1 /*
2 * Copyright (c) 2003-2004, Francois-Olivier Devaux
3 * Copyright (c) 2003-2004,  Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
4 * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
16  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  * POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #ifndef __MJ2_H
29 #define __MJ2_H
30 /**
31 @file mj2.h
32 @brief The Motion JPEG 2000 file format Reader/Writer (MJ22)
33 
34 */
35 
36 /** @defgroup MJ2 MJ2 - Motion JPEG 2000 file format reader/writer */
37 /*@{*/
38 
39 #define MJ2_JP    0x6a502020
40 #define MJ2_FTYP  0x66747970
41 #define MJ2_MJ2   0x6d6a7032
42 #define MJ2_MJ2S  0x6d6a3273
43 #define MJ2_MDAT  0x6d646174
44 #define MJ2_MOOV  0x6d6f6f76
45 #define MJ2_MVHD  0x6d766864
46 #define MJ2_TRAK  0x7472616b
47 #define MJ2_TKHD  0x746b6864
48 #define MJ2_MDIA  0x6d646961
49 #define MJ2_MDHD  0x6d646864
50 #define MJ2_MHDR  0x6d686472
51 #define MJ2_HDLR  0x68646C72
52 #define MJ2_MINF  0x6d696e66
53 #define MJ2_VMHD  0x766d6864
54 #define MJ2_SMHD  0x736d6864
55 #define MJ2_HMHD  0x686d6864
56 #define MJ2_DINF  0x64696e66
57 #define MJ2_DREF  0x64726566
58 #define MJ2_URL   0x75726c20
59 #define MJ2_URN   0x75726e20
60 #define MJ2_STBL  0x7374626c
61 #define MJ2_STSD  0x73747364
62 #define MJ2_STTS  0x73747473
63 #define MJ2_STSC  0x73747363
64 #define MJ2_STSZ  0x7374737a
65 #define MJ2_STCO  0x7374636f
66 #define MJ2_MOOF  0x6d6f6f66
67 #define MJ2_FREE  0x66726565
68 #define MJ2_SKIP  0x736b6970
69 #define MJ2_JP2C  0x6a703263
70 #define MJ2_FIEL  0x6669656c
71 #define MJ2_JP2P  0x6a703270
72 #define MJ2_JP2X  0x6a703278
73 #define MJ2_JSUB  0x6a737562
74 #define MJ2_ORFO  0x6f72666f
75 #define MJ2_MVEX  0x6d766578
76 #define MJ2_JP2   0x6a703220
77 #define MJ2_J2P0  0x4a325030
78 
79 /**
80 Decompressed format used in parameters
81 YUV = 0
82 */
83 #define YUV_DFMT 1
84 
85 /**
86 Compressed format used in parameters
87 MJ2 = 0
88 */
89 #define MJ2_CFMT 2
90 
91 
92 /* ----------------------------------------------------------------------- */
93 
94 /**
95 Time To Sample
96 */
97 typedef struct mj2_tts {
98     int sample_count;
99     int sample_delta;
100 } mj2_tts_t;
101 
102 /**
103 Chunk
104 */
105 typedef struct mj2_chunk {
106     unsigned int num_samples;
107     int sample_descr_idx;
108     int offset;
109 } mj2_chunk_t;
110 
111 /**
112 Sample to chunk
113 */
114 typedef struct mj2_sampletochunk {
115     unsigned int first_chunk;
116     unsigned int samples_per_chunk;
117     int sample_descr_idx;
118 } mj2_sampletochunk_t;
119 
120 /**
121 Sample
122 */
123 typedef struct mj2_sample {
124     unsigned int sample_size;
125     unsigned int offset;
126     unsigned int sample_delta;
127 } mj2_sample_t;
128 
129 /**
130 URL
131 */
132 typedef struct mj2_url {
133     int location[4];
134 } mj2_url_t;
135 
136 /**
137 URN
138 */
139 typedef struct mj2_urn {
140     int name[2];
141     int location[4];
142 } mj2_urn_t;
143 
144 /**
145 Video Track Parameters
146 */
147 typedef struct mj2_tk {
148     /** codec context */
149     opj_common_ptr cinfo;
150     int track_ID;
151     int track_type;
152     unsigned int creation_time;
153     unsigned int modification_time;
154     int duration;
155     int timescale;
156     int layer;
157     int volume;
158     int language;
159     int balance;
160     int maxPDUsize;
161     int avgPDUsize;
162     int maxbitrate;
163     int avgbitrate;
164     int slidingavgbitrate;
165     int graphicsmode;
166     int opcolor[3];
167     int num_url;
168     mj2_url_t *url;
169     int num_urn;
170     mj2_urn_t *urn;
171     int Dim[2];
172     int w;
173     int h;
174     int visual_w;
175     int visual_h;
176     int CbCr_subsampling_dx;
177     int CbCr_subsampling_dy;
178     int sample_rate;
179     int sample_description;
180     int horizresolution;
181     int vertresolution;
182     int compressorname[8];
183     int depth;
184     unsigned char fieldcount;
185     unsigned char fieldorder;
186     unsigned char or_fieldcount;
187     unsigned char or_fieldorder;
188     int num_br;
189     unsigned int *br;
190     unsigned char num_jp2x;
191     unsigned char *jp2xdata;
192     unsigned char hsub;
193     unsigned char vsub;
194     unsigned char hoff;
195     unsigned char voff;
196     int trans_matrix[9];
197     /** Number of samples */
198     unsigned int num_samples;
199     int transorm;
200     int handler_type;
201     int name_size;
202     unsigned char same_sample_size;
203     int num_tts;
204     /** Time to sample    */
205     mj2_tts_t *tts;
206     unsigned int num_chunks;
207     mj2_chunk_t *chunk;
208     unsigned int num_samplestochunk;
209     mj2_sampletochunk_t *sampletochunk;
210     char *name;
211     opj_jp2_t jp2_struct;
212     /** Sample parameters */
213     mj2_sample_t *sample;
214 } mj2_tk_t;
215 
216 /**
217 MJ2 box
218 */
219 typedef struct mj2_box {
220     int length;
221     int type;
222     int init_pos;
223 } mj2_box_t;
224 
225 /**
226 MJ2 Movie
227 */
228 typedef struct opj_mj2 {
229     /** codec context */
230     opj_common_ptr cinfo;
231     /** handle to the J2K codec  */
232     opj_j2k_t *j2k;
233     unsigned int brand;
234     unsigned int minversion;
235     int num_cl;
236     unsigned int *cl;
237     unsigned int creation_time;
238     unsigned int modification_time;
239     int timescale;
240     unsigned int duration;
241     int rate;
242     int num_vtk;
243     int num_stk;
244     int num_htk;
245     int volume;
246     int trans_matrix[9];
247     int next_tk_id;
248     /** Track Parameters  */
249     mj2_tk_t *tk;
250 } opj_mj2_t;
251 
252 /**
253 Decompression parameters
254 */
255 typedef struct mj2_dparameters {
256     /**@name command line encoder parameters (not used inside the library) */
257     /*@{*/
258     /** input file name */
259     char infile[OPJ_PATH_LEN];
260     /** output file name */
261     char outfile[OPJ_PATH_LEN];
262     /** J2K decompression parameters */
263     opj_dparameters_t j2k_parameters;
264 } mj2_dparameters_t;
265 
266 /**
267 Compression parameters
268 */
269 typedef struct mj2_cparameters {
270     /**@name command line encoder parameters (not used inside the library) */
271     /*@{*/
272     /** J2K compression parameters */
273     opj_cparameters_t j2k_parameters;
274     /** input file name */
275     char infile[OPJ_PATH_LEN];
276     /** output file name */
277     char outfile[OPJ_PATH_LEN];
278     /** input file format 0:MJ2 */
279     int decod_format;
280     /** output file format 0:YUV */
281     int cod_format;
282     /** Portion of the image coded */
283     int Dim[2];
284     /** YUV Frame width */
285     int w;
286     /** YUV Frame height */
287     int h;
288     /*   Sample rate of YUV 4:4:4, 4:2:2 or 4:2:0 */
289     int CbCr_subsampling_dx;
290     /*   Sample rate of YUV 4:4:4, 4:2:2 or 4:2:0 */
291     int CbCr_subsampling_dy;
292     /*   Video Frame Rate  */
293     int frame_rate;
294     /*   In YUV files, numcomps always considered as 3 */
295     int numcomps;
296     /*   In YUV files, precision always considered as 8 */
297     int prec;
298     unsigned int meth;
299     unsigned int enumcs;
300 } mj2_cparameters_t;
301 
302 
303 /** @name Exported functions */
304 /*@{*/
305 /* ----------------------------------------------------------------------- */
306 /**
307 Write the JP box
308 */
309 OPJ_API void OPJ_CALLCONV mj2_write_jp(opj_cio_t *cio);
310 /**
311 Write the FTYP box
312 @param movie MJ2 movie
313 @param cio Output buffer stream
314 */
315 OPJ_API void OPJ_CALLCONV mj2_write_ftyp(opj_mj2_t *movie, opj_cio_t *cio);
316 /**
317 Creates an MJ2 decompression structure
318 @return Returns a handle to a MJ2 decompressor if successful, returns NULL otherwise
319 */
320 OPJ_API opj_dinfo_t* OPJ_CALLCONV mj2_create_decompress();
321 /**
322 Destroy a MJ2 decompressor handle
323 @param movie MJ2 decompressor handle to destroy
324 */
325 OPJ_API void OPJ_CALLCONV mj2_destroy_decompress(opj_mj2_t *movie);
326 /**
327 Setup the decoder decoding parameters using user parameters.
328 Decoding parameters are returned in mj2->j2k->cp.
329 @param movie MJ2 decompressor handle
330 @param mj2_parameters decompression parameters
331 */
332 OPJ_API void OPJ_CALLCONV mj2_setup_decoder(opj_mj2_t *movie,
333         mj2_dparameters_t *mj2_parameters);
334 /**
335 Decode an image from a JPEG-2000 file stream
336 @param movie MJ2 decompressor handle
337 @param cio Input buffer stream
338 @return Returns a decoded image if successful, returns NULL otherwise
339 */
340 opj_image_t* mj2_decode(opj_mj2_t *movie, opj_cio_t *cio);
341 /**
342 Creates a MJ2 compression structure
343 @return Returns a handle to a MJ2 compressor if successful, returns NULL otherwise
344 */
345 OPJ_API opj_cinfo_t* OPJ_CALLCONV mj2_create_compress();
346 /**
347 Destroy a MJ2 compressor handle
348 @param movie MJ2 compressor handle to destroy
349 */
350 OPJ_API void OPJ_CALLCONV mj2_destroy_compress(opj_mj2_t *movie);
351 /**
352 Setup the encoder parameters using the current image and using user parameters.
353 Coding parameters are returned in mj2->j2k->cp.
354 @param movie MJ2 compressor handle
355 @param parameters compression parameters
356 */
357 OPJ_API void OPJ_CALLCONV mj2_setup_encoder(opj_mj2_t *movie,
358         mj2_cparameters_t *parameters);
359 /**
360 Encode an image into a JPEG-2000 file stream
361 @param movie MJ2 compressor handle
362 @param cio Output buffer stream
363 @param image Image to encode
364 @param index Name of the index file if required, NULL otherwise
365 @return Returns true if successful, returns false otherwise
366 */
367 opj_bool mj2_encode(opj_mj2_t *movie, opj_cio_t *cio, opj_image_t *image,
368                     char *index);
369 
370 /**
371 Init a Standard MJ2 movie
372 @param movie MJ2 Movie
373 @return Returns 0 if successful, returns 1 otherwise
374 */
375 OPJ_API int OPJ_CALLCONV mj2_init_stdmovie(opj_mj2_t *movie);
376 /**
377 Read the structure of an MJ2 file
378 @param file MJ2 input File
379 @param mj2 J2 movie structure
380 @return Returns 0 if successful, returns 1 otherwise
381 */
382 OPJ_API int OPJ_CALLCONV mj2_read_struct(FILE *file, opj_mj2_t *mj2);
383 /**
384 Write the MOOV box to an output buffer stream
385 @param movie MJ2 movie structure
386 @param cio Output buffer stream
387 */
388 OPJ_API void OPJ_CALLCONV mj2_write_moov(opj_mj2_t *movie, opj_cio_t *cio);
389 
390 
391 /* ----------------------------------------------------------------------- */
392 /*@}*/
393 
394 /*@}*/
395 
396 #endif /* __MJ2_H */
397