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