1 /*
2 * Copyright (c) 2003-2004, Fran�ois-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[4];
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 void 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 void 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_dinfo_t* mj2_create_decompress();
321 /**
322 Destroy a MJ2 decompressor handle
323 @param movie MJ2 decompressor handle to destroy
324 */
325 void 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 parameters decompression parameters
331 */
332 void mj2_setup_decoder(opj_mj2_t *movie, mj2_dparameters_t *mj2_parameters);
333 /**
334 Decode an image from a JPEG-2000 file stream
335 @param movie MJ2 decompressor handle
336 @param cio Input buffer stream
337 @return Returns a decoded image if successful, returns NULL otherwise
338 */
339 opj_image_t* mj2_decode(opj_mj2_t *movie, opj_cio_t *cio);
340 /**
341 Creates a MJ2 compression structure
342 @return Returns a handle to a MJ2 compressor if successful, returns NULL otherwise
343 */
344 opj_cinfo_t* mj2_create_compress();
345 /**
346 Destroy a MJ2 compressor handle
347 @param movie MJ2 compressor handle to destroy
348 */
349 void mj2_destroy_compress(opj_mj2_t *movie);
350 /**
351 Setup the encoder parameters using the current image and using user parameters.
352 Coding parameters are returned in mj2->j2k->cp.
353 @param movie MJ2 compressor handle
354 @param parameters compression parameters
355 */
356 void mj2_setup_encoder(opj_mj2_t *movie, mj2_cparameters_t *parameters);
357 /**
358 Encode an image into a JPEG-2000 file stream
359 @param movie MJ2 compressor handle
360 @param cio Output buffer stream
361 @param image Image to encode
362 @param index Name of the index file if required, NULL otherwise
363 @return Returns true if successful, returns false otherwise
364 */
365 opj_bool mj2_encode(opj_mj2_t *movie, opj_cio_t *cio, opj_image_t *image, char *index);
366 
367 /**
368 Init a Standard MJ2 movie
369 @param movie MJ2 Movie
370 @return Returns 0 if successful, returns 1 otherwise
371 */
372 int mj2_init_stdmovie(opj_mj2_t *movie);
373 /**
374 Read the structure of an MJ2 file
375 @param File MJ2 input File
376 @param movie J2 movie structure
377 @return Returns 0 if successful, returns 1 otherwise
378 */
379 int mj2_read_struct(FILE *file, opj_mj2_t *mj2);
380 /**
381 Write the the MOOV box to an output buffer stream
382 @param movie MJ2 movie structure
383 @param cio Output buffer stream
384 */
385 void mj2_write_moov(opj_mj2_t *movie, opj_cio_t *cio);
386 
387 
388 /* ----------------------------------------------------------------------- */
389 /*@}*/
390 
391 /*@}*/
392 
393 #endif /* __MJ2_H */
394