Grok 20.3.2
CodingParams.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016-2026 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
18#pragma once
19
20#include <memory>
21#include <mutex>
22
23#include "PacketCache.h"
24
25namespace grk
26{
27
28typedef void (*mct_function)(const void* p_src_data, void* p_dest_data, uint64_t nb_elem);
39
49
54{
57 uint8_t csty_;
61 uint8_t cblkw_expn_;
63 uint8_t cblkh_expn_;
65 uint8_t cblkStyle_;
67 uint8_t qmfbid_;
68 // true if quantization marker has been read for this component,
69 // false otherwise
71 // true if quantization marker was read from QCC otherwise false
73 // true if quantization marker was read from tile header
76 uint8_t qntsty_;
79 // number of step sizes read from QCC marker
82 uint8_t numgbits_;
84 uint8_t roishift_;
91};
92
104
116
124{
125 explicit TileCodingParams(CodingParams* cp);
129
130 bool advanceTilePartCounter(uint16_t tileIndex, uint8_t tilePartIndex);
131 bool initDefault(GrkImage* headerImage);
132
139 bool readPpt(uint8_t* headerData, uint16_t headerSize);
140
146 bool mergePpt(void);
147
155 bool readSPCodSPCoc(uint16_t compno, uint8_t* headerData, uint16_t* headerSize);
156
168 bool readSQcdSQcc(bool fromTileHeader, bool fromQCC, uint16_t compno, uint8_t* headerData,
169 uint16_t* headerSize);
170
177 bool readCod(uint8_t* headerData, uint16_t headerSize);
178
185 bool readCoc(uint8_t* headerData, uint16_t headerSize);
186
194 bool readQcd(bool fromTileHeader, uint8_t* headerData, uint16_t headerSize);
195
203 bool readQcc(bool fromTileHeader, uint8_t* headerData, uint16_t headerSize);
204
211 bool readRgn(uint8_t* headerData, uint16_t headerSize);
212
220 bool readPoc(uint8_t* headerData, uint16_t headerSize, int tilePartIndex);
221
228 bool readMct(uint8_t* headerData, uint16_t headerSize);
229
236 bool readMco(uint8_t* headerData, uint16_t headerSize);
237
244 bool readMcc(uint8_t* headerData, uint16_t headerSize);
245
246 bool addMct(uint32_t index);
247
248 void updateLayersToDecompress(void);
249
250 bool validateQuantization(void);
251
252 void setIsHT(bool ht, bool reversible, uint8_t guardBits);
253 bool isHT(void);
254 uint32_t getNumProgressions(void);
255 bool hasPoc(void);
256 void finalizePocs(void);
257
258 CodingParams* cp_ = nullptr;
259
261
263 uint8_t csty_ = 0;
267 uint16_t numLayers_ = 0;
268 /* layers slated for decompression */
271 uint8_t mct_ = 0;
275 uint32_t numpocs_ = 0;
279 uint32_t pptMarkersCount_ = 0;
283 uint8_t* pptData_ = nullptr;
285 uint8_t* pptBuffer_ = nullptr;
287 size_t pptLength_ = 0;
290 // quantization style as read from main QCD marker
291 uint32_t mainQcdQntsty = 0;
292 // number of step sizes as read from main QCD marker
296 // tile part counter
297 // NOTES: tile parts must appear in code stream in strictly increasing
298 // order
299 uint8_t tilePartCounter_ = 0;
302 // packets
305 double* mct_norms_ = nullptr;
307 float* mctDecodingMatrix_ = nullptr;
309 float* mctCodingMatrix_ = nullptr;
313 uint32_t numMctRecords_ = 0;
315 uint32_t numMaxMctRecords_ = 0;
319 uint32_t numMccRecords_ = 0;
321 uint32_t numMaxMccRecords_ = 0;
323 uint32_t cod_ = 0;
325 bool ppt_ = false;
326 Quantizer* qcd_ = nullptr;
327 uint16_t numComps_ = 0;
328
329private:
330 bool ht_ = false;
331 std::mutex pocMutex_;
332 std::vector<std::vector<grk_progression>> pocLists_;
333};
334
336{
350 /* write plt marker */
352 /* write TLM marker */
354 /* rate control algorithm */
356};
357
370
371struct TLMMarker;
372
374{
375public:
377
378 TileCodingParams* get(uint16_t tileIndex)
379 {
380 std::unique_lock<std::mutex> lock(mutex_);
381 auto it = tileMap_.find(tileIndex);
382
383 if(it == tileMap_.end()) // Check if tile exists
384 {
385 auto tcp = std::make_unique<TileCodingParams>(nullptr);
386 it = tileMap_.emplace(tileIndex, std::move(tcp)).first;
387 }
388 return it->second.get(); // Return raw pointer
389 }
390
391private:
392 std::unordered_map<uint16_t, std::unique_ptr<TileCodingParams>> tileMap_;
393 mutable std::mutex mutex_; // Mutex for thread safety
394};
395
396class TileCache;
397
402{
403 CodingParams();
405 Rect32 getTileBounds(Rect32 imageBounds, uint16_t tile_x, uint16_t tile_y) const;
406
413 bool readCom(uint8_t* headerData, uint16_t headerSize);
414
420 uint8_t getNumTilePartsFromTLM(uint16_t tileIndex) const noexcept;
421
422 bool hasTLM(void) const noexcept;
423
424 void init(grk_decompress_parameters* parameters, std::unique_ptr<TileCache>& tileCache);
425
426 uint16_t rsiz_;
427 uint32_t pcap_; /* Pcap */
428 uint16_t ccap_[32]; /* Ccap */
429 uint32_t tx0_;
430 uint32_t ty0_;
431 uint32_t t_width_;
432 uint32_t t_height_;
433 std::mutex commentMutex;
438 uint16_t t_grid_width_;
439 uint16_t t_grid_height_;
440
441 double dw_x0 = 0; /* decompress window left boundary*/
442 double dw_x1 = 0; /* decompress window right boundary*/
443 double dw_y0 = 0; /* decompress window top boundary*/
444 double dw_y1 = 0; /* decompress window bottom boundary*/
445 std::unique_ptr<PPMMarker> ppmMarkers_;
447 union
448 {
453 std::vector<uint16_t> compsToDecompress_;
454 std::unique_ptr<TLMMarker> tlmMarkers_;
455 std::unique_ptr<PLMarker> plmMarkers_;
460 /* packet info recording for transcode (PLT, SOP/EPH, filtering, reorder) */
462 {
463 uint16_t compno;
464 uint8_t resno;
465 uint16_t layno;
467 uint32_t totalLength; /* header + data */
468 uint32_t headerLength; /* header only (for EPH injection) */
469 };
471 std::vector<std::vector<RecordedPacketInfo>> recordedPacketInfo_; /* [tileIndex] → packets */
472};
473
474} // namespace grk
Stores header and data for an image.
Definition GrkImage.h:54
Manages packet buffers and associated packet parsers.
Definition PacketCache.h:30
Caches tile processors so that repeated decompress calls on the same codec can reuse SOT metadata,...
Definition TileCache.h:108
Definition CodingParams.h:374
std::mutex mutex_
Definition CodingParams.h:393
std::unordered_map< uint16_t, std::unique_ptr< TileCodingParams > > tileMap_
Definition CodingParams.h:392
TileCodingParams * get(uint16_t tileIndex)
Definition CodingParams.h:378
void(* grk_decompress_callback)(void *codec, uint16_t tile_index, grk_image *tile_image, uint8_t reduction, void *user_data)
Callback called when decompression of a tile has completed.
Definition grok.h:653
#define GRK_NUM_COMMENTS_SUPPORTED
maximum Grok supported number of comments
Definition grok.h:130
#define GRK_MAXRLVLS
Definition grok.h:336
enum _GRK_PROG_ORDER GRK_PROG_ORDER
Environment variables.
#define GRK_MAXBANDS
Definition grok.h:338
@ GRK_PROG_UNKNOWN
Definition grok.h:75
ResWindow.
Definition CompressedChunkCache.h:36
const uint16_t maxCompressLayersGRK
Definition CodeStreamLimits.h:40
void(* mct_function)(const void *p_src_data, void *p_dest_data, uint64_t nb_elem)
Definition CodingParams.h:28
MCT_ELEMENT_TYPE
Type of elements storing in the MCT data.
Definition CodingParams.h:33
@ MCT_TYPE_FLOAT
MCT data is stored as signed integers.
Definition CodingParams.h:36
@ MCT_TYPE_INT16
Definition CodingParams.h:34
@ MCT_TYPE_INT32
MCT data is stored as signed shorts.
Definition CodingParams.h:35
@ MCT_TYPE_DOUBLE
MCT data is stored as floats.
Definition CodingParams.h:37
Rect< uint32_t > Rect32
Definition geometry.h:64
MCT_ARRAY_TYPE
Type of MCT array.
Definition CodingParams.h:44
@ MCT_TYPE_OFFSET
Definition CodingParams.h:47
@ MCT_TYPE_DECORRELATION
Definition CodingParams.h:46
@ MCT_TYPE_DEPENDENCY
Definition CodingParams.h:45
Definition CodingParams.h:462
uint32_t totalLength
Definition CodingParams.h:467
uint16_t layno
Definition CodingParams.h:465
uint16_t compno
Definition CodingParams.h:463
uint8_t resno
Definition CodingParams.h:464
uint64_t precinctIndex
Definition CodingParams.h:466
uint32_t headerLength
Definition CodingParams.h:468
Coding parameters.
Definition CodingParams.h:402
void init(grk_decompress_parameters *parameters, std::unique_ptr< TileCache > &tileCache)
Definition CodingParams.cpp:176
uint32_t tx0_
Definition CodingParams.h:429
uint16_t ccap_[32]
Definition CodingParams.h:428
CodingParams()
Definition CodingParams.cpp:161
std::unique_ptr< TLMMarker > tlmMarkers_
Definition CodingParams.h:454
uint16_t t_grid_height_
number of tiles in width
Definition CodingParams.h:439
bool isBinaryComment_[GRK_NUM_COMMENTS_SUPPORTED]
Definition CodingParams.h:437
double dw_y1
Definition CodingParams.h:444
std::unique_ptr< PPMMarker > ppmMarkers_
Definition CodingParams.h:445
union grk::CodingParams::@340150172207352055302072176131177222273307310033 codingParams_
default tile coding parameters
std::unique_ptr< PLMarker > plmMarkers_
Definition CodingParams.h:455
TileCodingParamsPool tcps_
Definition CodingParams.h:446
uint32_t t_height_
XTsiz.
Definition CodingParams.h:432
DecodingParams dec_
Definition CodingParams.h:449
bool readCom(uint8_t *headerData, uint16_t headerSize)
Reads a COM marker (comments).
Definition CodingParams.cpp:235
EncodingParams enc_
Definition CodingParams.h:450
std::vector< std::vector< RecordedPacketInfo > > recordedPacketInfo_
Definition CodingParams.h:471
double dw_x0
number of tiles in height
Definition CodingParams.h:441
size_t numComments_
Definition CodingParams.h:434
bool asynchronous_
Definition CodingParams.h:456
grk_decompress_callback decompressCallback_
Definition CodingParams.h:458
uint8_t getNumTilePartsFromTLM(uint16_t tileIndex) const noexcept
Gets the number of tile parts for a given tile index from TLM marker.
Definition CodingParams.cpp:210
bool hasTLM(void) const noexcept
Definition CodingParams.cpp:206
double dw_y0
Definition CodingParams.h:443
uint16_t commentLength_[GRK_NUM_COMMENTS_SUPPORTED]
Definition CodingParams.h:436
bool recordPacketLengths_
Definition CodingParams.h:470
uint32_t pcap_
Rsiz.
Definition CodingParams.h:427
bool simulate_synchronous_
Definition CodingParams.h:457
void * decompressCallbackUserData_
Definition CodingParams.h:459
std::vector< uint16_t > compsToDecompress_
Component indices to decode during decompression.
Definition CodingParams.h:453
uint16_t t_grid_width_
Definition CodingParams.h:438
uint32_t ty0_
XTOsiz.
Definition CodingParams.h:430
uint16_t rsiz_
Definition CodingParams.h:426
double dw_x1
Definition CodingParams.h:442
uint32_t t_width_
YTOsiz.
Definition CodingParams.h:431
char * comment_[GRK_NUM_COMMENTS_SUPPORTED]
comments
Definition CodingParams.h:435
~CodingParams()
Definition CodingParams.cpp:169
std::mutex commentMutex
YTsiz.
Definition CodingParams.h:433
Rect32 getTileBounds(Rect32 imageBounds, uint16_t tile_x, uint16_t tile_y) const
Definition CodingParams.cpp:216
Definition CodingParams.h:359
bool skipAllocateComposite_
Definition CodingParams.h:367
uint32_t disableRandomAccessFlags_
Definition CodingParams.h:366
uint16_t layersToDecompress_
if != 0, then only the first "layersToDecompress_" layers are decompressed; if == 0 or not used,...
Definition CodingParams.h:365
bool fast16BitMct_
Definition CodingParams.h:368
uint8_t reduce_
if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decompressed to...
Definition CodingParams.h:362
Definition CodingParams.h:336
size_t maxComponentRate_
Maximum rate for each component.
Definition CodingParams.h:339
uint8_t newTilePartProgressionPosition_
Position of tile part flag in progression order.
Definition CodingParams.h:341
bool allocationByRateDistortion_
allocation by rate/distortion
Definition CodingParams.h:345
uint32_t rateControlAlgorithm_
Definition CodingParams.h:355
bool writePlt_
Definition CodingParams.h:351
bool writeTlm_
Definition CodingParams.h:353
bool enableTilePartGeneration_
Enabling Tile part generation.
Definition CodingParams.h:349
uint8_t newTilePartProgressionDivider_
Flag determining tile part generation.
Definition CodingParams.h:343
bool allocationByFixedQuality_
allocation by fixed_quality
Definition CodingParams.h:347
Definition Quantizer.h:37
Reads/writes TLM markers.
Definition TLMMarker.h:167
Tile coding parameters : this structure is used to store coding/decoding parameters common to all til...
Definition CodingParams.h:124
uint32_t mainQcdQntsty
Definition CodingParams.h:291
float * mctDecodingMatrix_
the mct decoding matrix
Definition CodingParams.h:307
bool hasPoc(void)
Definition CodingParams.cpp:1885
bool mergePpt(void)
Merges all PPT markers read (Packed headers, tile-part header).
Definition CodingParams.cpp:1734
uint32_t numMaxMctRecords_
the max number of mct records.
Definition CodingParams.h:315
uint32_t cod_
If cod == true --> there was a COD marker for the present tile.
Definition CodingParams.h:323
grk_mct_data * mctRecords_
mct records
Definition CodingParams.h:311
uint8_t tilePartCounter_
Definition CodingParams.h:299
uint32_t numMccRecords_
the number of mct records.
Definition CodingParams.h:319
bool addMct(uint32_t index)
Definition CodingParams.cpp:1306
bool advanceTilePartCounter(uint16_t tileIndex, uint8_t tilePartIndex)
Definition CodingParams.cpp:440
uint8_t signalledNumTileParts_
number of tile parts for the tile, signlled by TLM or SOT marker.
Definition CodingParams.h:301
grk_progression progressionOrderChange_[GRK_MAXRLVLS]
progression order changes
Definition CodingParams.h:277
bool readQcc(bool fromTileHeader, uint8_t *headerData, uint16_t headerSize)
Reads a QCC marker (Quantization component).
Definition CodingParams.cpp:521
uint16_t numComps_
Definition CodingParams.h:327
bool validateQuantization(void)
Definition CodingParams.cpp:1778
TileCodingParams & operator=(const TileCodingParams &)=delete
uint16_t numLayers_
number of layers
Definition CodingParams.h:267
uint32_t numMaxMccRecords_
the max number of mct records.
Definition CodingParams.h:321
bool ppt_
If ppt == true --> there was a PPT marker for the present tile.
Definition CodingParams.h:325
uint8_t * pptBuffer_
used to keep a track of the allocated memory
Definition CodingParams.h:285
uint8_t csty_
coding style
Definition CodingParams.h:263
void updateLayersToDecompress(void)
Definition CodingParams.cpp:1375
uint8_t * pptData_
packet header store there for future use in t2_decode_packet
Definition CodingParams.h:283
CodingParams * cp_
Definition CodingParams.h:258
bool readQcd(bool fromTileHeader, uint8_t *headerData, uint16_t headerSize)
Reads a QCD marker (Quantization defaults).
Definition CodingParams.cpp:485
uint16_t layersToDecompress_
Definition CodingParams.h:269
uint8_t mct_
multi-component transform identifier
Definition CodingParams.h:271
bool readMco(uint8_t *headerData, uint16_t headerSize)
Reads a MCO marker (Multiple Component Transform Ordering).
Definition CodingParams.cpp:1028
uint32_t pptMarkersCount_
number of ppt markers (reserved size)
Definition CodingParams.h:279
size_t pptLength_
size of ppt_data
Definition CodingParams.h:287
float * mctCodingMatrix_
the mct coding matrix
Definition CodingParams.h:309
bool readMcc(uint8_t *headerData, uint16_t headerSize)
Reads a MCC marker (Multiple Component Collection).
Definition CodingParams.cpp:1074
bool isHT(void)
Definition CodingParams.cpp:1877
uint32_t mainQcdNumStepSizes
Definition CodingParams.h:293
void setIsHT(bool ht, bool reversible, uint8_t guardBits)
Definition CodingParams.cpp:1870
bool readPpt(uint8_t *headerData, uint16_t headerSize)
Reads a PPT marker (Packed packet headers, tile-part header).
Definition CodingParams.cpp:1660
bool initDefault(GrkImage *headerImage)
Definition CodingParams.cpp:458
uint32_t getNumProgressions(void)
Definition CodingParams.cpp:1881
double distortion_[maxCompressLayersGRK]
fixed_quality
Definition CodingParams.h:289
TileComponentCodingParams * tccps_
tile-component coding parameters
Definition CodingParams.h:295
double * mct_norms_
compressing norms
Definition CodingParams.h:305
void finalizePocs(void)
Definition CodingParams.cpp:807
bool readRgn(uint8_t *headerData, uint16_t headerSize)
Reads a RGN marker (Region Of Interest).
Definition CodingParams.cpp:686
bool wholeTileDecompress_
Definition CodingParams.h:260
~TileCodingParams()
Definition CodingParams.cpp:410
bool readCoc(uint8_t *headerData, uint16_t headerSize)
Reads a COC marker (Coding Style Component).
Definition CodingParams.cpp:566
std::vector< std::vector< grk_progression > > pocLists_
Definition CodingParams.h:332
bool readSQcdSQcc(bool fromTileHeader, bool fromQCC, uint16_t compno, uint8_t *headerData, uint16_t *headerSize)
Reads a SQcd or SQcc element, i.e.
Definition CodingParams.cpp:1381
uint32_t numMctRecords_
the number of mct records.
Definition CodingParams.h:313
grk_ppx * pptMarkers_
ppt markers data (table indexed by Zppt)
Definition CodingParams.h:281
TileCodingParams(CodingParams *cp)
Definition CodingParams.cpp:287
PacketCache * packets_
Definition CodingParams.h:303
bool readSPCodSPCoc(uint16_t compno, uint8_t *headerData, uint16_t *headerSize)
Reads a SPCod or SPCoc element, i.e.
Definition CodingParams.cpp:1528
bool readCod(uint8_t *headerData, uint16_t headerSize)
Reads a COD marker (Coding Style defaults).
Definition CodingParams.cpp:602
bool readPoc(uint8_t *headerData, uint16_t headerSize, int tilePartIndex)
Reads a POC marker (Progression Order Change).
Definition CodingParams.cpp:727
bool readMct(uint8_t *headerData, uint16_t headerSize)
Reads a MCT marker (Multiple Component Transform).
Definition CodingParams.cpp:909
double rates_[maxCompressLayersGRK]
rates of layers
Definition CodingParams.h:273
grk_simple_mcc_decorrelation_data * mccRecords_
mcc records
Definition CodingParams.h:317
uint32_t numpocs_
number of progression order changes
Definition CodingParams.h:275
std::mutex pocMutex_
Definition CodingParams.h:331
GRK_PROG_ORDER prg_
progression order
Definition CodingParams.h:265
Quantizer * qcd_
Definition CodingParams.h:326
bool ht_
Definition CodingParams.h:330
Tile-component coding parameters.
Definition CodingParams.h:54
int32_t dcLevelShift_
the dc_level_shift
Definition CodingParams.h:90
uint8_t numgbits_
number of guard bits
Definition CodingParams.h:82
uint8_t qntsty_
quantisation style
Definition CodingParams.h:76
uint8_t qmfbid_
discrete wavelet transform identifier
Definition CodingParams.h:67
grk_stepsize stepsizes_[GRK_MAXBANDS]
stepsizes used for quantization
Definition CodingParams.h:78
uint8_t cblkw_expn_
log2(code-blocks width)
Definition CodingParams.h:61
uint8_t numStepSizes_
Definition CodingParams.h:80
bool fromTileHeader_
Definition CodingParams.h:74
uint8_t cblkStyle_
code-block mode
Definition CodingParams.h:65
uint8_t precHeightExp_[GRK_MAXRLVLS]
precinct height (power of 2 exponent, < 16)
Definition CodingParams.h:88
uint8_t roishift_
Region Of Interest shift.
Definition CodingParams.h:84
uint8_t numresolutions_
number of resolutions
Definition CodingParams.h:59
uint8_t precWidthExp_[GRK_MAXRLVLS]
precinct width (power of 2 exponent, < 16)
Definition CodingParams.h:86
TileComponentCodingParams()
Definition CodingParams.cpp:1889
bool quantizationMarkerSet_
Definition CodingParams.h:70
uint8_t cblkh_expn_
log2(code-blocks height)
Definition CodingParams.h:63
bool fromQCC_
Definition CodingParams.h:72
uint8_t csty_
coding style
Definition CodingParams.h:57
MCT data.
Definition CodingParams.h:97
uint32_t data_size_
Definition CodingParams.h:102
MCT_ELEMENT_TYPE element_type_
Definition CodingParams.h:98
MCT_ARRAY_TYPE array_type_
Definition CodingParams.h:99
uint32_t index_
Definition CodingParams.h:100
uint8_t * data_
Definition CodingParams.h:101
Definition PPMMarker.h:27
MCC decorrelation data.
Definition CodingParams.h:109
grk_mct_data * decorrelation_array_
Definition CodingParams.h:112
uint32_t index_
Definition CodingParams.h:110
uint32_t nb_comps_
Definition CodingParams.h:111
uint32_t is_irreversible_
Definition CodingParams.h:114
grk_mct_data * offset_array_
Definition CodingParams.h:113
Quantization stepsize.
Definition Quantizer.h:28
Decompression parameters.
Progression order change (POC).