/*
 * The copyright in this software is being made available under the 2-clauses 
 * BSD License, included below. This software may be subject to other third 
 * party and contributor rights, including patent rights, and no such rights
 * are granted under this license.
 *
 * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
 * Copyright (c) 2002-2014, Professor Benoit Macq
 * Copyright (c) 2001-2003, David Janssens
 * Copyright (c) 2002-2003, Yannick Verschueren
 * Copyright (c) 2003-2007, Francois-Olivier Devaux 
 * Copyright (c) 2003-2014, 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-2012, Centre National d'Etudes Spatiales (CNES), France 
 * Copyright (c) 2012, CS Systemes d'Information, France
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
#ifndef __J2K_H
#define __J2K_H
/**
@file j2k.h
@brief The JPEG-2000 Codestream Reader/Writer (J2K)

The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data.
*/

/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
/*@{*/

#define J2K_CP_CSTY_PRT 0x01
#define J2K_CP_CSTY_SOP 0x02
#define J2K_CP_CSTY_EPH 0x04
#define J2K_CCP_CSTY_PRT 0x01
#define J2K_CCP_CBLKSTY_LAZY 0x01     /**< Selective arithmetic coding bypass */
#define J2K_CCP_CBLKSTY_RESET 0x02    /**< Reset context probabilities on coding pass boundaries */
#define J2K_CCP_CBLKSTY_TERMALL 0x04  /**< Termination on each coding pass */
#define J2K_CCP_CBLKSTY_VSC 0x08      /**< Vertically stripe causal context */
#define J2K_CCP_CBLKSTY_PTERM 0x10    /**< Predictable termination */
#define J2K_CCP_CBLKSTY_SEGSYM 0x20   /**< Segmentation symbols are used */
#define J2K_CCP_QNTSTY_NOQNT 0
#define J2K_CCP_QNTSTY_SIQNT 1
#define J2K_CCP_QNTSTY_SEQNT 2

#define OPJ_J2K_DEFAULT_CBLK_DATA_SIZE 8192

/* ----------------------------------------------------------------------- */

#define J2K_MS_SOC 0xff4f	/**< SOC marker value */
#define J2K_MS_SOT 0xff90	/**< SOT marker value */
#define J2K_MS_SOD 0xff93	/**< SOD marker value */
#define J2K_MS_EOC 0xffd9	/**< EOC marker value */
#define J2K_MS_SIZ 0xff51	/**< SIZ marker value */
#define J2K_MS_COD 0xff52	/**< COD marker value */
#define J2K_MS_COC 0xff53	/**< COC marker value */
#define J2K_MS_RGN 0xff5e	/**< RGN marker value */
#define J2K_MS_QCD 0xff5c	/**< QCD marker value */
#define J2K_MS_QCC 0xff5d	/**< QCC marker value */
#define J2K_MS_POC 0xff5f	/**< POC marker value */
#define J2K_MS_TLM 0xff55	/**< TLM marker value */
#define J2K_MS_PLM 0xff57	/**< PLM marker value */
#define J2K_MS_PLT 0xff58	/**< PLT marker value */
#define J2K_MS_PPM 0xff60	/**< PPM marker value */
#define J2K_MS_PPT 0xff61	/**< PPT marker value */
#define J2K_MS_SOP 0xff91	/**< SOP marker value */
#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_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 */

#define J2K_MS_UNK 0		/**< UNKNOWN marker value */

/* UniPG>> */
#ifdef USE_JPWL
#define J2K_MS_EPC 0xff68	/**< EPC marker value (Part 11: JPEG 2000 for Wireless) */
#define J2K_MS_EPB 0xff66	/**< EPB marker value (Part 11: JPEG 2000 for Wireless) */ 
#define J2K_MS_ESD 0xff67	/**< ESD marker value (Part 11: JPEG 2000 for Wireless) */ 
#define J2K_MS_RED 0xff69	/**< RED marker value (Part 11: JPEG 2000 for Wireless) */
#endif /* USE_JPWL */
#ifdef USE_JPSEC
#define J2K_MS_SEC 0xff65    /**< SEC marker value (Part 8: Secure JPEG 2000) */
#define J2K_MS_INSEC 0xff94  /**< INSEC marker value (Part 8: Secure JPEG 2000) */
#endif /* USE_JPSEC */
/* <<UniPG */

