remove deprecated v1 style function j2k_create_decompress and jp2_create_decompress
[openjpeg.git] / libopenjpeg / j2k.h
index 270232aa0407fbb49fd58dd4820348349e7a2c6c..977847e86f352b87d2c7ca6e7f5aeb377e282434 100644 (file)
@@ -6,6 +6,9 @@
  * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2006-2007, Parvatha Elangovan
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * Copyright (c) 2011, Mickael Savinaud, Communications & Systemes <mickael.savinaud@c-s.fr>
+ *
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -77,15 +80,12 @@ The functions in J2K.C have for goal to read/write the several parts of the code
 #define J2K_MS_EPH 0xff92      /**< EPH marker value */
 #define J2K_MS_CRG 0xff63      /**< CRG marker value */
 #define J2K_MS_COM 0xff64      /**< COM marker value */
-
-#define J2K_MS_UNK 0           /**< UNKNOWN marker value */
-
-#ifdef TODO_MS /* FIXME */
 #define J2K_MS_CBD 0xff78      /**< CBD marker value */
 #define J2K_MS_MCC 0xff75      /**< MCC marker value */
 #define J2K_MS_MCT 0xff74      /**< MCT marker value */
 #define J2K_MS_MCO 0xff77      /**< MCO marker value */
-#endif
+
+#define J2K_MS_UNK 0           /**< UNKNOWN marker value */
 
 /* UniPG>> */
 #ifdef USE_JPWL
@@ -100,16 +100,14 @@ The functions in J2K.C have for goal to read/write the several parts of the code
 #endif /* USE_JPSEC */
 /* <<UniPG */
 
