X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libopenjpeg%2Ftcd.h;h=c3c416c6ecdc5a67b4f7cc8daf1a1316e7226de6;hb=d44375aece5dea2af83ffb8c9de4ade2ad35c593;hp=714d5ea480d8431e45f988c1bb46609273cfb17e;hpb=7ee36c3a4c37d9c8cee30ac19fd5532a3863285b;p=openjpeg.git diff --git a/libopenjpeg/tcd.h b/libopenjpeg/tcd.h index 714d5ea4..c3c416c6 100644 --- a/libopenjpeg/tcd.h +++ b/libopenjpeg/tcd.h @@ -1,7 +1,10 @@ /* - * Copyright (c) 2001-2002, David Janssens + * 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) 2002-2003, 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 @@ -25,159 +28,433 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ - #ifndef __TCD_H #define __TCD_H +/** +@file tcd.h +@brief Implementation of a tile coder/decoder (TCD) + +The functions in TCD.C have for goal to encode or decode each tile independently from +each other. The functions in TCD.C are used by some function in J2K.C. +*/ + +/** @defgroup TCD TCD - Implementation of a tile coder/decoder */ +/*@{*/ -#include "j2k.h" -#include "tgt.h" +/** +FIXME: documentation +*/ +//typedef struct opj_tcd_seg { +// unsigned char** data; +// int dataindex; +// int numpasses; +// int len; +// int maxpasses; +// int numnewpasses; +// int newlen; +//} opj_tcd_seg_t; -typedef struct { - int numpasses; - int len; - unsigned char *data; - int maxpasses; - int numnewpasses; - int newlen; -} tcd_seg_t; +/** +FIXME: documentation +*/ +typedef struct opj_tcd_seg { + OPJ_BYTE ** data; + OPJ_UINT32 dataindex; + OPJ_UINT32 numpasses; + OPJ_UINT32 real_num_passes; + OPJ_UINT32 len; + OPJ_UINT32 maxpasses; + OPJ_UINT32 numnewpasses; + OPJ_UINT32 newlen; +} opj_tcd_seg_t; -typedef struct { +/** +FIXME: documentation +*/ +typedef struct opj_tcd_pass { int rate; double distortiondec; int term, len; -} tcd_pass_t; +} opj_tcd_pass_t; -typedef struct { +/** +FIXME: documentation +*/ +typedef struct opj_tcd_layer { int numpasses; /* Number of passes in the layer */ int len; /* len of information */ double disto; /* add for index (Cfr. Marcela) */ unsigned char *data; /* data */ -} tcd_layer_t; +} opj_tcd_layer_t; -typedef struct { +/** +FIXME: documentation +*/ +typedef struct opj_tcd_cblk_enc { + unsigned char* data; /* Data */ + opj_tcd_layer_t* layers; /* layer information */ + opj_tcd_pass_t* passes; /* information about the passes */ int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ int numbps; int numlenbits; - int len; /* length */ int numpasses; /* number of pass already done for the code-blocks */ - int numnewpasses; /* number of pass added to the code-blocks */ - int numsegs; /* number of segments */ - tcd_seg_t segs[100]; /* segments informations */ - unsigned char data[8192]; /* Data */ int numpassesinlayers; /* number of passes in the layer */ - tcd_layer_t layers[100]; /* layer information */ int totalpasses; /* total number of passes */ - tcd_pass_t passes[100]; /* information about the passes */ -} tcd_cblk_t; - -typedef struct { - int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */ - int cw, ch; /* number of precinct in width and heigth */ - tcd_cblk_t *cblks; /* code-blocks informations */ - tgt_tree_t *incltree; /* inclusion tree */ - tgt_tree_t *imsbtree; /* IMSB tree */ -} tcd_precinct_t; - -typedef struct { - int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */ - int bandno; - tcd_precinct_t *precincts; /* precinct information */ - int numbps; - float stepsize; -} tcd_band_t; +} opj_tcd_cblk_enc_t; + +//typedef struct opj_tcd_cblk_dec { +// unsigned char* data; /* Data */ +// opj_tcd_seg_t* segs; /* segments informations */ +// int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ +// int numbps; +// int numlenbits; +// int len; /* length */ +// int numnewpasses; /* number of pass added to the code-blocks */ +// int numsegs; /* number of segments */ +//} opj_tcd_cblk_dec_t; + +typedef struct opj_tcd_cblk_dec { + OPJ_BYTE * data; /* Data */ + opj_tcd_seg_t* segs; /* segments informations */ + OPJ_INT32 x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ + OPJ_UINT32 numbps; + OPJ_UINT32 numlenbits; + OPJ_UINT32 len; /* length */ + OPJ_UINT32 numnewpasses; /* number of pass added to the code-blocks */ + OPJ_UINT32 numsegs; /* number of segments */ + OPJ_UINT32 real_num_segs; + OPJ_UINT32 m_current_max_segs; +} opj_tcd_cblk_dec_t; + +/** +FIXME: documentation +*/ +//typedef struct opj_tcd_precinct { +// int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */ +// int cw, ch; /* number of precinct in width and heigth */ +// union{ /* code-blocks informations */ +// opj_tcd_cblk_enc_t* enc; +// opj_tcd_cblk_dec_t* dec; +// } cblks; +// opj_tgt_tree_t *incltree; /* inclusion tree */ +// opj_tgt_tree_t *imsbtree; /* IMSB tree */ +//} opj_tcd_precinct_t; + + +typedef struct opj_tcd_precinct { + OPJ_INT32 x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */ + OPJ_UINT32 cw, ch; /* number of precinct in width and heigth */ + union{ /* code-blocks informations */ + opj_tcd_cblk_enc_t* enc; + opj_tcd_cblk_dec_t* dec; + } cblks; + OPJ_UINT32 block_size; /* size taken by cblks (in bytes) */ + struct opj_tgt_tree *incltree; /* inclusion tree */ + struct opj_tgt_tree *imsbtree; /* IMSB tree */ +} opj_tcd_precinct_t; -typedef struct { +/** +FIXME: documentation +*/ +//typedef struct opj_tcd_band { +// int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */ +// int bandno; +// opj_tcd_precinct_t *precincts; /* precinct information */ +// int numbps; +// float stepsize; +//} opj_tcd_band_t; + +typedef struct opj_tcd_band { + OPJ_INT32 x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */ + OPJ_UINT32 bandno; + opj_tcd_precinct_t *precincts; /* precinct information */ + OPJ_UINT32 precincts_data_size; /* size of data taken by precincts */ + OPJ_INT32 numbps; + OPJ_FLOAT32 stepsize; +} opj_tcd_band_t; + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_resolution { int x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */ int pw, ph; int numbands; /* number sub-band for the resolution level */ - tcd_band_t bands[3]; /* subband information */ -} tcd_resolution_t; - -typedef struct { - int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */ - int numresolutions; /* number of resolutions level */ - tcd_resolution_t *resolutions; /* resolutions information */ - int *data; /* data of the component */ - int nbpix; /* add fixed_quality */ -} tcd_tilecomp_t; - -typedef struct { + opj_tcd_band_t bands[3]; /* subband information */ +} opj_tcd_resolution_t; + +/** +FIXME: documentation +*/ +//typedef struct opj_tcd_tilecomp { +// int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */ +// int numresolutions; /* number of resolutions level */ +// opj_tcd_resolution_t *resolutions; /* resolutions information */ +// int *data; /* data of the component */ +// int numpix; /* add fixed_quality */ +//} opj_tcd_tilecomp_t; + +typedef struct opj_tcd_tilecomp +{ + OPJ_INT32 x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */ + OPJ_UINT32 numresolutions; /* number of resolutions level */ + OPJ_UINT32 minimum_num_resolutions; /* number of resolutions level to decode (at max)*/ + opj_tcd_resolution_t *resolutions; /* resolutions information */ + OPJ_UINT32 resolutions_size; /* size of data for resolutions (in bytes) */ + OPJ_INT32 *data; /* data of the component */ + OPJ_UINT32 data_size; /* size of the data of the component */ + OPJ_INT32 numpix; /* add fixed_quality */ +} opj_tcd_tilecomp_t; + + +/** +FIXME: documentation +*/ +typedef struct opj_tcd_tile { int x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */ int numcomps; /* number of components in tile */ - tcd_tilecomp_t *comps; /* Components information */ - int nbpix; /* add fixed_quality */ + opj_tcd_tilecomp_t *comps; /* Components information */ + int numpix; /* add fixed_quality */ double distotile; /* add fixed_quality */ double distolayer[100]; /* add fixed_quality */ -} tcd_tile_t; + /** packet number */ + int packno; +} opj_tcd_tile_t; -typedef struct { +/** +FIXME: documentation +*/ +typedef struct opj_tcd_image { int tw, th; /* number of tiles in width and heigth */ - tcd_tile_t *tiles; /* Tiles information */ -} tcd_image_t; + opj_tcd_tile_t *tiles; /* Tiles information */ +} opj_tcd_image_t; -/* - * Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode) - * img: raw image - * cp: coding parameters - * curtileno : number that identifies the tile that will be encoded - */ -void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno); +/** +Tile coder/decoder +*/ +typedef struct opj_tcd { + /** Position of the tilepart flag in Progression order*/ + int tp_pos; + /** Tile part number*/ + int tp_num; + /** Current tile part number*/ + int cur_tp_num; + /** Total number of tileparts of the current tile*/ + int cur_totnum_tp; + /** Current Packet iterator number */ + int cur_pino; + /** codec context */ + opj_common_ptr cinfo; + /** info on each image tile */ + opj_tcd_image_t *tcd_image; + /** image */ + opj_image_t *image; + /** coding parameters */ + opj_cp_t *cp; + /** pointer to the current encoded/decoded tile */ + opj_tcd_tile_t *tcd_tile; + /** coding/decoding parameters common to all tiles */ + opj_tcp_t *tcp; + /** current encoded/decoded tile */ + int tcd_tileno; + /** Time taken to encode a tile*/ + double encoding_time; +} opj_tcd_t; -/* - * Initialize the tile coder (allocate the memory) - * img: raw image - * cp: coding parameters - * curtileno : number that identifies the tile that will be encoded - */ -void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno); +struct opj_image; +struct opj_cp_v2; +struct opj_tcp_v2; +/** +Tile coder/decoder +*/ +typedef struct opj_tcd_v2 +{ + /** Position of the tilepart flag in Progression order*/ + OPJ_INT32 tp_pos; + /** Tile part number*/ + OPJ_UINT32 tp_num; + /** Current tile part number*/ + OPJ_UINT32 cur_tp_num; + /** Total number of tileparts of the current tile*/ + OPJ_UINT32 cur_totnum_tp; + /** Current Packet iterator number */ + OPJ_UINT32 cur_pino; + /** info on each image tile */ + opj_tcd_image_t *tcd_image; + /** image header */ + struct opj_image_header *image_header; + /** coding parameters */ + struct opj_cp_v2 *cp; + /** coding/decoding parameters common to all tiles */ + struct opj_tcp_v2 *tcp; + /** current encoded/decoded tile */ + OPJ_UINT32 tcd_tileno; + /** tell if the tcd is a decoder. */ + OPJ_UINT32 m_is_decoder : 1; +} opj_tcd_v2_t; -/* - * Initialize the tile decoder - * img: raw image - * cp: coding parameters - */ -void tcd_init(j2k_image_t * img, j2k_cp_t * cp); +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Dump the content of a tcd structure +*/ +void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img); +/** +Create a new TCD handle +@param cinfo Codec context info +@return Returns a new TCD handle if successful returns NULL otherwise +*/ +opj_tcd_t* tcd_create(opj_common_ptr cinfo); -/* - * Free the memory allocated for encoding - * img: raw image - * cp: coding parameters - * curtileno : number that identifies the tile that will be encoded - */ -void tcd_free_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno); +/** +Create a new TCD handle +@param FIXME +@return Returns a new TCD handle if successful returns NULL otherwise +*/ +opj_tcd_v2_t* tcd_create_v2(opj_bool p_is_decoder); -/* - * Encode a tile from the raw image into a buffer, format pnm, pgm or ppm - * tileno: number that identifies one of the tiles to be encoded - * dest: destination buffer - * len: length of destination buffer - * info_IM: creation of index file +/** +Destroy a previously created TCD handle +@param tcd TCD handle to destroy +*/ +void tcd_destroy_v2(opj_tcd_v2_t *tcd); + +/** + * Initialize the tile coder and may reuse some meory. + * @param p_tcd TCD handle. + * @param p_image raw image. + * @param p_cp coding parameters. + * @param p_tile_no current tile index to encode. + * + * @return true if the encoding values could be set (false otherwise). +*/ +opj_bool tcd_init_v2( + opj_tcd_v2_t *p_tcd, + //struct opj_image * p_image, + opj_image_header_t * p_image_header, + //struct opj_cp * p_cp + opj_cp_v2_t * p_cp + ); + +/** + * Allocates memory for decoding a specific tile. + * + * @param p_tcd the tile decoder. + * @param p_image the image to decode. + * @param p_cp the decoding parameters. + * @param p_tile_no the index of the tile received in sequence. This not necesseraly lead to the + * tile at index p_tile_no. + * @param p_cstr_info codestream info (if any). + * + * @return true if the remaining data is sufficient.s */ -int tcd_encode_tile_pxm(int tileno, unsigned char *dest, int len, - info_image * info_IM); +opj_bool tcd_init_decode_tile( + opj_tcd_v2_t *p_tcd, + OPJ_UINT32 p_tile_no + ); +/** +Destroy a previously created TCD handle +@param tcd TCD handle to destroy +*/ +void tcd_destroy(opj_tcd_t *tcd); +/** +Initialize the tile coder (allocate the memory) +@param tcd TCD handle +@param image Raw image +@param cp Coding parameters +@param curtileno Number that identifies the tile that will be encoded +*/ +void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno); +/** +Free the memory allocated for encoding +@param tcd TCD handle +*/ +void tcd_free_encode(opj_tcd_t *tcd); +/** +Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode) +@param tcd TCD handle +@param image Raw image +@param cp Coding parameters +@param curtileno Number that identifies the tile that will be encoded +*/ +void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno); +/** +Initialize the tile decoder +@param tcd TCD handle +@param image Raw image +@param cp Coding parameters +*/ +void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp); +void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info); +void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final); +void tcd_rateallocate_fixed(opj_tcd_t *tcd); +void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final); +opj_bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info); +/** +Encode a tile from the raw image into a buffer +@param tcd TCD handle +@param tileno Number that identifies one of the tiles to be encoded +@param dest Destination buffer +@param len Length of destination buffer +@param cstr_info Codestream information structure +@return +*/ +int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info); +/** +Decode a tile from a buffer into a raw image +@param tcd TCD handle +@param src Source buffer +@param len Length of source buffer +@param tileno Number that identifies one of the tiles to be decoded +@param cstr_info Codestream information structure +*/ +opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info); +/** +Free the memory allocated for decoding +@param tcd TCD handle +*/ +void tcd_free_decode(opj_tcd_t *tcd); +void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno); -/* - * Encode a tile from the raw image into a buffer, format pgx - * tileno: number that identifies one of the tiles to be encoded - * dest: destination buffer - * len: length of destination buffer - * info_IM: creation of index file + +/** + * Gets the maximum tile size that will be taken by the tile once decoded. */ -int tcd_encode_tile_pgx(int tileno, unsigned char *dest, int len, - info_image * info_IM); +OPJ_UINT32 tcd_get_decoded_tile_size ( + opj_tcd_v2_t *p_tcd + ); -/* - * Decode a tile from a buffer into a raw image - * src: source buffer - * len: length of the source buffer - * tileno: number that identifies the tile that will be decoded +/** +Decode a tile from a buffer into a raw image +@param tcd TCD handle +@param src Source buffer +@param len Length of source buffer +@param tileno Number that identifies one of the tiles to be decoded +*/ +opj_bool tcd_decode_tile_v2(opj_tcd_v2_t *tcd, + OPJ_BYTE *src, + OPJ_UINT32 len, + OPJ_UINT32 tileno, + struct opj_codestream_info_v2 *cstr_info); + + +/** + * Copies tile data from the system onto the given memory block. */ -int tcd_decode_tile(unsigned char *src, int len, int tileno); +opj_bool tcd_update_tile_data ( + opj_tcd_v2_t *p_tcd, + OPJ_BYTE * p_dest, + OPJ_UINT32 p_dest_length + ); + +/* ----------------------------------------------------------------------- */ +/*@}*/ -void tcd_dec_release(); +/*@}*/ -#endif +#endif /* __TCD_H */