Grok 10.0.5
PacketIter.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016-2023 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{
40
41struct ResIncludeBuffers
42{
43 ResIncludeBuffers()
44 {
45 for(uint8_t i = 0; i < GRK_J2K_MAXRLVLS; ++i)
46 buffers[i] = nullptr;
47 }
48 ~ResIncludeBuffers()
49 {
50 for(uint8_t i = 0; i < GRK_J2K_MAXRLVLS; ++i)
51 delete[] buffers[i];
52 }
54};
55struct IncludeTracker
56{
57 IncludeTracker(uint16_t numcomponents)
58 : numcomps(numcomponents), currentLayer(0), currentResBuf(nullptr),
59 include(new std::map<uint16_t, ResIncludeBuffers*>())
60 {
61 for(uint8_t i = 0; i < GRK_J2K_MAXRLVLS; ++i)
62 numPrecinctsPerRes[i] = 0;
63 }
64 ~IncludeTracker()
65 {
66 clear();
67 delete include;
68 }
69 uint8_t* get_include(uint16_t layerno, uint8_t resno)
70 {
71 ResIncludeBuffers* resBuf = nullptr;
72 if(layerno == currentLayer && currentResBuf)
73 {
74 resBuf = currentResBuf;
75 }
76 else
77 {
78 if(include->find(layerno) == include->end())
79 {
80 resBuf = new ResIncludeBuffers;
81 include->operator[](layerno) = resBuf;
82 }
83 else
84 {
85 resBuf = include->operator[](layerno);
86 }
87 currentResBuf = resBuf;
88 currentLayer = layerno;
89 }
90 auto buf = resBuf->buffers[resno];
91 if(!buf)
92 {
93 auto numprecs = numPrecinctsPerRes[resno];
94 auto len = (numprecs * numcomps + 7) / 8;
95 assert(len <= std::numeric_limits<size_t>::max());
96 buf = new uint8_t[(size_t)len];
97 memset(buf, 0, (size_t)len);
98 resBuf->buffers[resno] = buf;
99 }
100 return buf;
101 }
102 bool update(uint16_t layno, uint8_t resno, uint16_t compno, uint64_t precno)
103 {
104 auto include = get_include(layno, resno);
105 auto numprecs = numPrecinctsPerRes[resno];
106 uint64_t index = compno * numprecs + precno;
107 uint64_t include_index = (index >> 3);
108 uint32_t shift = (index & 7);
109 uint8_t val = include[include_index];
110 if(((val >> shift) & 1) == 0)
111 {
112 include[include_index] = (uint8_t)(val | (1 << shift));
113 return true;
114 }
115
116 return false;
117 }
118 void clear()
119 {
120 for(auto it = include->begin(); it != include->end(); ++it)
121 delete it->second;
122 include->clear();
123 }
125
126 private:
127 uint16_t numcomps;
128 uint16_t currentLayer;
129 ResIncludeBuffers* currentResBuf;
130 std::map<uint16_t, ResIncludeBuffers*>* include;
131};
132
133class PacketManager;
134
135/***
136 * Cache state of a tile component's resolution
137 * relative to the precinct grid in that resolution, and also
138 * projected onto the tile's highest resolution (PRJ)
139 */
140struct ResPrecinctInfo
141{
142 ResPrecinctInfo();
143 bool init(uint8_t resno, uint8_t decomplevel, grk_rect32 tileBounds, uint32_t dx, uint32_t dy,
144 bool windowed, grk_rect32 tileWindow);
145 void print(void);
146 uint32_t precWidthExp;
152 uint64_t precWidthPRJ;
157 uint64_t dxPRJ;
158 uint64_t dyPRJ;
161 uint8_t resno_;
165 grk_rect32 winPrecPRJ;
166 grk_rect32 winPrecGrid;
172 bool valid;
173};
174
175/***
176 * Packet iterator resolution
177 */
178struct PiResolution
179{
180 PiResolution()
182 precinctInfo(nullptr)
183 {}
184 ~PiResolution()
185 {
186 delete precinctInfo;
187 }
188 uint32_t precWidthExp;
189 uint32_t precHeightExp;
192 ResPrecinctInfo* precinctInfo;
193};
194
198struct PiComp
199{
200 PiComp() : dx(0), dy(0), numresolutions(0), resolutions(nullptr) {}
201 ~PiComp()
202 {
203 delete[] resolutions;
204 }
205
206 // component sub-sampling factors
207 uint32_t dx;
208 uint32_t dy;
210 PiResolution* resolutions;
211};
212
216struct PacketIter
217{
218 PacketIter();
219 ~PacketIter();
220
221 void init(PacketManager* packetMan, uint32_t pino, TileCodingParams* tcp, grk_rect32 tileBounds,
222 bool compression, uint8_t max_res, uint64_t max_precincts,
223 uint32_t* resolutionPrecinctGrid, uint32_t** precinctByComponent);
224
225 void printStaticState(void);
226 void printDynamicState(void);
227
234 void enableTilePartGeneration(uint32_t pino, bool first_poc_tile_part, uint32_t tppos);
235
236 bool genPrecinctInfoOPT();
237 void genPrecinctInfo();
238 void genPrecinctInfo(PiComp* comp, PiResolution* res, uint8_t resNumber);
239
240 uint8_t* get_include(uint16_t layerIndex);
241 bool update_include(void);
242 void destroy_include(void);
243
248 bool next(SparseBuffer* src);
249 GRK_PROG_ORDER getProgression(void) const;
250 uint16_t getCompno(void) const;
251 uint8_t getResno(void) const;
252 uint64_t getPrecinctIndex(void) const;
253 uint16_t getLayno(void) const;
254
255 private:
256 uint16_t compno;
257 uint8_t resno;
259 uint16_t layno;
261 uint16_t numcomps;
262 PiComp* comps;
263
265 uint64_t x, y;
267 uint32_t dx, dy;
269 void update_dxy(void);
270 bool checkForRemainingValidProgression(int32_t prog, uint32_t pino, const char* progString);
271 // This packet iterator is designed so that the innermost progression
272 // is only incremented before the **next** packet is processed.
273 // i.e. it is not incremented before the very first packet is processed,
274 // but rather before all subsequent packets are processed.
275 // This flag keeps track of this state.
277
278 PacketManager* packetManager;
282 ResPrecinctInfo* precinctInfoOPT_;
283 // precinct top,left grid coordinates
284 uint32_t px0grid_;
285 uint32_t py0grid_;
287 bool genPrecinctY0Grid(ResPrecinctInfo* rpInfo);
288 bool genPrecinctX0Grid(ResPrecinctInfo* rpInfo);
289 void genPrecinctY0GridRPCL_OPT(ResPrecinctInfo* rpInfo);
290 void genPrecinctX0GridRPCL_OPT(ResPrecinctInfo* rpInfo);
291 bool genPrecinctX0GridPCRL_OPT(ResPrecinctInfo* rpInfo);
292 bool genPrecinctY0GridPCRL_OPT(ResPrecinctInfo* rpInfo);
293 bool precInfoCheck(ResPrecinctInfo* rpInfo);
294 void generatePrecinctIndex(void);
295 bool validatePrecinct(void);
296 void update_dxy_for_comp(PiComp* comp, bool updateActive);
297 bool isWholeTile(void);
298
303 bool next_cprl(SparseBuffer* src);
304 bool next_cprlOPT(SparseBuffer* src);
305
310 bool next_pcrl(SparseBuffer* src);
311 bool next_pcrlOPT(SparseBuffer* src);
312
317 bool next_lrcp(SparseBuffer* src);
318 bool next_lrcpOPT(SparseBuffer* src);
323 bool next_rlcp(SparseBuffer* src);
324 bool next_rlcpOPT(SparseBuffer* src);
329 bool next_rpcl(SparseBuffer* src);
330 bool next_rpclOPT(SparseBuffer* src);
331
332 bool skipPackets(SparseBuffer* src, uint64_t numPackets);
333};
334
335} // namespace grk
uint8_t buf
Definition BitIO.h:84
uint64_t precinctIndex
Definition BlockExec.h:78
uint8_t resno
Definition BlockExec.h:53
uint32_t y
Definition BlockExec.h:39
uint32_t x
Definition BlockExec.h:38
uint32_t len
Definition Codeblock.h:38
uint32_t precWidthExp[GRK_J2K_MAXRLVLS]
precinct width (power of 2 exponent, < 16)
Definition CodingParams.h:85
uint8_t numresolutions
number of resolutions
Definition CodingParams.h:58
uint32_t precHeightExp[GRK_J2K_MAXRLVLS]
precinct height (power of 2 exponent, < 16)
Definition CodingParams.h:87
ComponentInfo * comps
Definition FileFormat.h:162
uint16_t numcomps
Definition FileFormat.h:149
grk_rect32 tileBoundsPrecPRJ
Definition PacketIter.h:163
grk_rect32 winPrecGrid
Definition PacketIter.h:166
bool incrementInner
Definition PacketIter.h:276
uint32_t px0grid_
Definition PacketIter.h:284
uint32_t resInPrecGridX0
Definition PacketIter.h:159
PiResolution * resolutions
Definition PacketIter.h:210
uint64_t numPrecinctsPerRes[GRK_J2K_MAXRLVLS]
Definition PacketIter.h:124
uint8_t resno_
Definition PacketIter.h:161
bool valid
Definition PacketIter.h:172
uint32_t dyActive
Definition PacketIter.h:268
uint64_t innerPrecincts_
Definition PacketIter.h:167
uint64_t precWidthPRJ
Definition PacketIter.h:152
uint64_t winPrecinctsLeft_
Definition PacketIter.h:168
uint64_t winPrecinctsBottom_
Definition PacketIter.h:171
uint32_t py0grid_
Definition PacketIter.h:285
uint64_t precHeightPRJMinusOne
Definition PacketIter.h:155
uint64_t dxPRJ
Definition PacketIter.h:157
ResPrecinctInfo * precinctInfoOPT_
Definition PacketIter.h:282
uint32_t dy
Definition PacketIter.h:208
uint64_t precWidthPRJMinusOne
Definition PacketIter.h:153
uint32_t resInPrecGridY0
Definition PacketIter.h:160
uint32_t precWidthExpPRJ
Definition PacketIter.h:148
PacketManager * packetManager
Definition PacketIter.h:278
uint64_t precHeightPRJ
Definition PacketIter.h:154
uint64_t dyPRJ
Definition PacketIter.h:158
ResIncludeBuffers * currentResBuf
Definition PacketIter.h:129
uint64_t winPrecinctsTop_
Definition PacketIter.h:170
uint16_t currentLayer
Definition PacketIter.h:128
uint32_t dx
component sub-sampling
Definition PacketIter.h:207
grk_rect32 tileBoundsPrecGrid
Definition PacketIter.h:164
uint32_t dxActive
Definition PacketIter.h:268
uint8_t decompLevel_
Definition PacketIter.h:162
grk_rect32 winPrecPRJ
Definition PacketIter.h:165
uint32_t resOffsetY0PRJ
Definition PacketIter.h:151
uint32_t precHeightExpPRJ
Definition PacketIter.h:149
grk_progression prog
Definition PacketIter.h:260
std::map< uint16_t, ResIncludeBuffers * > * include
Definition PacketIter.h:130
uint8_t * buffers[GRK_J2K_MAXRLVLS]
Definition PacketIter.h:53
uint64_t numPrecincts_
Definition PacketIter.h:156
uint8_t maxNumDecompositionResolutions
Definition PacketIter.h:279
bool singleProgression_
Definition PacketIter.h:280
bool compression_
Definition PacketIter.h:281
uint16_t layno
Definition PacketIter.h:259
uint64_t winPrecinctsRight_
Definition PacketIter.h:169
uint32_t resOffsetX0PRJ
Definition PacketIter.h:150
bool skippedLeft_
Definition PacketIter.h:286
ResPrecinctInfo * precinctInfo
Definition PacketIter.h:192
uint32_t precinctGridHeight
Definition Resolution.h:35
uint32_t precinctGridWidth
Definition Resolution.h:35
#define GRK_J2K_MAXRLVLS
uint32_t pino
Compression Only Current packet iterator number.
Definition TileProcessor.h:121
T val[N]
Definition WaveletCommon.h:65
enum _GRK_PROG_ORDER GRK_PROG_ORDER
Progression order.
grk_rect< uint32_t > grk_rect32
Definition TileCache.h:61
Copyright (C) 2016-2023 Grok Image Compression Inc.
Definition ICacheable.h:20
const double shift
Definition RateControl.cpp:165
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
uint16_t compno
Definition plugin_interface.h:43
Progression order change.
Definition grok.h:135