Grok 20.3.2
PacketParser.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016-2026 Grok Image Compression Inc.
3 *
4 * This source code is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Affero General Public License, version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This source code is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Affero General Public License for more details.
12 *
13 * You should have received a copy of the GNU Affero General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 */
17
18#pragma once
19
20#include <cstdint>
21#include <unordered_map>
22#include <queue>
23#include <optional>
24
25#include "SparseBuffer.h"
26
27namespace grk
28{
29
35{
36public:
49 PacketParser(ITileProcessor* tileProcessor, uint16_t packetSequenceNumber, uint16_t compno,
50 uint8_t resno, uint64_t precinctIndex, uint16_t layno, uint32_t cachedLength,
51 SparseBuffer* compressedPackets);
52
56 virtual ~PacketParser(void) = default;
57
62 uint32_t readHeader(void);
63
68 uint32_t getHeaderLength(void) const;
69
70 void parsePacketData(void);
71
75 void print(void);
76
77private:
81 void readData(void);
82
86 void readDataFinalize(void);
87
92
93 uint16_t tileIndex_ = 0;
94
102
106 uint16_t compno_ = 0;
107
111 uint8_t resno_ = 0;
112
116 uint64_t precinctIndex_ = 0;
117
121 uint16_t layno_ = 0;
122
127
131 uint8_t* layerData_ = nullptr;
132
137
141 bool tagBitsPresent_ = false;
142
146 uint32_t headerLength_ = 0;
147
152
156 uint32_t plLength_ = 0;
157
161 bool parsedHeader_ = false;
162
166 bool headerError_ = false;
167};
168
175template<typename T>
177{
178public:
184 : elements(std::make_unique<T*[]>(maxSize)), currentSize(0), maxSize(maxSize), popIndex(-1)
185 {}
186
190 ~LimitedQueue() = default;
191
197 bool push(T* ptr)
198 {
199 if(currentSize >= maxSize)
200 {
201 return false; // Queue full
202 }
203 elements[currentSize++] = ptr; // Store pointer
204 return true; // Successfully pushed
205 }
206
213 std::optional<T*> pop()
214 {
215 auto currentPopIndex = ++popIndex;
216 if((size_t)currentPopIndex >= currentSize)
217 return std::nullopt; // Queue empty
218 return elements[(size_t)currentPopIndex];
219 }
220
221private:
225 std::unique_ptr<T*[]> elements;
226
231
235 std::size_t maxSize;
236
240 std::atomic<int32_t> popIndex;
241};
242
274
280{
290
294 void clearPrecinctParsers(void);
295
301 void enqueue(uint64_t precinctIndex, PacketParser* parser);
306
310 std::unordered_map<uint64_t, std::unique_ptr<AllLayersPrecinctPacketParser>>
312};
313
314} // namespace grk
Queue limited to maximum size.
Definition PacketParser.h:177
LimitedQueue(std::size_t maxSize)
Constructs a LimitedQueue.
Definition PacketParser.h:183
bool push(T *ptr)
Pushes an element into the queue.
Definition PacketParser.h:197
std::optional< T * > pop()
Pops an element from the queue.
Definition PacketParser.h:213
std::unique_ptr< T *[]> elements
array of queue elements
Definition PacketParser.h:225
std::atomic< int32_t > popIndex
pop index
Definition PacketParser.h:240
std::size_t maxSize
maximum size of queue
Definition PacketParser.h:235
size_t currentSize
current size of queue
Definition PacketParser.h:230
~LimitedQueue()=default
Destroys a LimitedQueue.
Parses packet header and packer data.
Definition PacketParser.h:35
PacketParser(ITileProcessor *tileProcessor, uint16_t packetSequenceNumber, uint16_t compno, uint8_t resno, uint64_t precinctIndex, uint16_t layno, uint32_t cachedLength, SparseBuffer *compressedPackets)
Constructs PacketParser.
Definition PacketParser.cpp:57
SparseBuffer * packets_
SparseBuffer of all packets
Definition PacketParser.h:126
void readDataFinalize(void)
Finalizes packet data reading after it is complete.
Definition PacketParser.cpp:370
ITileProcessor * tileProcessor_
tile processor
Definition PacketParser.h:91
bool tagBitsPresent_
true if tag bits present in packet header
Definition PacketParser.h:141
size_t layerBytesAvailable_
all available bytes in layer (includes packet header and data)
Definition PacketParser.h:136
uint64_t precinctIndex_
precinct index
Definition PacketParser.h:116
uint32_t headerLength_
packet header length - does not include packed header bytes
Definition PacketParser.h:146
uint16_t packetSequenceNumber_
packet sequence number
Definition PacketParser.h:101
void readData(void)
Reads packet data.
Definition PacketParser.cpp:318
uint16_t tileIndex_
Definition PacketParser.h:93
uint16_t layno_
layer number
Definition PacketParser.h:121
uint32_t signalledLayerDataBytes_
length of packet data as signalled in packet header
Definition PacketParser.h:151
bool parsedHeader_
true if header has been parsed
Definition PacketParser.h:161
bool headerError_
true of there was an error reading the header
Definition PacketParser.h:166
uint32_t plLength_
total packet length as signalled in marker (PLT/PLM)
Definition PacketParser.h:156
uint8_t * layerData_
packets_ current chunk pointer aka layer data
Definition PacketParser.h:131
uint16_t compno_
component number
Definition PacketParser.h:106
void parsePacketData(void)
Definition PacketParser.cpp:375
virtual ~PacketParser(void)=default
Destroys PacketParser.
uint32_t readHeader(void)
Reads packet header.
Definition PacketParser.cpp:82
uint32_t getHeaderLength(void) const
Gets packet header length (valid after readHeader).
Definition PacketParser.cpp:314
uint8_t resno_
resolution number
Definition PacketParser.h:111
void print(void)
Printout for debugging.
Definition PacketParser.cpp:66
Manages a list of buffers (named chunks) which can be treated as one single contiguous buffer.
Definition SparseBuffer.h:41
ResWindow.
Definition CompressedChunkCache.h:36
AllLayersPrecinctPacketParser(ITileProcessor *tileProcessor)
Constructs an AllLayersPrecinctPacketParser.
Definition PacketParser.cpp:388
void enqueue(PacketParser *parser)
Enqueues a layer PacketParser for concurrent parsing.
Definition PacketParser.cpp:392
ITileProcessor * tileProcessor_
ITileProcessor
Definition PacketParser.h:267
~AllLayersPrecinctPacketParser(void)=default
Destroys an AllLayersPrecinctPacketParser.
LimitedQueue< PacketParser > parserQueue_
Queue of PacketParser.
Definition PacketParser.h:272
Interface for managing tile compression/decompression.
Definition ITileProcessor.h:37
ResolutionPacketParser(ITileProcessor *tileProcessor)
Constructs a ResolutionPacketParser.
Definition PacketParser.cpp:398
~ResolutionPacketParser()
Destroys a ResolutionPacketParser.
Definition PacketParser.cpp:402
void enqueue(uint64_t precinctIndex, PacketParser *parser)
Enqueues a PacketParser for a precinct, for concurrent parsing.
Definition PacketParser.cpp:411
std::unordered_map< uint64_t, std::unique_ptr< AllLayersPrecinctPacketParser > > allLayerPrecinctParsers_
map of AllLayersPrecinctPacketParser, indexed by precinct index
Definition PacketParser.h:311
void clearPrecinctParsers(void)
Clears map of PrecinctParser.
Definition PacketParser.cpp:407
ITileProcessor * tileProcessor_
ITileProcessor
Definition PacketParser.h:305