Grok  7.6.6
CodeStream.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 
24 #include <vector>
25 #include <map>
26 #include "CodingParams.h"
27 #include <map>
28 
29 namespace grk {
30 
31 // includes marker and marker length (4 bytes)
32 const uint32_t sot_marker_segment_len = 12U;
33 const uint32_t grk_marker_length = 4U;
34 
35 const uint32_t SPCod_SPCoc_len = 5U;
36 const uint32_t cod_coc_len = 5U;
37 const uint32_t tlm_len_per_tile_part = 5;
38 
39 
40 const uint32_t GRK_COMP_PARAM_DEFAULT_CBLOCKW = 64;
41 const uint32_t GRK_COMP_PARAM_DEFAULT_CBLOCKH = 64;
44 
45 // limits defined in JPEG 2000 standard
46 const uint32_t max_precision_jpeg_2000 = 38; // maximum number of magnitude bits, according to ISO standard
47 const uint32_t max_num_components = 16384; // maximum allowed number components
48 const uint32_t max_passes_per_segment = (max_precision_jpeg_2000-1) * 3 +1;
49 const uint32_t max_num_tiles = 65535;
50 const uint32_t max_num_tile_parts_per_tile = 255;
51 const uint32_t max_num_tile_parts = 65535;
52 // includes tile part header
53 const uint32_t max_tile_part_size = UINT_MAX;
54 
55 // limits in Grok library
56 const uint32_t max_supported_precision = 16; // maximum supported precision for Grok library
57 const uint32_t default_numbers_segments = 10;
58 const uint32_t default_header_size = 4096;
59 const uint32_t default_number_mcc_records = 10;
60 const uint32_t default_number_mct_records = 10;
61 
62 #define J2K_CP_CSTY_PRT 0x01
63 #define J2K_CP_CSTY_SOP 0x02
64 #define J2K_CP_CSTY_EPH 0x04
65 #define J2K_CCP_CSTY_PRT 0x01
66 #define J2K_CCP_QNTSTY_NOQNT 0 // no quantization
67 #define J2K_CCP_QNTSTY_SIQNT 1 // derived quantization
68 #define J2K_CCP_QNTSTY_SEQNT 2 // expounded quantization
69 
70 #define GRK_J2K_DEFAULT_CBLK_DATA_SIZE 8192
71 
72 #define J2K_MS_SOC 0xff4f
73 #define J2K_MS_SOT 0xff90
74 #define J2K_MS_SOD 0xff93
75 #define J2K_MS_EOC 0xffd9
76 #define J2K_MS_CAP 0xff50
77 #define J2K_MS_SIZ 0xff51
78 #define J2K_MS_COD 0xff52
79 #define J2K_MS_COC 0xff53
80 #define J2K_MS_RGN 0xff5e
81 #define J2K_MS_QCD 0xff5c
82 #define J2K_MS_QCC 0xff5d
83 #define J2K_MS_POC 0xff5f
84 #define J2K_MS_TLM 0xff55
85 #define J2K_MS_PLM 0xff57
86 #define J2K_MS_PLT 0xff58
87 #define J2K_MS_PPM 0xff60
88 #define J2K_MS_PPT 0xff61
89 #define J2K_MS_SOP 0xff91
90 #define J2K_MS_EPH 0xff92
91 #define J2K_MS_CRG 0xff63
92 #define J2K_MS_COM 0xff64
93 #define J2K_MS_CBD 0xff78
94 #define J2K_MS_MCC 0xff75
95 #define J2K_MS_MCT 0xff74
96 #define J2K_MS_MCO 0xff77
98 #define J2K_MS_UNK 0
100 struct TileProcessor;
101 class GrkImage;
102 
103 typedef bool (*j2k_procedure)(CodeStream *codeStream);
104 
105 typedef bool (*marker_callback)(CodeStream *codeStream, uint8_t *p_header_data, uint16_t header_size);
106 
108  marker_handler(uint16_t ID, uint32_t flags, marker_callback cb) :
109  id(ID), states(flags), callback(cb)
110  {}
112  uint16_t id;
114  uint32_t states;
117 } ;
118 
119 struct ICodeStream {
120 
121  virtual ~ICodeStream(){}
122 
124  virtual bool read_header(grk_header_info *header_info) = 0;
125 
126  virtual GrkImage* get_image(uint16_t tileIndex) = 0;
127 
128  virtual GrkImage* get_image(void) = 0;
129 
130  virtual bool decompress( grk_plugin_tile *tile) = 0;
131 
133  virtual bool decompress_tile(uint16_t tile_index) = 0;
134 
136  virtual bool end_decompress(void) = 0;
137 
139  virtual void init_decompress(grk_dparameters *p_param) = 0;
140 
142  virtual bool set_decompress_window(grk_rect_u32 window) = 0;
143 
144  virtual bool start_compress(void) = 0;
145 
146  virtual bool init_compress(grk_cparameters *p_param,GrkImage *p_image) = 0;
147 
148  virtual bool compress(grk_plugin_tile* tile) = 0;
149 
150  virtual bool compress_tile(uint16_t tile_index, uint8_t *p_data, uint64_t data_size) = 0;
151 
152  virtual bool end_compress(void) = 0;
153 
154  virtual void dump(uint32_t flag, FILE *out_stream) = 0;
155 
157 
159 };
160 
161 class TileCache;
162 
163 struct CodeStream : public ICodeStream {
164 
165  CodeStream(bool decompress, BufferedStream *stream);
166  ~CodeStream();
167 
169  bool read_header(grk_header_info *header_info);
170 
171  GrkImage* get_image(uint16_t tileIndex);
172  GrkImage* get_image(void);
173  std::vector<GrkImage*> getAllImages(void);
174 
175  bool decompress( grk_plugin_tile *tile);
176 
178  bool decompress_tile(uint16_t tile_index);
179 
181  bool end_decompress(void);
182 
184  void init_decompress(grk_dparameters *p_param);
185 
186  bool start_compress(void);
187 
188  bool init_compress(grk_cparameters *p_param,GrkImage *p_image);
189 
190  bool compress(grk_plugin_tile* tile);
191 
192  bool compress_tile(uint16_t tile_index, uint8_t *p_data, uint64_t data_size);
193 
194  bool end_compress(void);
195 
196  void dump(uint32_t flag, FILE *out_stream);
197 
199 
201 
202 
203  bool isDecodingTilePartHeader() ;
205 
206  bool read_marker(void);
207  bool read_short(uint16_t *val);
208 
209  bool process_marker(const marker_handler* marker_handler, uint16_t marker_size);
210 
219  bool set_decompress_window(grk_rect_u32 window);
220 
221  bool parse_tile_header_markers(bool *can_decode_tile_data);
222 
223  bool init_header_writing(void);
224 
225  bool read_header_procedure(void);
226 
227  bool exec_decompress();
228 
229  bool decompress_tile_t2t1(TileProcessor *tileProcessor) ;
230 
231  bool decompress_tile();
232 
233  bool decompress_tile_t2(TileProcessor *tileProcessor);
234 
235  bool decompress_tiles(void);
236 
237  bool decompress_validation(void);
238 
239  bool write_tile_part(TileProcessor *tileProcessor);
240 
241  bool post_write_tile(TileProcessor *tileProcessor);
242 
243  bool get_end_header(void);
244 
245  bool copy_default_tcp(void);
246 
247  bool update_rates(void);
248 
249  bool compress_validation(void);
257  bool exec(std::vector<j2k_procedure> &p_procedure_list);
258 
259 
269  bool need_nb_tile_parts_correction(bool *p_correction_needed);
270 
271  bool mct_validation(void);
272 
279  bool read_unk(uint16_t *output_marker);
280 
282 
283  GrkImage* getHeaderImage(void);
284 
285 
286  // state of decompressor/compressor
289 
290  /* output image (for decompress) */
292 
295 
297  std::vector<j2k_procedure> m_procedure_list;
298 
300  std::vector<j2k_procedure> m_validation_list;
301 
304 
305  int32_t tileIndexToDecode();
306 
307  TileProcessor* allocateProcessor(uint16_t tile_index);
309 
311 
312 private:
313 
314  // stores header image information (decompress/compress)
316 
325  const marker_handler* get_marker_handler( uint16_t id);
326 
327  std::map<uint16_t, marker_handler*> marker_map;
328 
331 
333 
335 
336 
337  std::map<uint32_t, TileProcessor*> m_processors;
338 
339 
343 
344 
350 
351 public:
352  uint16_t m_curr_marker;
358 
359 };
360 
363 /* ----------------------------------------------------------------------- */
364 
369 
370 /* ----------------------------------------------------------------------- */
374 
375 bool j2k_decompress_tile(CodeStream *codeStream, GrkImage *p_image, uint16_t tile_index);
376 
377 bool j2k_init_mct_encoding(TileCodingParams *p_tcp, GrkImage *p_image);
378 
379 }
Definition: GrkImage.h:11
Definition: TileCache.h:39
enum _GRK_PROG_ORDER GRK_PROG_ORDER
Progression order.
@ GRK_LRCP
layer-resolution-component-precinct order
Definition: grok.h:291
Copyright (C) 2016-2021 Grok Image Compression Inc.
Definition: BitIO.cpp:23
const uint32_t max_num_tile_parts
Definition: CodeStream.h:51
const uint32_t max_precision_jpeg_2000
Definition: CodeStream.h:46
const uint32_t max_num_components
Definition: CodeStream.h:47
const uint32_t default_number_mcc_records
Definition: CodeStream.h:59
const uint32_t default_header_size
Definition: CodeStream.h:58
const uint32_t SPCod_SPCoc_len
Definition: CodeStream.h:35
const uint32_t max_num_tiles
Definition: CodeStream.h:49
bool j2k_init_mct_encoding(TileCodingParams *p_tcp, GrkImage *p_image)
Definition: CodeStream.cpp:258
const GRK_PROG_ORDER GRK_COMP_PARAM_DEFAULT_PROG_ORDER
Definition: CodeStream.h:42
const uint32_t default_number_mct_records
Definition: CodeStream.h:60
const uint32_t GRK_COMP_PARAM_DEFAULT_CBLOCKW
Definition: CodeStream.h:40
bool(* j2k_procedure)(CodeStream *codeStream)
Definition: CodeStream.h:103
const uint32_t grk_marker_length
Definition: CodeStream.h:33
const uint32_t tlm_len_per_tile_part
Definition: CodeStream.h:37
char * j2k_convert_progression_order(GRK_PROG_ORDER prg_order)
Converts an enum type progression order to string type.
Definition: CodeStream.cpp:423
const uint32_t sot_marker_segment_len
Definition: CodeStream.h:32
const uint32_t default_numbers_segments
Definition: CodeStream.h:57
const uint32_t max_num_tile_parts_per_tile
Definition: CodeStream.h:50
const uint32_t GRK_COMP_PARAM_DEFAULT_NUMRESOLUTION
Definition: CodeStream.h:43
const uint32_t cod_coc_len
Definition: CodeStream.h:36
const uint32_t max_supported_precision
Definition: CodeStream.h:56
const uint32_t max_tile_part_size
Definition: CodeStream.h:53
static bool j2k_decompress_tile(CodeStream *codeStream)
Definition: CodeStream.cpp:195
bool(* marker_callback)(CodeStream *codeStream, uint8_t *p_header_data, uint16_t header_size)
Definition: CodeStream.h:105
const uint32_t GRK_COMP_PARAM_DEFAULT_CBLOCKH
Definition: CodeStream.h:41
const uint32_t max_passes_per_segment
Definition: CodeStream.h:48
Code stream index info.
Definition: grok.h:1161
Code stream info v2.
Definition: grok.h:1104
Compress parameters.
Definition: grok.h:446
Core decompress parameters.
Definition: grok.h:687
Header info.
Definition: grok.h:629
Plugin tile.
Definition: grok.h:1254
Byte input-output stream.
Definition: BufferedStream.h:38
Definition: CodeStream.h:163
bool copy_default_tcp(void)
Definition: CodeStream.cpp:2572
bool read_unk(uint16_t *output_marker)
Reads an unknown marker.
Definition: CodeStream.cpp:1592
bool compress_validation(void)
Definition: CodeStream.cpp:2736
CodeStream(bool decompress, BufferedStream *stream)
Definition: CodeStream.cpp:727
bool init_compress(grk_cparameters *p_param, GrkImage *p_image)
Definition: CodeStream.cpp:1661
bool write_tile_part(TileProcessor *tileProcessor)
Definition: CodeStream.cpp:2485
bool decompress_validation(void)
Definition: CodeStream.cpp:1484
bool decompress_tiles(void)
Definition: CodeStream.cpp:1152
bool wholeTileDecompress
Definition: CodeStream.h:353
int32_t tileIndexToDecode()
Definition: CodeStream.cpp:809
TileCodingParams * get_current_decode_tcp(void)
Definition: CodeStream.cpp:1528
bool read_short(uint16_t *val)
Definition: CodeStream.cpp:1536
bool compress_tile(uint16_t tile_index, uint8_t *p_data, uint64_t data_size)
Definition: CodeStream.cpp:2194
bool post_write_tile(TileProcessor *tileProcessor)
Definition: CodeStream.cpp:2527
grk_plugin_tile * current_plugin_tile
Definition: CodeStream.h:354
GrkImage * get_image(void)
Definition: CodeStream.cpp:844
BufferedStream * getStream()
Definition: CodeStream.cpp:801
GrkImage * getCompositeImage()
Definition: CodeStream.cpp:813
bool m_headerError
Definition: CodeStream.h:357
std::map< uint32_t, TileProcessor * > m_processors
Definition: CodeStream.h:337
bool start_compress(void)
Definition: CodeStream.cpp:1642
bool read_header(grk_header_info *header_info)
Main header reading function handler.
Definition: CodeStream.cpp:853
uint16_t m_marker_scratch_size
Definition: CodeStream.h:346
grk_codestream_info_v2 * get_cstr_info(void)
Definition: CodeStream.cpp:1495
CodingParams m_cp
Coding parameters.
Definition: CodeStream.h:294
std::vector< j2k_procedure > m_validation_list
the list of validation procedures to follow to make sure the code is valid
Definition: CodeStream.h:300
GrkImage * m_output_image
Definition: CodeStream.h:291
bool exec(std::vector< j2k_procedure > &p_procedure_list)
Executes the given procedures on the given codec.
Definition: CodeStream.cpp:792
bool end_decompress(void)
Reading function used after code stream if necessary.
Definition: CodeStream.cpp:1638
bool decompress_tile()
Definition: CodeStream.cpp:1346
int32_t m_tile_ind_to_dec
index of single tile to decompress; !!! initialized to -1 !!!
Definition: CodeStream.h:342
bool decompress(grk_plugin_tile *tile)
Definition: CodeStream.cpp:1132
bool compress(grk_plugin_tile *tile)
Definition: CodeStream.cpp:2110
bool exec_decompress()
Definition: CodeStream.cpp:1139
uint32_t m_nb_tile_parts_correction
Definition: CodeStream.h:356
bool process_marker(const marker_handler *marker_handler, uint16_t marker_size)
Definition: CodeStream.cpp:1503
bool decompress_tile_t2(TileProcessor *tileProcessor)
Definition: CodeStream.cpp:1461
TileProcessor * allocateProcessor(uint16_t tile_index)
Definition: CodeStream.cpp:817
bool need_nb_tile_parts_correction(bool *p_correction_needed)
Checks for invalid number of tile-parts in SOT marker (TPsot==TNsot).
void init_decompress(grk_dparameters *p_param)
Set up decompressor function handler.
Definition: CodeStream.cpp:1125
bool read_marker(void)
Definition: CodeStream.cpp:1555
bool m_multiTile
Only valid for decoding.
Definition: CodeStream.h:349
bool decompress_tile_t2t1(TileProcessor *tileProcessor)
Definition: CodeStream.cpp:1423
bool parse_tile_header_markers(bool *can_decode_tile_data)
Definition: CodeStream.cpp:2237
uint8_t * m_marker_scratch
Definition: CodeStream.h:345
const marker_handler * get_marker_handler(uint16_t id)
Reads the lookup table containing all the marker, status and action, and returns the handler associat...
Definition: CodeStream.cpp:1545
bool read_header_procedure(void)
Definition: CodeStream.cpp:1021
bool update_rates(void)
Definition: CodeStream.cpp:2669
BufferedStream * m_stream
Definition: CodeStream.h:334
grk_codestream_index * get_cstr_index()
Definition: CodeStream.cpp:1499
~CodeStream()
Definition: CodeStream.cpp:780
bool set_decompress_window(grk_rect_u32 window)
Sets the given area to be decompressed.
Definition: CodeStream.cpp:935
TileCache * m_tileCache
Definition: CodeStream.h:332
bool isDecodingTilePartHeader()
Definition: CodeStream.cpp:1525
std::vector< j2k_procedure > m_procedure_list
the list of procedures to exec
Definition: CodeStream.h:297
uint16_t m_curr_marker
Definition: CodeStream.h:352
bool mct_validation(void)
Definition: CodeStream.cpp:1573
bool get_end_header(void)
Definition: CodeStream.cpp:1568
std::vector< GrkImage * > getAllImages(void)
Definition: CodeStream.cpp:848
TileProcessor * m_tileProcessor
current TileProcessor
Definition: CodeStream.h:330
bool end_compress(void)
Definition: CodeStream.cpp:2226
TileProcessor * currentProcessor(void)
Definition: CodeStream.cpp:834
std::map< uint16_t, marker_handler * > marker_map
Definition: CodeStream.h:327
grk_codestream_index * cstr_index
helper used to write the index file
Definition: CodeStream.h:303
GrkImage * getHeaderImage(void)
Definition: CodeStream.cpp:805
bool m_nb_tile_parts_correction_checked
Definition: CodeStream.h:355
GrkImage * m_headerImage
Definition: CodeStream.h:315
void dump(uint32_t flag, FILE *out_stream)
Definition: CodeStream.cpp:1491
bool init_header_writing(void)
Definition: CodeStream.cpp:2453
EncoderState m_encoder
Definition: CodeStream.h:288
DecoderState m_decompressor
Definition: CodeStream.h:287
Coding parameters.
Definition: CodingParams.h:238
Definition: CodingParams.h:307
Definition: CodingParams.h:354
Definition: CodeStream.h:119
virtual grk_codestream_index * get_cstr_index(void)=0
virtual GrkImage * get_image(uint16_t tileIndex)=0
virtual GrkImage * get_image(void)=0
virtual bool decompress(grk_plugin_tile *tile)=0
virtual grk_codestream_info_v2 * get_cstr_info(void)=0
virtual bool set_decompress_window(grk_rect_u32 window)=0
Set decompress window function handler.
virtual void dump(uint32_t flag, FILE *out_stream)=0
virtual bool start_compress(void)=0
virtual bool end_compress(void)=0
virtual bool init_compress(grk_cparameters *p_param, GrkImage *p_image)=0
virtual void init_decompress(grk_dparameters *p_param)=0
Set up decompressor function handler.
virtual bool compress_tile(uint16_t tile_index, uint8_t *p_data, uint64_t data_size)=0
virtual ~ICodeStream()
Definition: CodeStream.h:121
virtual bool read_header(grk_header_info *header_info)=0
Main header reading function handler.
virtual bool compress(grk_plugin_tile *tile)=0
virtual bool decompress_tile(uint16_t tile_index)=0
decompress tile
virtual bool end_decompress(void)=0
Reading function used after code stream if necessary.
Tile coding parameters : this structure is used to store coding/decoding parameters common to all til...
Definition: CodingParams.h:121
Tile compressor/decompressor.
Definition: TileProcessor.h:70
Definition: CodeStream.h:107
uint32_t states
value of the state when the marker can appear
Definition: CodeStream.h:114
marker_callback callback
action linked to the marker
Definition: CodeStream.h:116
uint16_t id
marker value
Definition: CodeStream.h:112
marker_handler(uint16_t ID, uint32_t flags, marker_callback cb)
Definition: CodeStream.h:108