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