049f0771f6213559f3e24ccb378045018229b97b
[openjpeg.git] / src / lib / openjpip / index_manager.h
1 /*
2  * $Id$
3  *
4  * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
5  * Copyright (c) 2002-2011, Professor Benoit Macq
6  * Copyright (c) 2010-2011, Kaori Hagihara
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #ifndef         INDEX_MANAGER_H_
32 # define        INDEX_MANAGER_H_
33
34 #include "opj_config.h"
35 #include "opj_includes.h"
36
37 #include "byte_manager.h"
38 #include "faixbox_manager.h"
39 #include "metadata_manager.h"
40 #include "mhixbox_manager.h"
41 #include "bool.h"
42
43 /** progression order */
44 #if 0
45 typedef enum porder {
46   PROG_UNKNOWN = -1,      /**< place-holder */
47   LRCP = 0,               /**< layer-resolution-component-precinct order */
48   RLCP = 1,               /**< resolution-layer-component-precinct order */
49   RPCL = 2,               /**< resolution-precinct-component-layer order */
50   PCRL = 3,               /**< precinct-component-resolution-layer order */
51   CPRL = 4                /**< component-precinct-resolution-layer order */
52 } porder_t;
53 #endif
54
55 /** A.5.1 Image and tile size (SIZ)*/
56 typedef struct SIZmarker_param{
57   Byte2_t Lsiz;              /**< length of marker segment excluding the marker*/
58   Byte2_t Rsiz;              /**< capabilities that a decoder needs*/
59   Byte4_t Xsiz;              /**< width of the reference grid*/
60   Byte4_t Ysiz;              /**< height of the reference grid*/
61   Byte4_t XOsiz;             /**< horizontal offset from the origin of the reference grid to the left side of the image area*/
62   Byte4_t YOsiz;             /**< vertical offset from the origin of the reference grid to the top side of the image area*/
63   Byte4_t XTsiz;             /**< width of one reference tile with respect to the reference grid*/
64   Byte4_t YTsiz;             /**< height of one reference tile with respect to the reference grid*/
65   Byte4_t XTOsiz;            /**< horizontal offset from the origin of the reference grid to the left side of the first tile*/
66   Byte4_t YTOsiz;            /**< vertical offset from the origin of the reference grid to the top side of the first tile*/
67   Byte4_t XTnum;             /**< number of tiles in horizontal direction*/
68   Byte4_t YTnum;             /**< number of tiles in vertical direction*/
69   Byte2_t Csiz;              /**< number of the components in the image*/
70   Byte_t  Ssiz[3];           /**< precision (depth) in bits and sign of the component samples*/
71   Byte_t  XRsiz[3];          /**< horizontal separation of a sample of component with respect to the reference grid*/
72   Byte_t  YRsiz[3];          /**< vertical separation of a sample of component with respect to the reference grid*/
73 } SIZmarker_param_t;
74
75 /** A.6.1 Coding style default (COD)*/
76 typedef struct CODmarker_param{
77   Byte2_t  Lcod;             /**< length of marker segment excluding the marker*/
78   Byte_t   Scod;             /**< Coding style for all components*/
79   OPJ_PROG_ORDER prog_order;       /**< progression order*/
80   Byte2_t  numOflayers;      /**< number of layers*/
81   Byte_t   numOfdecomp;      /**< number of decompositions levels*/
82   Byte4_t  *XPsiz;           /**< dynamic array of precinct width  at successive resolution level in order*/
83   Byte4_t  *YPsiz;           /**< dynamic array of precinct height at successive resolution level in order*/
84 } CODmarker_param_t;
85
86 /** index parameters*/
87 typedef struct index_param{
88   metadatalist_param_t *metadatalist; /**< metadata-bin list*/
89   OPJ_OFF_T offset;                     /**< codestream offset*/
90   Byte8_t length;                     /**< codestream length */
91   Byte8_t mhead_length;               /**< main header length  */
92   SIZmarker_param_t SIZ;              /**< SIZ marker information*/
93   CODmarker_param_t COD;              /**< COD marker information*/
94   faixbox_param_t *tilepart;          /**< tile part information from tpix box*/
95   mhixbox_param_t **tileheader;       /**< dynamic array of tile header information from thix box*/
96   faixbox_param_t **precpacket;       /**< dynamic array of precint packet information from ppix box*/
97 } index_param_t;
98
99
100 /**
101  * parse JP2 file
102  * AnnexI: Indexing JPEG2000 files for JPIP
103  *
104  * @param[in] fd file descriptor of the JP2 file
105  * @return       pointer to the generated structure of index parameters
106  */
107 index_param_t * parse_jp2file( int fd);
108
109 /**
110  * print index parameters
111  *
112  * @param[in] index index parameters
113  */
114 void print_index( index_param_t index);
115
116 /**
117  * print Image and Tile SIZ parameters
118  *
119  * @param[in] SIZ SIZ marker information
120  */
121 void print_SIZ( SIZmarker_param_t SIZ);
122
123 /**
124  * print Coding style default COD parameters
125  *
126  * @param[in] COD COD marker information
127  */
128 void print_COD( CODmarker_param_t COD);
129
130 /**
131  * delete index
132  *
133  * @param[in,out] index addressof the index pointer
134  */
135 void delete_index( index_param_t **index);
136
137 /**
138  * delete dynamic arrays in COD marker
139  *
140  * @param[in] COD COD marker information
141  */
142 void delete_COD( CODmarker_param_t COD);
143
144
145 /** 1-dimensional range parameters*/
146 typedef struct range_param{
147   Byte4_t minvalue; /**< minimal value*/
148   Byte4_t maxvalue; /**< maximal value*/
149 } range_param_t;
150
151 /**
152  * get horizontal range of the tile in reference grid
153  *
154  * @param[in] SIZ      SIZ marker information
155  * @param[in] tile_id  tile id
156  * @param[in] level    decomposition level
157  * @return             structured range parameter
158  */
159 range_param_t get_tile_Xrange( SIZmarker_param_t SIZ, Byte4_t tile_id, int level);
160
161 /**
162  * get vertical range of the tile in reference grid
163  *
164  * @param[in] SIZ      SIZ marker information
165  * @param[in] tile_id  tile id
166  * @param[in] level    decomposition level
167  * @return             structured range parameter
168  */
169 range_param_t get_tile_Yrange( SIZmarker_param_t SIZ, Byte4_t tile_id, int level);
170
171
172 /**
173  * get tile wdith at the decomposition level
174  *
175  * @param[in] SIZ      SIZ marker information
176  * @param[in] tile_id  tile id
177  * @param[in] level    decomposition level
178  * @return             tile width
179  */
180 Byte4_t get_tile_XSiz( SIZmarker_param_t SIZ, Byte4_t tile_id, int level);
181 Byte4_t get_tile_YSiz( SIZmarker_param_t SIZ, Byte4_t tile_id, int level);
182
183
184 /**
185  * answers if the target is feasible to JPT-stream
186  *
187  * @param[in] index index parameters
188  * @return    true if JPT-stream is feasible
189  */
190 bool isJPTfeasible( index_param_t index);
191
192 #endif      /* !INDEX_MANAGER_H_ */