Grok  7.6.0
CodeStream.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2016-2020 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 
28 namespace grk {
29 
30 // includes marker and marker length (4 bytes)
31 const uint32_t sot_marker_segment_len = 12U;
32 
33 const uint32_t SPCod_SPCoc_len = 5U;
34 const uint32_t cod_coc_len = 5U;
35 const uint32_t tlm_len_per_tile_part = 5;
36 
37 
38 const uint32_t GRK_COMP_PARAM_DEFAULT_CBLOCKW = 64;
39 const uint32_t GRK_COMP_PARAM_DEFAULT_CBLOCKH = 64;
42 
43 // limits defined in JPEG 2000 standard
44 const uint32_t max_precision_jpeg_2000 = 38; // maximum number of magnitude bits, according to ISO standard
45 const uint32_t max_num_components = 16384; // maximum allowed number components
46 const uint32_t max_passes_per_segment = (max_precision_jpeg_2000-1) * 3 +1;
47 const uint32_t max_num_tiles = 65535;
48 const uint32_t max_num_tile_parts_per_tile = 255;
49 const uint32_t max_num_tile_parts = 65535;
50 // includes tile part header
51 const uint32_t max_tile_part_size = UINT_MAX;
52 
53 // limits in Grok library
54 const uint64_t max_tile_area = 67108864000;
55 const uint32_t max_supported_precision = 16; // maximum supported precision for Grok library
56 const uint32_t default_numbers_segments = 10;
57 const uint32_t default_header_size = 1000;
58 const uint32_t default_number_mcc_records = 10;
59 const uint32_t default_number_mct_records = 10;
60 
61 #define J2K_CP_CSTY_PRT 0x01
62 #define J2K_CP_CSTY_SOP 0x02
63 #define J2K_CP_CSTY_EPH 0x04
64 #define J2K_CCP_CSTY_PRT 0x01
65 #define J2K_CCP_QNTSTY_NOQNT 0 // no quantization
66 #define J2K_CCP_QNTSTY_SIQNT 1 // derived quantization
67 #define J2K_CCP_QNTSTY_SEQNT 2 // expounded quantization
68 
69 #define GRK_J2K_DEFAULT_CBLK_DATA_SIZE 8192
70 
71 #define J2K_MS_SOC 0xff4f
72 #define J2K_MS_SOT 0xff90
73 #define J2K_MS_SOD 0xff93
74 #define J2K_MS_EOC 0xffd9
75 #define J2K_MS_CAP 0xff50
76 #define J2K_MS_SIZ 0xff51
77 #define J2K_MS_COD 0xff52
78 #define J2K_MS_COC 0xff53
79 #define J2K_MS_RGN 0xff5e
80 #define J2K_MS_QCD 0xff5c
81 #define J2K_MS_QCC 0xff5d
82 #define J2K_MS_POC 0xff5f
83 #define J2K_MS_TLM 0xff55
84 #define J2K_MS_PLM 0xff57
85 #define J2K_MS_PLT 0xff58
86 #define J2K_MS_PPM 0xff60
87 #define J2K_MS_PPT 0xff61
88 #define J2K_MS_SOP 0xff91
89 #define J2K_MS_EPH 0xff92
90 #define J2K_MS_CRG 0xff63
91 #define J2K_MS_COM 0xff64
92 #define J2K_MS_CBD 0xff78
93 #define J2K_MS_MCC 0xff75
94 #define J2K_MS_MCT 0xff74
95 #define J2K_MS_MCO 0xff77
97 #define J2K_MS_UNK 0
103 enum J2K_STATUS {
107  J2K_DEC_STATE_MH = 0x0004,
109  J2K_DEC_STATE_TPH = 0x0010,
112  J2K_DEC_STATE_EOC = 0x0080,
113  J2K_DEC_STATE_ERR = 0x0100
114 };
115 
116 struct TileProcessor;
117 typedef bool (*j2k_procedure)(CodeStream *codeStream, TileProcessor *tileProcessor, BufferedStream *stream);
118 
119 
122  uint16_t id;
124  uint32_t states;
126  bool (*handler)(CodeStream *codeStream, TileProcessor *tileProcessor,
127  uint8_t *p_header_data, uint16_t header_size);
128 } ;
129 
130 struct CodeStream {
131 
132  CodeStream(bool decode);
134 
137 
138  bool read_marker(BufferedStream *stream, uint16_t *val);
139 
140  bool process_marker(const grk_dec_memory_marker_handler* marker_handler,
141  uint16_t current_marker, uint16_t marker_size,
142  TileProcessor *tileProcessor, BufferedStream *stream);
143 
158  uint32_t start_x,
159  uint32_t start_y,
160  uint32_t end_x,
161  uint32_t end_y);
162 
171 
172 
173  // state of decoder/encoder
176 
179 
180  /* output image (for decompress) */
182 
185 
187  std::vector<j2k_procedure> m_procedure_list;
188 
190  std::vector<j2k_procedure> m_validation_list;
191 
194 
197 
198 
202 
203 private:
204 
209 public:
215 
216 };
217 
220 /* ----------------------------------------------------------------------- */
221 
228 void j2k_init_decompressor(void *j2k, grk_dparameters *parameters);
229 
230 bool j2k_init_compress(CodeStream *codeStream, grk_cparameters *parameters,
231  grk_image *image);
232 
237 
238 /* ----------------------------------------------------------------------- */
242 
248 
258 bool j2k_read_header(BufferedStream *stream, CodeStream *codeStream,
259  grk_header_info *header_info, grk_image **image);
260 
266 void j2k_destroy(CodeStream *codeStream);
267 
268 
278 bool j2k_read_tile_header(CodeStream *codeStream, TileProcessor *tileProcessor,
279  bool *can_decode_tile_data, BufferedStream *stream);
280 
294 bool j2k_set_decompress_area(CodeStream *codeStream, grk_image *image, uint32_t start_x,
295  uint32_t start_y, uint32_t end_x, uint32_t end_y);
296 
306 bool j2k_decompress(CodeStream *codeStream, grk_plugin_tile *tile, BufferedStream *stream,
307  grk_image *image);
308 
309 bool j2k_decompress_tile(CodeStream *codeStream, BufferedStream *stream, grk_image *p_image, uint16_t tile_index);
310 
311 
322 bool j2k_compress_tile(CodeStream *codeStream, TileProcessor *tileProcessor,
323  uint16_t tile_index, uint8_t *p_data,
324  uint64_t uncompressed_data_size, BufferedStream *stream);
325 
329 bool j2k_compress(CodeStream *codeStream, grk_plugin_tile *tile, BufferedStream *stream);
330 
337 bool j2k_start_compress(CodeStream *codeStream, BufferedStream *stream);
338 
343 bool j2k_end_compress(CodeStream *codeStream, BufferedStream *stream);
344 
346 
347 }
grk::CodeStream::~CodeStream
~CodeStream()
grk::J2K_DEC_STATE_ERR
@ J2K_DEC_STATE_ERR
the decoding process has encountered an error
Definition: CodeStream.h:113
grk::j2k_init_mct_encoding
bool j2k_init_mct_encoding(TileCodingParams *p_tcp, grk_image *p_image)
_grk_codestream_index
Code stream index info.
Definition: grok.h:1149
grk::default_numbers_segments
const uint32_t default_numbers_segments
Definition: CodeStream.h:56
grk::CodeStream::m_encoder
EncoderState m_encoder
Definition: CodeStream.h:175
grk::J2K_DEC_STATE_TPH_SOT
@ J2K_DEC_STATE_TPH_SOT
the decoding process is in a tile part header and expects a SOT marker
Definition: CodeStream.h:108
grk::J2K_DEC_STATE_NONE
@ J2K_DEC_STATE_NONE
no decode state
Definition: CodeStream.h:104
grk::GRK_COMP_PARAM_DEFAULT_PROG_ORDER
const GRK_PROG_ORDER GRK_COMP_PARAM_DEFAULT_PROG_ORDER
Definition: CodeStream.h:40
grk::default_number_mct_records
const uint32_t default_number_mct_records
Definition: CodeStream.h:59
grk::grk_dec_memory_marker_handler::states
uint32_t states
value of the state when the marker can appear
Definition: CodeStream.h:124
grk::CodeStream::m_marker_scratch_size
uint16_t m_marker_scratch_size
Definition: CodeStream.h:206
grk::j2k_read_header
bool j2k_read_header(BufferedStream *stream, CodeStream *codeStream, grk_header_info *header_info, grk_image **image)
Read a JPEG 2000 code stream header.
grk::max_passes_per_segment
const uint32_t max_passes_per_segment
Definition: CodeStream.h:46
grk::TileProcessor
Tile coder/decoder.
Definition: TileProcessor.h:211
grk::CodeStream::m_tile_ind_to_dec
int32_t m_tile_ind_to_dec
index of the tile to decompress (used in get_tile); !!! initialized to -1 !!!
Definition: CodeStream.h:201
grk::j2k_init_compress
bool j2k_init_compress(CodeStream *codeStream, grk_cparameters *parameters, grk_image *image)
grk::TileCodingParams
Tile coding parameters : this structure is used to store coding/decoding parameters common to all til...
Definition: CodingParams.h:117
grk::max_num_tile_parts
const uint32_t max_num_tile_parts
Definition: CodeStream.h:49
GRK_LRCP
@ GRK_LRCP
layer-resolution-component-precinct order
Definition: grok.h:290
grk::CodeStream::m_decoder
DecoderState m_decoder
Definition: CodeStream.h:174
grk::j2k_end_decompress
bool j2k_end_decompress(CodeStream *j2k, BufferedStream *stream)
Ends the decompression procedures and possibiliy add data to be read after the code stream.
grk::tlm_len_per_tile_part
const uint32_t tlm_len_per_tile_part
Definition: CodeStream.h:35
grk::BufferedStream
Byte input-output stream.
Definition: BufferedStream.h:38
grk::J2K_DEC_STATE_MH_SOC
@ J2K_DEC_STATE_MH_SOC
a SOC marker is expected
Definition: CodeStream.h:105
grk::J2K_DEC_STATE_TPH
@ J2K_DEC_STATE_TPH
the decoding process is in a tile part header
Definition: CodeStream.h:109
grk::CodeStream::process_marker
bool process_marker(const grk_dec_memory_marker_handler *marker_handler, uint16_t current_marker, uint16_t marker_size, TileProcessor *tileProcessor, BufferedStream *stream)
grk::max_precision_jpeg_2000
const uint32_t max_precision_jpeg_2000
Definition: CodeStream.h:44
grk::default_header_size
const uint32_t default_header_size
Definition: CodeStream.h:57
grk::CodeStream::m_input_image
grk_image * m_input_image
internal/private encoded / decoded image
Definition: CodeStream.h:178
grk::CodeStream::cstr_index
grk_codestream_index * cstr_index
helper used to write the index file
Definition: CodeStream.h:193
grk::j2k_destroy
void j2k_destroy(CodeStream *codeStream)
Destroys a JPEG 2000 code stream.
_grk_plugin_tile
Plugin tile.
Definition: grok.h:1242
grk::CodeStream::m_nb_tile_parts_correction_checked
bool m_nb_tile_parts_correction_checked
TNsot correction : see issue 254.
Definition: CodeStream.h:213
grk::CodeStream::m_output_image
grk_image * m_output_image
Definition: CodeStream.h:181
grk::EncoderState
Definition: CodingParams.h:318
grk::CodeStream::m_tileProcessor
TileProcessor * m_tileProcessor
current TileProcessor
Definition: CodeStream.h:196
grk::default_number_mcc_records
const uint32_t default_number_mcc_records
Definition: CodeStream.h:58
grk::DecoderState
Definition: CodingParams.h:272
grk::CodeStream::m_marker_scratch
uint8_t * m_marker_scratch
Definition: CodeStream.h:205
grk::max_tile_area
const uint64_t max_tile_area
Definition: CodeStream.h:54
grk::j2k_compress
bool j2k_compress(CodeStream *codeStream, grk_plugin_tile *tile, BufferedStream *stream)
Encodes an image into a JPEG 2000 code stream.
grk::CodeStream::m_nb_tile_parts_correction
bool m_nb_tile_parts_correction
Definition: CodeStream.h:214
grk::CodeStream::CodeStream
CodeStream(bool decode)
grk::CodeStream::set_decompress_area
bool set_decompress_area(grk_image *p_image, uint32_t start_x, uint32_t start_y, uint32_t end_x, uint32_t end_y)
Sets the given area to be decoded.
GRK_PROG_ORDER
enum _GRK_PROG_ORDER GRK_PROG_ORDER
Progression order.
grk::CodingParams
Coding parameters.
Definition: CodingParams.h:230
grk::max_num_components
const uint32_t max_num_components
Definition: CodeStream.h:45
grk::CodeStream
Definition: CodeStream.h:130
grk::CodeStream::m_cp
CodingParams m_cp
Coding parameters.
Definition: CodeStream.h:184
grk::J2K_DEC_STATE_NO_EOC
@ J2K_DEC_STATE_NO_EOC
the decoding process must not expect a EOC marker because the code stream is truncated
Definition: CodeStream.h:110
grk::sot_marker_segment_len
const uint32_t sot_marker_segment_len
Definition: CodeStream.h:31
grk::SPCod_SPCoc_len
const uint32_t SPCod_SPCoc_len
Definition: CodeStream.h:33
_grk_dparameters
Core decompress parameters.
Definition: grok.h:669
grk::j2k_end_compress
bool j2k_end_compress(CodeStream *codeStream, BufferedStream *stream)
Ends the compression procedures and possibility add data to be read after the code stream.
grk::GRK_COMP_PARAM_DEFAULT_CBLOCKW
const uint32_t GRK_COMP_PARAM_DEFAULT_CBLOCKW
Definition: CodeStream.h:38
grk::CodeStream::current_plugin_tile
grk_plugin_tile * current_plugin_tile
Definition: CodeStream.h:211
grk::max_num_tile_parts_per_tile
const uint32_t max_num_tile_parts_per_tile
Definition: CodeStream.h:48
grk::j2k_convert_progression_order
char * j2k_convert_progression_order(GRK_PROG_ORDER prg_order)
Converts an enum type progression order to string type.
grk::CodeStream::m_procedure_list
std::vector< j2k_procedure > m_procedure_list
the list of procedures to exec
Definition: CodeStream.h:187
grk::j2k_compress_tile
bool j2k_compress_tile(CodeStream *codeStream, TileProcessor *tileProcessor, uint16_t tile_index, uint8_t *p_data, uint64_t uncompressed_data_size, BufferedStream *stream)
Writes a tile.
grk::j2k_start_compress
bool j2k_start_compress(CodeStream *codeStream, BufferedStream *stream)
Starts a compression scheme, i.e.
grk
Copyright (C) 2016-2020 Grok Image Compression Inc.
Definition: BitIO.h:27
grk::J2K_DEC_STATE_EOC
@ J2K_DEC_STATE_EOC
the decoding process has encountered the EOC marker
Definition: CodeStream.h:112
grk::CodeStream::isDecodingTilePartHeader
bool isDecodingTilePartHeader()
grk::CodeStream::get_current_decode_tcp
TileCodingParams * get_current_decode_tcp(TileProcessor *tileProcessor)
_grk_header_info
Header info.
Definition: grok.h:603
grk::grk_dec_memory_marker_handler
Definition: CodeStream.h:120
grk::GRK_COMP_PARAM_DEFAULT_CBLOCKH
const uint32_t GRK_COMP_PARAM_DEFAULT_CBLOCKH
Definition: CodeStream.h:39
grk::j2k_decompress_tile
bool j2k_decompress_tile(CodeStream *codeStream, BufferedStream *stream, grk_image *p_image, uint16_t tile_index)
grk::max_supported_precision
const uint32_t max_supported_precision
Definition: CodeStream.h:55
grk::J2K_DEC_STATE_DATA
@ J2K_DEC_STATE_DATA
the decoding process is expecting to read tile data from the code stream
Definition: CodeStream.h:111
grk::CodeStream::m_validation_list
std::vector< j2k_procedure > m_validation_list
the list of validation procedures to follow to make sure the code is valid
Definition: CodeStream.h:190
grk::max_num_tiles
const uint32_t max_num_tiles
Definition: CodeStream.h:47
grk::j2k_init_decompressor
void j2k_init_decompressor(void *j2k, grk_dparameters *parameters)
Setup the decoder decoding parameters using user parameters.
grk::J2K_DEC_STATE_MH_SIZ
@ J2K_DEC_STATE_MH_SIZ
a SIZ marker is expected
Definition: CodeStream.h:106
grk::GRK_COMP_PARAM_DEFAULT_NUMRESOLUTION
const uint32_t GRK_COMP_PARAM_DEFAULT_NUMRESOLUTION
Definition: CodeStream.h:41
grk::j2k_decompress
bool j2k_decompress(CodeStream *codeStream, grk_plugin_tile *tile, BufferedStream *stream, grk_image *image)
Decode an image from a JPEG 2000 code stream.
grk::CodeStream::alloc_multi_tile_output_data
bool alloc_multi_tile_output_data(grk_image *p_output_image)
Allocate output buffer for multiple tile decode.
grk::j2k_set_decompress_area
bool j2k_set_decompress_area(CodeStream *codeStream, grk_image *image, uint32_t start_x, uint32_t start_y, uint32_t end_x, uint32_t end_y)
Set the given area to be decoded.
grk::J2K_DEC_STATE_MH
@ J2K_DEC_STATE_MH
the decoding process is in the main header
Definition: CodeStream.h:107
grk::j2k_procedure
bool(* j2k_procedure)(CodeStream *codeStream, TileProcessor *tileProcessor, BufferedStream *stream)
Definition: CodeStream.h:117
grk::CodeStream::read_marker
bool read_marker(BufferedStream *stream, uint16_t *val)
_grk_image
Image.
Definition: grok.h:880
_grk_cparameters
Compress parameters.
Definition: grok.h:428
grk::cod_coc_len
const uint32_t cod_coc_len
Definition: CodeStream.h:34
CodingParams.h
grk::CodeStream::whole_tile_decoding
bool whole_tile_decoding
Only valid for decoding.
Definition: CodeStream.h:210
grk::j2k_read_tile_header
bool j2k_read_tile_header(CodeStream *codeStream, TileProcessor *tileProcessor, bool *can_decode_tile_data, BufferedStream *stream)
Reads a tile header.
grk::max_tile_part_size
const uint32_t max_tile_part_size
Definition: CodeStream.h:51
grk::grk_dec_memory_marker_handler::id
uint16_t id
marker value
Definition: CodeStream.h:122