Grok  9.7.5
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 namespace grk
24 {
33 {
35  FINAL_PASS = 1
36 };
37 
38 /***
39  * Packet iterator resolution
40  */
42 {
44  {}
45  uint32_t precWidthExp;
46  uint32_t precHeightExp;
49 };
50 
54 struct PiComp
55 {
56  PiComp() : dx(0), dy(0), numresolutions(0), resolutions(nullptr) {}
57  // component sub-sampling factors
58  uint32_t dx;
59  uint32_t dy;
60  uint8_t numresolutions;
62 };
63 
65 {
67  {
68  for(uint8_t i = 0; i < GRK_J2K_MAXRLVLS; ++i)
69  buffers[i] = nullptr;
70  }
72  {
73  for(uint8_t i = 0; i < GRK_J2K_MAXRLVLS; ++i)
74  delete[] buffers[i];
75  }
77 };
79 {
80  IncludeTracker(uint16_t numcomponents)
81  : numcomps(numcomponents), currentLayer(0), currentResBuf(nullptr),
82  include(new std::map<uint16_t, ResIncludeBuffers*>())
83  {
84  for(uint8_t i = 0; i < GRK_J2K_MAXRLVLS; ++i)
85  numPrecinctsPerRes[i] = 0;
86  }
88  {
89  clear();
90  delete include;
91  }
92  uint8_t* get_include(uint16_t layerno, uint8_t resno)
93  {
94  ResIncludeBuffers* resBuf = nullptr;
95  if(layerno == currentLayer && currentResBuf)
96  {
97  resBuf = currentResBuf;
98  }
99  else
100  {
101  if(include->find(layerno) == include->end())
102  {
103  resBuf = new ResIncludeBuffers;
104  include->operator[](layerno) = resBuf;
105  }
106  else
107  {
108  resBuf = include->operator[](layerno);
109  }
110  currentResBuf = resBuf;
111  currentLayer = layerno;
112  }
113  auto buf = resBuf->buffers[resno];
114  if(!buf)
115  {
116  auto numprecs = numPrecinctsPerRes[resno];
117  auto len = (numprecs * numcomps + 7) / 8;
118  buf = new uint8_t[len];
119  memset(buf, 0, len);
120  resBuf->buffers[resno] = buf;
121  }
122  return buf;
123  }
124  bool update(uint16_t layno, uint8_t resno, uint16_t compno, uint64_t precno)
125  {
126  auto include = get_include(layno, resno);
127  auto numprecs = numPrecinctsPerRes[resno];
128  uint64_t index = compno * numprecs + precno;
129  uint64_t include_index = (index >> 3);
130  uint32_t shift = (index & 7);
131  uint8_t val = include[include_index];
132  if(((val >> shift) & 1) == 0)
133  {
134  include[include_index] = (uint8_t)(val | (1 << shift));
135  return true;
136  }
137 
138  return false;
139  }
140  void clear()
141  {
142  for(auto it = include->begin(); it != include->end(); ++it)
143  delete it->second;
144  include->clear();
145  }
147 
148  private:
149  uint16_t numcomps;
150  uint16_t currentLayer;
152  std::map<uint16_t, ResIncludeBuffers*>* include;
153 };
154 
155 class PacketManager;
156 
157 /***
158  * Cache state of a tile component's resolution
159  * relative to the precinct grid in that resolution, and also
160  * projected onto the tile's highest resolution (PRJ)
161  */
163 {
164  ResPrecinctInfo();
165  void init(uint8_t resno, uint8_t decomplevel, grk_rect32 tileBounds, uint32_t dx, uint32_t dy,
166  bool windowed, grk_rect32 tileWindow);
167  void print(void);
168  uint32_t precWidthExp;
169  uint32_t precHeightExp;
170  uint32_t precWidthExpPRJ;
172  uint32_t resOffsetX0PRJ;
173  uint32_t resOffsetY0PRJ;
174  uint64_t precWidthPRJ;
176  uint64_t precHeightPRJ;
178  uint64_t numPrecincts_;
179  uint64_t dxPRJ;
180  uint64_t dyPRJ;
181  uint32_t resInPrecGridX0;
182  uint32_t resInPrecGridY0;
183  uint8_t resno_;
184  uint8_t decompLevel_;
189  uint64_t innerPrecincts_;
194  bool valid;
195 };
196 
201 {
202  PacketIter();
203  ~PacketIter();
204 
205  void init(PacketManager* packetMan, uint32_t pino, TileCodingParams* tcp, grk_rect32 tileBounds,
206  bool compression, uint8_t max_res, uint64_t max_precincts, uint32_t dx_min,
207  uint32_t dy_min, uint32_t* resolutionPrecinctGrid, uint32_t** precinctByComponent);
208 
209  void printStaticState(void);
210  void printDynamicState(void);
211 
218  void enableTilePartGeneration(uint32_t pino, bool first_poc_tile_part, uint32_t tppos);
219 
220  void genPrecinctInfo();
221 
222  uint8_t* get_include(uint16_t layerIndex);
223  bool update_include(void);
224  void destroy_include(void);
225 
230  bool next(SparseBuffer* src);
231  GRK_PROG_ORDER getProgression(void) const;
232  uint16_t getCompno(void) const;
233  uint8_t getResno(void) const;
234  uint64_t getPrecinctIndex(void) const;
235  uint16_t getLayno(void) const;
236 
237  private:
238  uint16_t compno;
239  uint8_t resno;
240  uint64_t precinctIndex;
241  uint16_t layno;
243  uint16_t numcomps;
245 
247  uint64_t x, y;
249  uint32_t dx, dy;
250  void update_dxy(void);
251  bool checkForRemainingValidProgression(int32_t prog, uint32_t pino, const char* progString);
252  // This packet iterator is designed so that the innermost progression
253  // is only incremented before the **next** packet is processed.
254  // i.e. it is not incremented before the very first packet is processed,
255  // but rather before all subsequent packets are processed.
256  // This flag keeps track of this state.
258 
264  // precinct top,left grid coordinates
265  uint32_t px0grid_;
266  uint32_t py0grid_;
268  bool genPrecinctY0Grid(ResPrecinctInfo* rpInfo);
269  bool genPrecinctX0Grid(ResPrecinctInfo* rpInfo);
274  bool precInfoCheck(ResPrecinctInfo* rpInfo);
275  bool generatePrecinctIndex(void);
276  void update_dxy_for_comp(PiComp* comp);
277  bool isWholeTile(void);
278 
283  bool next_cprl(SparseBuffer* src);
284  bool next_cprlOPT(SparseBuffer* src);
285 
290  bool next_pcrl(SparseBuffer* src);
291  bool next_pcrlOPT(SparseBuffer* src);
292 
297  bool next_lrcp(SparseBuffer* src);
298  bool next_lrcpOPT(SparseBuffer* src);
303  bool next_rlcp(SparseBuffer* src);
304  bool next_rlcpOPT(SparseBuffer* src);
309  bool next_rpcl(SparseBuffer* src);
310  bool next_rpclOPT(SparseBuffer* src);
311 
312  bool skipPackets(SparseBuffer* src, uint64_t numPackets);
313 };
314 
315 } // namespace grk
Definition: PacketManager.h:23
enum _GRK_PROG_ORDER GRK_PROG_ORDER
Progression order.
#define GRK_J2K_MAXRLVLS
Definition: grok.h:91
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:422
Definition: PacketIter.h:79
uint8_t * get_include(uint16_t layerno, uint8_t resno)
Definition: PacketIter.h:92
~IncludeTracker()
Definition: PacketIter.h:87
uint16_t numcomps
Definition: PacketIter.h:149
bool update(uint16_t layno, uint8_t resno, uint16_t compno, uint64_t precno)
Definition: PacketIter.h:124
uint16_t currentLayer
Definition: PacketIter.h:150
uint64_t numPrecinctsPerRes[GRK_J2K_MAXRLVLS]
Definition: PacketIter.h:146
void clear()
Definition: PacketIter.h:140
std::map< uint16_t, ResIncludeBuffers * > * include
Definition: PacketIter.h:152
IncludeTracker(uint16_t numcomponents)
Definition: PacketIter.h:80
ResIncludeBuffers * currentResBuf
Definition: PacketIter.h:151
Packet iterator.
Definition: PacketIter.h:201
bool isWholeTile(void)
Definition: PacketIter.cpp:843
void destroy_include(void)
Definition: PacketIter.cpp:648
bool genPrecinctY0GridPCRL_OPT(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:686
ResPrecinctInfo * precinctInfo_
Definition: PacketIter.h:263
bool next(SparseBuffer *src)
Modify the packet iterator to point to the next packet.
Definition: PacketIter.cpp:847
uint8_t * get_include(uint16_t layerIndex)
Definition: PacketIter.cpp:638
bool next_cprl(SparseBuffer *src)
Get next packet in component-precinct-resolution-layer order.
Definition: PacketIter.cpp:868
uint16_t layno
Definition: PacketIter.h:241
bool next_rlcpOPT(SparseBuffer *src)
Definition: PacketIter.cpp:1143
bool next_pcrl(SparseBuffer *src)
Get next packet in precinct-component-resolution-layer order.
Definition: PacketIter.cpp:906
uint16_t getCompno(void) const
Definition: PacketIter.cpp:622
bool next_rpcl(SparseBuffer *src)
Get next packet in resolution-precinct-component-layer order.
Definition: PacketIter.cpp:1039
uint32_t dy
Definition: PacketIter.h:249
uint16_t compno
Definition: PacketIter.h:238
bool update_include(void)
Definition: PacketIter.cpp:642
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:309
bool skippedLeft_
Definition: PacketIter.h:267
grk_progression prog
Definition: PacketIter.h:242
PacketManager * packetManager
Definition: PacketIter.h:259
bool genPrecinctX0Grid(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:674
uint32_t dx
component sub-sampling
Definition: PacketIter.h:249
bool genPrecinctX0GridPCRL_OPT(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:695
uint8_t maxNumDecompositionResolutions
Definition: PacketIter.h:260
uint8_t getResno(void) const
Definition: PacketIter.cpp:626
PiComp * comps
Definition: PacketIter.h:244
uint64_t y
Definition: PacketIter.h:247
uint32_t px0grid_
Definition: PacketIter.h:265
void printStaticState(void)
Definition: PacketIter.cpp:112
uint16_t getLayno(void) const
Definition: PacketIter.cpp:634
uint64_t precinctIndex
Definition: PacketIter.h:240
bool next_lrcpOPT(SparseBuffer *src)
Definition: PacketIter.cpp:1112
bool skipPackets(SparseBuffer *src, uint64_t numPackets)
Definition: PacketIter.cpp:1097
uint8_t resno
Definition: PacketIter.h:239
void printDynamicState(void)
Definition: PacketIter.cpp:126
void genPrecinctInfo()
Definition: PacketIter.cpp:144
uint64_t getPrecinctIndex(void) const
Definition: PacketIter.cpp:630
bool singleProgression_
Definition: PacketIter.h:261
bool genPrecinctY0Grid(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:663
void init(PacketManager *packetMan, uint32_t pino, TileCodingParams *tcp, grk_rect32 tileBounds, bool compression, uint8_t max_res, uint64_t max_precincts, uint32_t dx_min, uint32_t dy_min, uint32_t *resolutionPrecinctGrid, uint32_t **precinctByComponent)
Definition: PacketIter.cpp:734
void genPrecinctY0GridRPCL_OPT(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:704
bool next_lrcp(SparseBuffer *src)
Get next packet in layer-resolution-component-precinct order.
Definition: PacketIter.cpp:949
bool next_rpclOPT(SparseBuffer *src)
Definition: PacketIter.cpp:1310
bool next_rlcp(SparseBuffer *src)
Get next packet in resolution-layer-component-precinct order.
Definition: PacketIter.cpp:995
GRK_PROG_ORDER getProgression(void) const
Definition: PacketIter.cpp:618
bool compression_
Definition: PacketIter.h:262
void genPrecinctX0GridRPCL_OPT(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:708
bool generatePrecinctIndex(void)
Definition: PacketIter.cpp:206
bool next_pcrlOPT(SparseBuffer *src)
Definition: PacketIter.cpp:1250
PacketIter()
Definition: PacketIter.cpp:94
uint32_t py0grid_
Definition: PacketIter.h:266
void update_dxy(void)
Definition: PacketIter.cpp:712
uint16_t numcomps
Definition: PacketIter.h:243
void update_dxy_for_comp(PiComp *comp)
Definition: PacketIter.cpp:719
~PacketIter()
Definition: PacketIter.cpp:102
bool incrementInner
Definition: PacketIter.h:257
bool precInfoCheck(ResPrecinctInfo *rpInfo)
Definition: PacketIter.cpp:652
bool next_cprlOPT(SparseBuffer *src)
Definition: PacketIter.cpp:1175
bool checkForRemainingValidProgression(int32_t prog, uint32_t pino, const char *progString)
Check if there is a remaining valid progression order.
Definition: PacketIter.cpp:249
uint64_t x
packet coordinates
Definition: PacketIter.h:247
Packet iterator component.
Definition: PacketIter.h:55
uint32_t dx
Definition: PacketIter.h:58
uint8_t numresolutions
Definition: PacketIter.h:60
PiComp()
Definition: PacketIter.h:56
PiResolution * resolutions
Definition: PacketIter.h:61
uint32_t dy
Definition: PacketIter.h:59
Definition: PacketIter.h:42
uint32_t precinctGridHeight
Definition: PacketIter.h:48
uint32_t precinctGridWidth
Definition: PacketIter.h:47
uint32_t precHeightExp
Definition: PacketIter.h:46
uint32_t precWidthExp
Definition: PacketIter.h:45
PiResolution()
Definition: PacketIter.h:43
Definition: PacketIter.h:65
ResIncludeBuffers()
Definition: PacketIter.h:66
uint8_t * buffers[GRK_J2K_MAXRLVLS]
Definition: PacketIter.h:76
~ResIncludeBuffers()
Definition: PacketIter.h:71
Definition: PacketIter.h:163
uint32_t resOffsetY0PRJ
Definition: PacketIter.h:173
uint32_t precWidthExpPRJ
Definition: PacketIter.h:170
uint64_t dxPRJ
Definition: PacketIter.h:179
uint8_t resno_
Definition: PacketIter.h:183
uint32_t resInPrecGridX0
Definition: PacketIter.h:181
uint64_t precHeightPRJ
Definition: PacketIter.h:176
uint64_t dyPRJ
Definition: PacketIter.h:180
grk_rect32 winPrecGrid
Definition: PacketIter.h:188
uint64_t precWidthPRJMinusOne
Definition: PacketIter.h:175
void 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 winPrecinctsTop_
Definition: PacketIter.h:192
uint32_t precHeightExpPRJ
Definition: PacketIter.h:171
uint64_t precHeightPRJMinusOne
Definition: PacketIter.h:177
uint32_t resInPrecGridY0
Definition: PacketIter.h:182
uint64_t innerPrecincts_
Definition: PacketIter.h:189
uint64_t winPrecinctsRight_
Definition: PacketIter.h:191
bool valid
Definition: PacketIter.h:194
uint64_t numPrecincts_
Definition: PacketIter.h:178
grk_rect32 winPrecPRJ
Definition: PacketIter.h:187
uint64_t winPrecinctsLeft_
Definition: PacketIter.h:190
uint32_t precWidthExp
Definition: PacketIter.h:168
uint32_t precHeightExp
Definition: PacketIter.h:169
ResPrecinctInfo()
Definition: PacketIter.cpp:25
uint32_t resOffsetX0PRJ
Definition: PacketIter.h:172
uint64_t winPrecinctsBottom_
Definition: PacketIter.h:193
grk_rect32 tileBoundsPrecPRJ
Definition: PacketIter.h:185
uint64_t precWidthPRJ
Definition: PacketIter.h:174
grk_rect32 tileBoundsPrecGrid
Definition: PacketIter.h:186
void print(void)
Definition: PacketIter.cpp:76
uint8_t decompLevel_
Definition: PacketIter.h:184
Definition: SparseBuffer.h:28
Tile coding parameters : this structure is used to store coding/decoding parameters common to all til...
Definition: CodingParams.h:122