Added option for Digital cinema profile compliant codestream. This can be chosen...
[openjpeg.git] / libopenjpeg / openjpeg.h
index ad2c4d6a5267a2bf09aa68295a2db5a15afb520b..d5543b926d2d9a9ee30db923ecfe74c718cf680a 100644 (file)
@@ -1,9 +1,10 @@
-/*
+ /*
+ * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2007, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
- * Copyright (c) 2005, Herv� Drolon, FreeImage Team
- * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #ifndef OPENJPEG_H
 #define OPENJPEG_H
 
-#define OPENJPEG_VERSION "1.0.0"
+#define OPENJPEG_VERSION "1.1.1"
 
 /* 
 ==========================================================
    Compiler directives
 ==========================================================
 */
+
+#if defined(OPJ_STATIC) || !(defined(WIN32) || defined(__WIN32__))
+#define OPJ_API
+#define OPJ_CALLCONV
+#else
+#define OPJ_CALLCONV __stdcall
+/*
+The following ifdef block is the standard way of creating macros which make exporting 
+from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS
+symbol defined on the command line. this symbol should not be defined on any project
+that uses this DLL. This way any other project whose source files include this file see 
+OPJ_API functions as being imported from a DLL, wheras this DLL sees symbols
+defined with this macro as being exported.
+*/
+#ifdef OPJ_EXPORTS
+#define OPJ_API __declspec(dllexport)
+#else
+#define OPJ_API __declspec(dllimport)
+#endif /* OPJ_EXPORTS */
+#endif /* !OPJ_STATIC || !WIN32 */
+
 #ifndef __cplusplus
 #if defined(HAVE_STDBOOL_H)
 /*
@@ -68,19 +90,42 @@ braindamage below.
 ==========================================================
 */
 
-#ifndef MAX_PATH
-#define MAX_PATH 260   /**< Maximum allowed size for filenames */
-#endif /* MAX_PATH */
+#define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */
 
 #define J2K_MAXRLVLS 33                                        /**< Number of maximum resolution level authorized */
 #define J2K_MAXBANDS (3*J2K_MAXRLVLS-2)        /**< Number of maximum sub-band linked to number of resolution level */
 
+/* UniPG>> */
+#ifdef USE_JPWL
+#define JPWL_MAX_NO_TILESPECS  16 /**< Maximum number of tile parts expected by JPWL: increase at your will */
+#define JPWL_MAX_NO_PACKSPECS  16 /**< Maximum number of packet parts expected by JPWL: increase at your will */
+#define JPWL_MAX_NO_MARKERS    512 /**< Maximum number of JPWL markers: increase at your will */
+#define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */
+#define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */
+#define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */
+#define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */
+#endif /* USE_JPWL */
+/* <<UniPG */
+
 /* 
 ==========================================================
    enum definitions
 ==========================================================
 */
 
