Grok  9.5.0
PacketIter.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2016-2021 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 {
45  {}
46  uint32_t precinctWidthExp;
50 };
51 
55 struct PiComp
56 {
57  PiComp() : dx(0), dy(0), numresolutions(0), resolutions(nullptr) {}
58  // component sub-sampling factors
59  uint32_t dx;
60  uint32_t dy;
61  uint8_t numresolutions;
63 };
64 
65 struct ResBuf;
66 struct IncludeTracker;
67 struct PacketIter;
68 
69 struct ResBuf
70 {
72  {
73  for(uint8_t i = 0; i < GRK_J2K_MAXRLVLS; ++i)
74  buffers[i] = nullptr;
75  }
77  {
78  for(uint8_t i = 0; i < GRK_J2K_MAXRLVLS; ++i)
79  delete[] buffers[i];
80  }
82 };
84 {
85  IncludeTracker(uint16_t numcomponents)
86  : numcomps(numcomponents), currentLayer(0), currentResBuf(nullptr),
87  include(new std::map<uint16_t, ResBuf*>())
88  {}
90  {
91  clear();
92  delete include;
93  }
94  uint8_t* get_include(uint16_t layerno, uint8_t resno)
95  {
96  ResBuf* resBuf = nullptr;
97  if(layerno == currentLayer && currentResBuf)
98  {
99  resBuf = currentResBuf;
100  }
101  else
102  {
103  if(include->find(layerno) == include->end())
104  {
105  resBuf = new ResBuf;
106  include->operator[](layerno) = resBuf;
107  }
108  else
109  {
110  resBuf = include->operator[](layerno);
111  }
112  currentResBuf = resBuf;
113  currentLayer = layerno;
114  }
115  auto buf = resBuf->buffers[resno];
116  if(!buf)
117  {
118  auto numprecs = numPrecinctsPerRes[resno];
119  auto len = (numprecs * numcomps + 7) / 8;
120  buf = new uint8_t[len];
121  memset(buf, 0, len);
122  resBuf->buffers[resno] = buf;
123  }
124  return buf;
125  }
126  bool update(uint16_t layno, uint8_t resno, uint16_t compno, uint64_t precno)
127  {
128  auto include = get_include(layno, resno);
129  auto numprecs = numPrecinctsPerRes[resno];
130  uint64_t index = compno * numprecs + precno;
131  uint64_t include_index = (index >> 3);
132  uint32_t shift = (index & 7);
133  uint8_t val = include[include_index];
134  if(((val >> shift) & 1) == 0)
135  {
136  include[include_index] = (uint8_t)(val | (1 << shift));
137  return true;
138  }
139 
140  return false;
141  }
142 
143  void clear()
144  {
145  for(auto it = include->begin(); it != include->end(); ++it)
146  delete it->second;
147  include->clear();
148  }
149 
150  uint16_t numcomps;
151  uint16_t currentLayer;
154  std::map<uint16_t, ResBuf*>* include;
155 };
156 
157 class PacketManager;
158 
163 {
164  PacketIter();
165  ~PacketIter();
166 
167  void init(PacketManager* packetMan);
168 
169  uint8_t* get_include(uint16_t layerIndex);
170  bool update_include(void);
171  void destroy_include(void);
172 
177  bool next(void);
178 
179  void update_dxy(void);
180 
183 
185  uint64_t step_l;
187  uint64_t step_r;
189  uint64_t step_c;
191  uint32_t step_p;
193  uint16_t compno;
195  uint8_t resno;
197  uint64_t precinctIndex;
199  uint16_t layno;
203  uint16_t numcomps;
207  uint32_t tx0, ty0, tx1, ty1;
209  uint32_t x, y;
211  uint32_t dx, dy;
212 
213  private:
217  bool isSingleProgression(void);
218  bool generatePrecinctIndex(void);
220  void update_dxy_for_comp(PiComp* comp);
221 
226  bool next_cprl(void);
227 
232  bool next_pcrl(void);
233 
238  bool next_lrcp(void);
243  bool next_rlcp(void);
248  bool next_rpcl(void);
249 };
250 
251 /* ----------------------------------------------------------------------- */
255 
256 } // namespace grk
Definition: PacketManager.h:23
#define GRK_J2K_MAXRLVLS
Maximum number of resolution levels authorized.
Definition: grok.h:91
Copyright (C) 2016-2021 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:417
Definition: PacketIter.h:84
uint8_t * get_include(uint16_t layerno, uint8_t resno)
Definition: PacketIter.h:94
~IncludeTracker()
Definition: PacketIter.h:89
ResBuf * currentResBuf
Definition: PacketIter.h:152
uint16_t numcomps
Definition: PacketIter.h:150
std::map< uint16_t, ResBuf * > * include
Definition: PacketIter.h:154
bool update(uint16_t layno, uint8_t resno, uint16_t compno, uint64_t precno)
Definition: PacketIter.h:126
uint16_t currentLayer
Definition: PacketIter.h:151
uint64_t numPrecinctsPerRes[GRK_J2K_MAXRLVLS]
Definition: PacketIter.h:153
void clear()
Definition: PacketIter.h:143
IncludeTracker(uint16_t numcomponents)
Definition: PacketIter.h:85
Packet iterator.
Definition: PacketIter.h:163
uint32_t tx1
Definition: PacketIter.h:207
bool handledFirstInner
Definition: PacketIter.h:214
void destroy_include(void)
Definition: PacketIter.cpp:403
uint32_t ty0
Definition: PacketIter.h:207
bool next_rlcp(void)
Get next packet in resolution-layer-component-precinct order.
Definition: PacketIter.cpp:184
bool next_cprl(void)
Get next packet in component-precinct-resolution-layer order.
Definition: PacketIter.cpp:51
uint32_t ty1
Definition: PacketIter.h:207
uint8_t * get_include(uint16_t layerIndex)
Definition: PacketIter.cpp:393
uint32_t step_p
precinct step used to localize the packet in the include vector
Definition: PacketIter.h:191
uint16_t layno
layer that identify the packet
Definition: PacketIter.h:199
bool next(void)
Modify the packet iterator to point to the next packet.
Definition: PacketIter.cpp:285
uint32_t y
Definition: PacketIter.h:209
bool next_rpcl(void)
Get next packet in resolution-precinct-component-layer order.
Definition: PacketIter.cpp:229
uint32_t dy
Definition: PacketIter.h:211
uint16_t compno
component that identify the packet
Definition: PacketIter.h:193
void init(PacketManager *packetMan)
Definition: PacketIter.cpp:45
bool update_include(void)
Definition: PacketIter.cpp:397
uint32_t x
packet coordinates
Definition: PacketIter.h:209
grk_progression prog
progression order
Definition: PacketIter.h:201
PacketManager * packetManager
Definition: PacketIter.h:215
uint32_t tx0
tile bounds in canvas coordinates
Definition: PacketIter.h:207
uint32_t dx
component sub-sampling
Definition: PacketIter.h:211
uint8_t maxNumDecompositionResolutions
Definition: PacketIter.h:216
PiComp * comps
Components.
Definition: PacketIter.h:205
bool isSingleProgression(void)
Definition: PacketIter.cpp:407
bool enableTilePartGeneration
Enabling Tile part generation.
Definition: PacketIter.h:182
bool next_lrcp(void)
Get next packet in layer-resolution-component-precinct order.
Definition: PacketIter.cpp:143
uint64_t precinctIndex
precinct that identify the packet
Definition: PacketIter.h:197
bool next_pcrl(void)
Get next packet in precinct-component-resolution-layer order.
Definition: PacketIter.cpp:94
uint8_t resno
resolution that identify the packet
Definition: PacketIter.h:195
uint64_t step_l
layer step used to localize the packet in the include vector
Definition: PacketIter.h:185
uint64_t step_r
resolution step used to localize the packet in the include vector
Definition: PacketIter.h:187
uint64_t step_c
component step used to localize the packet in the include vector
Definition: PacketIter.h:189
grkRectU32 generatePrecinct(uint64_t precinctIndex)
Definition: PacketIter.cpp:342
bool generatePrecinctIndex(void)
Definition: PacketIter.cpp:305
PacketIter()
Definition: PacketIter.cpp:28
void update_dxy(void)
Definition: PacketIter.cpp:370
uint16_t numcomps
number of components in the image
Definition: PacketIter.h:203
void update_dxy_for_comp(PiComp *comp)
Definition: PacketIter.cpp:377
~PacketIter()
Definition: PacketIter.cpp:36
Packet iterator component.
Definition: PacketIter.h:56
uint32_t dx
Definition: PacketIter.h:59
uint8_t numresolutions
Definition: PacketIter.h:61
PiComp()
Definition: PacketIter.h:57
PiResolution * resolutions
Definition: PacketIter.h:62
uint32_t dy
Definition: PacketIter.h:60
Definition: PacketIter.h:42
uint32_t precinctGridHeight
Definition: PacketIter.h:49
uint32_t precinctGridWidth
Definition: PacketIter.h:48
uint32_t precinctWidthExp
Definition: PacketIter.h:46
PiResolution()
Definition: PacketIter.h:43
uint32_t precinctHeightExp
Definition: PacketIter.h:47
Definition: PacketIter.h:70
~ResBuf()
Definition: PacketIter.h:76
ResBuf()
Definition: PacketIter.h:71
uint8_t * buffers[GRK_J2K_MAXRLVLS]
Definition: PacketIter.h:81