inbits.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * This library is free software; you can redistribute it and/or
  3.  * modify it under the terms of the GNU Lesser General Public
  4.  * License as published by the Free Software Foundation; either
  5.  * version 2.1 of the License, or (at your option) any later version.
  6.  *
  7.  * This library is distributed in the hope that it will be useful,
  8.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  10.  * Lesser General Public License for more details.
  11.  * You should have received a copy of the GNU Lesser General Public
  12.  * License along with this library; if not, write to the Free Software
  13.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14.  *
  15.  * $Id: inbits.h,v 1.4 2002/03/07 23:04:01 wmay Exp $
  16.  */
  17. #ifndef __BITS_H__
  18. #define __BITS_H__ 1
  19. #include "systems.h"
  20. extern unsigned int bit_msk[33];
  21. #define INLINE __inline
  22. class CInBitStream
  23. {
  24.  public:
  25.   CInBitStream(void);
  26.   CInBitStream(int istrm);
  27.   ~CInBitStream();
  28.   void init(void);
  29.   int eof() const { return m_orig_buflen == 0; };
  30.   void set_buffer(unsigned char *bptr, uint32_t blen);
  31.   int get_used_bytes(void) { return m_framebits / 8; };
  32.   
  33.   uint32_t getBits(uint32_t numBits);
  34.   INLINE uint32_t peekBits(uint32_t numBits)
  35.     {
  36.       int rbit;
  37.       uint32_t b;
  38.   
  39.       check_buffer(numBits);
  40.   
  41.       rbit = 32 - m_bitcnt;
  42. #define _SWAP(a) ((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3])
  43.       b = _SWAP(m_rdptr);
  44.       return ((b & bit_msk[rbit]) >> (rbit-numBits));
  45.     };
  46.   int peekOneBit(uint32_t numBits);
  47.   int peekBitsTillByteAlign(int &nBitsToPeek);
  48.   
  49.   int peekBitsFromByteAlign(int nBitsToPeek);
  50.   
  51.   Void flush (int nExtraBits = 0);
  52.   INLINE Void setBookmark (void) {
  53.     assert(m_bookmark == 0);
  54.     m_bookmark_rdptr = m_rdptr;
  55.     m_bookmark_bitcnt = m_bitcnt;
  56.     m_bookmark_framebits = m_framebits;
  57.     m_bookmark = 1;
  58.   };
  59.   INLINE Void gotoBookmark (void) {
  60.     assert(m_bookmark == 1);
  61.     m_rdptr = m_bookmark_rdptr;
  62.     m_bitcnt = m_bookmark_bitcnt;
  63.     m_framebits = m_bookmark_framebits;
  64.     m_bookmark = 0;
  65.   };
  66.   void bookmark (Bool bSet);
  67.  private:
  68.   int m_pistrm;
  69.   unsigned char *m_buffer;
  70.   unsigned char *m_rdptr, *m_bookmark_rdptr;
  71.   int m_bitcnt, m_bookmark_bitcnt;
  72.   int m_framebits, m_bookmark_framebits;
  73.   int m_framebits_max;
  74.   uint32_t m_orig_buflen;
  75.   int m_bookmark;
  76.   INLINE void check_buffer (int n) {
  77.     int cmp;
  78.       
  79.     cmp = m_framebits + n;
  80.     if (cmp > m_framebits_max) {
  81.       if (m_pistrm < 0) {
  82. throw ((int)1);
  83.       } else {
  84. read_ifstream_buffer();
  85.       }
  86.     }
  87.   };
  88.   INLINE void flushbits(int n)
  89.     {
  90.       m_bitcnt += n;
  91.       if (m_bitcnt >= 8) {
  92. m_rdptr += (m_bitcnt>>3);
  93. m_bitcnt &= 7;
  94.       }
  95.       m_framebits += n;
  96.     };
  97.   void read_ifstream_buffer(void);
  98. };
  99. #endif