+typedef enum RSIZ_CAPABILITIES {
+       STD_RSIZ = 0,
+       CINEMA2K = 3,           /** Profile name for a 2K image*/
+       CINEMA4K = 4            /** Profile name for a 4K image*/
+} OPJ_RSIZ_CAPABILITIES;
+
+typedef enum CINEMA_MODE {
+       OFF = 0,
+       CINEMA2K_24 = 1,
+       CINEMA2K_48 = 2,
+       CINEMA4K_24 = 3
+}OPJ_CINEMA_MODE;
+
 /** Progression order */
 typedef enum PROG_ORDER {
        PROG_UNKNOWN = -1,      /**< place-holder */
@@ -111,6 +156,14 @@ typedef enum CODEC_FORMAT {
        CODEC_JP2 = 2           /**< JPEG-2000 file format : read/write */
 } OPJ_CODEC_FORMAT;
 
+/** 
+Limit decoding to certain portions of the codestream. 
+*/
+typedef enum LIMIT_DECODING {
+       NO_LIMITATION = 0,                              /**< No limitation for the decoding. The entire codestream will de decoded */
+       LIMIT_TO_MAIN_HEADER = 1        /**< The decoding is limited to the Main Header */
+} OPJ_LIMIT_DECODING;
+
 /* 
 ==========================================================
    event manager typedef definitions
@@ -164,6 +217,12 @@ typedef struct opj_poc {
 Compression parameters
 */
 typedef struct opj_cparameters {
+       /** Digital Cinema compliance 0-not compliant, 1-compliant*/
+       OPJ_CINEMA_MODE cp_cinema;
+       /** Progression order*/
+       char cp_prog[4];
+       /** Profile name*/
+       OPJ_RSIZ_CAPABILITIES cp_rsiz;
        /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */
        bool tile_size_on;
        /** XTOsiz */
@@ -195,7 +254,7 @@ typedef struct opj_cparameters {
        /** number of layers */
        int tcp_numlayers;
        /** rates of layers */
-       int tcp_rates[100];
+       float tcp_rates[100];
        /** different psnr for successive layers */
        float tcp_distoratio[100];
        /** number of resolutions */
@@ -222,13 +281,13 @@ typedef struct opj_cparameters {
        /**@name command line encoder parameters (not used inside the library) */
        /*@{*/
        /** input file name */
-       char infile[MAX_PATH];
+       char infile[OPJ_PATH_LEN];
        /** output file name */
-       char outfile[MAX_PATH];
+       char outfile[OPJ_PATH_LEN];
        /** creation of an index file, default to 0 (false) */
        int index_on;
        /** index file name */
-       char index[MAX_PATH];
+       char index[OPJ_PATH_LEN];
        /** subimage encoding: origin image offset in x direction */
        int image_offset_x0;
        /** subimage encoding: origin image offset in y direction */
@@ -237,11 +296,46 @@ typedef struct opj_cparameters {
        int subsampling_dx;
        /** subsampling value for dy */
        int subsampling_dy;
-       /** input file format 0: PGX, 1: PxM, 2: BMP */
+       /** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/
        int decod_format;
        /** output file format 0: J2K, 1: JP2, 2: JPT */
        int cod_format;
        /*@}*/
+
+/* UniPG>> */
+#ifdef USE_JPWL
+       /**@name JPWL encoding parameters */
+       /*@{*/
+       /** enables writing of EPC in MH, thus activating JPWL */
+       bool jpwl_epc_on;
+       /** error protection method for MH (0,1,16,32,37-128) */
+       int jpwl_hprot_MH;
+       /** tile number of header protection specification (>=0) */
+       int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
+       /** error protection methods for TPHs (0,1,16,32,37-128) */
+       int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS];
+       /** tile number of packet protection specification (>=0) */
+       int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS];
+       /** packet number of packet protection specification (>=0) */
+       int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS];
+       /** error protection methods for packets (0,1,16,32,37-128) */
+       int jpwl_pprot[JPWL_MAX_NO_PACKSPECS];
+       /** enables writing of ESD, (0=no/1/2 bytes) */
+       int jpwl_sens_size;
+       /** sensitivity addressing size (0=auto/2/4 bytes) */
+       int jpwl_sens_addr;
+       /** sensitivity range (0-3) */
+       int jpwl_sens_range;
+       /** sensitivity method for MH (-1=no,0-7) */
+       int jpwl_sens_MH;
+       /** tile number of sensitivity specification (>=0) */
+       int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
+       /** sensitivity methods for TPHs (-1=no,0-7) */
+       int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS];
+       /*@}*/
+#endif /* USE_JPWL */
+/* <<UniPG */
+
 } opj_cparameters_t;
 
 /**
@@ -264,17 +358,39 @@ typedef struct opj_dparameters {
        */
        int cp_layer;
 
+       /** 
+       Specify whether the decoding should be done on the entire codestream, or be limited to the main header
+       Limiting the decoding to the main header makes it possible to extract the characteristics of the codestream
+       if == NO_LIMITATION, the entire codestream is decoded; 
+       if == LIMIT_TO_MAIN_HEADER, only the main header is decoded; 
+       */
+       OPJ_LIMIT_DECODING cp_limit_decoding;
+
        /**@name command line encoder parameters (not used inside the library) */
        /*@{*/
        /** input file name */
-       char infile[MAX_PATH];
+       char infile[OPJ_PATH_LEN];
        /** output file name */
-       char outfile[MAX_PATH];
+       char outfile[OPJ_PATH_LEN];
        /** input file format 0: J2K, 1: JP2, 2: JPT */
        int decod_format;
        /** output file format 0: PGX, 1: PxM, 2: BMP */
        int cod_format;
        /*@}*/
+
+/* UniPG>> */
+#ifdef USE_JPWL
+       /**@name JPWL decoding parameters */
+       /*@{*/
+       /** activates the JPWL correction capabilities */
+       bool jpwl_correct;
+       /** expected number of components */
+       int jpwl_exp_comps;
+       /** maximum number of tiles */
+       int jpwl_max_tiles;
+       /*@}*/
+#endif /* USE_JPWL */
+/* <<UniPG */
 } opj_dparameters_t;
 
 /** Common fields between JPEG-2000 compression and decompression master structs. */
