Grok 15.1.0
PacketIter.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016-2025 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 * This source code incorporates work covered by the BSD 2-clause license.
18 * Please see the LICENSE file in the root directory for details.
19 *
20 */
21
22#pragma once
23
24#include <limits>
25
26namespace grk
27{
34
40
45constexpr size_t GRK_INCLUDE_TRACKER_CHUNK_SIZE = 1024;
46
54{
60 {
61 for(uint8_t i = 0; i < GRK_MAXRLVLS; ++i)
62 chunkMap[i] = nullptr; // Buffers start as nullptr
63 }
64
70 {
71 clear();
72 }
73
83 bool update(uint8_t resno, uint64_t bitIndex)
84 {
85 if(resno >= GRK_MAXRLVLS)
86 throw std::out_of_range("Resolution index out of range");
87
88 if(!chunkMap[resno])
89 chunkMap[resno] = new std::map<size_t, uint8_t*>(); // Lazily allocate the map
90
91 auto& chunks = *chunkMap[resno];
92 uint64_t byteIndex = bitIndex >> 3; // Byte index within the resolution's buffer
93 uint64_t chunkIndex =
94 byteIndex / GRK_INCLUDE_TRACKER_CHUNK_SIZE; // Determine which chunk to access
95 uint64_t chunkOffset = byteIndex % GRK_INCLUDE_TRACKER_CHUNK_SIZE; // Offset within the chunk
96
97 // Lazily allocate the chunk
98 if(chunks.find(chunkIndex) == chunks.end())
99 chunks[chunkIndex] = new uint8_t[GRK_INCLUDE_TRACKER_CHUNK_SIZE](); // Allocate chunk lazily
100 auto include = chunks[chunkIndex] + chunkOffset;
101 uint8_t bit = (bitIndex & 7);
102 uint8_t val = *include;
103 if(((val >> bit) & 1) == 0)
104 {
105 *include = (uint8_t)(val | (1 << bit));
106 return true;
107 }
108
109 return false;
110 }
111
116 void clear()
117 {
118 for(uint8_t i = 0; i < GRK_MAXRLVLS; ++i)
119 {
120 if(chunkMap[i])
121 {
122 for(auto& chunk : *chunkMap[i])
123 delete[] chunk.second; // Delete each chunk
124 delete chunkMap[i]; // Delete the map
125 chunkMap[i] = nullptr;
126 }
127 }
128 }
129
130private:
135 std::map<size_t, uint8_t*>* chunkMap[GRK_MAXRLVLS];
136};
137
139{
140 IncludeTracker(uint16_t numcomponents)
141 : numcomps(numcomponents), currentLayer(0), currentLayerIncludeBuf(nullptr),
142 include(new std::map<uint16_t, LayerIncludeBuffers*>())
143 {
145 }
146
148 {
149 clear();
150 delete include;
151 }
152
153 bool update(uint16_t layno, uint8_t resno, uint16_t compno, uint64_t precno)
154 {
155 LayerIncludeBuffers* layerBuf = nullptr;
156
157 // Retrieve or create the ResIncludeBuffers for the current layer
159 {
160 layerBuf = currentLayerIncludeBuf;
161 }
162 else
163 {
164 if(include->find(layno) == include->end())
165 include->operator[](layno) = layerBuf = new LayerIncludeBuffers;
166 else
167 layerBuf = include->operator[](layno);
168 currentLayerIncludeBuf = layerBuf;
169 currentLayer = layno;
170 }
171
172 // Calculate the index in bits
173 auto numprecs = numPrecinctsPerRes[resno];
174 uint64_t bitIndex = compno * numprecs + precno;
175
176 return layerBuf->update(resno, bitIndex);
177 }
178
179 void clear()
180 {
181 for(auto it = include->begin(); it != include->end(); ++it)
182 delete it->second;
183 include->clear();
184 }
185
187 {
188 for(uint8_t i = 0; i < GRK_MAXRLVLS; ++i)
189 numPrecinctsPerRes[i] = 0;
190 }
191
192 void updateNumPrecinctsPerRes(uint8_t resno, uint64_t numPrecincts)
193 {
194 if(numPrecincts > numPrecinctsPerRes[resno])
195 numPrecinctsPerRes[resno] = numPrecincts;
196 }
197
198private:
200 uint16_t numcomps;
201 uint16_t currentLayer;
203 std::map<uint16_t, LayerIncludeBuffers*>* include;
204};
205
206class PacketManager;
207
208/***
209 * Cache state of a tile component's resolution
210 * relative to the precinct grid in that resolution, and also
211 * projected onto the tile's highest resolution (PRJ)
212 */
214{
216 bool init(uint8_t resno, uint8_t decomplevel, grk_rect32 tileBounds, uint32_t dx, uint32_t dy,
217 bool windowed, grk_rect32 tileWindow);
218 void print(void);
219 uint32_t precWidthExp;
225 uint64_t precWidthPRJ;
230 uint64_t dxPRJ;
231 uint64_t dyPRJ;
234 uint8_t resno_;
245 bool valid;
246};
247
248/***
249 * Packet iterator resolution
250 */
267
271struct PiComp
272{
273 PiComp() : dx(0), dy(0), numresolutions(0), resolutions(nullptr) {}
275 {
276 delete[] resolutions;
277 }
278
279 // component sub-sampling factors
280 uint32_t dx;
281 uint32_t dy;
284};
285
290{
291 PacketIter();
292 ~PacketIter();
293
294 void init(PacketManager* packetMan, uint32_t pino, TileCodingParams* tcp, grk_rect32 tileBounds,
295 bool compression, uint8_t max_res, uint64_t max_precincts,
296 uint32_t* resolutionPrecinctGrid, uint32_t** precinctByComponent);
297
298 void printStaticState(void);
299 void printDynamicState(void);
300
307 void enable_tile_part_generation(uint32_t pino, bool first_poc_tile_part, uint32_t tppos);
308
309 void genPrecinctInfo();
310 void genPrecinctInfo(PiComp* comp, PiResolution* res, uint8_t resNumber);
311
312 bool update_include(void);
313 void destroy_include(void);
314
319 bool next(SparseBuffer* src);
320 GRK_PROG_ORDER getProgression(void) const;
321 uint16_t getCompno(void) const;
322 uint8_t getResno(void) const;
323 uint64_t getPrecinctIndex(void) const;
324 uint16_t getLayno(void) const;
325
326private:
327 uint16_t compno;
328 uint8_t resno;
330 uint16_t layno;
332 uint16_t numcomps;
334
336 uint64_t x, y;
338 uint32_t dx, dy;
340 void update_dxy(void);
341 bool checkForRemainingValidProgression(int32_t prog, uint32_t pino, const char* progString);
342 // This packet iterator is designed so that the innermost progression
343 // is only incremented before the **next** packet is processed.
344 // i.e. it is not incremented before the very first packet is processed,
345 // but rather before all subsequent packets are processed.
346 // This flag keeps track of this state.
348
354 // precinct top,left grid coordinates
355 uint32_t px0grid_;
356 uint32_t py0grid_;
360 bool precInfoCheck(ResPrecinctInfo* rpInfo);
361 void generatePrecinctIndex(void);
362 bool validatePrecinct(void);
363 void update_dxy_for_comp(PiComp* comp, bool updateActive);
364 bool isWholeTile(void);
365
370 bool next_cprl(SparseBuffer* src);
372
377 bool next_pcrl(SparseBuffer* src);
378
383 bool next_lrcp(SparseBuffer* src);
388 bool next_rlcp(SparseBuffer* src);
393 bool next_rpcl(SparseBuffer* src);
394
395 bool skipPackets(SparseBuffer* src, uint64_t numPackets);
396};
397
398} // namespace grk
Definition PacketManager.h:23
#define GRK_MAXRLVLS
Definition grok.h:322
enum _GRK_PROG_ORDER GRK_PROG_ORDER
Progression orders.
Copyright (C) 2016-2025 Grok Image Compression Inc.
Definition ICacheable.h:20
grk_rect< uint32_t > grk_rect32
Definition geometry.h:61
J2K_T2_MODE
Definition PacketIter.h:36
@ FINAL_PASS
Function called in rate allocation process.
Definition PacketIter.h:38
@ THRESH_CALC
Definition PacketIter.h:37
constexpr size_t GRK_INCLUDE_TRACKER_CHUNK_SIZE
Chunk size for chunked resolution include buffer.
Definition PacketIter.h:45
std::map< uint16_t, LayerIncludeBuffers * > * include
Definition PacketIter.h:203
~IncludeTracker()
Definition PacketIter.h:147
uint16_t numcomps
Definition PacketIter.h:200
void updateNumPrecinctsPerRes(uint8_t resno, uint64_t numPrecincts)
Definition PacketIter.h:192
uint64_t numPrecinctsPerRes[GRK_MAXRLVLS]
Definition PacketIter.h:199
bool update(uint16_t layno, uint8_t resno, uint16_t compno, uint64_t precno)
Definition PacketIter.h:153
uint16_t currentLayer
Definition PacketIter.h:201
void clear()
Definition PacketIter.h:179
void resetNumPrecinctsPerRes(void)
Definition PacketIter.h:186
IncludeTracker(uint16_t numcomponents)
Definition PacketIter.h:140
LayerIncludeBuffers * currentLayerIncludeBuf
Definition PacketIter.h:202
Include buffers for all resolutions in a given layer.
Definition PacketIter.h:54
LayerIncludeBuffers()
Construct a new LayerIncludeBuffers object.
Definition PacketIter.h:59
~LayerIncludeBuffers()
Destroy the LayerIncludeBuffers object.
Definition PacketIter.h:69
bool update(uint8_t resno, uint64_t bitIndex)
Get the byte object Lazily get or allocate a resolution's specific byte within its include buffer's m...
Definition PacketIter.h:83
void clear()
Clears all chunks and chunkMaps.
Definition PacketIter.h:116
std::map< size_t, uint8_t * > * chunkMap[GRK_MAXRLVLS]
Lazily allocated maps of chunks for each resolution.
Definition PacketIter.h:135
bool isWholeTile(void)
Definition PacketIter.cpp:795
void destroy_include(void)
Definition PacketIter.cpp:622
bool next(SparseBuffer *src)
Modify the packet iterator to point to the next packet.
Definition PacketIter.cpp:799
bool next_cprl(SparseBuffer *src)
Get next packet in component-precinct-resolution-layer order.
Definition PacketIter.cpp:820
uint16_t layno
Definition PacketIter.h:330
bool next_pcrl(SparseBuffer *src)
Get next packet in precinct-component-resolution-layer order.
Definition PacketIter.cpp:861
uint16_t getCompno(void) const
Definition PacketIter.cpp:599
ResPrecinctInfo * precinctInfoOPT_
Definition PacketIter.h:353
bool next_rpcl(SparseBuffer *src)
Get next packet in resolution-precinct-component-layer order.
Definition PacketIter.cpp:992
uint32_t dy
Definition PacketIter.h:338
uint16_t compno
Definition PacketIter.h:327
bool update_include(void)
Definition PacketIter.cpp:616
void update_dxy_for_comp(PiComp *comp, bool updateActive)
Definition PacketIter.cpp:669
uint32_t dxActive
Definition PacketIter.h:339
bool skippedLeft_
Definition PacketIter.h:357
grk_progression prog
Definition PacketIter.h:331
PacketManager * packetManager
Definition PacketIter.h:349
bool genPrecinctX0Grid(ResPrecinctInfo *rpInfo)
Definition PacketIter.cpp:648
void generatePrecinctIndex(void)
Definition PacketIter.cpp:222
uint32_t dx
component sub-sampling
Definition PacketIter.h:338
uint8_t maxNumDecompositionResolutions
Definition PacketIter.h:350
uint8_t getResno(void) const
Definition PacketIter.cpp:603
PiComp * comps
Definition PacketIter.h:333
uint64_t y
Definition PacketIter.h:336
uint32_t px0grid_
Definition PacketIter.h:355
void printStaticState(void)
Definition PacketIter.cpp:113
uint16_t getLayno(void) const
Definition PacketIter.cpp:611
uint64_t precinctIndex
Definition PacketIter.h:329
uint32_t dyActive
Definition PacketIter.h:339
bool skipPackets(SparseBuffer *src, uint64_t numPackets)
Definition PacketIter.cpp:1050
uint8_t resno
Definition PacketIter.h:328
void printDynamicState(void)
Definition PacketIter.cpp:127
void genPrecinctInfo()
Definition PacketIter.cpp:137
uint64_t getPrecinctIndex(void) const
Definition PacketIter.cpp:607
bool singleProgression_
Definition PacketIter.h:351
void enable_tile_part_generation(uint32_t pino, bool first_poc_tile_part, uint32_t tppos)
Modify the packet iterator for enabling tile part generation.
Definition PacketIter.cpp:292
bool genPrecinctY0Grid(ResPrecinctInfo *rpInfo)
Definition PacketIter.cpp:637
void init(PacketManager *packetMan, uint32_t pino, TileCodingParams *tcp, grk_rect32 tileBounds, bool compression, uint8_t max_res, uint64_t max_precincts, uint32_t *resolutionPrecinctGrid, uint32_t **precinctByComponent)
Definition PacketIter.cpp:689
bool next_lrcp(SparseBuffer *src)
Get next packet in layer-resolution-component-precinct order.
Definition PacketIter.cpp:905
bool next_rlcp(SparseBuffer *src)
Get next packet in resolution-layer-component-precinct order.
Definition PacketIter.cpp:949
GRK_PROG_ORDER getProgression(void) const
Definition PacketIter.cpp:595
bool compression_
Definition PacketIter.h:352
PacketIter()
Definition PacketIter.cpp:97
uint32_t py0grid_
Definition PacketIter.h:356
void update_dxy(void)
Definition PacketIter.cpp:660
uint16_t numcomps
Definition PacketIter.h:332
~PacketIter()
Definition PacketIter.cpp:105
bool incrementInner
Definition PacketIter.h:347
bool precInfoCheck(ResPrecinctInfo *rpInfo)
Definition PacketIter.cpp:626
bool next_cprlOPT(SparseBuffer *src)
bool checkForRemainingValidProgression(int32_t prog, uint32_t pino, const char *progString)
Check if there is a remaining valid progression order.
Definition PacketIter.cpp:232
uint64_t x
packet coordinates
Definition PacketIter.h:336
bool validatePrecinct(void)
Definition PacketIter.cpp:172
Packet iterator component.
Definition PacketIter.h:272
~PiComp()
Definition PacketIter.h:274
uint32_t dx
Definition PacketIter.h:280
uint8_t numresolutions
Definition PacketIter.h:282
PiComp()
Definition PacketIter.h:273
PiResolution * resolutions
Definition PacketIter.h:283
uint32_t dy
Definition PacketIter.h:281
Definition PacketIter.h:252
uint32_t precinctGridHeight
Definition PacketIter.h:264
~PiResolution()
Definition PacketIter.h:257
uint32_t precinctGridWidth
Definition PacketIter.h:263
uint32_t precHeightExp
Definition PacketIter.h:262
ResPrecinctInfo * precinctInfo
Definition PacketIter.h:265
uint32_t precWidthExp
Definition PacketIter.h:261
PiResolution()
Definition PacketIter.h:253
Definition PacketIter.h:214
uint32_t resOffsetY0PRJ
Definition PacketIter.h:224
uint32_t precWidthExpPRJ
Definition PacketIter.h:221
uint64_t dxPRJ
Definition PacketIter.h:230
uint8_t resno_
Definition PacketIter.h:234
uint32_t resInPrecGridX0
Definition PacketIter.h:232
uint64_t precHeightPRJ
Definition PacketIter.h:227
uint64_t dyPRJ
Definition PacketIter.h:231
grk_rect32 winPrecGrid
Definition PacketIter.h:239
bool init(uint8_t resno, uint8_t decomplevel, grk_rect32 tileBounds, uint32_t dx, uint32_t dy, bool windowed, grk_rect32 tileWindow)
Definition PacketIter.cpp:32
uint64_t precWidthPRJMinusOne
Definition PacketIter.h:226
uint64_t winPrecinctsTop_
Definition PacketIter.h:243
uint32_t precHeightExpPRJ
Definition PacketIter.h:222
uint64_t precHeightPRJMinusOne
Definition PacketIter.h:228
uint32_t resInPrecGridY0
Definition PacketIter.h:233
uint64_t innerPrecincts_
Definition PacketIter.h:240
uint64_t winPrecinctsRight_
Definition PacketIter.h:242
bool valid
Definition PacketIter.h:245
uint64_t numPrecincts_
Definition PacketIter.h:229
grk_rect32 winPrecPRJ
Definition PacketIter.h:238
uint64_t winPrecinctsLeft_
Definition PacketIter.h:241
uint32_t precWidthExp
Definition PacketIter.h:219
uint32_t precHeightExp
Definition PacketIter.h:220
ResPrecinctInfo()
Definition PacketIter.cpp:25
uint32_t resOffsetX0PRJ
Definition PacketIter.h:223
uint64_t winPrecinctsBottom_
Definition PacketIter.h:244
grk_rect32 tileBoundsPrecPRJ
Definition PacketIter.h:236
uint64_t precWidthPRJ
Definition PacketIter.h:225
grk_rect32 tileBoundsPrecGrid
Definition PacketIter.h:237
void print(void)
Definition PacketIter.cpp:79
uint8_t decompLevel_
Definition PacketIter.h:235
Definition SparseBuffer.h:28
Tile coding parameters : this structure is used to store coding/decoding parameters common to all til...
Definition CodingParams.h:122
Progression order change (POC)