40548d91e4a88db0546fc3431ad972102d7c5520
[openjpeg.git] / src / lib / openjpip / msgqueue_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  * Copyright (c) 2011,      Lucian Corlaciu, GSoC
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #ifndef         MSGQUEUE_MANAGER_H_
33 # define        MSGQUEUE_MANAGER_H_
34
35 #include "bool.h"
36 #include "byte_manager.h"
37 #include "cachemodel_manager.h"
38 #include "placeholder_manager.h"
39
40 #define PRECINCT_MSG 0
41 #define EXT_PRECINCT_MSG 1
42 #define TILE_HEADER_MSG 2
43 #define TILE_MSG 4
44 #define EXT_TILE_MSG 5
45 #define MAINHEADER_MSG 6
46 #define METADATA_MSG 8
47
48 /** message parameters */
49 typedef struct message_param{
50   bool    last_byte;          /**< if message contains the last byte of the data-bin*/
51   Byte8_t in_class_id;        /**< in-class identifier A.2.3*/
52   Byte8_t class_id;           /**< class identifiers */
53   Byte8_t csn;                /**< index of the codestream*/
54   Byte8_t bin_offset;         /**< offset of the data in this message from the start of the data-bin*/
55   Byte8_t length;             /**< message byte length*/
56   Byte8_t aux;                /**<*/
57   OPJ_OFF_T res_offset;         /**< offset in the resource*/
58   placeholder_param_t *phld;  /**< placeholder pointer in index*/
59   struct message_param *next; /**< pointer to the next message*/
60 } message_param_t;
61
62 /** message queue parameters */
63 typedef struct msgqueue_param{
64   message_param_t *first;         /**< first message pointer of the list*/
65   message_param_t *last;          /**< last  message pointer of the list*/
66   bool stateless;                 /**< if this is a stateless message queue*/
67   cachemodel_param_t *cachemodel; /**< reference cachemodel pointer*/
68 } msgqueue_param_t;
69
70 /**
71  * generate message queue
72  *
73  * @param[in] stateless   if this is a stateless message queue
74  * @param[in] cachemodel  cachemodel pointer
75  * @return                generated message queue pointer
76  */
77 msgqueue_param_t * gene_msgqueue( bool stateless, cachemodel_param_t *cachemodel);
78
79 /**
80  * delete message queue
81  *
82  * @param[in] msgqueue address of the message queue pointer
83  */
84 void delete_msgqueue( msgqueue_param_t **msgqueue);
85
86 /**
87  * delete a message in msgqueue
88  *
89  * @param[in] message  address of the deleting message pointer
90  * @param[in] msgqueue message queue pointer
91  */
92 void delete_message_in_msgqueue( message_param_t **message, msgqueue_param_t *msgqueue);
93
94 /**
95  * print message queue
96  *
97  * @param[in] msgqueue message queue pointer
98  */
99 void print_msgqueue( msgqueue_param_t *msgqueue);
100
101
102 /**
103  * enqueue main header data-bin into message queue
104  *
105  * @param[in,out] msgqueue message queue pointer
106  */
107 void enqueue_mainheader( msgqueue_param_t *msgqueue);
108
109 /**
110  * enqueue tile headers data-bin into message queue
111  *
112  * @param[in]     tile_id  tile id starting from 0
113  * @param[in,out] msgqueue message queue pointer
114  */
115 void enqueue_tileheader( int tile_id, msgqueue_param_t *msgqueue);
116
117 /**
118  * enqueue tile data-bin into message queue
119  *
120  * @param[in]     tile_id  tile id starting from 0
121  * @param[in]     level    decomposition level
122  * @param[in,out] msgqueue message queue pointer
123  */
124 void enqueue_tile( Byte4_t tile_id, int level, msgqueue_param_t *msgqueue);
125
126 /**
127  * enqueue precinct data-bin into message queue
128  *
129  * @param[in]     seq_id   precinct sequence number within its tile
130  * @param[in]     tile_id  tile index
131  * @param[in]     comp_id  component number
132  * @param[in]     layers   num of layers
133  * @param[in,out] msgqueue message queue
134  */
135 void enqueue_precinct( int seq_id, int tile_id, int comp_id, int layers, msgqueue_param_t *msgqueue);
136
137
138 /**
139  * enqueue Metadata-bin into message queue
140  *
141  * @param[in]     meta_id  metadata-bin id
142  * @param[in,out] msgqueue message queue pointer
143  */
144 void enqueue_metadata( Byte8_t meta_id, msgqueue_param_t *msgqueue);
145
146
147 /**
148  * reconstruct JPT/JPP-stream from message queue
149  *
150  * @param[in] msgqueue message queue pointer
151  * @param[in] tmpfd    file discriptor to write JPT/JPP-stream
152  */
153 void recons_stream_from_msgqueue( msgqueue_param_t *msgqueue, int tmpfd);
154
155
156 /**
157  * parse JPT- JPP- stream to message queue
158  *
159  * @param[in]     JPIPstream   JPT- JPP- stream data pointer
160  * @param[in]     streamlen    JPIPstream length
161  * @param[in]     offset       offset of the stream from the whole beginning
162  * @param[in,out] msgqueue     adding message queue pointer
163  */
164 void parse_JPIPstream( Byte_t *JPIPstream, Byte8_t streamlen, OPJ_OFF_T offset, msgqueue_param_t *msgqueue);
165
166 /**
167  * parse JPT- JPP- stream to message queue
168  *
169  * @param[in] msgqueue     reference message queue pointer
170  * @param[in] stream       stream data pointer
171  * @param[in] streamlen    stream length
172  * @param[in] metadatalist adding metadata list pointer
173  */
174 void parse_metamsg( msgqueue_param_t *msgqueue, Byte_t *stream, Byte8_t streamlen, metadatalist_param_t *metadatalist);
175
176 /**
177  * compute precinct ID A.3.2.1
178  *
179  * @param[in]  t                 tile index
180  * @param[in]  c                 component index
181  * @param[in]  s                 sequence number
182  * @param[in]  num_components    total number of components
183  * @param[in]  num_tiles         total number of tiles
184  * @return                       precicnt id
185  */
186 Byte8_t comp_precinct_id( int t, int c, int s, int num_components, int num_tiles);
187
188 #endif      /* !MSGQUEUE_MANAGER_H_ */