Grok  10.0.3
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
23 
24 #include <limits>
25 
26 namespace grk
27 {
36 {
38  FINAL_PASS = 1
39 };
40 
42 {
44  {
45  for(uint8_t i = 0; i < GRK_J2K_MAXRLVLS; ++i)
46  buffers[i] = nullptr;
47  }
49  {
50  for(uint8_t i = 0; i < GRK_J2K_MAXRLVLS; ++i)
51  delete[] buffers[i];
52  }
54 };
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  }
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;
130  std::map<uint16_t, ResIncludeBuffers*>* include;
131 };
132 
133 class 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  */
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;
147  uint32_t precHeightExp;
148  uint32_t precWidthExpPRJ;
150  uint32_t resOffsetX0PRJ;
151  uint32_t resOffsetY0PRJ;
152  uint64_t precWidthPRJ;
154  uint64_t precHeightPRJ;
156  uint64_t numPrecincts_;
157  uint64_t dxPRJ;
158  uint64_t dyPRJ;
159  uint32_t resInPrecGridX0;
160  uint32_t resInPrecGridY0;
161  uint8_t resno_;
162  uint8_t decompLevel_;
167  uint64_t innerPrecincts_;
172  bool valid;
173 };
174 
175 /***
176  * Packet iterator resolution
177  */
179 {
182  precinctInfo(nullptr)
183  {}
185  {
186  delete precinctInfo;
187  }
188  uint32_t precWidthExp;
189  uint32_t precHeightExp;
193 };
194 
198 struct PiComp
199 {
200  PiComp() : dx(0), dy(0), numresolutions(0), resolutions(nullptr) {}
202  {
203  delete[] resolutions;
204  }
205 
206  // component sub-sampling factors
207  uint32_t dx;
208  uint32_t dy;
209  uint8_t numresolutions;
211 };
212 
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;
258  uint64_t precinctIndex;
259  uint16_t layno;
261  uint16_t numcomps;
263 
265  uint64_t x, y;
267  uint32_t dx, dy;
268  uint32_t dxActive, dyActive;
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 
283  // precinct top,left grid coordinates
284  uint32_t px0grid_;
285  uint32_t py0grid_;
287  bool genPrecinctY0Grid(ResPrecinctInfo* rpInfo);
288  bool genPrecinctX0Grid(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
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:36
@ FINAL_PASS
Function called in rate allocation process.
Definition: PacketIter.h:38
@ THRESH_CALC
Definition: PacketIter.h:37
Progression order change.
Definition: grok.h:135
Definition: PacketIter.h:56
uint8_t * get_include(uint16_t layerno, uint8_t resno)
Definition: PacketIter.h:69
~IncludeTracker()
Definition: PacketIter.h:64
uint16_t numcomps
Definition: PacketIter.h:127
bool update(uint16_t layno, uint8_t resno, uint16_t compno, uint64_t precno)
Definition: PacketIter.h:102
uint16_t currentLayer
Definition: PacketIter.h:128
uint64_t numPrecinctsPerRes[GRK_J2K_MAXRLVLS]
Definition: PacketIter.h:124
void clear()
Definition: PacketIter.h:118
std::map< uint16_t, ResIncludeBuffers * > * include
Definition: PacketIter.h:130
IncludeTracker(uint16_t numcomponents)
Definition: PacketIter.h:57
ResIncludeBuffers * currentResBuf
Definition: PacketIter.h:129
Packet iterator.
Definition: PacketIter.h:217
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:259
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:282
bool next_rpcl(SparseBuffer *src)
Get next packet in resolution-precinct-component-layer order.
Definition: PacketIter.cpp:1104
uint32_t dy
Definition: PacketIter.h:267
uint16_t compno
Definition: PacketIter.h:256
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:268
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:286
grk_progression prog
Definition: PacketIter.h:260
PacketManager * packetManager
Definition: PacketIter.h:278
bool genPrecinctX0Grid(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:728
void generatePrecinctIndex(void)
Definition: PacketIter.cpp:292
uint32_t dx
component sub-sampling
Definition: PacketIter.h:267
bool genPrecinctX0GridPCRL_OPT(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:749
uint8_t maxNumDecompositionResolutions
Definition: PacketIter.h:279
uint8_t getResno(void) const
Definition: PacketIter.cpp:680
PiComp * comps
Definition: PacketIter.h:262
uint64_t y
Definition: PacketIter.h:265
uint32_t px0grid_
Definition: PacketIter.h:284
void printStaticState(void)
Definition: PacketIter.cpp:114
uint16_t getLayno(void) const
Definition: PacketIter.cpp:688
uint64_t precinctIndex
Definition: PacketIter.h:258
uint32_t dyActive
Definition: PacketIter.h:268
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:257
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:280
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:281
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:285
void update_dxy(void)
Definition: PacketIter.cpp:766
uint16_t numcomps
Definition: PacketIter.h:261
~PacketIter()
Definition: PacketIter.cpp:106
bool incrementInner
Definition: PacketIter.h:276
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:265
bool validatePrecinct(void)
Definition: PacketIter.cpp:242
Packet iterator component.
Definition: PacketIter.h:199
~PiComp()
Definition: PacketIter.h:201
uint32_t dx
Definition: PacketIter.h:207
uint8_t numresolutions
Definition: PacketIter.h:209
PiComp()
Definition: PacketIter.h:200
PiResolution * resolutions
Definition: PacketIter.h:210
uint32_t dy
Definition: PacketIter.h:208
Definition: PacketIter.h:179
uint32_t precinctGridHeight
Definition: PacketIter.h:191
~PiResolution()
Definition: PacketIter.h:184
uint32_t precinctGridWidth
Definition: PacketIter.h:190
uint32_t precHeightExp
Definition: PacketIter.h:189
ResPrecinctInfo * precinctInfo
Definition: PacketIter.h:192
uint32_t precWidthExp
Definition: PacketIter.h:188
PiResolution()
Definition: PacketIter.h:180
Definition: PacketIter.h:42
ResIncludeBuffers()
Definition: PacketIter.h:43
uint8_t * buffers[GRK_J2K_MAXRLVLS]
Definition: PacketIter.h:53
~ResIncludeBuffers()
Definition: PacketIter.h:48
Definition: PacketIter.h:141
uint32_t resOffsetY0PRJ
Definition: PacketIter.h:151
uint32_t precWidthExpPRJ
Definition: PacketIter.h:148
uint64_t dxPRJ
Definition: PacketIter.h:157
uint8_t resno_
Definition: PacketIter.h:161
uint32_t resInPrecGridX0
Definition: PacketIter.h:159
uint64_t precHeightPRJ
Definition: PacketIter.h:154
uint64_t dyPRJ
Definition: PacketIter.h:158
grk_rect32 winPrecGrid
Definition: PacketIter.h:166
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:153
uint64_t winPrecinctsTop_
Definition: PacketIter.h:170
uint32_t precHeightExpPRJ
Definition: PacketIter.h:149
uint64_t precHeightPRJMinusOne
Definition: PacketIter.h:155
uint32_t resInPrecGridY0
Definition: PacketIter.h:160
uint64_t innerPrecincts_
Definition: PacketIter.h:167
uint64_t winPrecinctsRight_
Definition: PacketIter.h:169
bool valid
Definition: PacketIter.h:172
uint64_t numPrecincts_
Definition: PacketIter.h:156
grk_rect32 winPrecPRJ
Definition: PacketIter.h:165
uint64_t winPrecinctsLeft_
Definition: PacketIter.h:168
uint32_t precWidthExp
Definition: PacketIter.h:146
uint32_t precHeightExp
Definition: PacketIter.h:147
ResPrecinctInfo()
Definition: PacketIter.cpp:25
uint32_t resOffsetX0PRJ
Definition: PacketIter.h:150
uint64_t winPrecinctsBottom_
Definition: PacketIter.h:171
grk_rect32 tileBoundsPrecPRJ
Definition: PacketIter.h:163
uint64_t precWidthPRJ
Definition: PacketIter.h:152
grk_rect32 tileBoundsPrecGrid
Definition: PacketIter.h:164
void print(void)
Definition: PacketIter.cpp:80
uint8_t decompLevel_
Definition: PacketIter.h:162
Definition: SparseBuffer.h:28
Tile coding parameters : this structure is used to store coding/decoding parameters common to all til...
Definition: CodingParams.h:122