78 "Segment %p: total passes: %d, max passes: %d, calculated passes in layer: %d total "
79 "bytes: %d signalled bytes in layer: %d",
91 [](
const size_t s,
Buffer8* a) { return s + a->num_elts(); });
106 memcpy(buffer + offset, buf->buf(), buf->num_elts());
107 offset += buf->num_elts();
213 if(index ==
segs_.size())
225 void readPacketHeader(std::shared_ptr<t1_t2::BitIO> bio, uint32_t& signalledLayerDataBytes,
226 uint16_t layno, uint8_t cblk_sty)
229 uint8_t remainingPassesInLayer;
230 bio->getnumpasses(&remainingPassesInLayer);
235 uint8_t increment = bio->getcommacode();
242 if(seg ==
segs_.end() || (*seg)->totalPasses_ == (*seg)->maxPasses_)
249 auto seg =
segs_.back();
255 grklog.warn(
"Number of code block passes (%u) in packet is "
256 "suspiciously large.",
257 remainingPassesInLayer);
262 seg->calculatedPassesInLayer_[layno] = remainingPassesInLayer;
267 assert(seg->maxPasses_ >= seg->totalPasses_);
268 seg->calculatedPassesInLayer_[layno] = std::min<uint8_t>(
269 (uint8_t)(seg->maxPasses_ - seg->totalPasses_), remainingPassesInLayer);
271 if(seg->calculatedPassesInLayer_[layno] > remainingPassesInLayer)
273 grklog.warn(
"readHeader: number of segment passes %d in packet"
274 "is greater than total layer passes in packet %d ",
275 seg->calculatedPassesInLayer_[layno], remainingPassesInLayer);
281 if(bits_to_read > 16)
283 grklog.warn(
"readPacketHeader: signalled bits (%d) for layer bytes must be <= 16",
287 bio->read(seg->signalledBytesInLayer_ + layno, bits_to_read);
288 signalledLayerDataBytes += seg->signalledBytesInLayer_[layno];
289 assert(remainingPassesInLayer >= seg->calculatedPassesInLayer_[layno]);
290 remainingPassesInLayer -= seg->calculatedPassesInLayer_[layno];
293 if(remainingPassesInLayer > 0)
296 }
while(remainingPassesInLayer > 0);
318 uint8_t* layerData, uint32_t& layerDataOffset)
327 if(dSeg ==
segs_.end() || ((*dSeg)->totalPasses_ == (*dSeg)->maxPasses_))
329 if(dSeg ==
segs_.end())
340 if(((*dSeg)->signalledBytesInLayer_[layno] > remainingTilePartBytes))
346 (*dSeg)->signalledBytesInLayer_[layno] = 0;
347 (*dSeg)->totalPasses_ = 0;
350 if((*dSeg)->signalledBytesInLayer_[layno])
353 if(UINT_MAX - (*dSeg)->signalledBytesInLayer_[layno] < (*dSeg)->totalBytes_)
357 if((*dSeg)->signalledBytesInLayer_[layno] > remainingTilePartBytes)
359 grklog.warn(
"CodeblockDecompress: signalled segment bytes in layer %d exceeds remaining"
360 "tile part bytes %d. Packet is trancated.",
361 (*dSeg)->signalledBytesInLayer_[layno], remainingTilePartBytes);
363 (*dSeg)->signalledBytesInLayer_[layno] = (uint16_t)remainingTilePartBytes;
367 (*dSeg)->data_chunks_.push_back(
new Buffer8(layerData + layerDataOffset,
368 (*dSeg)->signalledBytesInLayer_[layno],
false));
369 layerDataOffset += (*dSeg)->signalledBytesInLayer_[layno];
372 (*dSeg)->totalBytes_ += (*dSeg)->signalledBytesInLayer_[layno];
373 assert(remainingTilePartBytes >= (*dSeg)->signalledBytesInLayer_[layno]);
374 remainingTilePartBytes -= (*dSeg)->signalledBytesInLayer_[layno];
378 (*dSeg)->totalPasses_ += (*dSeg)->calculatedPassesInLayer_[layno];
379 assert(signalledPassesInLayer >= (*dSeg)->calculatedPassesInLayer_[layno]);
380 signalledPassesInLayer -= (*dSeg)->calculatedPassesInLayer_[layno];
383 if(signalledPassesInLayer > 0)
386 }
while(dSeg !=
segs_.end() && signalledPassesInLayer > 0);
416 for(
auto& bc : (*seg)->data_chunks_)
441 bool decompress(T* coder, uint8_t orientation, uint32_t cblksty)
452 auto segBegin =
segs_.begin();
462 if(
passno_ == (*seg)->totalPasses_ &&
466 coder->decompressInitOrientation(orientation);
557 for(
const auto& segment :
segs_)
559 if(!segment->data_chunks_.empty())
574 size_t total_length = 0;
575 for(
auto s =
segs_.begin(); s !=
segs_.end(); ++s)
576 total_length += (*s)->getDataChunksLength();
593 for(
auto s =
segs_.begin(); s !=
segs_.end(); ++s)
594 offset += (*s)->copyDataChunksToContiguous(buffer + offset);
623 auto seg =
segs_.back();
631 if(
segs_.size() == 1)
633 seg->maxPasses_ = 10;
637 auto prev_segment =
segs_.end() - 2;
639 (((*prev_segment)->maxPasses_ == 1) || ((*prev_segment)->maxPasses_ == 10)) ? 2 : 1;
#define T1_TYPE_MQ
Definition CodeblockDecompressImpl.h:401
#define T1_TYPE_RAW
Definition CodeblockDecompressImpl.h:402
Definition Codeblock.h:37
#define GRK_CBLKSTY_TERMALL
Definition grok.h:1886
#define GRK_CBLKSTY_LAZY
Definition grok.h:1884
Definition SchedulerFreebyrd.h:36
ILogger & grklog
Definition Logger.cpp:24
static uint8_t floorlog2(uint32_t a)
Get logarithm of an integer and round downwards.
Definition intmath.h:74
const uint8_t maxPassesPerSegmentJ2K
Definition CodeStreamLimits.h:28
const uint32_t maxBitPlanesJ2K
Definition CodeStreamLimits.h:35
Buffer< uint8_t, AllocatorVanilla > Buffer8
Definition buffer.h:257
uint16_t num_buffers_
Number of buffers.
Definition CodeblockDecompressImpl.h:680
std::vector< Segment * >::iterator toBeDecompressedEnd()
Iterator pointing one location past the last Segment whose data has been parsed.
Definition CodeblockDecompressImpl.h:192
void init()
Initializes the code block.
Definition CodeblockDecompressImpl.h:174
bool needsSegInit_
decompression: segment needs initialization
Definition CodeblockDecompressImpl.h:701
uint8_t ** buffers_
Array of pointers to buffers.
Definition CodeblockDecompressImpl.h:670
bool dataChunksEmpty()
Checks whether all segments' data chunks are empty.
Definition CodeblockDecompressImpl.h:555
uint8_t numDataParsedSegments_
Number of segments whose data has been read from their respective layers.
Definition CodeblockDecompressImpl.h:657
uint32_t compressDataOffset_
offset into contiguous buffer of compressed data
Definition CodeblockDecompressImpl.h:693
std::vector< Segment * > segs_
Collection of Segment.
Definition CodeblockDecompressImpl.h:665
void newSegment(uint8_t cblk_sty)
Creates a new Segment.
Definition CodeblockDecompressImpl.h:620
bool copyDataChunksToContiguous(uint8_t *buffer) const
Copies all segment data chunk buffers for all uncompressed segments whose data has been parsed,...
Definition CodeblockDecompressImpl.h:587
std::vector< Segment * >::iterator nextDataParsedSegment(void)
Increments to next segment whose data is going to be parsed.
Definition CodeblockDecompressImpl.h:537
uint16_t dataParsedLayers_
number of layers whose data has been parsed
Definition CodeblockDecompressImpl.h:710
bool needsSegUpdate_
decompression: segment needs update, as more packets have been parsed
Definition CodeblockDecompressImpl.h:706
Segment * getSegment(uint16_t index)
Gets segment for the specified index If index equals number of segments, then a new segment will be a...
Definition CodeblockDecompressImpl.h:211
void setNumBps(uint8_t bps)
Sets number of bit planes to be decompressed.
Definition CodeblockDecompressImpl.h:200
uint8_t passno_
decompression: current pass number
Definition CodeblockDecompressImpl.h:697
uint8_t numDecompressedSegments_
Number of decompressed segments.
Definition CodeblockDecompressImpl.h:661
bool decompress(T *coder, uint8_t orientation, uint32_t cblksty)
Decompresses all layers specified so far.
Definition CodeblockDecompressImpl.h:441
std::vector< Segment * >::iterator currHeaderParsedSegment(void)
Gets iterator pointing to current segment being populated by packet header.
Definition CodeblockDecompressImpl.h:546
bool canDecompress(void)
Definition CodeblockDecompressImpl.h:425
void readPacketHeader(std::shared_ptr< t1_t2::BitIO > bio, uint32_t &signalledLayerDataBytes, uint16_t layno, uint8_t cblk_sty)
Reads packet header.
Definition CodeblockDecompressImpl.h:225
void parsePacketData(uint16_t layno, size_t &remainingTilePartBytes, bool isHT, uint8_t *layerData, uint32_t &layerDataOffset)
Parses packet data based on packet header.
Definition CodeblockDecompressImpl.h:317
~CodeblockDecompressImpl()
Destroys a CodeblockDecompressImpl.
Definition CodeblockDecompressImpl.h:165
void nextToBeDecompressedSegment(std::vector< Segment * >::iterator &s)
Increments iterator for next segment to be decompressed.
Definition CodeblockDecompressImpl.h:393
uint16_t getNumDataParsedSegments(void)
Gets number of segments whose layer data has been parsed.
Definition CodeblockDecompressImpl.h:521
uint8_t bitPlanesToDecompress_
Remaining bit planes to decompress.
Definition CodeblockDecompressImpl.h:685
CodeblockDecompressImpl(uint16_t numLayers)
Constructs a CodeblockDecompressImpl.
Definition CodeblockDecompressImpl.h:156
size_t getDataChunksLength() const
Gets combined length of all data chunks across all uncompressed segments whose datg has been parsed.
Definition CodeblockDecompressImpl.h:572
uint32_t * buffer_lengths_
Array of buffer lengths.
Definition CodeblockDecompressImpl.h:675
std::vector< Segment * >::iterator toBeDecompressedBegin()
Iterator pointing to the beginning of the segments yet to be decompressed.
Definition CodeblockDecompressImpl.h:183
std::vector< Segment * >::iterator currDataParsedSegment(void)
Gets iterator pointing to current segment whose layer data is being parsed.
Definition CodeblockDecompressImpl.h:529
uint8_t passtype_
Type of pass: cleanup, magnitude refinement or significance propagation.
Definition CodeblockDecompressImpl.h:689
void prepareBufferList(std::vector< Segment * >::iterator seg)
Definition CodeblockDecompressImpl.h:404
void release()
Releases resources.
Definition CodeblockDecompressImpl.h:603
uint16_t numLayers_
Definition CodeblockImpl.h:80
uint8_t * signalledPassesByLayer_
Definition CodeblockImpl.h:79
CodeblockImpl(uint16_t numLayers)
Definition CodeblockImpl.h:25
void init()
Definition CodeblockImpl.h:70
void setNumLenBits(uint8_t bits)
Definition CodeblockImpl.h:64
uint8_t numbps_
Definition CodeblockImpl.h:77
uint8_t numlenbits()
Definition CodeblockImpl.h:60
Stores information for a code block segment.
Definition CodeblockDecompressImpl.h:40
uint16_t numLayers_
Number of layers for this code block.
Definition CodeblockDecompressImpl.h:116
~Segment(void)
Destroys a Segment.
Definition CodeblockDecompressImpl.h:54
uint8_t * calculatedPassesInLayer_
Number of passes contributed by layer, calculated by decompress codeblock when parsing packet header.
Definition CodeblockDecompressImpl.h:131
std::vector< Buffer8 * > data_chunks_
Definition CodeblockDecompressImpl.h:143
void clear()
Clears a Segment.
Definition CodeblockDecompressImpl.h:63
size_t getDataChunksLength() const
Gets combined length of all data chunks.
Definition CodeblockDecompressImpl.h:88
size_t copyDataChunksToContiguous(uint8_t *buffer) const
Copies data chunks into a single contiguous buffer.
Definition CodeblockDecompressImpl.h:99
uint8_t maxPasses_
Maximum number of passes in this code block This is determined by the code block style i....
Definition CodeblockDecompressImpl.h:126
uint32_t totalBytes_
Total number of bytes in segment.
Definition CodeblockDecompressImpl.h:136
Segment(uint16_t numlayers)
Constructs a Segment.
Definition CodeblockDecompressImpl.h:44
uint16_t * signalledBytesInLayer_
Number of bytes signalled by layer.
Definition CodeblockDecompressImpl.h:141
void print(uint16_t layno)
Definition CodeblockDecompressImpl.h:75
uint8_t totalPasses_
Running total of number of passes across multiple layers.
Definition CodeblockDecompressImpl.h:121