-
-struct opj_stream_private;
-
 /* ----------------------------------------------------------------------- */
 
 /**
-Values that specify the status of the decoding process when decoding the main header. 
-These values may be combined with a | operator. 
-*/
+ * Values that specify the status of the decoding process when decoding the main header.
+ * These values may be combined with a | operator.
+ * */
 typedef enum J2K_STATUS {
+       J2K_STATE_NONE  =  0x0000, /**< a SOC marker is expected */
        J2K_STATE_MHSOC  = 0x0001, /**< a SOC marker is expected */
        J2K_STATE_MHSIZ  = 0x0002, /**< a SIZ marker is expected */
        J2K_STATE_MH     = 0x0004, /**< the decoding process is in the main header */
@@ -118,10 +116,31 @@ typedef enum J2K_STATUS {
        J2K_STATE_MT     = 0x0020, /**< the EOC marker has just been read */
        J2K_STATE_NEOC   = 0x0040, /**< the decoding process must not expect a EOC marker because the codestream is truncated */
 
-       J2K_STATE_EOC    = 0x0100,  /**< the decoding process has encountered the EOC marker */
-       J2K_STATE_ERR    = 0x8000 /**< the decoding process has encountered an error (FIXME warning V1 = 0x0080)*/
+       J2K_STATE_EOC    = 0x0100, /**< the decoding process has encountered the EOC marker */
+       J2K_STATE_ERR    = 0x8000  /**< the decoding process has encountered an error (FIXME warning V1 = 0x0080)*/
 } J2K_STATUS;
 
+/**
+ * Type of elements storing in the MCT data
+ */
+typedef enum MCT_ELEMENT_TYPE
+{
+       MCT_TYPE_INT16 = 0,             /** MCT data is stored as signed shorts*/
+       MCT_TYPE_INT32 = 1,             /** MCT data is stored as signed integers*/
+       MCT_TYPE_FLOAT = 2,             /** MCT data is stored as floats*/
+       MCT_TYPE_DOUBLE = 3             /** MCT data is stored as doubles*/
+} J2K_MCT_ELEMENT_TYPE;
+
+/**
+ * Type of MCT array
+ */
+typedef enum MCT_ARRAY_TYPE
+{
+       MCT_TYPE_DEPENDENCY = 0,
+       MCT_TYPE_DECORRELATION = 1,
+       MCT_TYPE_OFFSET = 2
+} J2K_MCT_ARRAY_TYPE;
+
 /* ----------------------------------------------------------------------- */
 
 /** 
@@ -133,8 +152,8 @@ typedef enum T2_MODE {
 }J2K_T2_MODE;
 
 /**
-Quantization stepsize
-*/
+ * Quantization stepsize
+ */
 typedef struct opj_stepsize {
        /** exponent */
        int expn;
@@ -142,36 +161,6 @@ typedef struct opj_stepsize {
        int mant;
 } opj_stepsize_t;
 
-//OPJ_V1/**
-//Tile-component coding parameters
-//*/
-//typedef struct opj_tccp {
-//     /** coding style */
-//     int csty;
-//     /** number of resolutions */
-//     int numresolutions;
-//     /** code-blocks width */
-//     int cblkw;
-//     /** code-blocks height */
-//     int cblkh;
-//     /** code-block coding style */
-//     int cblksty;
-//     /** discrete wavelet transform identifier */
-//     int qmfbid;
-//     /** quantisation style */
-//     int qntsty;
-//     /** stepsizes used for quantization */
-//     opj_stepsize_t stepsizes[J2K_MAXBANDS];
-//     /** number of guard bits */
-//     int numgbits;
-//     /** Region Of Interest shift */
-//     int roishift;
-//     /** precinct width */
-//     int prcw[J2K_MAXRLVLS];
-//     /** precinct height */
-//     int prch[J2K_MAXRLVLS];
-//} opj_tccp_t;
-
 /**
 Tile-component coding parameters
 */
@@ -207,7 +196,7 @@ typedef struct opj_tccp
 opj_tccp_t;
 
 
-/**
+/** V1 STYLE
 Tile coding parameters : 
 this structure is used to store coding/decoding parameters common to all
 tiles (information like COD, COC in main header)
@@ -247,28 +236,9 @@ typedef struct opj_tcp {
        opj_tccp_t *tccps;
 } opj_tcp_t;
 
-
-/**
- * Type of data for storing the MCT data
- */
-typedef enum MCT_ELEMENT_TYPE
-{
-       MCT_TYPE_INT16 = 0,             /** MCT data is stored as signed shorts*/
-       MCT_TYPE_INT32 = 1,             /** MCT data is stored as signed integers*/
-       MCT_TYPE_FLOAT = 2,             /** MCT data is stored as floats*/
-       MCT_TYPE_DOUBLE = 3             /** MCT data is stored as doubles*/
-} J2K_MCT_ELEMENT_TYPE;
-
 /**
- * Type of data for storing the MCT data
+ * FIXME DOC
  */
-typedef enum MCT_ARRAY_TYPE
-{
-       MCT_TYPE_DEPENDENCY = 0,
-       MCT_TYPE_DECORRELATION = 1,
-       MCT_TYPE_OFFSET = 2
-} J2K_MCT_ARRAY_TYPE;
-
 typedef struct opj_mct_data
 {
        J2K_MCT_ELEMENT_TYPE m_element_type;
@@ -279,6 +249,9 @@ typedef struct opj_mct_data
 }
 opj_mct_data_t;
 
+/**
+ * FIXME DOC
+ */
 typedef struct opj_simple_mcc_decorrelation_data
 {
        OPJ_UINT32                       m_index;
@@ -349,7 +322,6 @@ typedef struct opj_tcp_v2
        OPJ_UINT32 m_nb_max_mcc_records;
 
 
-
        /***** FLAGS *******/
        /** If ppt == 1 --> there was a PPT marker for the present tile */
        OPJ_UINT32 ppt : 1;
@@ -361,7 +333,7 @@ typedef struct opj_tcp_v2
 
 
 
-/**
+/** V1 STYLE
 Coding parameters
 */
 typedef struct opj_cp {
@@ -505,8 +477,8 @@ opj_decoding_param_t;
 
 
 /**
-Coding parameters
-*/
+ * Coding parameters
+ */
 typedef struct opj_cp_v2
 {
        /** Size of the image in bits*/
@@ -514,9 +486,9 @@ typedef struct opj_cp_v2
        /** Rsiz*/
        OPJ_RSIZ_CAPABILITIES rsiz;
        /** XTOsiz */
-       OPJ_UINT32 tx0; // MSD see norm
+       OPJ_UINT32 tx0; /* MSD see norm */
        /** YTOsiz */
-       OPJ_UINT32 ty0; // MSD see norm
+       OPJ_UINT32 ty0; /* MSD see norm */
        /** XTsiz */
        OPJ_UINT32 tdx;
        /** YTsiz */
@@ -528,9 +500,6 @@ typedef struct opj_cp_v2
        /** number of tiles in heigth */
        OPJ_UINT32 th;
 
-
-
-
        /** packet header store there for futur use in t2_decode_packet */
        OPJ_BYTE *ppm_data;
        /** size of the ppm_data*/
@@ -632,6 +601,19 @@ typedef struct opj_j2k_dec
        OPJ_UINT32 m_start_tile_y;
        OPJ_UINT32 m_end_tile_x;
        OPJ_UINT32 m_end_tile_y;
+       /**
+        * Decoded area set by the user
+        */
+       OPJ_UINT32 m_DA_x0;
+       OPJ_UINT32 m_DA_y0;
+       OPJ_UINT32 m_DA_x1;
+       OPJ_UINT32 m_DA_y1;
+
+       /** Index of the tile to decode (used in get_tile) */
+       OPJ_INT32 m_tile_ind_to_dec;
+       /** Position of the last SOT marker read */
+       OPJ_OFF_T m_last_sot_read_pos;
+
        /**
         * Indicate that the current tile-part is assume as the last tile part of the codestream.
         * It is useful in the case of PSot is equal to zero. The sot length will be compute in the
@@ -648,10 +630,10 @@ typedef struct opj_j2k_dec
 typedef struct opj_j2k_enc
 {
        /** Tile part number, regardless of poc, for each new poc, tp is reset to 1*/
-       OPJ_UINT32 m_current_poc_tile_part_number; // tp_num
+       OPJ_UINT32 m_current_poc_tile_part_number; /* tp_num */
 
        /** Tile part number currently coding, taking into account POC. m_current_tile_part_number holds the total number of tile parts while encoding the last tile part.*/
-       OPJ_UINT32 m_current_tile_part_number; //cur_tp_num
+       OPJ_UINT32 m_current_tile_part_number; /*cur_tp_num */
 
        /**
        locate the start position of the TLM marker
@@ -669,7 +651,7 @@ typedef struct opj_j2k_enc
 
        /** Total num of tile parts in whole image = num tiles* num tileparts in each tile*/
        /** used in TLMmarker*/
-       OPJ_UINT32 m_total_tile_parts;   // totnum_tp
+       OPJ_UINT32 m_total_tile_parts;   /* totnum_tp */
 
        /* encoded data for a tile */
        OPJ_BYTE * m_encoded_tile_data;
@@ -763,9 +745,11 @@ typedef struct opj_j2k_v2
        }
        m_specific_param;
 
-       /** pointer to the encoded / decoded image */
-       //opj_image_t *m_image;
-       opj_image_t* m_image;
+       /** pointer to the internal/private encoded / decoded image */
+       opj_image_t* m_private_image;
+
+       /* pointer to the output image (decoded)*/
+       opj_image_t* m_output_image;
 
        /** Coding parameters */
        opj_cp_v2_t m_cp;
@@ -784,9 +768,6 @@ typedef struct opj_j2k_v2
 
        /** the current tile coder/decoder **/
        struct opj_tcd_v2 *     m_tcd;
-       //opj_tcd_v2_t *        m_tcd;
-
-
 
 }
 opj_j2k_v2_t;
@@ -797,12 +778,7 @@ opj_j2k_v2_t;
 /** @name Exported functions */
 /*@{*/
 /* ----------------------------------------------------------------------- */
-/**
-Creates a J2K decompression structure
-@param cinfo Codec context info
-@return Returns a handle to a J2K decompressor if successful, returns NULL otherwise
-*/
-opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo);
+
 /**
 Destroy a J2K decompressor handle
 @param j2k J2K decompressor handle to destroy
@@ -846,7 +822,7 @@ Creates a J2K compression structure
 @param cinfo Codec context info
 @return Returns a handle to a J2K compressor if successful, returns NULL otherwise
 */
-opj_j2k_v2_t* j2k_create_compress_v2();
+opj_j2k_v2_t* j2k_create_compress_v2(void);
 
 /**
 Destroy a J2K compressor handle
@@ -861,6 +837,12 @@ Coding parameters are returned in j2k->cp.
 @param image input filled image
 */
 void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image);
+
+void j2k_setup_encoder_v2(     opj_j2k_v2_t *p_j2k,
+                                                       opj_cparameters_t *parameters,
+                                                       opj_image_t *image,
+                                                       struct opj_event_mgr * p_manager);
+
 /**
 Converts an enum type progression order to string type
 */
@@ -897,7 +879,7 @@ opj_bool j2k_end_decompress(opj_j2k_v2_t *j2k, struct opj_stream_private *cio, s
  */
 opj_bool j2k_read_header(      struct opj_stream_private *p_stream,
                                                        opj_j2k_v2_t* p_j2k,
-                                                       opj_image_t* p_image,
+                                                       opj_image_t** p_image,
                                                        struct opj_event_mgr* p_manager );
 
 
@@ -908,6 +890,13 @@ opj_bool j2k_read_header(  struct opj_stream_private *p_stream,
  */
 void j2k_destroy (opj_j2k_v2_t *p_j2k);
 
+/**
+ * Destroys a codestream index structure.
+ *
+ * @param      p_cstr_ind      the codestream index parameter to destroy.
+ */
+void j2k_destroy_cstr_index (opj_codestream_index_t *p_cstr_ind);
+
 /**
  * Decode tile data.
  * @param      p_j2k           the jpeg2000 codec.
@@ -957,6 +946,7 @@ opj_bool j2k_read_tile_header (
  * @return     true                    if the area could be set.
  */
 opj_bool j2k_set_decode_area(  opj_j2k_v2_t *p_j2k,
+                                                               opj_image_t* p_image,
                                                                OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
                                                                OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
                                                                struct opj_event_mgr * p_manager );
@@ -966,7 +956,7 @@ opj_bool j2k_set_decode_area(       opj_j2k_v2_t *p_j2k,
  *
  * @return a handle to a J2K decompressor if successful, NULL otherwise.
  */
-opj_j2k_v2_t* j2k_create_decompress_v2();
+opj_j2k_v2_t* j2k_create_decompress_v2(void);
 
 
 /**
@@ -1027,4 +1017,58 @@ opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_v2_t* p_j2k);
 opj_bool j2k_decode_v2(opj_j2k_v2_t *j2k, struct opj_stream_private *cio, opj_image_t* p_image, opj_event_mgr_t * p_manager);
 
 
+opj_bool j2k_get_tile( opj_j2k_v2_t *p_j2k,
+                                               opj_stream_private_t *p_stream,
+                                               opj_image_t* p_image,
+                                               struct opj_event_mgr * p_manager,
+                                               OPJ_UINT32 tile_index );
+
+opj_bool j2k_set_decoded_resolution_factor(opj_j2k_v2_t *p_j2k, OPJ_UINT32 res_factor, opj_event_mgr_t * p_manager);
+
+
+/**
+ * Writes a tile.
+ * @param      p_j2k           the jpeg2000 codec.
+ * @param      p_stream                        the stream to write data to.
+ * @param      p_manager       the user event manager.
+ */
+opj_bool j2k_write_tile (      opj_j2k_v2_t * p_j2k,
+                                                       OPJ_UINT32 p_tile_index,
+                                                       OPJ_BYTE * p_data,
+                                                       OPJ_UINT32 p_data_size,
+                                                       struct opj_stream_private *p_stream,
+                                                       struct opj_event_mgr * p_manager );
+
+/**
+ * Encodes an image into a JPEG-2000 codestream
+ */
+opj_bool j2k_encode_v2(        opj_j2k_v2_t * p_j2k,
+                                               opj_stream_private_t *cio,
+                                               struct opj_event_mgr * p_manager );
+
+/**
+ * Starts a compression scheme, i.e. validates the codec parameters, writes the header.
+ *
+ * @param      p_j2k           the jpeg2000 codec.
+ * @param      cio                     the stream object.
+ * @param      p_manager       the user event manager.
+ *
+ * @return true if the codec is valid.
+ */
+opj_bool j2k_start_compress(opj_j2k_v2_t *p_j2k,
+                                                       struct opj_stream_private *cio,
+                                                       struct opj_image * p_image,
+                                                       struct opj_event_mgr * p_manager );
+
+/**
+ * Ends the compression procedures and possibiliy add data to be read after the
+ * codestream.
+ */
+opj_bool j2k_end_compress(     opj_j2k_v2_t *p_j2k,
+                                                       opj_stream_private_t *cio,
+                                                       struct opj_event_mgr * p_manager);
+
+opj_bool j2k_setup_mct_encoding (opj_tcp_v2_t * p_tcp, opj_image_t * p_image);
+
+
 #endif /* __J2K_H */