/* ----------------------------------------------------------------------- */

/**
 * 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_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */
	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_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;

/* ----------------------------------------------------------------------- */

/** 
T2 encoding mode 
*/
typedef enum T2_MODE {
	THRESH_CALC = 0,	/** Function called in Rate allocation process*/
	FINAL_PASS = 1		/** Function called in Tier 2 process*/
}J2K_T2_MODE;

/**
 * Quantization stepsize
 */
typedef struct opj_stepsize {
	/** exponent */
	OPJ_INT32 expn;
	/** mantissa */
	OPJ_INT32 mant;
} opj_stepsize_t;

/**
Tile-component coding parameters
*/
typedef struct opj_tccp
{
	/** coding style */
	OPJ_UINT32 csty;
	/** number of resolutions */
	OPJ_UINT32 numresolutions;
	/** code-blocks width */
	OPJ_UINT32 cblkw;
	/** code-blocks height */
	OPJ_UINT32 cblkh;
	/** code-block coding style */
	OPJ_UINT32 cblksty;
	/** discrete wavelet transform identifier */
	OPJ_UINT32 qmfbid;
	/** quantisation style */
	OPJ_UINT32 qntsty;
	/** stepsizes used for quantization */
	opj_stepsize_t stepsizes[OPJ_J2K_MAXBANDS];
	/** number of guard bits */
	OPJ_UINT32 numgbits;
	/** Region Of Interest shift */
	OPJ_INT32 roishift;
	/** precinct width */
	OPJ_UINT32 prcw[OPJ_J2K_MAXRLVLS];
	/** precinct height */
	OPJ_UINT32 prch[OPJ_J2K_MAXRLVLS];
	/** the dc_level_shift **/
	OPJ_INT32 m_dc_level_shift;
}
opj_tccp_t;



/**
 * FIXME DOC
 */
typedef struct opj_mct_data
{
	J2K_MCT_ELEMENT_TYPE m_element_type;
	J2K_MCT_ARRAY_TYPE	 m_array_type;
	OPJ_UINT32			 m_index;
	OPJ_BYTE *			 m_data;
	OPJ_UINT32			 m_data_size;
}
opj_mct_data_t;

/**
 * FIXME DOC
 */
typedef struct opj_simple_mcc_decorrelation_data
{
	OPJ_UINT32			 m_index;
	OPJ_UINT32			 m_nb_comps;
	opj_mct_data_t *	 m_decorrelation_array;
	opj_mct_data_t *	 m_offset_array;
	OPJ_UINT32			 m_is_irreversible : 1;
}
opj_simple_mcc_decorrelation_data_t;

