bitstream.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. #include "bitstream.h"
  22. #ifndef MIN
  23. #define MIN(a, b)  (((a) < (b)) ? (a) : (b))
  24. #endif
  25. static unsigned int msk[33] =
  26. {
  27.   0x00000000, 0x00000001, 0x00000003, 0x00000007,
  28.   0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
  29.   0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
  30.   0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
  31.   0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
  32.   0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
  33.   0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
  34.   0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
  35.   0xffffffff
  36. };
  37. void CBitstream::init (const uint8_t *buffer, 
  38.        uint32_t bit_len)
  39. {
  40.   m_chDecBuffer = buffer;
  41.   m_chDecBufferSize = bit_len;
  42.   m_bBookmarkOn = 0;
  43.   m_uNumOfBitsInBuffer = 0;
  44. }
  45. void CBitstream::bookmark (int bSet)
  46. {
  47.   if (bSet) {
  48.     m_uNumOfBitsInBuffer_bookmark = m_uNumOfBitsInBuffer;
  49.     m_chDecBuffer_bookmark = m_chDecBuffer;
  50.     m_chDecBufferSize_bookmark = m_chDecBufferSize;
  51.     m_bBookmarkOn = 1;
  52.   } else {
  53.     m_uNumOfBitsInBuffer = m_uNumOfBitsInBuffer_bookmark;
  54.     m_chDecBuffer = m_chDecBuffer_bookmark;
  55.     m_chDecBufferSize = m_chDecBufferSize_bookmark;
  56.     m_bBookmarkOn = 0;
  57.   }
  58. }
  59. uint32_t CBitstream::GetBits (uint32_t numBits)
  60. {
  61.   uint32_t retData;
  62.   if (numBits > 32) {
  63.     throw;
  64.   }
  65.   
  66.   if (numBits == 0) {
  67.     return 0;
  68.   }
  69.   if (m_uNumOfBitsInBuffer >= numBits) {  // don't need to read from FILE
  70.     m_uNumOfBitsInBuffer -= numBits;
  71.     retData = m_chDecData >> m_uNumOfBitsInBuffer;
  72.     // wmay - this gets done below...retData &= msk[numBits];
  73.   } else {
  74.     uint32_t nbits;
  75.     nbits = numBits - m_uNumOfBitsInBuffer;
  76.     if (nbits == 32)
  77.       retData = 0;
  78.     else
  79.       retData = m_chDecData << nbits;
  80.     switch ((nbits - 1) / 8) {
  81.     case 3:
  82.       nbits -= 8;
  83.       if (m_chDecBufferSize < 8) throw;
  84.       retData |= *m_chDecBuffer++ << nbits;
  85.       m_chDecBufferSize -= 8;
  86.       // fall through
  87.     case 2:
  88.       nbits -= 8;
  89.       if (m_chDecBufferSize < 8) throw;
  90.       retData |= *m_chDecBuffer++ << nbits;
  91.       m_chDecBufferSize -= 8;
  92.     case 1:
  93.       nbits -= 8;
  94.       if (m_chDecBufferSize < 8) throw;
  95.       retData |= *m_chDecBuffer++ << nbits;
  96.       m_chDecBufferSize -= 8;
  97.     case 0:
  98.       break;
  99.     }
  100.     if (m_chDecBufferSize < nbits) {
  101.       throw;
  102.     }
  103.     m_chDecData = *m_chDecBuffer++;
  104.     m_uNumOfBitsInBuffer = MIN(8, m_chDecBufferSize) - nbits;
  105.     m_chDecBufferSize -= MIN(8, m_chDecBufferSize);
  106.     retData |= (m_chDecData >> m_uNumOfBitsInBuffer) & msk[nbits];
  107.   }
  108.   //printf("bits %d value %dn", numBits, retData&msk[numBits]);
  109.   return (retData & msk[numBits]);
  110. }
  111. int CBitstream::byte_align(void) 
  112. {
  113.   int temp = 0;
  114.   if (m_uNumOfBitsInBuffer != 0) {
  115.     temp = m_uNumOfBitsInBuffer;
  116.     m_uNumOfBitsInBuffer = 0;
  117.     m_chDecBuffer++;
  118.     m_chDecBufferSize -= MIN(m_chDecBufferSize,8);
  119.   }
  120.   return (temp);
  121. }