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