/**
Tile coding parameters :
this structure is used to store coding/decoding parameters common to all
tiles (information like COD, COC in main header)
*/
typedef struct opj_tcp
{
	/** coding style */
	OPJ_UINT32 csty;
	/** progression order */
	OPJ_PROG_ORDER prg;
	/** number of layers */
	OPJ_UINT32 numlayers;
	OPJ_UINT32 num_layers_to_decode;
	/** multi-component transform identifier */
	OPJ_UINT32 mct;
	/** rates of layers */
	OPJ_FLOAT32 rates[100];
	/** number of progression order changes */
	OPJ_UINT32 numpocs;
	/** progression order changes */
	opj_poc_t pocs[32];
	/** packet header store there for futur use in t2_decode_packet */
	OPJ_BYTE *ppt_data;
	/** used to keep a track of the allocated memory */
	OPJ_BYTE *ppt_buffer;
	/** Number of bytes stored inside ppt_data*/
	OPJ_UINT32 ppt_data_size;
	/** size of ppt_data*/
	OPJ_UINT32 ppt_len;
	/** add fixed_quality */
	OPJ_FLOAT32 distoratio[100];
	/** tile-component coding parameters */
	opj_tccp_t *tccps;
	/** number of tile parts for the tile. */
	OPJ_UINT32 m_nb_tile_parts;
	/** data for the tile */
	OPJ_BYTE *		m_data;
	/** size of data */
	OPJ_UINT32		m_data_size;
	/** encoding norms */
	OPJ_FLOAT64 *	mct_norms;
	/** the mct decoding matrix */
	OPJ_FLOAT32 *	m_mct_decoding_matrix;
	/** the mct coding matrix */
	OPJ_FLOAT32 *	m_mct_coding_matrix;
	/** mct records */
	opj_mct_data_t * m_mct_records;
	/** the number of mct records. */
	OPJ_UINT32 m_nb_mct_records;
	/** the max number of mct records. */
	OPJ_UINT32 m_nb_max_mct_records;
	/** mcc records */
	opj_simple_mcc_decorrelation_data_t * m_mcc_records;
	/** the number of mct records. */
	OPJ_UINT32 m_nb_mcc_records;
	/** the max number of mct records. */
	OPJ_UINT32 m_nb_max_mcc_records;


	/***** FLAGS *******/
	/** If cod == 1 --> there was a COD marker for the present tile */
	OPJ_UINT32 cod : 1;
	/** If ppt == 1 --> there was a PPT marker for the present tile */
	OPJ_UINT32 ppt : 1;
	/** indicates if a POC marker has been used O:NO, 1:YES */
	OPJ_UINT32 POC : 1;
} opj_tcp_t;




typedef struct opj_encoding_param
{
	/** Maximum rate for each component. If == 0, component size limitation is not considered */
	OPJ_UINT32 m_max_comp_size;
	/** Position of tile part flag in progression order*/
	OPJ_INT32 m_tp_pos;
	/** fixed layer */
	OPJ_INT32 *m_matrice;
	/** Flag determining tile part generation*/
	OPJ_BYTE m_tp_flag;
	/** allocation by rate/distortion */
	OPJ_UINT32 m_disto_alloc : 1;
	/** allocation by fixed layer */
	OPJ_UINT32 m_fixed_alloc : 1;
	/** add fixed_quality */
	OPJ_UINT32 m_fixed_quality : 1;
	/** Enabling Tile part generation*/
	OPJ_UINT32 m_tp_on : 1;
}
opj_encoding_param_t;

