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 __CIO_H
41 #define __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 
74 typedef enum
75 {
76 	opj_signed_sentinel		= -1, /* do not use in code */
77 	opj_stream_e_output		= 0x1,
78 	opj_stream_e_input		= 0x2,
79 	opj_stream_e_end		= 0x4,
80 	opj_stream_e_error		= 0x8
81 }
82 opj_stream_flag ;
83 
84 /**
85 Byte input-output stream.
86 */
87 typedef struct opj_stream_private
88 {
89 	/**
90 	 * User data, be it files, ... The actual data depends on the type of the stream.
91 	 */
92 	void *					m_user_data;
93 
94 	/**
95 	 * Pointer to function to free m_user_data (NULL at initialization)
96 	 * when destroying the stream. If pointer is NULL the function is not
97 	 * called and the m_user_data is not freed (even if non-NULL).
98 	 */
99 	opj_stream_free_user_data_fn		m_free_user_data_fn;
100 
101 	/**
102 	 * User data length
103 	 */
104 	OPJ_UINT64 				m_user_data_length;
105 
106 	/**
107 	 * Pointer to actual read function (NULL at the initialization of the cio.
108 	 */
109 	opj_stream_read_fn		m_read_fn;
110 
111 	/**
112 	 * Pointer to actual write function (NULL at the initialization of the cio.
113 	 */
114 	opj_stream_write_fn		m_write_fn;
115 
116 	/**
117 	 * Pointer to actual skip function (NULL at the initialization of the cio.
118 	 * There is no seek function to prevent from back and forth slow procedures.
119 	 */
120 	opj_stream_skip_fn		m_skip_fn;
121 
122 	/**
123 	 * Pointer to actual seek function (if available).
124 	 */
125 	opj_stream_seek_fn		m_seek_fn;
126 
127 	/**
128 	 * Actual data stored into the stream if readed from. Data is read by chunk of fixed size.
129 	 * you should never access this data directly.
130 	 */
131 	OPJ_BYTE *					m_stored_data;
132 
133 	/**
134 	 * Pointer to the current read data.
135 	 */
136 	OPJ_BYTE *					m_current_data;
137 
138     /**
139     * FIXME DOC.
140     */
141 	OPJ_OFF_T (* m_opj_skip)(struct opj_stream_private * ,OPJ_OFF_T , struct opj_event_mgr *);
142 
143     /**
144     * FIXME DOC.
145     */
146 	OPJ_BOOL (* m_opj_seek) (struct opj_stream_private * , OPJ_OFF_T , struct opj_event_mgr *);
147 
148 	/**
149 	 * number of bytes containing in the buffer.
150 	 */
151 	OPJ_SIZE_T			m_bytes_in_buffer;
152 
153 	/**
154 	 * The number of bytes read/written from the beginning of the stream
155 	 */
156 	OPJ_OFF_T			m_byte_offset;
157 
158 	/**
159 	 * The size of the buffer.
160 	 */
161 	OPJ_SIZE_T			m_buffer_size;
162 
163 	/**
164 	 * Flags to tell the status of the stream.
165 	 */
166 	opj_stream_flag m_status;
167 
168 }
169 opj_stream_private_t;
170 
171 /** @name Exported functions (see also openjpeg.h) */
172 /*@{*/
173 /* ----------------------------------------------------------------------- */
174 /**
175  * Write some bytes to the given data buffer, this function is used in Big Endian cpus.
176  * @param p_buffer		pointer the data buffer to write data to.
177  * @param p_value		the value to write
178  * @param p_nb_bytes	the number of bytes to write
179 */
180 void opj_write_bytes_BE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes);
181 
182 /**
183  * Reads some bytes from the given data buffer, this function is used in Big Endian cpus.
184  * @param p_buffer		pointer the data buffer to read data from.
185  * @param p_value		pointer to the value that will store the data.
186  * @param p_nb_bytes	the nb bytes to read.
187  * @return				the number of bytes read or -1 if an error occurred.
188  */
189 void opj_read_bytes_BE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes);
190 
191 /**
192  * Write some bytes to the given data buffer, this function is used in Little Endian cpus.
193  * @param p_buffer		pointer the data buffer to write data to.
194  * @param p_value		the value to write
195  * @param p_nb_bytes	the number of bytes to write
196  * @return				the number of bytes written or -1 if an error occurred
197 */
198 void opj_write_bytes_LE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes);
199 
200 /**
201  * Reads some bytes from the given data buffer, this function is used in Little Endian cpus.
202  * @param p_buffer		pointer the data buffer to read data from.
203  * @param p_value		pointer to the value that will store the data.
204  * @param p_nb_bytes	the nb bytes to read.
205  * @return				the number of bytes read or -1 if an error occurred.
206  */
207 void opj_read_bytes_LE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, 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,OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, struct opj_event_mgr * p_event_mgr);
275 
276 /**
277  * Writes some bytes to the stream.
278  * @param		p_stream	the stream to write data to.
279  * @param		p_buffer	pointer to the data buffer holds the data to be writtent.
280  * @param		p_size		number of bytes to write.
281  * @param		p_event_mgr	the user event manager to be notified of special events.
282  * @return		the number of bytes writtent, or -1 if an error occurred.
283  */
284 OPJ_SIZE_T opj_stream_write_data (opj_stream_private_t * p_stream,const OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, struct opj_event_mgr * p_event_mgr);
285 
286 /**
287  * Writes the content of the stream buffer to the stream.
288  * @param		p_stream	the stream to write data to.
289  * @param		p_event_mgr	the user event manager to be notified of special events.
290  * @return		true if the data could be flushed, false else.
291  */
292 OPJ_BOOL opj_stream_flush (opj_stream_private_t * p_stream, struct opj_event_mgr * p_event_mgr);
293 
294 /**
295  * Skips a number of bytes from the stream.
296  * @param		p_stream	the stream to skip data from.
297  * @param		p_size		the number of bytes to skip.
298  * @param		p_event_mgr	the user event manager to be notified of special events.
299  * @return		the number of bytes skipped, or -1 if an error occurred.
300  */
301 OPJ_OFF_T opj_stream_skip (opj_stream_private_t * p_stream,OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
302 
303 /**
304  * Tells the byte offset on the stream (similar to ftell).
305  *
306  * @param		p_stream	the stream to get the information from.
307  *
308  * @return		the current position o fthe stream.
309  */
310 OPJ_OFF_T opj_stream_tell (const opj_stream_private_t * p_stream);
311 
312 
313 /**
314  * Get the number of bytes left before the end of the stream (similar to cio_numbytesleft).
315  *
316  * @param		p_stream	the stream to get the information from.
317  *
318  * @return		Number of bytes left before the end of the stream.
319  */
320 OPJ_OFF_T opj_stream_get_number_byte_left (const opj_stream_private_t * p_stream);
321 
322 /**
323  * Skips a number of bytes from the stream.
324  * @param		p_stream	the stream to skip data from.
325  * @param		p_size		the number of bytes to skip.
326  * @param		p_event_mgr	the user event manager to be notified of special events.
327  * @return		the number of bytes skipped, or -1 if an error occurred.
328  */
329 OPJ_OFF_T opj_stream_write_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
330 
331 /**
332  * Skips a number of bytes from the stream.
333  * @param		p_stream	the stream to skip data from.
334  * @param		p_size		the number of bytes to skip.
335  * @param		p_event_mgr	the user event manager to be notified of special events.
336  * @return		the number of bytes skipped, or -1 if an error occurred.
337  */
338 OPJ_OFF_T opj_stream_read_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
339 
340 /**
341  * Skips a number of bytes from the stream.
342  * @param		p_stream	the stream to skip data from.
343  * @param		p_size		the number of bytes to skip.
344  * @param		p_event_mgr	the user event manager to be notified of special events.
345  * @return		OPJ_TRUE if success, or OPJ_FALSE if an error occurred.
346  */
347 OPJ_BOOL opj_stream_read_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
348 
349 /**
350  * Skips a number of bytes from the stream.
351  * @param		p_stream	the stream to skip data from.
352  * @param		p_size		the number of bytes to skip.
353  * @param		p_event_mgr	the user event manager to be notified of special events.
354  * @return		the number of bytes skipped, or -1 if an error occurred.
355  */
356 OPJ_BOOL opj_stream_write_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
357 
358 /**
359  * Seeks 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		true if the stream is seekable.
364  */
365 OPJ_BOOL opj_stream_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
366 
367 /**
368  * Tells if the given stream is seekable.
369  */
370 OPJ_BOOL opj_stream_has_seek (const opj_stream_private_t * p_stream);
371 
372 /**
373  * FIXME DOC.
374  */
375 OPJ_SIZE_T opj_stream_default_read (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data);
376 
377 /**
378  * FIXME DOC.
379  */
380 OPJ_SIZE_T opj_stream_default_write (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data);
381 
382 /**
383  * FIXME DOC.
384  */
385 OPJ_OFF_T opj_stream_default_skip (OPJ_OFF_T p_nb_bytes, void * p_user_data);
386 
387 /**
388  * FIXME DOC.
389  */
390 OPJ_BOOL opj_stream_default_seek (OPJ_OFF_T p_nb_bytes, void * p_user_data);
391 
392 /* ----------------------------------------------------------------------- */
393 /*@}*/
394 
395 /*@}*/
396 
397 
398 #endif /* __CIO_H */
399 
400