• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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