Merge branch 'master' into travis-matrix
[openjpeg.git] / src / lib / openjp2 / tcd.h
index b43d28502a1ba84846c2276720dfae36cf483596..07f8379afd48cf307051fe2f7cb2fb0ac282d849 100644 (file)
@@ -1,10 +1,18 @@
 /*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
+ * 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 and Antonin Descampe
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -42,20 +50,7 @@ each other. The functions in TCD.C are used by other functions in J2K.C.
 /*@{*/
 
 /**
-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
+FIXME DOC
 */
 typedef struct opj_tcd_seg {
        OPJ_BYTE ** data;
@@ -69,23 +64,17 @@ typedef struct opj_tcd_seg {
 } opj_tcd_seg_t;
 
 /**
-FIXME: documentation
+FIXME DOC
 */
 typedef struct opj_tcd_pass {
-  int rate;
-  double distortiondec;
-  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;
+} opj_tcd_pass_t;
 
 /**
-FIXME: documentation
+FIXME DOC
 */
 typedef struct opj_tcd_layer {
        OPJ_UINT32 numpasses;           /* Number of passes in the layer */
@@ -95,225 +84,119 @@ typedef struct opj_tcd_layer {
 } opj_tcd_layer_t;
 
 /**
-FIXME: documentation
+FIXME DOC
 */
 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 numpasses;               /* number of pass already done for the code-blocks */
-  int numpassesinlayers;       /* number of passes in the layer */
-  int totalpasses;             /* total number of passes */
-} 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_BYTE* data;               /* Data */
+       opj_tcd_layer_t* layers;      /* layer information */
+       opj_tcd_pass_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;
+       OPJ_UINT32 data_size;         /* Size of allocated data buffer */
+       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_t;
 
 
-typedef struct opj_tcd_cblk_dec_v2 {
+typedef struct opj_tcd_cblk_dec {
        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_INT32 x0, y0, x1, y1;               /* position 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 data_max_size;               /* Size of allocated data buffer */
+       OPJ_UINT32 data_current_size;   /* Size of used data buffer */
        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;
+} opj_tcd_cblk_dec_t;
 
 /**
-FIXME: documentation
+FIXME DOC
 */
 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 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;
+               opj_tcd_cblk_enc_t* enc;
+               opj_tcd_cblk_dec_t* dec;
+               void*               blocks;
        } 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;
+       opj_tgt_tree_t *incltree;           /* inclusion tree */
+       opj_tgt_tree_t *imsbtree;           /* IMSB tree */
+} opj_tcd_precinct_t;
 
 /**
-FIXME: documentation
+FIXME DOC
 */
 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_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_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_v2_t;
+} opj_tcd_band_t;
 
 /**
-FIXME: documentation
+FIXME DOC
 */
 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 */
-  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;
+       opj_tcd_band_t bands[3];                /* subband information */
+} opj_tcd_resolution_t;
 
 /**
-FIXME: documentation
+FIXME DOC
 */
-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_v2
+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_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;
+       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_BOOL  ownsData;                 /* if true, then need to free after usage, otherwise do not free */
+       OPJ_UINT32 data_size_needed;        /* we may either need to allocate this amount of data, or re-use image data and ignore this value */
+       OPJ_UINT32 data_size;               /* size of the data of the component */
+       OPJ_INT32 numpix;                   /* add fixed_quality */
+} opj_tcd_tilecomp_t;
 
 
 /**
-FIXME: documentation
+FIXME DOC
 */
 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 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_tcd_tilecomp_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;
+       OPJ_UINT32 packno;              /* packet number */
+} opj_tcd_tile_t;
 
 /**
-FIXME: documentation
+FIXME DOC
 */
