Grok 10.0.0
PacketIter.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016-2022 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
23namespace grk
24{
33{
35 FINAL_PASS = 1
36};
37
39{
41 {
42 for(uint8_t i = 0; i < GRK_J2K_MAXRLVLS; ++i)
43 buffers[i] = nullptr;
44 }
46 {
47 for(uint8_t i = 0; i < GRK_J2K_MAXRLVLS; ++i)
48 delete[] buffers[i];
49 }
51};
53{
54 IncludeTracker(uint16_t numcomponents)
55 : numcomps(numcomponents), currentLayer(0), currentResBuf(nullptr),
56 include(new std::map<uint16_t, ResIncludeBuffers*>())
57 {
58 for(uint8_t i = 0; i < GRK_J2K_MAXRLVLS; ++i)
59 numPrecinctsPerRes[i] = 0;
60 }
62 {
63 clear();
64 delete include;
65 }
66 uint8_t* get_include(uint16_t layerno, uint8_t resno)
67 {
68 ResIncludeBuffers* resBuf = nullptr;
69 if(layerno == currentLayer && currentResBuf)
70 {
71 resBuf = currentResBuf;
72 }
73 else
74 {
75 if(include->find(layerno) == include->end())
76 {
77 resBuf = new ResIncludeBuffers;
78 include->operator[](layerno) = resBuf;
79 }
80 else
81 {
82 resBuf = include->operator[](layerno);
83 }
84 currentResBuf = resBuf;
85 currentLayer = layerno;
86 }
87 auto buf = resBuf->buffers[resno];
88 if(!buf)
89 {
90 auto numprecs = numPrecinctsPerRes[resno];
91 auto len = (numprecs * numcomps + 7) / 8;
92 buf = new uint8_t[len];
93 memset(buf, 0, len);
94 resBuf->buffers[resno] = buf;
95 }
96 return buf;
97 }
98 bool update(uint16_t layno, uint8_t resno, uint16_t compno, uint64_t precno)
99 {
100 auto include = get_include(layno, resno);
101 auto numprecs = numPrecinctsPerRes[resno];
102 uint64_t index = compno * numprecs + precno;
103 uint64_t include_index = (index >> 3);
104 uint32_t shift = (index & 7);
105 uint8_t val = include[include_index];
106 if(((val >> shift) & 1) == 0)
107 {
108 include[include_index] = (uint8_t)(val | (1 << shift));
109 return true;
110 }
111
112 return false;
113 }
114 void clear()
115 {
116 for(auto it = include->begin(); it != include->end(); ++it)
117 delete it->second;
118 include->clear();
119 }
121
122 private:
123 uint16_t numcomps;
124 uint16_t currentLayer;
126 std::map<uint16_t, ResIncludeBuffers*>* include;
127};
128
129class PacketManager;
130
131/***
132 * Cache state of a tile component's resolution
133 * relative to the precinct grid in that resolution, and also
134 * projected onto the tile's highest resolution (PRJ)
135 */
137{
139 bool init(uint8_t resno, uint8_t decomplevel, grk_rect32 tileBounds, uint32_t dx, uint32_t dy,
140 bool windowed, grk_rect32 tileWindow);
141 void print(void);
142 uint32_t precWidthExp;
148 uint64_t precWidthPRJ;
153 uint64_t dxPRJ;
154 uint64_t dyPRJ;
157 uint8_t resno_;
168 bool valid;
169};
170
171/***
172 * Packet iterator resolution
173 */
175{
178 precinctInfo(nullptr)
179 {}
181 {
182 delete precinctInfo;
183 }
184 uint32_t precWidthExp;
189};
190
194struct PiComp
195{
196 PiComp() : dx(0), dy(0), numresolutions(0), resolutions(nullptr) {}
198 {
199 delete[] resolutions;
200 }
201
202 // component sub-sampling factors
203 uint32_t dx;
204 uint32_t dy;
207};
208
213{
214 PacketIter();
215 ~PacketIter();
216
217 void init(PacketManager* packetMan, uint32_t pino, TileCodingParams* tcp, grk_rect32 tileBounds,
218 bool compression, uint8_t max_res, uint64_t max_precincts,
219 uint32_t* resolutionPrecinctGrid, uint32_t** precinctByComponent);
220
221 void printStaticState(void);
222 void printDynamicState(void);
223
230 void enableTilePartGeneration(uint32_t pino, bool first_poc_tile_part, uint32_t tppos);
231
232 bool genPrecinctInfoOPT();
233 void genPrecinctInfo();
234 void genPrecinctInfo(PiComp* comp, PiResolution* res, uint8_t resNumber);
235
236 uint8_t* get_include(uint16_t layerIndex);
237 bool update_include(void);
238 void destroy_include(void);
239
244 bool next(SparseBuffer* src);
245 GRK_PROG_ORDER getProgression(void) const;
246 uint16_t getCompno(void) const;
247 uint8_t getResno(void) const;
248 uint64_t getPrecinctIndex(void) const;
249 uint16_t getLayno(void) const;
250
251 private:
252 uint16_t compno;
253 uint8_t resno;
255 uint16_t layno;
257 uint16_t numcomps;
259
261 uint64_t x, y;
263 uint32_t dx, dy;
265 void update_dxy(void);
266 bool checkForRemainingValidProgression(int32_t prog, uint32_t pino, const char* progString);
267 // This packet iterator is designed so that the innermost progression
268 // is only incremented before the **next** packet is processed.
269 // i.e. it is not incremented before the very first packet is processed,
270 // but rather before all subsequent packets are processed.
271 // This flag keeps track of this state.
273
279 // precinct top,left grid coordinates
280 uint32_t px0grid_;
281 uint32_t py0grid_;
289 bool precInfoCheck(ResPrecinctInfo* rpInfo);
290 void generatePrecinctIndex(void);
291 bool validatePrecinct(void);
292 void update_dxy_for_comp(PiComp* comp, bool updateActive);
293 bool isWholeTile(void);
294
299 bool next_cprl(SparseBuffer* src);
300 bool next_cprlOPT(SparseBuffer* src);
301
306 bool next_pcrl(SparseBuffer* src);
307 bool next_pcrlOPT(SparseBuffer* src);
308
313 bool next_lrcp(SparseBuffer* src);
314 bool next_lrcpOPT(SparseBuffer* src);
319 bool next_rlcp(SparseBuffer* src);
320 bool next_rlcpOPT(SparseBuffer* src);
325 bool next_rpcl(SparseBuffer* src);
326 bool next_rpclOPT(SparseBuffer* src);
327
328 bool skipPackets(SparseBuffer* src, uint64_t numPackets);
329};
330
331} // namespace grk
Definition: PacketManager.h:23
enum _GRK_PROG_ORDER GRK_PROG_ORDER
Progression order.
#define GRK_J2K_MAXRLVLS
Definition: grok.h:232
Copyright (C) 2016-2022 Grok Image Compression Inc.
Definition: ICacheable.h:20
const double shift
Definition: RateControl.cpp:165
J2K_T2_MODE
Definition: PacketIter.h:33
@ FINAL_PASS
Function called in rate allocation process.
Definition: PacketIter.h:35
@ THRESH_CALC
Definition: PacketIter.h:34
Progression order change.
Definition: grok.h:135
Definition: PacketIter.h:53
~IncludeTracker()
Definition: PacketIter.h:61
uint8_t * get_include(uint16_t layerno, uint8_t resno)
Definition: PacketIter.h:66
uint16_t numcomps
Definition: PacketIter.h:123
bool update(uint16_t layno, uint8_t resno, uint16_t compno, uint64_t precno)
Definition: PacketIter.h:98
uint16_t currentLayer
Definition: PacketIter.h:124
uint64_t numPrecinctsPerRes[GRK_J2K_MAXRLVLS]
Definition: PacketIter.h:120
void clear()
Definition: PacketIter.h:114
std::map< uint16_t, ResIncludeBuffers * > * include
Definition: PacketIter.h:126
IncludeTracker(uint16_t numcomponents)
Definition: PacketIter.h:54
ResIncludeBuffers * currentResBuf
Definition: PacketIter.h:125
Packet iterator.
Definition: PacketIter.h:213
bool isWholeTile(void)
Definition: PacketIter.cpp:902
void destroy_include(void)
Definition: PacketIter.cpp:702
bool genPrecinctY0GridPCRL_OPT(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:740
bool next(SparseBuffer *src)
Modify the packet iterator to point to the next packet.
Definition: PacketIter.cpp:906
uint8_t * get_include(uint16_t layerIndex)
Definition: PacketIter.cpp:692
bool next_cprl(SparseBuffer *src)
Get next packet in component-precinct-resolution-layer order.
Definition: PacketIter.cpp:927
uint16_t layno
Definition: PacketIter.h:255
bool next_rlcpOPT(SparseBuffer *src)
Definition: PacketIter.cpp:1209
bool next_pcrl(SparseBuffer *src)
Get next packet in precinct-component-resolution-layer order.
Definition: PacketIter.cpp:969
uint16_t getCompno(void) const
Definition: PacketIter.cpp:676
ResPrecinctInfo * precinctInfoOPT_
Definition: PacketIter.h:278
bool next_rpcl(SparseBuffer *src)
Get next packet in resolution-precinct-component-layer order.
Definition: PacketIter.cpp:1104
uint32_t dy
Definition: PacketIter.h:263
uint16_t compno
Definition: PacketIter.h:252
bool update_include(void)
Definition: PacketIter.cpp:696
void update_dxy_for_comp(PiComp *comp, bool updateActive)
Definition: PacketIter.cpp:775
uint32_t dxActive
Definition: PacketIter.h:264
void enableTilePartGeneration(uint32_t pino, bool first_poc_tile_part, uint32_t tppos)
Modify the packet iterator for enabling tile part generation.
Definition: PacketIter.cpp:363
bool skippedLeft_
Definition: PacketIter.h:282
grk_progression prog
Definition: PacketIter.h:256
PacketManager * packetManager
Definition: PacketIter.h:274
bool genPrecinctX0Grid(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:728
void generatePrecinctIndex(void)
Definition: PacketIter.cpp:292
uint32_t dx
component sub-sampling
Definition: PacketIter.h:263
bool genPrecinctX0GridPCRL_OPT(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:749
uint8_t maxNumDecompositionResolutions
Definition: PacketIter.h:275
uint8_t getResno(void) const
Definition: PacketIter.cpp:680
PiComp * comps
Definition: PacketIter.h:258
uint64_t y
Definition: PacketIter.h:261
uint32_t px0grid_
Definition: PacketIter.h:280
void printStaticState(void)
Definition: PacketIter.cpp:114
uint16_t getLayno(void) const
Definition: PacketIter.cpp:688
uint64_t precinctIndex
Definition: PacketIter.h:254
uint32_t dyActive
Definition: PacketIter.h:264
bool next_lrcpOPT(SparseBuffer *src)
Definition: PacketIter.cpp:1179
bool skipPackets(SparseBuffer *src, uint64_t numPackets)
Definition: PacketIter.cpp:1164
uint8_t resno
Definition: PacketIter.h:253
void printDynamicState(void)
Definition: PacketIter.cpp:128
void genPrecinctInfo()
Definition: PacketIter.cpp:138
uint64_t getPrecinctIndex(void) const
Definition: PacketIter.cpp:684
bool singleProgression_
Definition: PacketIter.h:276
bool genPrecinctY0Grid(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:717
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:795
void genPrecinctY0GridRPCL_OPT(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:758
bool next_lrcp(SparseBuffer *src)
Get next packet in layer-resolution-component-precinct order.
Definition: PacketIter.cpp:1014
bool genPrecinctInfoOPT()
Definition: PacketIter.cpp:184
bool next_rpclOPT(SparseBuffer *src)
Definition: PacketIter.cpp:1374
bool next_rlcp(SparseBuffer *src)
Get next packet in resolution-layer-component-precinct order.
Definition: PacketIter.cpp:1060
GRK_PROG_ORDER getProgression(void) const
Definition: PacketIter.cpp:672
bool compression_
Definition: PacketIter.h:277
void genPrecinctX0GridRPCL_OPT(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:762
bool next_pcrlOPT(SparseBuffer *src)
Definition: PacketIter.cpp:1315
PacketIter()
Definition: PacketIter.cpp:98
uint32_t py0grid_
Definition: PacketIter.h:281
void update_dxy(void)
Definition: PacketIter.cpp:766
uint16_t numcomps
Definition: PacketIter.h:257
~PacketIter()
Definition: PacketIter.cpp:106
bool incrementInner
Definition: PacketIter.h:272
bool precInfoCheck(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:706
bool next_cprlOPT(SparseBuffer *src)
Definition: PacketIter.cpp:1240
bool checkForRemainingValidProgression(int32_t prog, uint32_t pino, const char *progString)
Check if there is a remaining valid progression order.
Definition: PacketIter.cpp:302
uint64_t x
packet coordinates
Definition: PacketIter.h:261
bool validatePrecinct(void)
Definition: PacketIter.cpp:242
Packet iterator component.
Definition: PacketIter.h:195
~PiComp()
Definition: PacketIter.h:197
uint32_t dx
Definition: PacketIter.h:203
uint8_t numresolutions
Definition: PacketIter.h:205
PiComp()
Definition: PacketIter.h:196
PiResolution * resolutions
Definition: PacketIter.h:206
uint32_t dy
Definition: PacketIter.h:204
Definition: PacketIter.h:175
uint32_t precinctGridHeight
Definition: PacketIter.h:187
~PiResolution()
Definition: PacketIter.h:180
uint32_t precinctGridWidth
Definition: PacketIter.h:186
uint32_t precHeightExp
Definition: PacketIter.h:185
ResPrecinctInfo * precinctInfo
Definition: PacketIter.h:188
uint32_t precWidthExp
Definition: PacketIter.h:184
PiResolution()
Definition: PacketIter.h:176
Definition: PacketIter.h:39
ResIncludeBuffers()
Definition: PacketIter.h:40
uint8_t * buffers[GRK_J2K_MAXRLVLS]
Definition: PacketIter.h:50
~ResIncludeBuffers()
Definition: PacketIter.h:45
Definition: PacketIter.h:137
uint32_t resOffsetY0PRJ
Definition: PacketIter.h:147
uint32_t precWidthExpPRJ
Definition: PacketIter.h:144
uint64_t dxPRJ
Definition: PacketIter.h:153
uint8_t resno_
Definition: PacketIter.h:157
uint32_t resInPrecGridX0
Definition: PacketIter.h:155
uint64_t precHeightPRJ
Definition: PacketIter.h:150
uint64_t dyPRJ
Definition: PacketIter.h:154
grk_rect32 winPrecGrid
Definition: PacketIter.h:162
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:149
uint64_t winPrecinctsTop_
Definition: PacketIter.h:166
uint32_t precHeightExpPRJ
Definition: PacketIter.h:145
uint64_t precHeightPRJMinusOne
Definition: PacketIter.h:151
uint32_t resInPrecGridY0
Definition: PacketIter.h:156
uint64_t innerPrecincts_
Definition: PacketIter.h:163
uint64_t winPrecinctsRight_
Definition: PacketIter.h:165
bool valid
Definition: PacketIter.h:168
uint64_t numPrecincts_
Definition: PacketIter.h:152
grk_rect32 winPrecPRJ
Definition: PacketIter.h:161
uint64_t winPrecinctsLeft_
Definition: PacketIter.h:164
uint32_t precWidthExp
Definition: PacketIter.h:142
uint32_t precHeightExp
Definition: PacketIter.h:143
ResPrecinctInfo()
Definition: PacketIter.cpp:25
uint32_t resOffsetX0PRJ
Definition: PacketIter.h:146
uint64_t winPrecinctsBottom_
Definition: PacketIter.h:167
grk_rect32 tileBoundsPrecPRJ
Definition: PacketIter.h:159
uint64_t precWidthPRJ
Definition: PacketIter.h:148
grk_rect32 tileBoundsPrecGrid
Definition: PacketIter.h:160
void print(void)
Definition: PacketIter.cpp:80
uint8_t decompLevel_
Definition: PacketIter.h:158
Definition: SparseBuffer.h:28
Tile coding parameters : this structure is used to store coding/decoding parameters common to all til...
Definition: CodingParams.h:122