OpenJPEG 2.1.0

tcd.h

Go to the documentation of this file.
00001 /*
00002  * The copyright in this software is being made available under the 2-clauses 
00003  * BSD License, included below. This software may be subject to other third 
00004  * party and contributor rights, including patent rights, and no such rights
00005  * are granted under this license.
00006  *
00007  * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
00008  * Copyright (c) 2002-2014, Professor Benoit Macq
00009  * Copyright (c) 2001-2003, David Janssens
00010  * Copyright (c) 2002-2003, Yannick Verschueren
00011  * Copyright (c) 2003-2007, Francois-Olivier Devaux 
00012  * Copyright (c) 2003-2014, Antonin Descampe
00013  * Copyright (c) 2005, Herve Drolon, FreeImage Team
00014  * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
00015  * Copyright (c) 2012, CS Systemes d'Information, France
00016  * All rights reserved.
00017  *
00018  * Redistribution and use in source and binary forms, with or without
00019  * modification, are permitted provided that the following conditions
00020  * are met:
00021  * 1. Redistributions of source code must retain the above copyright
00022  *    notice, this list of conditions and the following disclaimer.
00023  * 2. Redistributions in binary form must reproduce the above copyright
00024  *    notice, this list of conditions and the following disclaimer in the
00025  *    documentation and/or other materials provided with the distribution.
00026  *
00027  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
00028  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00029  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00030  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00031  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00032  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00033  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00034  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00035  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00036  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00037  * POSSIBILITY OF SUCH DAMAGE.
00038  */
00039 #ifndef __TCD_H
00040 #define __TCD_H
00041 
00051 
00055 typedef struct opj_tcd_seg {
00056         OPJ_BYTE ** data;
00057         OPJ_UINT32 dataindex;
00058         OPJ_UINT32 numpasses;
00059         OPJ_UINT32 real_num_passes;
00060         OPJ_UINT32 len;
00061         OPJ_UINT32 maxpasses;
00062         OPJ_UINT32 numnewpasses;
00063         OPJ_UINT32 newlen;
00064 } opj_tcd_seg_t;
00065 
00069 typedef struct opj_tcd_pass {
00070         OPJ_UINT32 rate;
00071         OPJ_FLOAT64 distortiondec;
00072         OPJ_UINT32 len;
00073         OPJ_UINT32 term : 1;
00074 } opj_tcd_pass_t;
00075 
00079 typedef struct opj_tcd_layer {
00080         OPJ_UINT32 numpasses;           /* Number of passes in the layer */
00081         OPJ_UINT32 len;                         /* len of information */
00082         OPJ_FLOAT64 disto;                      /* add for index (Cfr. Marcela) */
00083         OPJ_BYTE *data;                         /* data */
00084 } opj_tcd_layer_t;
00085 
00089 typedef struct opj_tcd_cblk_enc {
00090         OPJ_BYTE* data;                                 /* Data */
00091         opj_tcd_layer_t* layers;                /* layer information */
00092         opj_tcd_pass_t* passes;         /* information about the passes */
00093         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
00094         OPJ_UINT32 numbps;
00095         OPJ_UINT32 numlenbits;
00096         OPJ_UINT32 numpasses;                   /* number of pass already done for the code-blocks */
00097         OPJ_UINT32 numpassesinlayers;   /* number of passes in the layer */
00098         OPJ_UINT32 totalpasses;                 /* total number of passes */
00099 } opj_tcd_cblk_enc_t;
00100 
00101 
00102 typedef struct opj_tcd_cblk_dec {
00103         OPJ_BYTE * data;                                /* Data */
00104         opj_tcd_seg_t* segs;                    /* segments information */
00105         OPJ_INT32 x0, y0, x1, y1;               /* position of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
00106         OPJ_UINT32 numbps;
00107         OPJ_UINT32 numlenbits;
00108     OPJ_UINT32 data_max_size;           /* Size of allocated data buffer */
00109         OPJ_UINT32 data_current_size;   /* Size of used data buffer */
00110         OPJ_UINT32 numnewpasses;                /* number of pass added to the code-blocks */
00111         OPJ_UINT32 numsegs;                             /* number of segments */
00112         OPJ_UINT32 real_num_segs;
00113         OPJ_UINT32 m_current_max_segs;
00114 } opj_tcd_cblk_dec_t;
00115 
00119 typedef struct opj_tcd_precinct {
00120         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
00121         OPJ_UINT32 cw, ch;                              /* number of precinct in width and height */
00122         union{                                                  /* code-blocks information */
00123                 opj_tcd_cblk_enc_t* enc;
00124                 opj_tcd_cblk_dec_t* dec;
00125         } cblks;
00126         OPJ_UINT32 block_size;                  /* size taken by cblks (in bytes) */
00127         opj_tgt_tree_t *incltree;           /* inclusion tree */
00128         opj_tgt_tree_t *imsbtree;           /* IMSB tree */
00129 } opj_tcd_precinct_t;
00130 
00134 typedef struct opj_tcd_band {
00135         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
00136         OPJ_UINT32 bandno;
00137         opj_tcd_precinct_t *precincts;  /* precinct information */
00138         OPJ_UINT32 precincts_data_size; /* size of data taken by precincts */
00139         OPJ_INT32 numbps;
00140         OPJ_FLOAT32 stepsize;
00141 } opj_tcd_band_t;
00142 
00146 typedef struct opj_tcd_resolution {
00147         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
00148         OPJ_UINT32 pw, ph;
00149         OPJ_UINT32 numbands;                    /* number sub-band for the resolution level */
00150         opj_tcd_band_t bands[3];                /* subband information */
00151 } opj_tcd_resolution_t;
00152 
00156 typedef struct opj_tcd_tilecomp
00157 {
00158         OPJ_INT32 x0, y0, x1, y1;                               /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
00159         OPJ_UINT32 numresolutions;                              /* number of resolutions level */
00160         OPJ_UINT32 minimum_num_resolutions;             /* number of resolutions level to decode (at max)*/
00161         opj_tcd_resolution_t *resolutions;      /* resolutions information */
00162         OPJ_UINT32 resolutions_size;                    /* size of data for resolutions (in bytes) */
00163         OPJ_INT32 *data;                                                /* data of the component */
00164         OPJ_UINT32 data_size;                                   /* size of the data of the component */
00165         OPJ_INT32 numpix;                                               /* add fixed_quality */
00166 } opj_tcd_tilecomp_t;
00167 
00168 
00172 typedef struct opj_tcd_tile {
00173         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
00174         OPJ_UINT32 numcomps;                    /* number of components in tile */
00175         opj_tcd_tilecomp_t *comps;      /* Components information */
00176         OPJ_INT32 numpix;                               /* add fixed_quality */
00177         OPJ_FLOAT64 distotile;                  /* add fixed_quality */
00178         OPJ_FLOAT64 distolayer[100];    /* add fixed_quality */
00179         OPJ_UINT32 packno;              /* packet number */
00180 } opj_tcd_tile_t;
00181 
00185 typedef struct opj_tcd_image
00186 {
00187         opj_tcd_tile_t *tiles;          /* Tiles information */
00188 }
00189 opj_tcd_image_t;
00190 
00191 
00195 typedef struct opj_tcd
00196 {
00198         OPJ_INT32 tp_pos;
00200         OPJ_UINT32 tp_num;
00202         OPJ_UINT32 cur_tp_num;
00204         OPJ_UINT32 cur_totnum_tp;
00206         OPJ_UINT32 cur_pino;
00208         opj_tcd_image_t *tcd_image;
00210         opj_image_t *image;
00212         opj_cp_t *cp;
00214         opj_tcp_t *tcp;
00216         OPJ_UINT32 tcd_tileno;
00218         OPJ_UINT32 m_is_decoder : 1;
00219 } opj_tcd_t;
00220 
00223 /* ----------------------------------------------------------------------- */
00224 
00228 /*void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);*/ /* TODO MSD shoul use the new v2 structures */ 
00229 
00235 opj_tcd_t* opj_tcd_create(OPJ_BOOL p_is_decoder);
00236 
00241 void opj_tcd_destroy(opj_tcd_t *tcd);
00242 
00251 OPJ_BOOL opj_tcd_init(  opj_tcd_t *p_tcd,
00252                                                 opj_image_t * p_image,
00253                                                 opj_cp_t * p_cp );
00254 
00264 OPJ_BOOL opj_tcd_init_decode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no);
00265 
00266 void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final);
00267 
00268 void opj_tcd_rateallocate_fixed(opj_tcd_t *tcd);
00269 
00270 void opj_tcd_makelayer( opj_tcd_t *tcd,
00271                                                 OPJ_UINT32 layno,
00272                                                 OPJ_FLOAT64 thresh,
00273                                                 OPJ_UINT32 final);
00274 
00275 OPJ_BOOL opj_tcd_rateallocate(  opj_tcd_t *tcd,
00276                                                                 OPJ_BYTE *dest,
00277                                                                 OPJ_UINT32 * p_data_written,
00278                                                                 OPJ_UINT32 len,
00279                                                                 opj_codestream_info_t *cstr_info);
00280 
00284 OPJ_UINT32 opj_tcd_get_decoded_tile_size (opj_tcd_t *p_tcd );
00285 
00296 OPJ_BOOL opj_tcd_encode_tile(   opj_tcd_t *p_tcd,
00297                                                             OPJ_UINT32 p_tile_no,
00298                                                             OPJ_BYTE *p_dest,
00299                                                             OPJ_UINT32 * p_data_written,
00300                                                             OPJ_UINT32 p_len,
00301                                                             struct opj_codestream_info *p_cstr_info);
00302 
00303 
00312 OPJ_BOOL opj_tcd_decode_tile(   opj_tcd_t *tcd,
00313                                                             OPJ_BYTE *src,
00314                                                             OPJ_UINT32 len,
00315                                                             OPJ_UINT32 tileno,
00316                                                             opj_codestream_index_t *cstr_info);
00317 
00318 
00322 OPJ_BOOL opj_tcd_update_tile_data (     opj_tcd_t *p_tcd,
00323                                                                     OPJ_BYTE * p_dest,
00324                                                                     OPJ_UINT32 p_dest_length );
00325 
00329 OPJ_UINT32 opj_tcd_get_encoded_tile_size ( opj_tcd_t *p_tcd );
00330 
00339 OPJ_BOOL opj_tcd_init_encode_tile (     opj_tcd_t *p_tcd,
00340                                                                     OPJ_UINT32 p_tile_no );
00341 
00345 OPJ_BOOL opj_tcd_copy_tile_data (opj_tcd_t *p_tcd,
00346                                  OPJ_BYTE * p_src,
00347                                  OPJ_UINT32 p_src_length );
00348 
00349 /* ----------------------------------------------------------------------- */
00353 
00354 #endif /* __TCD_H */