-typedef struct opj_tcd_image {
-  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
+typedef struct opj_tcd_image
 {
-       opj_tcd_tile_v2_t *tiles;               /* Tiles information */
+       opj_tcd_tile_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;
-
-       /** 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;
+opj_tcd_image_t;
 
 
 /**
 Tile coder/decoder
 */
-typedef struct opj_tcd_v2
+typedef struct opj_tcd
 {
        /** Position of the tilepart flag in Progression order*/
        OPJ_INT32 tp_pos;
@@ -326,18 +209,18 @@ typedef struct opj_tcd_v2
        /** Current Packet iterator number */
        OPJ_UINT32 cur_pino;
        /** info on each image tile */
-       opj_tcd_image_v2_t *tcd_image;
+       opj_tcd_image_t *tcd_image;
        /** image header */
        opj_image_t *image;
        /** coding parameters */
-       opj_cp_v2_t *cp;
+       opj_cp_t *cp;
        /** coding/decoding parameters common to all tiles */
-       opj_tcp_v2_t *tcp;
+       opj_tcp_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;
+} opj_tcd_t;
 
 /** @name Exported functions */
 /*@{*/
@@ -346,20 +229,20 @@ typedef struct opj_tcd_v2
 /**
 Dump the content of a tcd structure
 */
-void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);
+/*void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);*/ /* TODO MSD shoul use the new v2 structures */ 
 
 /**
 Create a new TCD handle
 @param p_is_decoder FIXME DOC
 @return Returns a new TCD handle if successful returns NULL otherwise
 */
-opj_tcd_v2_t* opj_tcd_create(opj_bool p_is_decoder);
+opj_tcd_t* opj_tcd_create(OPJ_BOOL p_is_decoder);
 
 /**
 Destroy a previously created TCD handle
 @param tcd TCD handle to destroy
 */
-void opj_tcd_destroy(opj_tcd_v2_t *tcd);
+void opj_tcd_destroy(opj_tcd_t *tcd);
 
 /**
  * Initialize the tile coder and may reuse some memory.
@@ -369,9 +252,9 @@ void opj_tcd_destroy(opj_tcd_v2_t *tcd);
  *
  * @return true if the encoding values could be set (false otherwise).
 */
-opj_bool opj_tcd_init( opj_tcd_v2_t *p_tcd,
+OPJ_BOOL opj_tcd_init( opj_tcd_t *p_tcd,
                                                opj_image_t * p_image,
-                                               opj_cp_v2_t * p_cp );
+                                               opj_cp_t * p_cp );
 
 /**
  * Allocates memory for decoding a specific tile.
@@ -379,21 +262,22 @@ opj_bool opj_tcd_init(    opj_tcd_v2_t *p_tcd,
  * @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.
+ * @param p_manager the event manager.
  *
  * @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);
+OPJ_BOOL opj_tcd_init_decode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no, opj_event_mgr_t* p_manager);
 
-void opj_tcd_makelayer_fixed(opj_tcd_v2_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final);
+void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final);
 
-void opj_tcd_rateallocate_fixed(opj_tcd_v2_t *tcd);
+void opj_tcd_rateallocate_fixed(opj_tcd_t *tcd);
 
-void opj_tcd_makelayer(        opj_tcd_v2_t *tcd,
+void opj_tcd_makelayer(        opj_tcd_t *tcd,
                                                OPJ_UINT32 layno,
                                                OPJ_FLOAT64 thresh,
                                                OPJ_UINT32 final);
 
-opj_bool opj_tcd_rateallocate( opj_tcd_v2_t *tcd,
+OPJ_BOOL opj_tcd_rateallocate( opj_tcd_t *tcd,
                                                                OPJ_BYTE *dest,
                                                                OPJ_UINT32 * p_data_written,
                                                                OPJ_UINT32 len,
@@ -402,7 +286,7 @@ opj_bool opj_tcd_rateallocate(      opj_tcd_v2_t *tcd,
 /**
  * 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 );
+OPJ_UINT32 opj_tcd_get_decoded_tile_size (opj_tcd_t *p_tcd );
 
 /**
  * Encodes a tile from the raw image into the given buffer.
@@ -412,9 +296,9 @@ OPJ_UINT32 opj_tcd_get_decoded_tile_size (opj_tcd_v2_t *p_tcd );
  * @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.
+ * @return  true if the coding is successful.
 */
-opj_bool opj_tcd_encode_tile(   opj_tcd_v2_t *p_tcd,
+OPJ_BOOL opj_tcd_encode_tile(   opj_tcd_t *p_tcd,
                                                            OPJ_UINT32 p_tile_no,
                                                            OPJ_BYTE *p_dest,
                                                            OPJ_UINT32 * p_data_written,
@@ -429,44 +313,54 @@ 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
 @param cstr_info  FIXME DOC
+@param manager the event manager.
 */
-opj_bool opj_tcd_decode_tile(   opj_tcd_v2_t *tcd,
+OPJ_BOOL opj_tcd_decode_tile(   opj_tcd_t *tcd,
                                                            OPJ_BYTE *src,
                                                            OPJ_UINT32 len,
                                                            OPJ_UINT32 tileno,
-                                                           opj_codestream_index_t *cstr_info);
+                                                           opj_codestream_index_t *cstr_info,
+                                                           opj_event_mgr_t *manager);
 
 
 /**
  * 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_BOOL opj_tcd_update_tile_data (    opj_tcd_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 );
+OPJ_UINT32 opj_tcd_get_encoded_tile_size ( opj_tcd_t *p_tcd );
 
 /**
  * Initialize the tile coder and may reuse some meory.
  *
  * @param      p_tcd           TCD handle.
  * @param      p_tile_no       current tile index to encode.
+ * @param p_manager the event manager.
  *
  * @return true if the encoding values could be set (false otherwise).
 */
-opj_bool opj_tcd_init_encode_tile (    opj_tcd_v2_t *p_tcd,
-                                                                   OPJ_UINT32 p_tile_no );
+OPJ_BOOL opj_tcd_init_encode_tile (    opj_tcd_t *p_tcd,
+                                                                   OPJ_UINT32 p_tile_no, opj_event_mgr_t* p_manager );
 
 /**
  * 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_BOOL opj_tcd_copy_tile_data (opj_tcd_t *p_tcd,
                                  OPJ_BYTE * p_src,
                                  OPJ_UINT32 p_src_length );
 
+/**
+ * Allocates tile component data
+ *
+ *
+ */
+OPJ_BOOL opj_alloc_tile_component_data(opj_tcd_tilecomp_t *l_tilec);
+
 /* ----------------------------------------------------------------------- */
 /*@}*/