1 | /* |
2 | * The copyright in this software is being made available under the 2-clauses |
3 | * BSD License, included below. This software may be subject to other third |
4 | * party and contributor rights, including patent rights, and no such rights |
5 | * are granted under this license. |
6 | * |
7 | * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium |
8 | * Copyright (c) 2002-2014, Professor Benoit Macq |
9 | * Copyright (c) 2001-2003, David Janssens |
10 | * Copyright (c) 2002-2003, Yannick Verschueren |
11 | * Copyright (c) 2003-2007, Francois-Olivier Devaux |
12 | * Copyright (c) 2003-2014, Antonin Descampe |
13 | * Copyright (c) 2005, Herve Drolon, FreeImage Team |
14 | * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR |
15 | * Copyright (c) 2012, CS Systemes d'Information, France |
16 | * All rights reserved. |
17 | * |
18 | * Redistribution and use in source and binary forms, with or without |
19 | * modification, are permitted provided that the following conditions |
20 | * are met: |
21 | * 1. Redistributions of source code must retain the above copyright |
22 | * notice, this list of conditions and the following disclaimer. |
23 | * 2. Redistributions in binary form must reproduce the above copyright |
24 | * notice, this list of conditions and the following disclaimer in the |
25 | * documentation and/or other materials provided with the distribution. |
26 | * |
27 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' |
28 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
29 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
30 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
31 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
32 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
33 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
34 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
35 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
36 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
37 | * POSSIBILITY OF SUCH DAMAGE. |
38 | */ |
39 | |
40 | #ifndef OPJ_CIO_H |
41 | #define OPJ_CIO_H |
42 | /** |
43 | @file cio.h |
44 | @brief Implementation of a byte input-output process (CIO) |
45 | |
46 | The functions in CIO.C have for goal to realize a byte input / output process. |
47 | */ |
48 | |
49 | /** @defgroup CIO CIO - byte input-output stream */ |
50 | /*@{*/ |
51 | |
52 | #include "opj_config_private.h" |
53 | |
54 | /* ----------------------------------------------------------------------- */ |
55 | |
56 | #if defined(OPJ_BIG_ENDIAN) |
57 | #define opj_write_bytes opj_write_bytes_BE |
58 | #define opj_read_bytes opj_read_bytes_BE |
59 | #define opj_write_double opj_write_double_BE |
60 | #define opj_read_double opj_read_double_BE |
61 | #define opj_write_float opj_write_float_BE |
62 | #define opj_read_float opj_read_float_BE |
63 | #else |
64 | #define opj_write_bytes opj_write_bytes_LE |
65 | #define opj_read_bytes opj_read_bytes_LE |
66 | #define opj_write_double opj_write_double_LE |
67 | #define opj_read_double opj_read_double_LE |
68 | #define opj_write_float opj_write_float_LE |
69 | #define opj_read_float opj_read_float_LE |
70 | #endif |
71 | |
72 | |
73 | #define OPJ_STREAM_STATUS_OUTPUT 0x1U |
74 | #define OPJ_STREAM_STATUS_INPUT 0x2U |
75 | #define OPJ_STREAM_STATUS_END 0x4U |
76 | #define OPJ_STREAM_STATUS_ERROR 0x8U |
77 | |
78 | /** |
79 | Byte input-output stream. |
80 | */ |
81 | typedef struct opj_stream_private { |
82 | /** |
83 | * User data, be it files, ... The actual data depends on the type of the stream. |
84 | */ |
85 | void * m_user_data; |
86 | |
87 | /** |
88 | * Pointer to function to free m_user_data (NULL at initialization) |
89 | * when destroying the stream. If pointer is NULL the function is not |
90 | * called and the m_user_data is not freed (even if non-NULL). |
91 | */ |
92 | opj_stream_free_user_data_fn m_free_user_data_fn; |
93 | |
94 | /** |
95 | * User data length |
96 | */ |
97 | OPJ_UINT64 m_user_data_length; |
98 | |
99 | /** |
100 | * Pointer to actual read function (NULL at the initialization of the cio. |
101 | */ |
102 | opj_stream_read_fn m_read_fn; |
103 | |
104 | /** |
105 | * Pointer to actual write function (NULL at the initialization of the cio. |
106 | */ |
107 | opj_stream_write_fn m_write_fn; |
108 | |
109 | /** |
110 | * Pointer to actual skip function (NULL at the initialization of the cio. |
111 | * There is no seek function to prevent from back and forth slow procedures. |
112 | */ |
113 | opj_stream_skip_fn m_skip_fn; |
114 | |
115 | /** |
116 | * Pointer to actual seek function (if available). |
117 | */ |
118 | opj_stream_seek_fn m_seek_fn; |
119 | |
120 | /** |
121 | * Actual data stored into the stream if readed from. Data is read by chunk of fixed size. |
122 | * you should never access this data directly. |
123 | */ |
124 | OPJ_BYTE * m_stored_data; |
125 | |
126 | /** |
127 | * Pointer to the current read data. |
128 | */ |
129 | OPJ_BYTE * m_current_data; |
130 | |
131 | /** |
132 | * FIXME DOC. |
133 | */ |
134 | OPJ_OFF_T(* m_opj_skip)(struct opj_stream_private *, OPJ_OFF_T, |
135 | struct opj_event_mgr *); |
136 | |
137 | /** |
138 | * FIXME DOC. |
139 | */ |
140 | OPJ_BOOL(* m_opj_seek)(struct opj_stream_private *, OPJ_OFF_T, |
141 | struct opj_event_mgr *); |
142 | |
143 | /** |
144 | * number of bytes containing in the buffer. |
145 | */ |
146 | OPJ_SIZE_T m_bytes_in_buffer; |
147 | |
148 | /** |
149 | * The number of bytes read/written from the beginning of the stream |
150 | */ |
151 | OPJ_OFF_T m_byte_offset; |
152 | |
153 | /** |
154 | * The size of the buffer. |
155 | */ |
156 | OPJ_SIZE_T m_buffer_size; |
157 | |
158 | /** |
159 | * Flags to tell the status of the stream. |
160 | * Used with OPJ_STREAM_STATUS_* defines. |
161 | */ |
162 | OPJ_UINT32 m_status; |
163 | |
164 | } |
165 | opj_stream_private_t; |
166 | |
167 | /** @name Exported functions (see also openjpeg.h) */ |
168 | /*@{*/ |
169 | /* ----------------------------------------------------------------------- */ |
170 | /** |
171 | * Write some bytes to the given data buffer, this function is used in Big Endian cpus. |
172 | * @param p_buffer pointer the data buffer to write data to. |
173 | * @param p_value the value to write |
174 | * @param p_nb_bytes the number of bytes to write |
175 | */ |
176 | void opj_write_bytes_BE(OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, |
177 | OPJ_UINT32 p_nb_bytes); |
178 | |
179 | /** |
180 | * Reads some bytes from the given data buffer, this function is used in Big Endian cpus. |
181 | * @param p_buffer pointer the data buffer to read data from. |
182 | * @param p_value pointer to the value that will store the data. |
183 | * @param p_nb_bytes the nb bytes to read. |
184 | * @return the number of bytes read or -1 if an error occurred. |
185 | */ |
186 | void opj_read_bytes_BE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, |
187 | OPJ_UINT32 p_nb_bytes); |
188 | |
189 | /** |
190 | * Write some bytes to the given data buffer, this function is used in Little Endian cpus. |
191 | * @param p_buffer pointer the data buffer to write data to. |
192 | * @param p_value the value to write |
193 | * @param p_nb_bytes the number of bytes to write |
194 | * @return the number of bytes written or -1 if an error occurred |
195 | */ |
196 | void opj_write_bytes_LE(OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, |
197 | OPJ_UINT32 p_nb_bytes); |
198 | |
199 | /** |
200 | * Reads some bytes from the given data buffer, this function is used in Little Endian cpus. |
201 | * @param p_buffer pointer the data buffer to read data from. |
202 | * @param p_value pointer to the value that will store the data. |
203 | * @param p_nb_bytes the nb bytes to read. |
204 | * @return the number of bytes read or -1 if an error occurred. |
205 | */ |
206 | void opj_read_bytes_LE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, |
207 | OPJ_UINT32 p_nb_bytes); |
208 | |
209 | |
210 | /** |
211 | * Write some bytes to the given data buffer, this function is used in Little Endian cpus. |
212 | * @param p_buffer pointer the data buffer to write data to. |
213 | * @param p_value the value to write |
214 | */ |
215 | void opj_write_double_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value); |
216 | |
217 | /*** |
218 | * Write some bytes to the given data buffer, this function is used in Big Endian cpus. |
219 | * @param p_buffer pointer the data buffer to write data to. |
220 | * @param p_value the value to write |
221 | */ |
222 | void opj_write_double_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value); |
223 | |
224 | /** |
225 | * Reads some bytes from the given data buffer, this function is used in Little Endian cpus. |
226 | * @param p_buffer pointer the data buffer to read data from. |
227 | * @param p_value pointer to the value that will store the data. |
228 | */ |
229 | void opj_read_double_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value); |
230 | |
231 | /** |
232 | * Reads some bytes from the given data buffer, this function is used in Big Endian cpus. |
233 | * @param p_buffer pointer the data buffer to read data from. |
234 | * @param p_value pointer to the value that will store the data. |
235 | */ |
236 | void opj_read_double_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value); |
237 | |
238 | /** |
239 | * Reads some bytes from the given data buffer, this function is used in Little Endian cpus. |
240 | * @param p_buffer pointer the data buffer to read data from. |
241 | * @param p_value pointer to the value that will store the data. |
242 | */ |
243 | void opj_read_float_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value); |
244 | |
245 | /** |
246 | * Reads some bytes from the given data buffer, this function is used in Big Endian cpus. |
247 | * @param p_buffer pointer the data buffer to read data from. |
248 | * @param p_value pointer to the value that will store the data. |
249 | */ |
250 | void opj_read_float_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value); |
251 | |
252 | /** |
253 | * Write some bytes to the given data buffer, this function is used in Little Endian cpus. |
254 | * @param p_buffer pointer the data buffer to write data to. |
255 | * @param p_value the value to write |
256 | */ |
257 | void opj_write_float_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value); |
258 | |
259 | /*** |
260 | * Write some bytes to the given data buffer, this function is used in Big Endian cpus. |
261 | * @param p_buffer pointer the data buffer to write data to. |
262 | * @param p_value the value to write |
263 | */ |
264 | void opj_write_float_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value); |
265 | |
266 | /** |
267 | * Reads some bytes from the stream. |
268 | * @param p_stream the stream to read data from. |
269 | * @param p_buffer pointer to the data buffer that will receive the data. |
270 | * @param p_size number of bytes to read. |
271 | * @param p_event_mgr the user event manager to be notified of special events. |
272 | * @return the number of bytes read, or -1 if an error occurred or if the stream is at the end. |
273 | */ |
274 | OPJ_SIZE_T opj_stream_read_data(opj_stream_private_t * p_stream, |
275 | OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, struct opj_event_mgr * p_event_mgr); |
276 | |
277 | /** |
278 | * Writes some bytes to the stream. |
279 | * @param p_stream the stream to write data to. |
280 | * @param p_buffer pointer to the data buffer holds the data to be writtent. |
281 | * @param p_size number of bytes to write. |
282 | * @param p_event_mgr the user event manager to be notified of special events. |
283 | * @return the number of bytes writtent, or -1 if an error occurred. |
284 | */ |
285 | OPJ_SIZE_T opj_stream_write_data(opj_stream_private_t * p_stream, |
286 | const OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, |
287 | struct opj_event_mgr * p_event_mgr); |
288 | |
289 | /** |
290 | * Writes the content of the stream buffer to the stream. |
291 | * @param p_stream the stream to write data to. |
292 | * @param p_event_mgr the user event manager to be notified of special events. |
293 | * @return true if the data could be flushed, false else. |
294 | */ |
295 | OPJ_BOOL opj_stream_flush(opj_stream_private_t * p_stream, |
296 | struct opj_event_mgr * p_event_mgr); |
297 | |
298 | /** |
299 | * Skips a number of bytes from the stream. |
300 | * @param p_stream the stream to skip data from. |
301 | * @param p_size the number of bytes to skip. |
302 | * @param p_event_mgr the user event manager to be notified of special events. |
303 | * @return the number of bytes skipped, or -1 if an error occurred. |
304 | */ |
305 | OPJ_OFF_T opj_stream_skip(opj_stream_private_t * p_stream, OPJ_OFF_T p_size, |
306 | struct opj_event_mgr * p_event_mgr); |
307 | |
308 | /** |
309 | * Tells the byte offset on the stream (similar to ftell). |
310 | * |
311 | * @param p_stream the stream to get the information from. |
312 | * |
313 | * @return the current position o fthe stream. |
314 | */ |
315 | OPJ_OFF_T opj_stream_tell(const opj_stream_private_t * p_stream); |
316 | |
317 | |
318 | /** |
319 | * Get the number of bytes left before the end of the stream (similar to cio_numbytesleft). |
320 | * |
321 | * @param p_stream the stream to get the information from. |
322 | * |
323 | * @return Number of bytes left before the end of the stream. |
324 | */ |
325 | OPJ_OFF_T opj_stream_get_number_byte_left(const opj_stream_private_t * |
326 | p_stream); |
327 | |
328 | /** |
329 | * Skips a number of bytes from the stream. |
330 | * @param p_stream the stream to skip data from. |
331 | * @param p_size the number of bytes to skip. |
332 | * @param p_event_mgr the user event manager to be notified of special events. |
333 | * @return the number of bytes skipped, or -1 if an error occurred. |
334 | */ |
335 | OPJ_OFF_T opj_stream_write_skip(opj_stream_private_t * p_stream, |
336 | OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr); |
337 | |
338 | /** |
339 | * Skips a number of bytes from the stream. |
340 | * @param p_stream the stream to skip data from. |
341 | * @param p_size the number of bytes to skip. |
342 | * @param p_event_mgr the user event manager to be notified of special events. |
343 | * @return the number of bytes skipped, or -1 if an error occurred. |
344 | */ |
345 | OPJ_OFF_T opj_stream_read_skip(opj_stream_private_t * p_stream, |
346 | OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr); |
347 | |
348 | /** |
349 | * Skips a number of bytes from the stream. |
350 | * @param p_stream the stream to skip data from. |
351 | * @param p_size the number of bytes to skip. |
352 | * @param p_event_mgr the user event manager to be notified of special events. |
353 | * @return OPJ_TRUE if success, or OPJ_FALSE if an error occurred. |
354 | */ |
355 | OPJ_BOOL opj_stream_read_seek(opj_stream_private_t * p_stream, OPJ_OFF_T p_size, |
356 | struct opj_event_mgr * p_event_mgr); |
357 | |
358 | /** |
359 | * Skips a number of bytes from the stream. |
360 | * @param p_stream the stream to skip data from. |
361 | * @param p_size the number of bytes to skip. |
362 | * @param p_event_mgr the user event manager to be notified of special events. |
363 | * @return the number of bytes skipped, or -1 if an error occurred. |
364 | */ |
365 | OPJ_BOOL opj_stream_write_seek(opj_stream_private_t * p_stream, |
366 | OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr); |
367 | |
368 | /** |
369 | * Seeks a number of bytes from the stream. |
370 | * @param p_stream the stream to skip data from. |
371 | * @param p_size the number of bytes to skip. |
372 | * @param p_event_mgr the user event manager to be notified of special events. |
373 | * @return true if the stream is seekable. |
374 | */ |
375 | OPJ_BOOL opj_stream_seek(opj_stream_private_t * p_stream, OPJ_OFF_T p_size, |
376 | struct opj_event_mgr * p_event_mgr); |
377 | |
378 | /** |
379 | * Tells if the given stream is seekable. |
380 | */ |
381 | OPJ_BOOL opj_stream_has_seek(const opj_stream_private_t * p_stream); |
382 | |
383 | /** |
384 | * FIXME DOC. |
385 | */ |
386 | OPJ_SIZE_T opj_stream_default_read(void * p_buffer, OPJ_SIZE_T p_nb_bytes, |
387 | void * p_user_data); |
388 | |
389 | /** |
390 | * FIXME DOC. |
391 | */ |
392 | OPJ_SIZE_T opj_stream_default_write(void * p_buffer, OPJ_SIZE_T p_nb_bytes, |
393 | void * p_user_data); |
394 | |
395 | /** |
396 | * FIXME DOC. |
397 | */ |
398 | OPJ_OFF_T opj_stream_default_skip(OPJ_OFF_T p_nb_bytes, void * p_user_data); |
399 | |
400 | /** |
401 | * FIXME DOC. |
402 | */ |
403 | OPJ_BOOL opj_stream_default_seek(OPJ_OFF_T p_nb_bytes, void * p_user_data); |
404 | |
405 | /* ----------------------------------------------------------------------- */ |
406 | /*@}*/ |
407 | |
408 | /*@}*/ |
409 | |
410 | |
411 | #endif /* OPJ_CIO_H */ |
412 | |
413 | |