typedef struct opj_decoding_param
{
	/** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
	OPJ_UINT32 m_reduce;
	/** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
	OPJ_UINT32 m_layer;
}
opj_decoding_param_t;


/**
 * Coding parameters
 */
typedef struct opj_cp
{
	/** Size of the image in bits*/
	/*int img_size;*/
	/** Rsiz*/
    OPJ_UINT16 rsiz;
	/** XTOsiz */
	OPJ_UINT32 tx0; /* MSD see norm */
	/** YTOsiz */
	OPJ_UINT32 ty0; /* MSD see norm */
	/** XTsiz */
	OPJ_UINT32 tdx;
	/** YTsiz */
	OPJ_UINT32 tdy;
	/** comment */
	OPJ_CHAR *comment;
	/** number of tiles in width */
	OPJ_UINT32 tw;
	/** 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*/
	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_t *tcps;

	union
	{
		opj_decoding_param_t m_dec;
		opj_encoding_param_t m_enc;
	}
	m_specific_param;


/* UniPG>> */
#ifdef USE_JPWL
	/** enables writing of EPC in MH, thus activating JPWL */
	OPJ_BOOL epc_on;
	/** enables writing of EPB, in case of activated JPWL */
	OPJ_BOOL epb_on;
	/** enables writing of ESD, in case of activated JPWL */
	OPJ_BOOL esd_on;
	/** enables writing of informative techniques of ESD, in case of activated JPWL */
	OPJ_BOOL info_on;
	/** enables writing of RED, in case of activated JPWL */
	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) */
	int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
	/** error protection methods for TPHs (0,1,16,32,37-128) */
	int hprot_TPH[JPWL_MAX_NO_TILESPECS];
	/** tile number of packet protection specification (>=0) */
	int pprot_tileno[JPWL_MAX_NO_PACKSPECS];
	/** packet number of packet protection specification (>=0) */
	int pprot_packno[JPWL_MAX_NO_PACKSPECS];
	/** error protection methods for packets (0,1,16,32,37-128) */
	int pprot[JPWL_MAX_NO_PACKSPECS];
	/** enables writing of ESD, (0/2/4 bytes) */
	int sens_size;
	/** sensitivity addressing size (0=auto/2/4 bytes) */
	int sens_addr;
	/** sensitivity range (0-3) */
	int sens_range;
	/** sensitivity method for MH (-1,0-7) */
	int sens_MH;
	/** tile number of sensitivity specification (>=0) */
	int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
	/** sensitivity methods for TPHs (-1,0-7) */
	int sens_TPH[JPWL_MAX_NO_TILESPECS];
	/** enables JPWL correction at the decoder */
	OPJ_BOOL correct;
	/** expected number of components at the decoder */
	int exp_comps;
	/** maximum number of tiles at the decoder */
	OPJ_UINT32 max_tiles;
#endif /* USE_JPWL */

	/******** FLAGS *********/
	/** if ppm == 1 --> there was a PPM marker*/
	OPJ_UINT32 ppm : 1;
	/** tells if the parameter is a coding or decoding one */
	OPJ_UINT32 m_is_decoder : 1;
/* <<UniPG */
} opj_cp_t;


typedef struct opj_j2k_dec
{
	/** locate in which part of the codestream the decoder is (main header, tile header, end) */
	OPJ_UINT32 m_state;
	/**
	 * store decoding parameters common to all tiles (information like COD, COC in main header)
	 */
	opj_tcp_t *m_default_tcp;
	OPJ_BYTE  *m_header_data;
	OPJ_UINT32 m_header_data_size;
	/** to tell the tile part length */
	OPJ_UINT32 m_sot_length;
	/** Only tiles index in the correct range will be decoded.*/
	OPJ_UINT32 m_start_tile_x;
	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;
	OPJ_UINT32 m_skip_data			: 1;

} opj_j2k_dec_t;

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 */

	/** 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 */

	/**
	locate the start position of the TLM marker
	after encoding the tilepart, a jump (in j2k_write_sod) is done to the TLM marker to store the value of its length.
	*/
    OPJ_OFF_T m_tlm_start;
	/**
	 * Stores the sizes of the tlm.
	 */
	OPJ_BYTE * m_tlm_sot_offsets_buffer;
	/**
	 * The current offset of the tlm buffer.
	 */
	OPJ_BYTE * m_tlm_sot_offsets_current;

	/** 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 */

	/* encoded data for a tile */
	OPJ_BYTE * m_encoded_tile_data;

	/* size of the encoded_data */
	OPJ_UINT32 m_encoded_tile_size;

	/* encoded data for a tile */
	OPJ_BYTE * m_header_tile_data;

	/* size of the encoded_data */
	OPJ_UINT32 m_header_tile_data_size;


} opj_j2k_enc_t;



