16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M/////////////////////////////////////////////////////////////////////////////////////// 26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// By downloading, copying, installing or using the software you agree to this license. 66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// If you do not agree to this license, do not download, install, 76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// copy or use the software. 86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Intel License Agreement 116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// For Open Source Computer Vision Library 126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved. 146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners. 156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification, 176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met: 186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's of source code must retain the above copyright notice, 206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer. 216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's in binary form must reproduce the above copyright notice, 236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer in the documentation 246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and/or other materials provided with the distribution. 256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * The name of Intel Corporation may not be used to endorse or promote products 276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// derived from this software without specific prior written permission. 286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and 306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied 316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed. 326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct, 336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages 346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services; 356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused 366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability, 376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of 386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage. 396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/ 416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef _BITSTRM_H_ 436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _BITSTRM_H_ 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <stdio.h> 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <setjmp.h> 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if _MSC_VER >= 1200 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn #pragma warning( disable: 4711 4324 ) 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define RBS_THROW_EOS -123 /* <end of stream> exception code */ 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define RBS_THROW_FORB -124 /* <forrbidden huffman code> exception code */ 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define RBS_HUFF_FORB 2047 /* forrbidden huffman code "value" */ 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef unsigned char uchar; 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef unsigned long ulong; 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// class RBaseStream - base class for other reading streams. 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass RBaseStream 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //methods 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn RBaseStream(); 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~RBaseStream(); 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual bool Open( const char* filename ); 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void Close(); 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void SetBlockSize( int block_size, int unGetsize = 4 ); 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool IsOpened(); 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void SetPos( int pos ); 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int GetPos(); 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void Skip( int bytes ); 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jmp_buf& JmpBuf(); 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected: 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jmp_buf m_jmp_buf; 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* m_start; 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* m_end; 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* m_current; 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FILE* m_file; 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int m_unGetsize; 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int m_block_size; 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int m_block_pos; 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool m_jmp_set; 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool m_is_opened; 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void ReadBlock(); 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void Release(); 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void Allocate(); 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// class RLByteStream - uchar-oriented stream. 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// l in prefix means that the least significant uchar of a multi-uchar value goes first 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass RLByteStream : public RBaseStream 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~RLByteStream(); 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int GetByte(); 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void GetBytes( void* buffer, int count, int* readed = 0 ); 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int GetWord(); 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int GetDWord(); 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// class RMBitStream - uchar-oriented stream. 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// m in prefix means that the most significant uchar of a multi-uchar value go first 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass RMByteStream : public RLByteStream 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~RMByteStream(); 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int GetWord(); 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int GetDWord(); 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// class RLBitStream - bit-oriented stream. 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// l in prefix means that the least significant bit of a multi-bit value goes first 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass RLBitStream : public RBaseStream 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~RLBitStream(); 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void SetPos( int pos ); 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int GetPos(); 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int Get( int bits ); 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int Show( int bits ); 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int GetHuff( const short* table ); 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void Move( int shift ); 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void Skip( int bytes ); 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected: 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int m_bit_idx; 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void ReadBlock(); 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// class RMBitStream - bit-oriented stream. 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// m in prefix means that the most significant bit of a multi-bit value goes first 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass RMBitStream : public RLBitStream 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~RMBitStream(); 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void SetPos( int pos ); 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int GetPos(); 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int Get( int bits ); 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int Show( int bits ); 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int GetHuff( const short* table ); 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void Move( int shift ); 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void Skip( int bytes ); 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected: 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void ReadBlock(); 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// WBaseStream - base class for output streams 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass WBaseStream 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn //methods 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn WBaseStream(); 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~WBaseStream(); 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual bool Open( const char* filename ); 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void Close(); 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void SetBlockSize( int block_size ); 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool IsOpened(); 1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int GetPos(); 1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected: 1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* m_start; 1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* m_end; 1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* m_current; 1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int m_block_size; 1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int m_block_pos; 1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn FILE* m_file; 1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool m_is_opened; 1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void WriteBlock(); 1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void Release(); 1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void Allocate(); 1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// class WLByteStream - uchar-oriented stream. 1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// l in prefix means that the least significant uchar of a multi-byte value goes first 1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass WLByteStream : public WBaseStream 1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~WLByteStream(); 1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void PutByte( int val ); 1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void PutBytes( const void* buffer, int count ); 1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void PutWord( int val ); 1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void PutDWord( int val ); 2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// class WLByteStream - uchar-oriented stream. 2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// m in prefix means that the least significant uchar of a multi-byte value goes last 2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass WMByteStream : public WLByteStream 2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~WMByteStream(); 2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void PutWord( int val ); 2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void PutDWord( int val ); 2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// class WLBitStream - bit-oriented stream. 2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// l in prefix means that the least significant bit of a multi-bit value goes first 2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass WLBitStream : public WBaseStream 2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~WLBitStream(); 2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int GetPos(); 2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void Put( int val, int bits ); 2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void PutHuff( int val, const int* table ); 2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected: 2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int m_bit_idx; 2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int m_val; 2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void WriteBlock(); 2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// class WMBitStream - bit-oriented stream. 2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// l in prefix means that the least significant bit of a multi-bit value goes first 2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass WMBitStream : public WBaseStream 2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic: 2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn WMBitStream(); 2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual ~WMBitStream(); 2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool Open( const char* filename ); 2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void Close(); 2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void Flush(); 2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int GetPos(); 2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void Put( int val, int bits ); 2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void PutHuff( int val, const ulong* table ); 2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected: 2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int m_bit_idx; 2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ulong m_pad_val; 2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ulong m_val; 2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn virtual void WriteBlock(); 2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn void ResetBuffer(); 2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}; 2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define BSWAP(v) (((v)<<24)|(((v)&0xff00)<<8)| \ 2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (((v)>>8)&0xff00)|((unsigned)(v)>>24)) 2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennint* bsCreateSourceHuffmanTable( const uchar* src, int* dst, 2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int max_bits, int first_bits ); 2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool bsCreateDecodeHuffmanTable( const int* src, short* dst, int max_size ); 2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool bsCreateEncodeHuffmanTable( const int* src, ulong* dst, int max_size ); 2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid bsBSwapBlock( uchar *start, uchar *end ); 2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool bsIsBigEndian( void ); 2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennextern const ulong bs_bit_mask[]; 2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif/*_BITSTRM_H_*/ 273