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