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
48namespace cv
49{
50
51enum
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
59typedef unsigned long ulong;
60
61// class RBaseStream - base class for other reading streams.
62class RBaseStream
63{
64public:
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
77protected:
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
96class RLByteStream : public RBaseStream
97{
98public:
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
109class RMByteStream : public RLByteStream
110{
111public:
112    virtual ~RMByteStream();
113
114    int     getWord();
115    int     getDWord();
116};
117
118// WBaseStream - base class for output streams
119class WBaseStream
120{
121public:
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
132protected:
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
151class WLByteStream : public WBaseStream
152{
153public:
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
165class WMByteStream : public WLByteStream
166{
167public:
168    virtual ~WMByteStream();
169    void  putWord( int val );
170    void  putDWord( int val );
171};
172
173inline unsigned BSWAP(unsigned v)
174{
175    return (v<<24)|((v&0xff00)<<8)|((v>>8)&0xff00)|((unsigned)v>>24);
176}
177
178bool bsIsBigEndian( void );
179
180}
181
182#endif/*_BITSTRM_H_*/
183