struct opj_tcd;
/**
JPEG-2000 codestream reader/writer
*/
typedef struct opj_j2k
{
	/* J2K codestream is decoded*/
	OPJ_BOOL m_is_decoder;

	/* FIXME DOC*/
	union
	{
		opj_j2k_dec_t m_decoder;
		opj_j2k_enc_t m_encoder;
	}
	m_specific_param;

	/** 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_t m_cp;

	/** the list of procedures to exec **/
	opj_procedure_list_t *	m_procedure_list;

	/** the list of validation procedures to follow to make sure the code is valid **/
	opj_procedure_list_t *	m_validation_list;

	/** helper used to write the index file */
	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 *	m_tcd;

}
opj_j2k_t;




/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */

/**
Setup the decoder decoding parameters using user parameters.
Decoding parameters are returned in j2k->cp. 
@param j2k J2K decompressor handle
@param parameters decompression parameters
*/
void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);

/**
 * Creates a J2K compression structure
 *
 * @return Returns a handle to a J2K compressor if successful, returns NULL otherwise
*/
opj_j2k_t* opj_j2k_create_compress(void);


OPJ_BOOL opj_j2k_setup_encoder(	opj_j2k_t *p_j2k,
						    opj_cparameters_t *parameters,
						    opj_image_t *image,
						    opj_event_mgr_t * p_manager);

/**
Converts an enum type progression order to string type
*/
char *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order);

/* ----------------------------------------------------------------------- */
/*@}*/

/*@}*/

/**
 * Ends the decompression procedures and possibiliy add data to be read after the
 * codestream.
 */
OPJ_BOOL opj_j2k_end_decompress(opj_j2k_t *j2k,
                                opj_stream_private_t *p_stream,
                                opj_event_mgr_t * p_manager);

/**
 * Reads a jpeg2000 codestream header structure.
 *
 * @param p_stream the stream to read data from.
 * @param p_j2k the jpeg2000 codec.
 * @param p_image FIXME DOC
 * @param p_manager the user event manager.
 *
 * @return true if the box is valid.
 */
OPJ_BOOL opj_j2k_read_header(	opj_stream_private_t *p_stream,
                                opj_j2k_t* p_j2k,
                                opj_image_t** p_image,
                                opj_event_mgr_t* p_manager );


/**
 * Destroys a jpeg2000 codec.
 *
 * @param	p_j2k	the jpeg20000 structure to destroy.
 */
