* 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
#define J2K_MS_EPH 0xff92 /**< EPH marker value */
#define J2K_MS_CRG 0xff63 /**< CRG marker value */
#define J2K_MS_COM 0xff64 /**< COM marker value */
-
-#ifdef TODO_MS
#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
#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 */
J2K_STATE_TPH = 0x0010, /**< the decoding process is in a tile part header */
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_ERR = 0x0080 /**< the decoding process has encountered an error */
+
+ 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;
+
/* ----------------------------------------------------------------------- */
/**
}J2K_T2_MODE;
/**
-Quantization stepsize
-*/
+ * Quantization stepsize
+ */
typedef struct opj_stepsize {
/** exponent */
int expn;
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
*/
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)
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;
}
opj_mct_data_t;
+/**
+ * FIXME DOC
+ */
typedef struct opj_simple_mcc_decorrelation_data
{
OPJ_UINT32 m_index;
OPJ_UINT32 m_nb_max_mcc_records;
-
/***** FLAGS *******/
/** If ppt == 1 --> there was a PPT marker for the present tile */
OPJ_UINT32 ppt : 1;
-/**
+/** V1 STYLE
Coding parameters
*/
typedef struct opj_cp {
/**
-Coding parameters
-*/
+ * Coding parameters
+ */
typedef struct opj_cp_v2
{
/** Size of the image in bits*/
/** 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 */
OPJ_UINT32 tw;
/** number of tiles in heigth */
OPJ_UINT32 th;
- /** packet header storage original buffer */
- OPJ_BYTE *ppm_buffer;
+
/** packet header store there for futur use in t2_decode_packet */
OPJ_BYTE *ppm_data;
/** size of the ppm_data*/
OPJ_UINT32 ppm_len;
+ /** size of the ppm_data*/
+ OPJ_UINT32 ppm_data_read;
+
+ OPJ_BYTE *ppm_data_current;
+
+ /** packet header storage original buffer */
+ OPJ_BYTE *ppm_buffer;
+ /** pointer remaining on the first byte of the first header if ppm is used */
+ OPJ_BYTE *ppm_data_first;
/** Number of bytes actually stored inside the ppm_data */
OPJ_UINT32 ppm_data_size;
+ /** use in case of multiple marker PPM (number of info already store) */
+ OPJ_INT32 ppm_store;
+ /** use in case of multiple marker PPM (case on non-finished previous info) */
+ OPJ_INT32 ppm_previous;
+
/** tile coding parameters */
opj_tcp_v2_t *tcps;
+
union
{
opj_decoding_param_t m_dec;
/* UniPG>> */
#ifdef USE_JPWL
/** enables writing of EPC in MH, thus activating JPWL */
- bool epc_on;
+ opj_bool epc_on;
/** enables writing of EPB, in case of activated JPWL */
- bool epb_on;
+ opj_bool epb_on;
/** enables writing of ESD, in case of activated JPWL */
- bool esd_on;
+ opj_bool esd_on;
/** enables writing of informative techniques of ESD, in case of activated JPWL */
- bool info_on;
+ opj_bool info_on;
/** enables writing of RED, in case of activated JPWL */
- bool red_on;
+ opj_bool red_on;
/** error protection method for MH (0,1,16,32,37-128) */
int hprot_MH;
/** tile number of header protection specification (>=0) */
/** sensitivity methods for TPHs (-1,0-7) */
int sens_TPH[JPWL_MAX_NO_TILESPECS];
/** enables JPWL correction at the decoder */
- bool correct;
+ opj_bool correct;
/** expected number of components at the decoder */
int exp_comps;
/** maximum number of tiles at the decoder */
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
+ * SOD reader function. FIXME NOT USED for the moment
+ */
+ opj_bool m_last_tile_part;
/** to tell that a tile can be decoded. */
OPJ_UINT32 m_can_decode : 1;
OPJ_UINT32 m_discard_tiles : 1;
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
/** 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;
*/
typedef struct opj_j2k_v2
{
+ /* J2K codestream is decoded*/
+ opj_bool m_is_decoder;
+
+ /* FIXME DOC*/
union
{
opj_j2k_dec_t m_decoder;
}
m_specific_param;
- /** number of the tile curently concern by coding/decoding */
- OPJ_UINT32 m_current_tile_number;
+ /** pointer to the internal/private encoded / decoded image */
+ opj_image_t* m_private_image;
- /** pointer to the encoded / decoded image */
- opj_image_t *m_image;
+ /* pointer to the output image (decoded)*/
+ opj_image_t* m_output_image;
/** Coding parameters */
opj_cp_v2_t m_cp;
struct opj_procedure_list * m_validation_list;
/** helper used to write the index file */
- opj_codestream_info_t *cstr_info;
+ opj_codestream_index_t *cstr_index;
+
+ /** number of the tile curently concern by coding/decoding */
+ OPJ_UINT32 m_current_tile_number;
/** the current tile coder/decoder **/
struct opj_tcd_v2 * m_tcd;
- //opj_tcd_v2_t * m_tcd;
-
- OPJ_UINT32 m_is_decoder : 1;
}
opj_j2k_v2_t;
@param parameters decompression parameters
*/
void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);
+
+void j2k_setup_decoder_v2(opj_j2k_v2_t *j2k, opj_dparameters_t *parameters);
+
/**
Decode an image from a JPEG-2000 codestream
@param j2k J2K decompressor handle
@return Returns a handle to a J2K compressor if successful, returns NULL otherwise
*/
opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo);
+
+/**
+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(void);
+
/**
Destroy a J2K compressor handle
@param j2k J2K compressor handle to destroy
@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
*/
* Ends the decompression procedures and possibiliy add data to be read after the
* codestream.
*/
-opj_bool j2k_end_decompress(opj_j2k_t *j2k, struct opj_stream_private *cio, struct opj_event_mgr * p_manager);
+opj_bool j2k_end_decompress(opj_j2k_v2_t *j2k, struct opj_stream_private *cio, struct opj_event_mgr * p_manager);
/**
* Reads a jpeg2000 codestream header structure.
*
* @return true if the box is valid.
*/
-opj_bool j2k_read_header(
- opj_j2k_v2_t *p_j2k,
- struct opj_image ** p_image,
- OPJ_INT32 * p_tile_x0,
- OPJ_INT32 * p_tile_y0,
- OPJ_UINT32 * p_tile_width,
- OPJ_UINT32 * p_tile_height,
- OPJ_UINT32 * p_nb_tiles_x,
- OPJ_UINT32 * p_nb_tiles_y,
- struct opj_stream_private *cio,
- struct opj_event_mgr * p_manager
- );
+opj_bool j2k_read_header( struct opj_stream_private *p_stream,
+ opj_j2k_v2_t* p_j2k,
+ opj_image_t** p_image,
+ struct opj_event_mgr* p_manager );
+
/**
* Destroys a jpeg2000 codec.
*/
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.
*
* @return true if the area could be set.
*/
-opj_bool j2k_set_decode_area(
- opj_j2k_v2_t *p_j2k,
- 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
- );
+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 );
/**
* Creates a J2K decompression structure.
*
* @return a handle to a J2K decompressor if successful, NULL otherwise.
+ */
+opj_j2k_v2_t* j2k_create_decompress_v2(void);
+
+
+/**
+ * Dump some elements from the J2K decompression structure .
+ *
+ *@param p_j2k the jpeg2000 codec.
+ *@param flag flag to describe what elments are dump.
+ *@param out_stream output stream where dump the elements.
+ *
+*/
+void j2k_dump (opj_j2k_v2_t* p_j2k, OPJ_INT32 flag, FILE* out_stream);
+
+
+
+/**
+ * Dump an image header structure.
+ *
+ *@param img_header the image header to dump.
+ *@param dev_dump_flag flag to describe if we are in the case of this function is use outside j2k_dump function
+ *@param out_stream output stream where dump the elements.
+ */
+void j2k_dump_image_header(opj_image_t* image, opj_bool dev_dump_flag, FILE* out_stream);
+
+/**
+ * Dump a component image header structure.
+ *
+ *@param comp_header the component image header to dump.
+ *@param dev_dump_flag flag to describe if we are in the case of this function is use outside j2k_dump function
+ *@param out_stream output stream where dump the elements.
+ */
+void j2k_dump_image_comp_header(opj_image_comp_t* comp, opj_bool dev_dump_flag, FILE* out_stream);
+
+/**
+ * Get the codestream info from a JPEG2000 codec.
+ *
+ *@param p_j2k the component image header to dump.
+ *
+ *@return the codestream information extract from the jpg2000 codec
+ */
+opj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_v2_t* p_j2k);
+
+/**
+ * Get the codestream index from a JPEG2000 codec.
+ *
+ *@param p_j2k the component image header to dump.
+ *
+ *@return the codestream index extract from the jpg2000 codec
+ */
+opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_v2_t* p_j2k);
+
+/**
+ * Decode an image from a JPEG-2000 codestream
+ * @param j2k J2K decompressor handle
+ * @param cio Input buffer stream
+ * @param cstr_info Codestream information structure if required, NULL otherwise
+ * @return Returns a decoded image if successful, returns NULL otherwise
*/
-opj_j2k_v2_t* j2k_create_decompress_v2();
+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 */