@@ -446,7 +562,7 @@ extern "C" {
 ==========================================================
 */
 
-const char * opj_version();
+OPJ_API const char * OPJ_CALLCONV opj_version();
 
 /* 
 ==========================================================
@@ -461,13 +577,13 @@ Create an image
 @param clrspc image color space
 @return returns a new image structure if successful, returns NULL otherwise
 */
-opj_image_t *opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
+OPJ_API opj_image_t* OPJ_CALLCONV opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
 
 /**
 Deallocate any resources associated with an image
 @param image image to be destroyed
 */
-void opj_image_destroy(opj_image_t *image);
+OPJ_API void OPJ_CALLCONV opj_image_destroy(opj_image_t *image);
 
 /* 
 ==========================================================
@@ -486,26 +602,26 @@ to contain encoded data.
 @param length Reading: buffer length. Writing: 0
 @return Returns a CIO handle if successful, returns NULL otherwise
 */
-opj_cio_t* opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length);
+OPJ_API opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length);
 
 /**
 Close and free a CIO handle
 @param cio CIO handle to free
 */
-void opj_cio_close(opj_cio_t *cio);
+OPJ_API void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio);
 
 /**
 Get position in byte stream
 @param cio CIO handle
 @return Returns the position in bytes
 */
-int cio_tell(opj_cio_t *cio);
+OPJ_API int OPJ_CALLCONV cio_tell(opj_cio_t *cio);
 /**
 Set position in byte stream
 @param cio CIO handle
 @param pos Position, in number of bytes, from the beginning of the stream
 */
-void cio_seek(opj_cio_t *cio, int pos);
+OPJ_API void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos);
 
 /* 
 ==========================================================
@@ -513,7 +629,7 @@ void cio_seek(opj_cio_t *cio, int pos);
 ==========================================================
 */
 
-opj_event_mgr_t* opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context);
+OPJ_API opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context);
 
 /* 
 ==========================================================
@@ -525,42 +641,42 @@ Creates a J2K/JPT/JP2 decompression structure
 @param format Decoder to select
 @return Returns a handle to a decompressor if successful, returns NULL otherwise
 */
-opj_dinfo_t* opj_create_decompress(OPJ_CODEC_FORMAT format);
+OPJ_API opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format);
 /**
 Destroy a decompressor handle
 @param dinfo decompressor handle to destroy
 */
-void opj_destroy_decompress(opj_dinfo_t *dinfo);
+OPJ_API void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo);
 /**
 Set decoding parameters to default values
 @param parameters Decompression parameters
 */
-void opj_set_default_decoder_parameters(opj_dparameters_t *parameters);
+OPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters);
 /**
 Setup the decoder decoding parameters using user parameters.
 Decoding parameters are returned in j2k->cp. 
 @param dinfo decompressor handle
 @param parameters decompression parameters
 */
-void opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters);
+OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters);
 /**
 Decode an image from a JPEG-2000 codestream
 @param dinfo decompressor handle
 @param cio Input buffer stream
 @return Returns a decoded image if successful, returns NULL otherwise
 */
-opj_image_t* opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio);
+OPJ_API opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio);
 /**
 Creates a J2K/JP2 compression structure
 @param format Coder to select
 @return Returns a handle to a compressor if successful, returns NULL otherwise
 */
-opj_cinfo_t* opj_create_compress(OPJ_CODEC_FORMAT format);
+OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format);
 /**
 Destroy a compressor handle
 @param cinfo compressor handle to destroy
 */
-void opj_destroy_compress(opj_cinfo_t *cinfo);
+OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo);
 /**
 Set encoding parameters to default values, that means : 
 <ul>
@@ -582,14 +698,14 @@ Set encoding parameters to default values, that means :
 </ul>
 @param parameters Compression parameters
 */
-void opj_set_default_encoder_parameters(opj_cparameters_t *parameters);
+OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters);
 /**
 Setup the encoder parameters using the current image and using user parameters. 
 @param cinfo compressor handle
 @param parameters compression parameters
 @param image input filled image
 */
-void opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image);
+OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image);
 /**
 Encode an image into a JPEG-2000 codestream
 @param cinfo compressor handle
@@ -598,7 +714,7 @@ Encode an image into a JPEG-2000 codestream
 @param index Name of the index file if required, NULL otherwise
 @return Returns true if successful, returns false otherwise
 */
-bool opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index);
+OPJ_API bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index);
 
 #ifdef __cplusplus
 }