Grok 20.3.2
FileFormatJP2Family.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 <string>
21#include <stack>
22
23namespace grk
24{
25const uint32_t JP2_JP = 0x6a502020;
26const uint32_t JP2_SIG = 0x0d0a870a;
27const uint32_t JP2_FTYP = 0x66747970;
28const uint32_t JP2_JP2 = 0x6a703220;
29const uint32_t JP2_JPH = 0x6A706820;
30const uint32_t JP2_JPX = 0x6a707820;
31
32// JP2 Header
33const uint32_t JP2_JP2H = 0x6a703268;
34const uint32_t JP2_IHDR = 0x69686472;
35const uint32_t JP2_BPCC = 0x62706363;
36const uint32_t JP2_COLR = 0x636f6c72;
37const uint32_t JP2_PCLR = 0x70636c72;
38const uint32_t JP2_CMAP = 0x636d6170;
39const uint32_t JP2_CDEF = 0x63646566;
40const uint32_t JP2_RES = 0x72657320;
41const uint32_t JP2_CAPTURE_RES = 0x72657363;
42const uint32_t JP2_DISPLAY_RES = 0x72657364;
43
44// Boxes shared between compress and decompress
45const uint32_t JP2_JP2C = 0x6a703263;
46const uint32_t JP2_JP2I = 0x6a703269;
47const uint32_t JP2_XML = 0x786d6c20;
48const uint32_t JP2_UUID = 0x75756964;
49const uint32_t JP2_ASOC = 0x61736f63;
50const uint32_t JP2_LBL = 0x6c626c20;
51const uint32_t JP2_RREQ = 0x72726571;
52
53#define GRK_BOX_SIZE 1024
54#define GRK_RESOLUTION_BOX_SIZE (4 + 4 + 10)
55#define JP2_MAX_NUM_UUIDS 128
56#define JP2_MAX_NUM_XML_BOXES 64
57
67
68typedef std::function<bool(uint8_t* headerData, uint32_t headerSize)> BOX_FUNC;
69
71{
72 FindHandlerInfo(BOX_FUNC handler, bool superBox) : handler_(handler), superBox_(superBox) {}
73 bool valid(void)
74 {
75 return handler_ || superBox_;
76 }
79};
80
81typedef std::function<uint8_t*(uint32_t* len)> WRITE_FUNC;
83{
84 BoxWriteHandler() : handler(nullptr), data_(nullptr), size_(0) {}
86 uint8_t* data_;
87 uint32_t size_;
88};
89
90struct Box
91{
92 Box() : length(0), type(0), byteCount(0) {}
93 uint64_t length;
94 uint32_t type;
95 uint64_t byteCount;
96};
97
98struct UUIDBox : public Box, Buffer8
99{
101 {
102 memset(uuid, 0, sizeof(uuid));
103 }
104 UUIDBox(const uint8_t myuuid[16], uint8_t* buf, size_t size) : Box(), Buffer8(buf, size, false)
105 {
106 memcpy(uuid, myuuid, 16);
107 }
108 uint8_t uuid[16];
109};
110
112{
114 uint8_t bpc;
115};
116
121{
122 ~AsocBox() override
123 {
125 }
126 void dealloc() override
127 {
129 for(auto& as : children)
130 {
131 delete as;
132 }
133 children.clear();
134 }
135 std::string label;
136 std::vector<AsocBox*> children;
137};
138
143{
144public:
146 virtual ~FileFormatJP2Family();
149
150protected:
151 void init(grk_decompress_parameters* param);
152 bool readHeaderProcedure();
153 bool readHeader(grk_header_info* header_info, GrkImage* headerImage);
154 virtual GrkImage* getHeaderImage(void) = 0;
155 grk_color* getColour(void);
156 std::string getBoxName(const Box& box);
164 const FindHandlerInfo img_find_handler(uint32_t id);
165
166 uint32_t read_asoc(AsocBox* parent, uint8_t** header_data, uint32_t* header_data_size,
167 uint32_t asocSize);
168 bool read_asoc(uint8_t* header_data, uint32_t header_data_size);
169 void serializeAsoc(AsocBox* asoc, grk_asoc* serial_asocs, uint32_t* num_asocs, uint32_t level);
170 /***
171 * Read box length and type only
172 *
173 *
174 * returns: true if box header was read successfully, otherwise false
175 * throw: CorruptJP2BoxException if box is corrupt
176 * Note: box length is never 0
177 *
178 */
179 bool read_box_header(Box* box, IStream* stream, uint32_t* bytesRead, bool codeStreamBoxWasRead);
180 bool read_box_header(Box* box, uint8_t* p_data, uint32_t* bytesRead, uint64_t availableBytes);
181
182 uint8_t* write_buffer(uint32_t boxId, Buffer8* buffer, uint32_t* p_nb_bytes_written);
183 bool write_ftyp(IStream* stream, uint32_t file_type);
184 bool write_signature(IStream* stream, uint32_t sig);
185
186 bool exec(std::vector<PROCEDURE_FUNC>* procs);
188 std::vector<PROCEDURE_FUNC>* procedure_list_;
189
190 uint32_t brand;
191 uint32_t minversion;
192 uint32_t numcl;
193 uint32_t* cl;
194
195 // IHDR ///////////////////////////
196 uint32_t w;
197 uint32_t h;
198 uint16_t numcomps;
199 uint8_t bpc;
200 uint8_t C;
201 uint8_t UnkC;
202 uint8_t IPR;
204
205 uint8_t meth;
206 uint8_t approx;
208 uint8_t precedence;
210
215
218 uint32_t numXmlBoxes;
220 std::string xml_outfile_;
221
223
225 uint32_t numUuids;
226
227 std::unordered_map<uint32_t, BOX_FUNC> header;
229 uint32_t jp2_state;
230
233
234 std::stack<Box> superBoxes_;
235
236 std::unordered_map<uint32_t, BOX_FUNC> img_header;
237
239
250 bool read_jp2h(uint8_t* headerData, uint32_t headerSize);
251 void skip(uint8_t** headerData, uint32_t* headerSize, uint32_t skip);
252
253private:
254 double calc_res(uint16_t num, uint16_t den, uint8_t exponent);
255 bool read_ihdr(uint8_t* p_image_header_data, uint32_t image_header_size);
256 bool read_res_box(uint32_t* id, uint32_t* num, uint32_t* den, uint32_t* exponent,
257 uint8_t** p_resolution_data);
258 bool read_res(uint8_t* p_resolution_data, uint32_t resolution_size);
259 bool read_bpc(uint8_t* p_bpc_header_data, uint32_t bpc_header_size);
260 bool read_channel_definition(uint8_t* p_cdef_header_data, uint32_t cdef_header_size);
261 bool read_colr(uint8_t* p_colr_header_data, uint32_t colr_header_size);
262 bool read_component_mapping(uint8_t* component_mapping_header_data,
263 uint32_t component_mapping_header_size);
264 bool read_palette_clr(uint8_t* p_pclr_header_data, uint32_t pclr_header_size);
265
274 bool read_signature(uint8_t* headerData, uint32_t headerSize);
283 bool read_ftyp(uint8_t* headerData, uint32_t headerSize);
284
285 const FindHandlerInfo find_handler(uint32_t id);
286
287 void updateSuperBoxes(uint64_t boxBytes);
288};
289
290} // namespace grk
#define JP2_MAX_NUM_XML_BOXES
Definition FileFormatJP2Family.h:56
#define JP2_MAX_NUM_UUIDS
Definition FileFormatJP2Family.h:55
bool readHeader(grk_header_info *header_info, GrkImage *headerImage)
Definition FileFormatJP2Family.cpp:112
std::vector< PROCEDURE_FUNC > * procedure_list_
list of execution procedures
Definition FileFormatJP2Family.h:188
double display_resolution[2]
Definition FileFormatJP2Family.h:214
bool read_signature(uint8_t *headerData, uint32_t headerSize)
Reads a JPEG 2000 file signature box.
Definition FileFormatJP2Family.cpp:524
bool read_res_box(uint32_t *id, uint32_t *num, uint32_t *den, uint32_t *exponent, uint8_t **p_resolution_data)
Definition FileFormatJP2Family.cpp:735
const FindHandlerInfo find_handler(uint32_t id)
Definition FileFormatJP2Family.cpp:516
void skip(uint8_t **headerData, uint32_t *headerSize, uint32_t skip)
Definition FileFormatJP2Family.cpp:104
bool read_jp2h(uint8_t *headerData, uint32_t headerSize)
Reads the Jpeg2000 file Header box - JP2 Header box.
Definition FileFormatJP2Family.cpp:605
std::unordered_map< uint32_t, BOX_FUNC > header
Definition FileFormatJP2Family.h:227
FileFormatJP2Family(const FileFormatJP2Family &)=delete
grk_color * getColour(void)
Definition FileFormatJP2Family.cpp:92
bool write_ftyp(IStream *stream, uint32_t file_type)
Definition FileFormatJP2Family.cpp:471
IStream * stream_
Definition FileFormatJP2Family.h:238
uint8_t * write_buffer(uint32_t boxId, Buffer8 *buffer, uint32_t *p_nb_bytes_written)
Definition FileFormatJP2Family.cpp:432
bool read_bpc(uint8_t *p_bpc_header_data, uint32_t bpc_header_size)
Definition FileFormatJP2Family.cpp:803
FileFormatJP2Family & operator=(const FileFormatJP2Family &)=delete
uint8_t approx
Definition FileFormatJP2Family.h:206
bool exec(std::vector< PROCEDURE_FUNC > *procs)
Definition FileFormatJP2Family.cpp:1382
uint32_t numUuids
Definition FileFormatJP2Family.h:225
uint8_t IPR
Definition FileFormatJP2Family.h:202
std::string xml_outfile_
Definition FileFormatJP2Family.h:220
bool io_xml_
Definition FileFormatJP2Family.h:219
uint32_t brand
Definition FileFormatJP2Family.h:190
bool headerError_
Definition FileFormatJP2Family.h:231
std::stack< Box > superBoxes_
Definition FileFormatJP2Family.h:234
Buffer8 xml
Definition FileFormatJP2Family.h:216
std::unordered_map< uint32_t, BOX_FUNC > img_header
Definition FileFormatJP2Family.h:236
virtual GrkImage * getHeaderImage(void)=0
uint32_t numXmlBoxes
Definition FileFormatJP2Family.h:218
bool read_component_mapping(uint8_t *component_mapping_header_data, uint32_t component_mapping_header_size)
Definition FileFormatJP2Family.cpp:1038
bool read_ihdr(uint8_t *p_image_header_data, uint32_t image_header_size)
Definition FileFormatJP2Family.cpp:660
bool read_res(uint8_t *p_resolution_data, uint32_t resolution_size)
Definition FileFormatJP2Family.cpp:762
AsocBox root_asoc
Definition FileFormatJP2Family.h:228
uint32_t read_asoc(AsocBox *parent, uint8_t **header_data, uint32_t *header_data_size, uint32_t asocSize)
Definition FileFormatJP2Family.cpp:1282
std::string getBoxName(const Box &box)
Definition FileFormatJP2Family.cpp:595
bool readHeaderProcedure()
Definition FileFormatJP2Family.cpp:261
double capture_resolution[2]
Definition FileFormatJP2Family.h:212
FileFormatJP2Family(IStream *stream)
Definition FileFormatJP2Family.cpp:48
Buffer8 ipr
Definition FileFormatJP2Family.h:222
uint32_t * cl
Definition FileFormatJP2Family.h:193
uint32_t minversion
Definition FileFormatJP2Family.h:191
void serializeAsoc(AsocBox *asoc, grk_asoc *serial_asocs, uint32_t *num_asocs, uint32_t level)
Definition FileFormatJP2Family.cpp:1355
uint32_t numcl
Definition FileFormatJP2Family.h:192
double calc_res(uint16_t num, uint16_t den, uint8_t exponent)
Definition FileFormatJP2Family.cpp:728
bool read_colr(uint8_t *p_colr_header_data, uint32_t colr_header_size)
Definition FileFormatJP2Family.cpp:925
bool has_display_resolution
Definition FileFormatJP2Family.h:213
virtual ~FileFormatJP2Family()
Definition FileFormatJP2Family.cpp:74
uint8_t UnkC
Definition FileFormatJP2Family.h:201
UUIDBox uuids[JP2_MAX_NUM_UUIDS]
Definition FileFormatJP2Family.h:224
bool headerRead_
Definition FileFormatJP2Family.h:232
uint16_t numcomps
Definition FileFormatJP2Family.h:198
bool read_palette_clr(uint8_t *p_pclr_header_data, uint32_t pclr_header_size)
Definition FileFormatJP2Family.cpp:1083
bool read_ftyp(uint8_t *headerData, uint32_t headerSize)
Reads a FTYP box - File type box.
Definition FileFormatJP2Family.cpp:552
uint32_t h
Definition FileFormatJP2Family.h:197
uint8_t precedence
Definition FileFormatJP2Family.h:208
bool has_capture_resolution
Definition FileFormatJP2Family.h:211
uint8_t C
Definition FileFormatJP2Family.h:200
GRK_ENUM_COLOUR_SPACE enumcs
Definition FileFormatJP2Family.h:207
uint32_t w
Definition FileFormatJP2Family.h:196
void updateSuperBoxes(uint64_t boxBytes)
Definition FileFormatJP2Family.cpp:245
uint8_t bpc
Definition FileFormatJP2Family.h:199
bool read_box_header(Box *box, IStream *stream, uint32_t *bytesRead, bool codeStreamBoxWasRead)
Definition FileFormatJP2Family.cpp:1204
void init(grk_decompress_parameters *param)
Definition FileFormatJP2Family.cpp:86
bool read_channel_definition(uint8_t *p_cdef_header_data, uint32_t cdef_header_size)
Definition FileFormatJP2Family.cpp:828
const FindHandlerInfo img_find_handler(uint32_t id)
Finds the BOX_FUNC related to given box id.
Definition FileFormatJP2Family.cpp:96
bool write_signature(IStream *stream, uint32_t sig)
Definition FileFormatJP2Family.cpp:458
uint32_t jp2_state
Definition FileFormatJP2Family.h:229
uint8_t meth
Definition FileFormatJP2Family.h:205
Buffer8 xml_boxes[JP2_MAX_NUM_XML_BOXES]
Definition FileFormatJP2Family.h:217
ComponentInfo * comps
Definition FileFormatJP2Family.h:209
Stores header and data for an image.
Definition GrkImage.h:54
enum _GRK_ENUM_COLOUR_SPACE GRK_ENUM_COLOUR_SPACE
JPEG 2000 enumerated color spaces.
ResWindow.
Definition CompressedChunkCache.h:36
const uint32_t JP2_CAPTURE_RES
Resolution box (super-box).
Definition FileFormatJP2Family.h:41
const uint32_t JP2_JP2H
JPX file type.
Definition FileFormatJP2Family.h:33
const uint32_t JP2_XML
Intellectual property box.
Definition FileFormatJP2Family.h:47
const uint32_t JP2_JP2C
Display resolution box.
Definition FileFormatJP2Family.h:45
const uint32_t JP2_UUID
XML box.
Definition FileFormatJP2Family.h:48
const uint32_t JP2_PCLR
Colour specification box.
Definition FileFormatJP2Family.h:37
const uint32_t JP2_LBL
Associated data box.
Definition FileFormatJP2Family.h:50
const uint32_t JP2_IHDR
JP2 header box (super-box).
Definition FileFormatJP2Family.h:34
JP2_STATE
Definition FileFormatJP2Family.h:59
@ JP2_STATE_FILE_TYPE
Definition FileFormatJP2Family.h:62
@ JP2_STATE_SIGNATURE
Definition FileFormatJP2Family.h:61
@ JP2_STATE_CODESTREAM
Definition FileFormatJP2Family.h:64
@ JP2_STATE_NONE
Definition FileFormatJP2Family.h:60
@ JP2_STATE_HEADER
Definition FileFormatJP2Family.h:63
@ JP2_STATE_END_CODESTREAM
Definition FileFormatJP2Family.h:65
const uint32_t JP2_JP2I
Contiguous code stream box.
Definition FileFormatJP2Family.h:46
std::function< uint8_t *(uint32_t *len)> WRITE_FUNC
Definition FileFormatJP2Family.h:81
const uint32_t JP2_ASOC
UUID box.
Definition FileFormatJP2Family.h:49
const uint32_t JP2_DISPLAY_RES
Capture resolution box.
Definition FileFormatJP2Family.h:42
const uint32_t JP2_FTYP
JPEG 2000 signature.
Definition FileFormatJP2Family.h:27
const uint32_t JP2_SIG
JPEG 2000 signature box.
Definition FileFormatJP2Family.h:26
const uint32_t JP2_RREQ
Label box.
Definition FileFormatJP2Family.h:51
const uint32_t JP2_RES
Channel Definition box.
Definition FileFormatJP2Family.h:40
const uint32_t JP2_CDEF
Component Mapping box.
Definition FileFormatJP2Family.h:39
const uint32_t JP2_CMAP
Palette box.
Definition FileFormatJP2Family.h:38
const uint32_t JP2_JP
Definition FileFormatJP2Family.h:25
std::function< bool(uint8_t *headerData, uint32_t headerSize)> BOX_FUNC
Definition FileFormatJP2Family.h:68
const uint32_t JP2_COLR
Bits per component box.
Definition FileFormatJP2Family.h:36
const uint32_t JP2_JP2
File type box.
Definition FileFormatJP2Family.h:28
const uint32_t JP2_JPX
Definition FileFormatJP2Family.h:30
Buffer< uint8_t, AllocatorVanilla > Buffer8
Definition buffer.h:257
const uint32_t JP2_BPCC
Image header box.
Definition FileFormatJP2Family.h:35
const uint32_t JP2_JPH
File type fields.
Definition FileFormatJP2Family.h:29
Association box (defined in ITU 15444-2 Annex M 11.1 ).
Definition FileFormatJP2Family.h:121
std::string label
Definition FileFormatJP2Family.h:135
void dealloc() override
Definition FileFormatJP2Family.h:126
~AsocBox() override
Definition FileFormatJP2Family.h:122
std::vector< AsocBox * > children
Definition FileFormatJP2Family.h:136
Definition FileFormatJP2Family.h:91
Box()
Definition FileFormatJP2Family.h:92
uint32_t type
Definition FileFormatJP2Family.h:94
uint64_t byteCount
Definition FileFormatJP2Family.h:95
uint64_t length
Definition FileFormatJP2Family.h:93
WRITE_FUNC handler
Definition FileFormatJP2Family.h:85
BoxWriteHandler()
Definition FileFormatJP2Family.h:84
uint32_t size_
Definition FileFormatJP2Family.h:87
uint8_t * data_
Definition FileFormatJP2Family.h:86
uint8_t * buf() const
Definition buffer.h:235
virtual void dealloc()
Definition buffer.h:124
Definition FileFormatJP2Family.h:112
uint8_t bpc
Definition FileFormatJP2Family.h:114
ComponentInfo()
Definition FileFormatJP2Family.h:113
Definition FileFormatJP2Family.h:71
bool valid(void)
Definition FileFormatJP2Family.h:73
bool superBox_
Definition FileFormatJP2Family.h:78
BOX_FUNC handler_
Definition FileFormatJP2Family.h:77
FindHandlerInfo(BOX_FUNC handler, bool superBox)
Definition FileFormatJP2Family.h:72
Definition IStream.h:60
Definition FileFormatJP2Family.h:99
UUIDBox()
Definition FileFormatJP2Family.h:100
UUIDBox(const uint8_t myuuid[16], uint8_t *buf, size_t size)
Definition FileFormatJP2Family.h:104
uint8_t uuid[16]
Definition FileFormatJP2Family.h:108
Association box info.
ICC profile, palette, channel definition.
Decompression parameters.
JPEG 2000 header info.