Home | History | Annotate | Download | only in src
      1 /*M///////////////////////////////////////////////////////////////////////////////////////
      2 //
      3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
      4 //
      5 //  By downloading, copying, installing or using the software you agree to this license.
      6 //  If you do not agree to this license, do not download, install,
      7 //  copy or use the software.
      8 //
      9 //
     10 //                           License Agreement
     11 //                For Open Source Computer Vision Library
     12 //
     13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
     14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
     15 // Third party copyrights are property of their respective owners.
     16 //
     17 // Redistribution and use in source and binary forms, with or without modification,
     18 // are permitted provided that the following conditions are met:
     19 //
     20 //   * Redistribution's of source code must retain the above copyright notice,
     21 //     this list of conditions and the following disclaimer.
     22 //
     23 //   * Redistribution's in binary form must reproduce the above copyright notice,
     24 //     this list of conditions and the following disclaimer in the documentation
     25 //     and/or other materials provided with the distribution.
     26 //
     27 //   * The name of the copyright holders may not be used to endorse or promote products
     28 //     derived from this software without specific prior written permission.
     29 //
     30 // This software is provided by the copyright holders and contributors "as is" and
     31 // any express or implied warranties, including, but not limited to, the implied
     32 // warranties of merchantability and fitness for a particular purpose are disclaimed.
     33 // In no event shall the Intel Corporation or contributors be liable for any direct,
     34 // indirect, incidental, special, exemplary, or consequential damages
     35 // (including, but not limited to, procurement of substitute goods or services;
     36 // loss of use, data, or profits; or business interruption) however caused
     37 // and on any theory of liability, whether in contract, strict liability,
     38 // or tort (including negligence or otherwise) arising in any way out of
     39 // the use of this software, even if advised of the possibility of such damage.
     40 //
     41 //M*/
     42 
     43 #ifndef _BITSTRM_H_
     44 #define _BITSTRM_H_
     45 
     46 #include <stdio.h>
     47 
     48 namespace cv
     49 {
     50 
     51 enum
     52 {
     53     RBS_THROW_EOS=-123,  // <end of stream> exception code
     54     RBS_THROW_FORB=-124,  // <forrbidden huffman code> exception code
     55     RBS_HUFF_FORB=2047,  // forrbidden huffman code "value"
     56     RBS_BAD_HEADER=-125 // invalid header
     57 };
     58 
     59 typedef unsigned long ulong;
     60 
     61 // class RBaseStream - base class for other reading streams.
     62 class RBaseStream
     63 {
     64 public:
     65     //methods
     66     RBaseStream();
     67     virtual ~RBaseStream();
     68 
     69     virtual bool  open( const String& filename );
     70     virtual bool  open( const Mat& buf );
     71     virtual void  close();
     72     bool          isOpened();
     73     void          setPos( int pos );
     74     int           getPos();
     75     void          skip( int bytes );
     76 
     77 protected:
     78 
     79     bool    m_allocated;
     80     uchar*  m_start;
     81     uchar*  m_end;
     82     uchar*  m_current;
     83     FILE*   m_file;
     84     int     m_block_size;
     85     int     m_block_pos;
     86     bool    m_is_opened;
     87 
     88     virtual void  readBlock();
     89     virtual void  release();
     90     virtual void  allocate();
     91 };
     92 
     93 
     94 // class RLByteStream - uchar-oriented stream.
     95 // l in prefix means that the least significant uchar of a multi-uchar value goes first
     96 class RLByteStream : public RBaseStream
     97 {
     98 public:
     99     virtual ~RLByteStream();
    100 
    101     int     getByte();
    102     int     getBytes( void* buffer, int count );
    103     int     getWord();
    104     int     getDWord();
    105 };
    106 
    107 // class RMBitStream - uchar-oriented stream.
    108 // m in prefix means that the most significant uchar of a multi-uchar value go first
    109 class RMByteStream : public RLByteStream
    110 {
    111 public:
    112     virtual ~RMByteStream();
    113 
    114     int     getWord();
    115     int     getDWord();
    116 };
    117 
    118 // WBaseStream - base class for output streams
    119 class WBaseStream
    120 {
    121 public:
    122     //methods
    123     WBaseStream();
    124     virtual ~WBaseStream();
    125 
    126     virtual bool  open( const String& filename );
    127     virtual bool  open( std::vector<uchar>& buf );
    128     virtual void  close();
    129     bool          isOpened();
    130     int           getPos();
    131 
    132 protected:
    133 
    134     uchar*  m_start;
    135     uchar*  m_end;
    136     uchar*  m_current;
    137     int     m_block_size;
    138     int     m_block_pos;
    139     FILE*   m_file;
    140     bool    m_is_opened;
    141     std::vector<uchar>* m_buf;
    142 
    143     virtual void  writeBlock();
    144     virtual void  release();
    145     virtual void  allocate();
    146 };
    147 
    148 
    149 // class WLByteStream - uchar-oriented stream.
    150 // l in prefix means that the least significant uchar of a multi-byte value goes first
    151 class WLByteStream : public WBaseStream
    152 {
    153 public:
    154     virtual ~WLByteStream();
    155 
    156     void  putByte( int val );
    157     void  putBytes( const void* buffer, int count );
    158     void  putWord( int val );
    159     void  putDWord( int val );
    160 };
    161 
    162 
    163 // class WLByteStream - uchar-oriented stream.
    164 // m in prefix means that the least significant uchar of a multi-byte value goes last
    165 class WMByteStream : public WLByteStream
    166 {
    167 public:
    168     virtual ~WMByteStream();
    169     void  putWord( int val );
    170     void  putDWord( int val );
    171 };
    172 
    173 inline unsigned BSWAP(unsigned v)
    174 {
    175     return (v<<24)|((v&0xff00)<<8)|((v>>8)&0xff00)|((unsigned)v>>24);
    176 }
    177 
    178 bool bsIsBigEndian( void );
    179 
    180 }
    181 
    182 #endif/*_BITSTRM_H_*/
    183