Grok  7.6.6
FileFormat.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 #pragma once
22 #include <string>
23 
24 namespace grk {
25 
34 
35 #define JP2_JP 0x6a502020
36 #define JP2_FTYP 0x66747970
37 #define JP2_JP2H 0x6a703268
38 #define JP2_IHDR 0x69686472
39 #define JP2_COLR 0x636f6c72
40 #define JP2_JP2C 0x6a703263
41 #define JP2_PCLR 0x70636c72
42 #define JP2_CMAP 0x636d6170
43 #define JP2_CDEF 0x63646566
44 #define JP2_DTBL 0x6474626c
45 #define JP2_BPCC 0x62706363
46 #define JP2_JP2 0x6a703220
47 #define JP2_RES 0x72657320
48 #define JP2_CAPTURE_RES 0x72657363
49 #define JP2_DISPLAY_RES 0x72657364
50 #define JP2_JP2I 0x6a703269
51 #define JP2_XML 0x786d6c20
52 #define JP2_UUID 0x75756964
53 #define JP2_UINF 0x75696e66
54 #define JP2_ULST 0x756c7374
55 #define JP2_URL 0x75726c20
56 #define JP2_ASOC 0x61736f63
57 #define JP2_LBL 0x6c626c20
60 #define JP2_MAX_NUM_UUIDS 128
61 const uint8_t IPTC_UUID[16] = { 0x33, 0xC7, 0xA4, 0xD2, 0xB8, 0x1D, 0x47, 0x23,
62  0xA0, 0xBA, 0xF1, 0xA3, 0xE0, 0x97, 0xAD, 0x38 };
63 const uint8_t XMP_UUID[16] = { 0xBE, 0x7A, 0xCF, 0xCB, 0x97, 0xA9, 0x42, 0xE8,
64  0x9C, 0x71, 0x99, 0x94, 0x91, 0xE3, 0xAF, 0xAC };
65 
66 enum JP2_STATE {
73  JP2_STATE_UNKNOWN = 0x7fffffff /* ISO C restricts enumerator values to range of 'int' */
74 };
75 
78 };
79 
83 struct FileFormatBox {
85  {}
86  uint64_t length;
87  uint32_t type;
88 };
89 
90 
94 struct ComponentInfo {
96  {}
97  uint8_t bpc;
98 };
99 
104  virtual ~AsocBox() override {
105  dealloc();
106  }
107  void dealloc() override {
109  for (auto& as : children){
110  delete as;
111  }
112  children.clear();
113  }
114  std::string label;
115  std::vector<AsocBox*> children;
116 };
117 
121 struct UUIDBox: public FileFormatBox, grk_buf {
123  memset(uuid, 0, sizeof(uuid));
124  }
125  UUIDBox(const uint8_t myuuid[16], uint8_t *buf, size_t size, bool owns) : FileFormatBox(),
126  grk_buf(buf, size, owns) {
127  for (int i = 0; i < 16; ++i)
128  uuid[i] = myuuid[i];
129  }
130  uint8_t uuid[16];
131 };
132 
133 class FileFormat;
134 
136  uint32_t id;
137  bool (*handler)(FileFormat *fileFormat, uint8_t *p_header_data, uint32_t header_size);
138 };
139 
141  uint8_t* (*handler)(FileFormat *fileFormat, uint32_t *data_size);
142  uint8_t *m_data;
143  uint32_t m_size;
144 };
145 
146 class FileFormat;
147 typedef bool (*jp2_procedure)(FileFormat *fileFormat);
148 
152 class FileFormat : public ICodeStream {
153 public:
154  FileFormat(bool isDecoder, BufferedStream *stream);
155  ~FileFormat();
156 
158  bool read_header(grk_header_info *header_info);
159 
160  GrkImage* get_image(uint16_t tileIndex);
161  GrkImage* get_image(void);
162 
164  void init_decompress(grk_dparameters *p_param);
165 
176  bool set_decompress_window(grk_rect_u32 window);
177  bool decompress( grk_plugin_tile *tile);
178  bool end_decompress(void);
179  bool init_compress(grk_cparameters *p_param,GrkImage *p_image);
180  bool start_compress(void);
181  bool compress(grk_plugin_tile* tile);
182  bool compress_tile(uint16_t tile_index, uint8_t *p_data, uint64_t data_size);
183  bool end_compress(void);
184  bool decompress_tile(uint16_t tile_index);
185  void dump(uint32_t flag, FILE *out_stream);
188  static void free_color(grk_color *color);
189  static void alloc_palette(grk_color *color, uint8_t num_channels, uint16_t num_entries);
190  static void free_palette_clr(grk_color *color);
191  uint32_t read_asoc(AsocBox *parent,
192  uint8_t **header_data,
193  uint32_t *header_data_size,
194  uint32_t asocSize);
195  bool read_header_procedure(void);
196  bool default_validation(void);
197  bool read_box_hdr(FileFormatBox *box, uint32_t *p_number_bytes_read,BufferedStream *stream);
198  bool read_ihdr( uint8_t *p_image_header_data,uint32_t image_header_size);
199  uint8_t* write_ihdr( uint32_t *p_nb_bytes_written);
200  uint8_t* write_buffer(uint32_t boxId, grk_buf *buffer,uint32_t *p_nb_bytes_written);
201  bool read_xml( uint8_t *p_xml_data, uint32_t xml_size);
202  uint8_t* write_xml( uint32_t *p_nb_bytes_written);
203  bool read_uuid( uint8_t *p_header_data,uint32_t header_size);
204  double calc_res(uint16_t num, uint16_t den, uint8_t exponent);
205  bool read_res_box(uint32_t *id, uint32_t *num, uint32_t *den,
206  uint32_t *exponent, uint8_t **p_resolution_data);
207  bool read_res( uint8_t *p_resolution_data,
208  uint32_t resolution_size);
209  void find_cf(double x, uint32_t *num, uint32_t *den);
210  void write_res_box(double resx, double resy, uint32_t box_id,
211  uint8_t **current_res_ptr);
212  uint8_t* write_res( uint32_t *p_nb_bytes_written);
213  uint8_t* write_bpc( uint32_t *p_nb_bytes_written);
214  bool read_bpc( uint8_t *p_bpc_header_data,uint32_t bpc_header_size);
215  uint8_t* write_channel_definition( uint32_t *p_nb_bytes_written);
217  bool read_channel_definition( uint8_t *p_cdef_header_data,
218  uint32_t cdef_header_size);
219  uint8_t* write_colr( uint32_t *p_nb_bytes_written);
220  bool read_colr( uint8_t *p_colr_header_data,
221  uint32_t colr_header_size);
222  bool check_color(GrkImage *image, grk_color *color);
223  bool apply_palette_clr(GrkImage *image, grk_color *color);
224  bool read_component_mapping( uint8_t *component_mapping_header_data,
225  uint32_t component_mapping_header_size);
226  uint8_t* write_component_mapping( uint32_t *p_nb_bytes_written);
227  uint8_t* write_palette_clr( uint32_t *p_nb_bytes_written);
228  bool read_palette_clr( uint8_t *p_pclr_header_data, uint32_t pclr_header_size);
229  bool write_jp2h(void);
230  bool write_uuids(void);
231  bool write_ftyp(void);
232  bool write_jp2c(void);
233  bool write_jp(void);
234  bool exec( std::vector<jp2_procedure> *procs) ;
235  const BoxReadHandler* find_handler(uint32_t id);
236  const BoxReadHandler* img_find_handler(uint32_t id);
237  bool read_jp( uint8_t *p_header_data,uint32_t header_size);
238  bool read_ftyp( uint8_t *p_header_data, uint32_t header_size) ;
239  bool skip_jp2c(void);
240  bool read_jp2h( uint8_t *p_header_data, uint32_t header_size);
241  bool read_box(FileFormatBox *box, uint8_t *p_data,
242  uint32_t *p_number_bytes_read, uint64_t p_box_max_size);
243  void serializeAsoc(AsocBox *asoc,
244  grk_asoc *serial_asocs,
245  uint32_t *num_asocs,
246  uint32_t level);
247 
251  std::vector<jp2_procedure> *m_validation_list;
253  std::vector<jp2_procedure> *m_procedure_list;
254 
255  /* width of image */
256  uint32_t w;
257  /* height of image */
258  uint32_t h;
259  /* number of components in the image */
260  uint16_t numcomps;
261  uint8_t bpc;
262  uint8_t C;
263  uint8_t UnkC;
264  uint8_t IPR;
265  uint8_t meth;
266  uint8_t approx;
268  uint8_t precedence;
269  uint32_t brand;
270  uint32_t minversion;
271  uint32_t numcl;
272  uint32_t *cl;
276  uint32_t jp2_state;
277  uint32_t jp2_img_state;
279 
284 
286 
288  uint32_t numUuids;
289 
291 
293 private:
294  bool applyColour(GrkImage *img);
295 };
296 
297 
300 /* ----------------------------------------------------------------------- */
301 
305 
306 }
307 
#define JP2_MAX_NUM_UUIDS
Definition: FileFormat.h:60
JPEG 2000 file format reader/writer.
Definition: FileFormat.h:152
AsocBox root_asoc
Definition: FileFormat.h:290
bool read_colr(uint8_t *p_colr_header_data, uint32_t colr_header_size)
Definition: FileFormat.cpp:2217
uint32_t read_asoc(AsocBox *parent, uint8_t **header_data, uint32_t *header_data_size, uint32_t asocSize)
Definition: FileFormat.cpp:1229
std::vector< jp2_procedure > * m_validation_list
list of validation procedures
Definition: FileFormat.h:251
grk_buf xml
Definition: FileFormat.h:285
uint8_t C
Definition: FileFormat.h:262
uint32_t h
Definition: FileFormat.h:258
uint32_t w
Definition: FileFormat.h:256
bool needs_xl_jp2c_box_length
Definition: FileFormat.h:275
void dump(uint32_t flag, FILE *out_stream)
Definition: FileFormat.cpp:1304
bool write_ftyp(void)
Definition: FileFormat.cpp:2853
uint8_t precedence
Definition: FileFormat.h:268
uint8_t * write_ihdr(uint32_t *p_nb_bytes_written)
Definition: FileFormat.cpp:1615
bool read_box_hdr(FileFormatBox *box, uint32_t *p_number_bytes_read, BufferedStream *stream)
Definition: FileFormat.cpp:1491
uint32_t minversion
Definition: FileFormat.h:270
bool write_jp2h(void)
Definition: FileFormat.cpp:2746
static void alloc_palette(grk_color *color, uint8_t num_channels, uint16_t num_entries)
Definition: FileFormat.cpp:1213
uint32_t jp2_state
Definition: FileFormat.h:276
bool write_jp(void)
Definition: FileFormat.cpp:2932
bool read_channel_definition(uint8_t *p_cdef_header_data, uint32_t cdef_header_size)
Definition: FileFormat.cpp:2069
uint8_t * write_palette_clr(uint32_t *p_nb_bytes_written)
Definition: FileFormat.cpp:2624
uint8_t * write_res(uint32_t *p_nb_bytes_written)
Definition: FileFormat.cpp:1874
uint8_t * write_channel_definition(uint32_t *p_nb_bytes_written)
Definition: FileFormat.cpp:1972
uint8_t * write_bpc(uint32_t *p_nb_bytes_written)
Definition: FileFormat.cpp:1920
double capture_resolution[2]
Definition: FileFormat.h:281
void serializeAsoc(AsocBox *asoc, grk_asoc *serial_asocs, uint32_t *num_asocs, uint32_t level)
Definition: FileFormat.cpp:709
uint32_t brand
Definition: FileFormat.h:269
~FileFormat()
Definition: FileFormat.cpp:697
uint16_t numcomps
Definition: FileFormat.h:260
uint8_t * write_buffer(uint32_t boxId, grk_buf *buffer, uint32_t *p_nb_bytes_written)
Definition: FileFormat.cpp:1663
bool skip_jp2c(void)
Definition: FileFormat.cpp:3089
bool read_ftyp(uint8_t *p_header_data, uint32_t header_size)
Reads a a FTYP box - File type box.
Definition: FileFormat.cpp:3041
static void free_palette_clr(grk_color *color)
Definition: FileFormat.cpp:2733
bool read_jp2h(uint8_t *p_header_data, uint32_t header_size)
Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
Definition: FileFormat.cpp:3107
bool apply_palette_clr(GrkImage *image, grk_color *color)
Definition: FileFormat.cpp:2460
uint32_t jp2_img_state
Definition: FileFormat.h:277
uint64_t j2k_codestream_offset
Definition: FileFormat.h:274
uint8_t IPR
Definition: FileFormat.h:264
FileFormat(bool isDecoder, BufferedStream *stream)
Definition: FileFormat.cpp:655
bool read_bpc(uint8_t *p_bpc_header_data, uint32_t bpc_header_size)
Definition: FileFormat.cpp:1948
uint32_t numUuids
Definition: FileFormat.h:288
bool read_uuid(uint8_t *p_header_data, uint32_t header_size)
Definition: FileFormat.cpp:1708
bool end_decompress(void)
Reading function used after code stream if necessary.
Definition: FileFormat.cpp:925
bool read_res_box(uint32_t *id, uint32_t *num, uint32_t *den, uint32_t *exponent, uint8_t **p_resolution_data)
Definition: FileFormat.cpp:1737
bool check_color(GrkImage *image, grk_color *color)
Definition: FileFormat.cpp:2329
ComponentInfo * comps
Definition: FileFormat.h:273
bool decompress(grk_plugin_tile *tile)
Definition: FileFormat.cpp:895
const BoxReadHandler * img_find_handler(uint32_t id)
Finds the image execution function related to the given box id.
Definition: FileFormat.cpp:2987
bool has_display_resolution
Definition: FileFormat.h:282
bool read_header(grk_header_info *header_info)
Main header reading function handler.
Definition: FileFormat.cpp:743
bool applyColour(GrkImage *img)
Definition: FileFormat.cpp:936
bool m_headerError
Definition: FileFormat.h:292
uint8_t * write_xml(uint32_t *p_nb_bytes_written)
Definition: FileFormat.cpp:1704
uint32_t numcl
Definition: FileFormat.h:271
bool read_ihdr(uint8_t *p_image_header_data, uint32_t image_header_size)
Definition: FileFormat.cpp:1532
grk_color color
Definition: FileFormat.h:278
void apply_channel_definition(GrkImage *image, grk_color *color)
Definition: FileFormat.cpp:2016
bool exec(std::vector< jp2_procedure > *procs)
Executes the given procedures on the given codec.
Definition: FileFormat.cpp:2955
const BoxReadHandler * find_handler(uint32_t id)
Definition: FileFormat.cpp:2968
bool compress(grk_plugin_tile *tile)
Definition: FileFormat.cpp:1179
uint8_t * write_colr(uint32_t *p_nb_bytes_written)
Definition: FileFormat.cpp:2162
bool write_uuids(void)
Definition: FileFormat.cpp:2829
double display_resolution[2]
Definition: FileFormat.h:283
void find_cf(double x, uint32_t *num, uint32_t *den)
Definition: FileFormat.cpp:1806
CodeStream * codeStream
handle to the J2K codec
Definition: FileFormat.h:249
bool read_header_procedure(void)
Definition: FileFormat.cpp:1318
bool read_res(uint8_t *p_resolution_data, uint32_t resolution_size)
Definition: FileFormat.cpp:1767
bool default_validation(void)
Definition: FileFormat.cpp:1440
grk_codestream_index * get_cstr_index(void)
Definition: FileFormat.cpp:1313
uint32_t * cl
Definition: FileFormat.h:272
uint8_t bpc
Definition: FileFormat.h:261
bool read_component_mapping(uint8_t *component_mapping_header_data, uint32_t component_mapping_header_size)
Definition: FileFormat.cpp:2558
bool set_decompress_window(grk_rect_u32 window)
Sets the given area to be decompressed, relative to image origin.
Definition: FileFormat.cpp:881
uint8_t meth
Definition: FileFormat.h:265
grk_codestream_info_v2 * get_cstr_info(void)
Definition: FileFormat.cpp:1308
bool has_capture_resolution
Definition: FileFormat.h:280
bool write_jp2c(void)
Definition: FileFormat.cpp:2892
uint8_t UnkC
Definition: FileFormat.h:263
bool end_compress(void)
Definition: FileFormat.cpp:1189
uint8_t * write_component_mapping(uint32_t *p_nb_bytes_written)
Definition: FileFormat.cpp:2596
bool read_box(FileFormatBox *box, uint8_t *p_data, uint32_t *p_number_bytes_read, uint64_t p_box_max_size)
Definition: FileFormat.cpp:3156
void write_res_box(double resx, double resy, uint32_t box_id, uint8_t **current_res_ptr)
Definition: FileFormat.cpp:1834
uint8_t approx
Definition: FileFormat.h:266
std::vector< jp2_procedure > * m_procedure_list
list of execution procedures
Definition: FileFormat.h:253
static void free_color(grk_color *color)
Definition: FileFormat.cpp:1200
UUIDBox uuids[JP2_MAX_NUM_UUIDS]
Definition: FileFormat.h:287
bool read_jp(uint8_t *p_header_data, uint32_t header_size)
Reads a JPEG 2000 file signature box.
Definition: FileFormat.cpp:3007
bool start_compress(void)
Definition: FileFormat.cpp:957
bool decompress_tile(uint16_t tile_index)
decompress tile
Definition: FileFormat.cpp:910
GRK_ENUM_COLOUR_SPACE enumcs
Definition: FileFormat.h:267
bool compress_tile(uint16_t tile_index, uint8_t *p_data, uint64_t data_size)
Definition: FileFormat.cpp:1184
bool init_compress(grk_cparameters *p_param, GrkImage *p_image)
Definition: FileFormat.cpp:987
void init_decompress(grk_dparameters *p_param)
Set up decompressor function handler.
Definition: FileFormat.cpp:886
GrkImage * get_image(void)
Definition: FileFormat.cpp:738
double calc_res(uint16_t num, uint16_t den, uint8_t exponent)
Definition: FileFormat.cpp:1732
bool read_palette_clr(uint8_t *p_pclr_header_data, uint32_t pclr_header_size)
Definition: FileFormat.cpp:2672
bool read_xml(uint8_t *p_xml_data, uint32_t xml_size)
Definition: FileFormat.cpp:1691
Definition: GrkImage.h:11
GRK_ENUM_COLOUR_SPACE
Definition: grok.h:331
Copyright (C) 2016-2021 Grok Image Compression Inc.
Definition: BitIO.cpp:23
const uint8_t IPTC_UUID[16]
Definition: FileFormat.h:61
JP2_STATE
Definition: FileFormat.h:66
@ JP2_STATE_UNKNOWN
Definition: FileFormat.h:73
@ JP2_STATE_FILE_TYPE
Definition: FileFormat.h:69
@ JP2_STATE_SIGNATURE
Definition: FileFormat.h:68
@ JP2_STATE_CODESTREAM
Definition: FileFormat.h:71
@ JP2_STATE_NONE
Definition: FileFormat.h:67
@ JP2_STATE_HEADER
Definition: FileFormat.h:70
@ JP2_STATE_END_CODESTREAM
Definition: FileFormat.h:72
bool(* jp2_procedure)(FileFormat *fileFormat)
Definition: FileFormat.h:147
const uint8_t XMP_UUID[16]
Definition: FileFormat.h:63
JP2_IMG_STATE
Definition: FileFormat.h:76
@ JP2_IMG_STATE_UNKNOWN
Definition: FileFormat.h:77
@ JP2_IMG_STATE_NONE
Definition: FileFormat.h:77
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
Association box (defined in ITU 15444-2 Annex M 11.1 )
Definition: FileFormat.h:103
std::string label
Definition: FileFormat.h:114
virtual ~AsocBox() override
Definition: FileFormat.h:104
void dealloc() override
Definition: FileFormat.h:107
std::vector< AsocBox * > children
Definition: FileFormat.h:115
Definition: FileFormat.h:135
bool(* handler)(FileFormat *fileFormat, uint8_t *p_header_data, uint32_t header_size)
Definition: FileFormat.h:137
uint32_t id
Definition: FileFormat.h:136
Definition: FileFormat.h:140
uint32_t m_size
Definition: FileFormat.h:143
uint8_t * m_data
Definition: FileFormat.h:142
Byte input-output stream.
Definition: BufferedStream.h:38
Definition: CodeStream.h:163
Component.
Definition: FileFormat.h:94
uint8_t bpc
Definition: FileFormat.h:97
ComponentInfo()
Definition: FileFormat.h:95
Box.
Definition: FileFormat.h:83
uint64_t length
Definition: FileFormat.h:86
FileFormatBox()
Definition: FileFormat.h:84
uint32_t type
Definition: FileFormat.h:87
Definition: CodeStream.h:119
UUID.
Definition: FileFormat.h:121
UUIDBox(const uint8_t myuuid[16], uint8_t *buf, size_t size, bool owns)
Definition: FileFormat.h:125
UUIDBox()
Definition: FileFormat.h:122
uint8_t uuid[16]
Definition: FileFormat.h:130
virtual void dealloc()
Definition: util.h:259
uint8_t * buf
Definition: util.h:304
Definition: grok.h:619
ICC profile, palette, channel definition.
Definition: grok.h:611