Home | History | Annotate | Download | only in libopenjpeg20
      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.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 occured.
    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 occured
    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 occured.
    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 occured 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 occured.
    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 occured.
    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 occured.
    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 occured.
    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 occured.
    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 occured.
    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