void opj_j2k_destroy (opj_j2k_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.
 * @param	p_tile_index
 * @param p_data       FIXME DOC
 * @param p_data_size  FIXME DOC
 * @param	p_stream			the stream to write data to.
 * @param	p_manager	the user event manager.
 */
OPJ_BOOL opj_j2k_decode_tile (  opj_j2k_t * p_j2k,
                                OPJ_UINT32 p_tile_index,
                                OPJ_BYTE * p_data,
                                OPJ_UINT32 p_data_size,
                                opj_stream_private_t *p_stream,
                                opj_event_mgr_t * p_manager );

/**
 * Reads a tile header.
 * @param	p_j2k		the jpeg2000 codec.
 * @param	p_tile_index FIXME DOC
 * @param	p_data_size FIXME DOC
 * @param	p_tile_x0 FIXME DOC
 * @param	p_tile_y0 FIXME DOC
 * @param	p_tile_x1 FIXME DOC
 * @param	p_tile_y1 FIXME DOC
 * @param	p_nb_comps FIXME DOC
 * @param	p_go_on FIXME DOC
 * @param	p_stream			the stream to write data to.
 * @param	p_manager	the user event manager.
 */
OPJ_BOOL opj_j2k_read_tile_header ( opj_j2k_t * p_j2k,
                                    OPJ_UINT32 * p_tile_index,
                                    OPJ_UINT32 * p_data_size,
                                    OPJ_INT32 * p_tile_x0,
                                    OPJ_INT32 * p_tile_y0,
                                    OPJ_INT32 * p_tile_x1,
                                    OPJ_INT32 * p_tile_y1,
                                    OPJ_UINT32 * p_nb_comps,
                                    OPJ_BOOL * p_go_on,
                                    opj_stream_private_t *p_stream,
                                    opj_event_mgr_t * p_manager );


/**
 * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.
 *
 * @param	p_j2k			the jpeg2000 codec.
 * @param	p_image     FIXME DOC
 * @param	p_start_x		the left position of the rectangle to decode (in image coordinates).
 * @param	p_start_y		the up position of the rectangle to decode (in image coordinates).
 * @param	p_end_x			the right position of the rectangle to decode (in image coordinates).
 * @param	p_end_y			the bottom position of the rectangle to decode (in image coordinates).
 * @param	p_manager		the user event manager
 *
 * @return	true			if the area could be set.
 */
OPJ_BOOL opj_j2k_set_decode_area(	opj_j2k_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,
								    opj_event_mgr_t * p_manager );

/**
 * Creates a J2K decompression structure.
 *
 * @return a handle to a J2K decompressor if successful, NULL otherwise.
 */
opj_j2k_t* opj_j2k_create_decompress(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_t* p_j2k, OPJ_INT32 flag, FILE* out_stream);



/**
 * Dump an image header structure.
 *
 *@param image			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		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_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_t* p_j2k);

/**
 * Decode an image from a JPEG-2000 codestream
 * @param j2k J2K decompressor handle
 * @param p_stream  FIXME DOC
 * @param p_image   FIXME DOC
 * @param p_manager FIXME DOC
 * @return FIXME DOC
*/
OPJ_BOOL opj_j2k_decode(opj_j2k_t *j2k,
                        opj_stream_private_t *p_stream,
                        opj_image_t *p_image,
                        opj_event_mgr_t *p_manager);


OPJ_BOOL opj_j2k_get_tile(	opj_j2k_t *p_j2k,
			    			opj_stream_private_t *p_stream,
				    		opj_image_t* p_image,
					    	opj_event_mgr_t * p_manager,
						    OPJ_UINT32 tile_index );

OPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k, 
                                               OPJ_UINT32 res_factor,
                                               opj_event_mgr_t * p_manager);


/**
 * Writes a tile.
 * @param	p_j2k		the jpeg2000 codec.
 * @param p_tile_index FIXME DOC
 * @param p_data FIXME DOC
 * @param p_data_size FIXME DOC
 * @param	p_stream			the stream to write data to.
 * @param	p_manager	the user event manager.
 */
OPJ_BOOL opj_j2k_write_tile (	opj_j2k_t * p_j2k,
							    OPJ_UINT32 p_tile_index,
							    OPJ_BYTE * p_data,
							    OPJ_UINT32 p_data_size,
							    opj_stream_private_t *p_stream,
							    opj_event_mgr_t * p_manager );

/**
 * Encodes an image into a JPEG-2000 codestream
 */
OPJ_BOOL opj_j2k_encode(	opj_j2k_t * p_j2k,
			    			opj_stream_private_t *cio,
				    		opj_event_mgr_t * p_manager );

/**
 * Starts a compression scheme, i.e. validates the codec parameters, writes the header.
 *
 * @param	p_j2k		the jpeg2000 codec.
 * @param	p_stream			the stream object.
 * @param	p_image FIXME DOC
 * @param	p_manager	the user event manager.
 *
 * @return true if the codec is valid.
 */
OPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k,
							    opj_stream_private_t *p_stream,
							    opj_image_t * p_image,
							    opj_event_mgr_t * p_manager);

/**
 * Ends the compression procedures and possibiliy add data to be read after the
 * codestream.
 */
OPJ_BOOL opj_j2k_end_compress( 	opj_j2k_t *p_j2k,
							    opj_stream_private_t *cio,
							    opj_event_mgr_t * p_manager);

OPJ_BOOL opj_j2k_setup_mct_encoding (opj_tcp_t * p_tcp, opj_image_t * p_image);


#endif /* __J2K_H */
