Grok  9.5.0
TileProcessor.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 #include "grk_includes.h"
24 #include <queue>
25 #include <mutex>
26 
27 namespace grk
28 {
29 /*
30  * Tile structure.
31  *
32  * Tile bounds are in canvas coordinates, and are equal to the
33  * full, non-windowed, unreduced tile dimensions,
34  * while the component dimensions are reduced
35  * if there is a resolution reduction.
36  *
37  */
38 struct Tile : public grkRectU32
39 {
40  Tile();
41  ~Tile();
42  uint16_t numcomps;
44  double distortion;
48 };
49 
51 {
52  PacketTracker();
54  void init(uint32_t numcomps, uint32_t numres, uint64_t numprec, uint32_t numlayers);
55  void clear(void);
56  void packet_encoded(uint32_t comps, uint32_t res, uint64_t prec, uint32_t layer);
57  bool is_packet_encoded(uint32_t comps, uint32_t res, uint64_t prec, uint32_t layer);
58 
59  private:
60  uint8_t* bits;
61 
62  uint32_t m_numcomps;
63  uint32_t m_numres;
64  uint64_t m_numprec;
65  uint32_t m_numlayers;
66 
67  uint64_t get_buffer_len(uint32_t numcomps, uint32_t numres, uint64_t numprec,
68  uint32_t numlayers);
69  uint64_t index(uint32_t comps, uint32_t res, uint64_t prec, uint32_t layer);
70 };
71 
77 {
78  explicit TileProcessor(CodeStream* codeStream, IBufferedStream* stream, bool isCompressor,
81  bool init(void);
82  bool allocWindowBuffers(const GrkImage* outputImage);
83  void deallocBuffers();
84  bool preCompressTile(void);
85  bool canWritePocMarker(void);
86  bool writeTilePartT2(uint32_t* tileBytesWritten);
87  bool doCompress(void);
88  bool decompressT1(void);
89  bool decompressT2(SparseBuffer* srcBuf);
90  bool decompressT2T1(TileCodingParams* tcp, GrkImage* outputImage, bool multiTile, bool doPost);
91  bool ingestUncompressedData(uint8_t* p_src, uint64_t src_length);
92  bool needsRateControl();
93  void ingestImage();
95  void generateImage(GrkImage* src_image, Tile* src_tile);
96  GrkImage* getImage(void);
97  void setCorruptPacket(void);
101  uint8_t getMaxNumDecompressResolutions(void);
102  IBufferedStream* getStream(void);
103  uint32_t getPreCalculatedTileLen(void);
104  bool canPreCalculateTileLen(void);
105 
107  uint16_t m_tileIndex;
116  // Decompressing Only
123  uint32_t pino;
127  // true if whole tile will be decoded; false if tile window will be decoded
131 
132  private:
133  // Compressing only - track which packets have already been written
134  // to the code stream
140  // coding/decoding parameters for this tile
142  bool isWholeTileDecompress(uint32_t compno);
143  bool needsMctDecompress(uint32_t compno);
144  bool mctDecompress();
145  bool dcLevelShiftDecompress();
146  bool dcLevelShiftCompress();
147  bool mct_encode();
148  bool dwt_encode();
149  void t1_encode();
150  bool encodeT2(uint32_t* packet_bytes_written);
151  bool rateAllocate(uint32_t* allPacketBytes);
152  bool layerNeedsRateControl(uint32_t layno);
154  void makeLayerFinal(uint32_t layno);
155  bool pcrdBisectSimple(uint32_t* p_data_written);
156  void makeLayerSimple(uint32_t layno, double thresh, bool final);
157  bool pcrdBisectFeasible(uint32_t* p_data_written);
158  void makeLayerFeasible(uint32_t layno, uint16_t thresh, bool final);
159  bool truncated;
164 };
165 
167 {
168  bool operator()(const TileProcessor* a, const TileProcessor* b) const
169  {
170  return a->m_tileIndex > b->m_tileIndex;
171  }
172 };
173 
175 {
176  public:
178  void push(TileProcessor* val)
179  {
180  std::lock_guard<std::mutex> lock(queue_mutex);
181  queue.push(val);
182  }
184  {
185  std::lock_guard<std::mutex> lock(queue_mutex);
186  if(queue.empty())
187  return nullptr;
188  auto val = queue.top();
189  if(val->m_tileIndex <= nextTileIndex)
190  {
191  queue.pop();
192  if(val->m_tileIndex == nextTileIndex)
193  nextTileIndex++;
194  return val;
195  }
196  return nullptr;
197  }
198  bool empty(void)
199  {
200  std::lock_guard<std::mutex> lock(queue_mutex);
201  return queue.empty();
202  }
203 
204  private:
205  std::priority_queue<TileProcessor*, std::vector<TileProcessor*>, TileProcessorComparator> queue;
206  std::mutex queue_mutex;
207  uint16_t nextTileIndex;
208 };
209 
210 } // namespace grk
Definition: CodeStreamDecompress.h:38
Definition: CodeStream.h:128
Definition: GrkImage.h:19
Definition: PacketLengthCache.h:24
Definition: TileProcessor.h:175
void push(TileProcessor *val)
Definition: TileProcessor.h:178
std::priority_queue< TileProcessor *, std::vector< TileProcessor * >, TileProcessorComparator > queue
Definition: TileProcessor.h:205
std::mutex queue_mutex
Definition: TileProcessor.h:206
TileProcessorMinHeap()
Definition: TileProcessor.h:177
bool empty(void)
Definition: TileProcessor.h:198
uint16_t nextTileIndex
Definition: TileProcessor.h:207
TileProcessor * pop(void)
Definition: TileProcessor.h:183
Copyright (C) 2016-2021 Grok Image Compression Inc.
Definition: ICacheable.h:20
const uint16_t maxCompressLayersGRK
Definition: CodeStreamLimits.h:43
Plugin tile.
Definition: grok.h:1096
Coding parameters.
Definition: CodingParams.h:242
Definition: IBufferedStream.h:20
Definition: TileProcessor.h:51
uint8_t * bits
Definition: TileProcessor.h:60
void init(uint32_t numcomps, uint32_t numres, uint64_t numprec, uint32_t numlayers)
Definition: TileProcessor.cpp:1567
uint64_t m_numprec
Definition: TileProcessor.h:64
bool is_packet_encoded(uint32_t comps, uint32_t res, uint64_t prec, uint32_t layer)
Definition: TileProcessor.cpp:1612
uint32_t m_numres
Definition: TileProcessor.h:63
PacketTracker()
Definition: TileProcessor.cpp:1560
uint64_t get_buffer_len(uint32_t numcomps, uint32_t numres, uint64_t numprec, uint32_t numlayers)
Definition: TileProcessor.cpp:1592
void clear(void)
Definition: TileProcessor.cpp:1587
uint64_t index(uint32_t comps, uint32_t res, uint64_t prec, uint32_t layer)
Definition: TileProcessor.cpp:1624
void packet_encoded(uint32_t comps, uint32_t res, uint64_t prec, uint32_t layer)
Definition: TileProcessor.cpp:1599
~PacketTracker()
Definition: TileProcessor.cpp:1563
uint32_t m_numcomps
Definition: TileProcessor.h:62
uint32_t m_numlayers
Definition: TileProcessor.h:65
Definition: SparseBuffer.h:28
Tile coding parameters : this structure is used to store coding/decoding parameters common to all til...
Definition: CodingParams.h:122
Definition: TileComponent.h:28
Definition: TileProcessor.h:39
uint16_t numcomps
Definition: TileProcessor.h:42
Tile()
Definition: TileProcessor.cpp:1550
~Tile()
Definition: TileProcessor.cpp:1556
TileComponent * comps
Definition: TileProcessor.h:43
uint64_t numProcessedPackets
Definition: TileProcessor.h:46
double layerDistoration[maxCompressLayersGRK]
Definition: TileProcessor.h:45
uint64_t numDecompressedPackets
Definition: TileProcessor.h:47
double distortion
Definition: TileProcessor.h:44
Definition: TileProcessor.h:167
bool operator()(const TileProcessor *a, const TileProcessor *b) const
Definition: TileProcessor.h:168
Tile processor for decompression and compression.
Definition: TileProcessor.h:77
bool rateAllocate(uint32_t *allPacketBytes)
Definition: TileProcessor.cpp:968
bool allocWindowBuffers(const GrkImage *outputImage)
Definition: TileProcessor.cpp:165
~TileProcessor()
Definition: TileProcessor.cpp:40
bool decompressT2T1(TileCodingParams *tcp, GrkImage *outputImage, bool multiTile, bool doPost)
Definition: TileProcessor.cpp:413
GrkImage * getImage(void)
Definition: TileProcessor.cpp:65
uint32_t getPreCalculatedTileLen(void)
Definition: TileProcessor.cpp:50
void t1_encode()
Definition: TileProcessor.cpp:622
CodingParams * m_cp
Definition: TileProcessor.h:129
TileCodingParams * m_tcp
Definition: TileProcessor.h:141
bool mct_encode()
Definition: TileProcessor.cpp:574
PacketTracker m_packetTracker
Definition: TileProcessor.h:135
uint32_t tilePartDataLength
Definition: TileProcessor.h:117
bool pcrdBisectFeasible(uint32_t *p_data_written)
Definition: TileProcessor.cpp:1092
PacketLengthCache packetLengthCache
Definition: TileProcessor.h:130
bool m_first_poc_tile_part
Compressing Only true for first POC tile part, otherwise false.
Definition: TileProcessor.h:110
bool needsRateControl()
Definition: TileProcessor.cpp:990
Tile * tile
Definition: TileProcessor.h:124
TileCodingParams * getTileCodingParams(void)
Definition: TileProcessor.cpp:77
void makeLayerFeasible(uint32_t layno, uint16_t thresh, bool final)
Definition: TileProcessor.cpp:1010
uint8_t numTilePartsTotal
Compressing Only Total number of tile parts of the tile.
Definition: TileProcessor.h:120
uint8_t m_tilePartIndexCounter
Compressing Only index of tile part being currently coding.
Definition: TileProcessor.h:115
PacketTracker * getPacketTracker(void)
Definition: TileProcessor.cpp:73
GrkImage * headerImage
Definition: TileProcessor.h:125
bool dcLevelShiftCompress()
Definition: TileProcessor.cpp:531
uint32_t pino
Compressing Only Current packet iterator number.
Definition: TileProcessor.h:123
bool truncated
Definition: TileProcessor.h:159
GrkImage * m_image
Definition: TileProcessor.h:160
void makeLayerFinal(uint32_t layno)
Definition: TileProcessor.cpp:1494
void generateImage(GrkImage *src_image, Tile *src_tile)
Definition: TileProcessor.cpp:59
TileProcessor(CodeStream *codeStream, IBufferedStream *stream, bool isCompressor, bool isWholeTileDecompress)
Definition: TileProcessor.cpp:24
IBufferedStream * getStream(void)
Definition: TileProcessor.cpp:46
bool wholeTileDecompress
Definition: TileProcessor.h:128
bool preCompressTile(void)
Definition: TileProcessor.cpp:753
bool m_isCompressor
Definition: TileProcessor.h:161
void deallocBuffers()
Definition: TileProcessor.cpp:196
grkRectU32 getUnreducedTileWindow(void)
Definition: TileProcessor.cpp:191
bool decompressT1(void)
Definition: TileProcessor.cpp:357
bool canWritePocMarker(void)
Definition: TileProcessor.cpp:285
uint32_t preCalculatedTileLen
Definition: TileProcessor.h:163
void setCorruptPacket(void)
Definition: TileProcessor.cpp:69
bool encodeT2(uint32_t *packet_bytes_written)
Definition: TileProcessor.cpp:647
bool doCompress(void)
Definition: TileProcessor.cpp:204
grkRectU32 unreducedTileWindow
Definition: TileProcessor.h:162
uint16_t m_tileIndex
index of tile being currently compressed/decompressed
Definition: TileProcessor.h:107
uint8_t getMaxNumDecompressResolutions(void)
Definition: TileProcessor.cpp:81
bool layerNeedsRateControl(uint32_t layno)
Definition: TileProcessor.cpp:984
bool ingestUncompressedData(uint8_t *p_src, uint64_t src_length)
Definition: TileProcessor.cpp:811
bool init(void)
Definition: TileProcessor.cpp:98
grk_plugin_tile * current_plugin_tile
Definition: TileProcessor.h:126
bool dwt_encode()
Definition: TileProcessor.cpp:606
bool dcLevelShiftDecompress()
Definition: TileProcessor.cpp:514
bool isWholeTileDecompress(uint32_t compno)
Returns whether a tile component should be fully decompressed, taking into account win_* members.
Definition: TileProcessor.cpp:312
bool writeTilePartT2(uint32_t *tileBytesWritten)
Definition: TileProcessor.cpp:292
bool makeSingleLosslessLayer()
Definition: TileProcessor.cpp:1001
bool decompressT2(SparseBuffer *srcBuf)
Definition: TileProcessor.cpp:328
void makeLayerSimple(uint32_t layno, double thresh, bool final)
Definition: TileProcessor.cpp:1401
bool pcrdBisectSimple(uint32_t *p_data_written)
Definition: TileProcessor.cpp:1230
bool prepareSodDecompress(CodeStreamDecompress *codeStream)
Definition: TileProcessor.cpp:868
bool mctDecompress()
Definition: TileProcessor.cpp:484
IBufferedStream * m_stream
Definition: TileProcessor.h:136
void ingestImage()
Definition: TileProcessor.cpp:437
bool m_corrupt_packet
Definition: TileProcessor.h:137
bool canPreCalculateTileLen(void)
Definition: TileProcessor.cpp:54
uint32_t newTilePartProgressionPosition
position of the tile part flag in progression order
Definition: TileProcessor.h:139
bool needsMctDecompress(uint32_t compno)
Definition: TileProcessor.cpp:459