fix a compilation error
[openjpeg.git] / libopenjpeg / tcd.h
index d93622cd14076f149e006061427f45244bf60b25..0a60b4086d4f9d414b6ec894466c132447fd9eb6 100644 (file)
@@ -1,9 +1,10 @@
 /*
+ * 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) 2003-2005, Francois Devaux and Antonin Descampe
- * Copyright (c) 2005, Herv� Drolon, FreeImage Team
- * Copyright (c) 2002-2005, 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
 @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.
+The functions in TCD.C encode or decode each tile independently from
+each other. The functions in TCD.C are used by other functions 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;
 
 /**
@@ -61,46 +77,105 @@ typedef struct opj_tcd_pass {
   int term, len;
 } opj_tcd_pass_t;
 
+typedef struct opj_tcd_pass_v2 {
+       OPJ_UINT32 rate;
+       OPJ_FLOAT64 distortiondec;
+       OPJ_UINT32 len;
+       OPJ_UINT32 term : 1;
+} opj_tcd_pass_v2_t;
+
 /**
 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 */
+       OPJ_UINT32 numpasses;           /* Number of passes in the layer */
+       OPJ_UINT32 len;                         /* len of information */
+       OPJ_FLOAT64 disto;                      /* add for index (Cfr. Marcela) */
+       OPJ_BYTE *data;                         /* data */
 } opj_tcd_layer_t;
 
 /**
 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;
+
+/**
+FIXME: documentation
+*/
+typedef struct opj_tcd_cblk_enc_v2 {
+       OPJ_BYTE* data;                                 /* Data */
+       opj_tcd_layer_t* layers;                /* layer information */
+       opj_tcd_pass_v2_t* passes;              /* information about the passes */
+       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 numpasses;                   /* number of pass already done for the code-blocks */
+       OPJ_UINT32 numpassesinlayers;   /* number of passes in the layer */
+       OPJ_UINT32 totalpasses;                 /* total number of passes */
+} opj_tcd_cblk_enc_v2_t;
+
+typedef struct opj_tcd_cblk_dec {
+  unsigned char* data; /* Data */
+  opj_tcd_seg_t* segs;         /* segments information */
+       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_v2 {
+       OPJ_BYTE * data;                                /* Data */
+       opj_tcd_seg_t* segs;                    /* segments information */
+       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_v2_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 */
-  opj_tcd_cblk_t *cblks;               /* code-blocks informations */
+  int cw, ch;                  /* number of precinct in width and height */
+  union{               /* code-blocks information */
+         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_v2 {
+       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 height */
+       union{                                                  /* code-blocks information */
+               opj_tcd_cblk_enc_v2_t* enc;
+               opj_tcd_cblk_dec_v2_t* dec;
+       } cblks;
+       OPJ_UINT32 block_size;                  /* size taken by cblks (in bytes) */
+       opj_tgt_tree_t *incltree;       /* inclusion tree */
+       opj_tgt_tree_t *imsbtree;       /* IMSB tree */
+} opj_tcd_precinct_v2_t;
+
 /**
 FIXME: documentation
 */
@@ -112,6 +187,15 @@ typedef struct opj_tcd_band {
   float stepsize;
 } opj_tcd_band_t;
 
+typedef struct opj_tcd_band_v2 {
+       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_v2_t *precincts;       /* precinct information */
+       OPJ_UINT32 precincts_data_size; /* size of data taken by precincts */
+       OPJ_INT32 numbps;
+       OPJ_FLOAT32 stepsize;
+} opj_tcd_band_v2_t;
+
 /**
 FIXME: documentation
 */
@@ -122,6 +206,13 @@ typedef struct opj_tcd_resolution {
   opj_tcd_band_t bands[3];             /* subband information */
 } opj_tcd_resolution_t;
 
+typedef struct opj_tcd_resolution_v2 {
+       OPJ_INT32 x0, y0, x1, y1;               /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
+       OPJ_UINT32 pw, ph;
+       OPJ_UINT32 numbands;                    /* number sub-band for the resolution level */
+       opj_tcd_band_v2_t bands[3];             /* subband information */
+} opj_tcd_resolution_v2_t;
+
 /**
 FIXME: documentation
 */
@@ -130,9 +221,22 @@ typedef struct opj_tcd_tilecomp {
   int numresolutions;          /* number of resolutions level */
   opj_tcd_resolution_t *resolutions;   /* resolutions information */
   int *data;                   /* data of the component */
-  int nbpix;                   /* add fixed_quality */
+  int numpix;                  /* add fixed_quality */
 } opj_tcd_tilecomp_t;
 
+typedef struct opj_tcd_tilecomp_v2
+{
+       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_v2_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_v2_t;
+
+
 /**
 FIXME: documentation
 */
@@ -140,23 +244,52 @@ 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;
 
+typedef struct opj_tcd_tile_v2 {
+       OPJ_INT32 x0, y0, x1, y1;               /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
+       OPJ_UINT32 numcomps;                    /* number of components in tile */
+       opj_tcd_tilecomp_v2_t *comps;   /* Components information */
+       OPJ_INT32 numpix;                               /* add fixed_quality */
+       OPJ_FLOAT64 distotile;                  /* add fixed_quality */
+       OPJ_FLOAT64 distolayer[100];    /* add fixed_quality */
+       /** packet number */
+       OPJ_UINT32 packno;
+} opj_tcd_tile_v2_t;
+
 /**
 FIXME: documentation
 */
 typedef struct opj_tcd_image {
-  int tw, th;                  /* number of tiles in width and heigth */
+  int tw, th;                  /* number of tiles in width and height */
   opj_tcd_tile_t *tiles;               /* Tiles information */
 } opj_tcd_image_t;
 
+typedef struct opj_tcd_image_v2
+{
+       opj_tcd_tile_v2_t *tiles;               /* Tiles information */
+}
+opj_tcd_image_v2_t;
+
 /**
 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;
 
@@ -172,17 +305,40 @@ typedef struct opj_tcd {
        opj_tcp_t *tcp;
        /** current encoded/decoded tile */
        int tcd_tileno;
-       /**@name working variables */
-       /*@{*/
-       opj_tcd_tile_t *tile;
-       opj_tcd_tilecomp_t *tilec;
-       opj_tcd_resolution_t *res;
-       opj_tcd_band_t *band;
-       opj_tcd_precinct_t *prc;
-       opj_tcd_cblk_t *cblk;
-       /*@}*/
+       /** Time taken to encode a tile*/
+       double encoding_time;
 } opj_tcd_t;
 
+
+/**
+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_v2_t *tcd_image;
+       /** image header */
+       opj_image_t *image;
+       /** coding parameters */
+       opj_cp_v2_t *cp;
+       /** coding/decoding parameters common to all tiles */
+       opj_tcp_v2_t *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 */
 /*@{*/
 /* ----------------------------------------------------------------------- */
@@ -191,59 +347,81 @@ typedef struct opj_tcd {
 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
+@param FIXME
 @return Returns a new TCD handle if successful returns NULL otherwise
 */
-opj_tcd_t* tcd_create(opj_common_ptr cinfo);
+opj_tcd_v2_t* opj_tcd_create(opj_bool p_is_decoder);
+
 /**
 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);
+void opj_tcd_destroy(opj_tcd_v2_t *tcd);
+
 /**
-Free the memory allocated for encoding
-@param tcd TCD handle
+ * Initialize the tile coder and may reuse some memory.
+ * @param      p_tcd           TCD handle.
+ * @param      p_image         raw image.
+ * @param      p_cp            coding parameters.
+ *
+ * @return true if the encoding values could be set (false otherwise).
 */
-void tcd_free_encode(opj_tcd_t *tcd);
+opj_bool opj_tcd_init( opj_tcd_v2_t *p_tcd,
+                                               opj_image_t * p_image,
+                                               opj_cp_v2_t * p_cp );
+
 /**
-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);
+ * Allocates memory for decoding a specific tile.
+ *
+ * @param      p_tcd           the tile decoder.
+ * @param      p_tile_no       the index of the tile received in sequence. This not necessarily lead to the
+ * tile at index p_tile_no.
+ *
+ * @return     true if the remaining data is sufficient.
+ */
+opj_bool opj_tcd_init_decode_tile(opj_tcd_v2_t *p_tcd, OPJ_UINT32 p_tile_no);
+
+void opj_tcd_makelayer_fixed(opj_tcd_v2_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final);
+
+void opj_tcd_rateallocate_fixed(opj_tcd_v2_t *tcd);
+
+void opj_tcd_makelayer(        opj_tcd_v2_t *tcd,
+                                               OPJ_UINT32 layno,
+                                               OPJ_FLOAT64 thresh,
+                                               OPJ_UINT32 final);
+
+opj_bool opj_tcd_rateallocate( opj_tcd_v2_t *tcd,
+                                                               OPJ_BYTE *dest,
+                                                               OPJ_UINT32 * p_data_written,
+                                                               OPJ_UINT32 len,
+                                                               opj_codestream_info_t *cstr_info);
+
 /**
-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_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_image_info_t * image_info);
+ * Gets the maximum tile size that will be taken by the tile once decoded.
+ */
+OPJ_UINT32 opj_tcd_get_decoded_tile_size (opj_tcd_v2_t *p_tcd );
+
 /**
-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 image_info Creation of index file
-@return 
+ * Encodes a tile from the raw image into the given buffer.
+ * @param      p_tcd                   Tile Coder handle
+ * @param      p_tile_no               Index of the tile to encode.
+ * @param      p_dest                  Destination buffer
+ * @param      p_data_written  pointer to an int that is incremented by the number of bytes really written on p_dest
+ * @param      p_len                   Maximum length of the destination buffer
+ * @param      p_cstr_info             Codestream information structure
+ * @return  true if the coding is successfull.
 */
-int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_image_info_t * image_info);
+opj_bool opj_tcd_encode_tile(   opj_tcd_v2_t *p_tcd,
+                                                           OPJ_UINT32 p_tile_no,
+                                                           OPJ_BYTE *p_dest,
+                                                           OPJ_UINT32 * p_data_written,
+                                                           OPJ_UINT32 p_len,
+                                                           struct opj_codestream_info *p_cstr_info);
+
+
 /**
 Decode a tile from a buffer into a raw image
 @param tcd TCD handle
@@ -251,12 +429,43 @@ Decode a tile from a buffer into a raw image
 @param len Length of source buffer
 @param tileno Number that identifies one of the tiles to be decoded
 */
-bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno);
+opj_bool opj_tcd_decode_tile(   opj_tcd_v2_t *tcd,
+                                                           OPJ_BYTE *src,
+                                                           OPJ_UINT32 len,
+                                                           OPJ_UINT32 tileno,
+                                                           opj_codestream_index_t *cstr_info);
+
+
 /**
-Free the memory allocated for decoding
-@param tcd TCD handle
+ * Copies tile data from the system onto the given memory block.
+ */
+opj_bool opj_tcd_update_tile_data (    opj_tcd_v2_t *p_tcd,
+                                                                   OPJ_BYTE * p_dest,
+                                                                   OPJ_UINT32 p_dest_length );
+
+/**
+ *
+ */
+OPJ_UINT32 opj_tcd_get_encoded_tile_size ( opj_tcd_v2_t *p_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).
 */
-void tcd_free_decode(opj_tcd_t *tcd);
+opj_bool opj_tcd_init_encode_tile (    opj_tcd_v2_t *p_tcd,
+                                                                   OPJ_UINT32 p_tile_no );
+
+/**
+ * Copies tile data from the given memory block onto the system.
+ */
+opj_bool opj_tcd_copy_tile_data (opj_tcd_v2_t *p_tcd,
+                                 OPJ_BYTE * p_src,
+                                 OPJ_UINT32 p_src_length );
 
 /* ----------------------------------------------------------------------- */
 /*@}*/