X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libopenjpeg%2Ftcd.h;h=c3c416c6ecdc5a67b4f7cc8daf1a1316e7226de6;hb=d44375aece5dea2af83ffb8c9de4ade2ad35c593;hp=a357b104041c4e2244526a78db8630049443afe9;hpb=acfe0ad6458db913aac469804d4d17bea671682a;p=openjpeg.git diff --git a/libopenjpeg/tcd.h b/libopenjpeg/tcd.h index a357b104..c3c416c6 100644 --- a/libopenjpeg/tcd.h +++ b/libopenjpeg/tcd.h @@ -41,16 +41,31 @@ each other. The functions in TCD.C are used by some function in J2K.C. /** @defgroup TCD TCD - Implementation of a tile coder/decoder */ /*@{*/ +/** +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; + /** FIXME: documentation */ typedef struct opj_tcd_seg { - int numpasses; - int len; - unsigned char *data; - int maxpasses; - int numnewpasses; - int newlen; + 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; /** @@ -75,42 +90,87 @@ typedef struct opj_tcd_layer { /** FIXME: documentation */ -typedef struct opj_tcd_cblk { +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 */ - opj_tcd_seg_t segs[100]; /* segments informations */ - unsigned char data[8192]; /* Data */ int numpassesinlayers; /* number of passes in the layer */ - opj_tcd_layer_t layers[100]; /* layer information */ int totalpasses; /* total number of passes */ - opj_tcd_pass_t passes[100]; /* information about the passes */ -} opj_tcd_cblk_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 { - 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 */ - opj_tcd_cblk_t *cblks; /* code-blocks informations */ - opj_tgt_tree_t *incltree; /* inclusion tree */ - opj_tgt_tree_t *imsbtree; /* IMSB tree */ + 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; /** 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 { - int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */ - int bandno; + 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 */ - int numbps; - float stepsize; + OPJ_UINT32 precincts_data_size; /* size of data taken by precincts */ + OPJ_INT32 numbps; + OPJ_FLOAT32 stepsize; } opj_tcd_band_t; /** @@ -126,14 +186,27 @@ typedef struct opj_tcd_resolution { /** 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 */ +//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 */ - int *data; /* data of the component */ - int nbpix; /* add fixed_quality */ + 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 */ @@ -141,9 +214,11 @@ 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 */ opj_tcd_tilecomp_t *comps; /* Components information */ - int nbpix; /* add fixed_quality */ + int numpix; /* add fixed_quality */ double distotile; /* add fixed_quality */ double distolayer[100]; /* add fixed_quality */ + /** packet number */ + int packno; } opj_tcd_tile_t; /** @@ -187,6 +262,39 @@ typedef struct opj_tcd { double encoding_time; } opj_tcd_t; + +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; + /** @name Exported functions */ /*@{*/ /* ----------------------------------------------------------------------- */ @@ -201,6 +309,54 @@ Create a new TCD handle @return Returns a new TCD handle if successful returns NULL otherwise */ opj_tcd_t* tcd_create(opj_common_ptr cinfo); + +/** +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); + +/** +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 + */ +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 @@ -234,11 +390,11 @@ Initialize the tile decoder @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); +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); -bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info); +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 @@ -255,8 +411,9 @@ Decode a tile from a buffer into a raw image @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 */ -bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno); +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 @@ -264,6 +421,37 @@ Free the memory allocated for decoding void tcd_free_decode(opj_tcd_t *tcd); void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno); + +/** + * Gets the maximum tile size that will be taken by the tile once decoded. + */ +OPJ_UINT32 tcd_get_decoded_tile_size ( + opj_tcd_v2_t *p_tcd + ); + +/** +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. + */ +opj_bool tcd_update_tile_data ( + opj_tcd_v2_t *p_tcd, + OPJ_BYTE * p_dest, + OPJ_UINT32 p_dest_length + ); + /* ----------------------------------------------------------------------- */ /*@}*/