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

流媒体/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-2002.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. #include "mp4av_common.h"
  22. void CMemoryBitstream::AllocBytes(u_int32_t numBytes) 
  23. {
  24. m_pBuf = (u_int8_t*)calloc(numBytes, 1);
  25. if (!m_pBuf) {
  26. throw ENOMEM;
  27. }
  28. m_bitPos = 0;
  29. m_numBits = numBytes << 3;
  30. }
  31. void CMemoryBitstream::SetBytes(u_int8_t* pBytes, u_int32_t numBytes) 
  32. {
  33. m_pBuf = pBytes;
  34. m_bitPos = 0;
  35. m_numBits = numBytes << 3;
  36. }
  37. void CMemoryBitstream::PutBytes(u_int8_t* pBytes, u_int32_t numBytes)
  38. {
  39. u_int32_t numBits = numBytes << 3;
  40. if (numBits + m_bitPos > m_numBits) {
  41. throw EIO;
  42. }
  43. if ((m_bitPos & 7) == 0) {
  44. memcpy(&m_pBuf[m_bitPos >> 3], pBytes, numBytes);
  45. m_bitPos += numBits;
  46. } else {
  47. for (u_int32_t i = 0; i < numBytes; i++) {
  48. PutBits(pBytes[i], 8);
  49. }
  50. }
  51. }
  52. void CMemoryBitstream::PutBits(u_int32_t bits, u_int32_t numBits)
  53. {
  54. if (numBits + m_bitPos > m_numBits) {
  55. throw EIO;
  56. }
  57. if (numBits > 32) {
  58. throw EIO;
  59. }
  60. for (int8_t i = numBits - 1; i >= 0; i--) {
  61. m_pBuf[m_bitPos >> 3] |= ((bits >> i) & 1) << (7 - (m_bitPos & 7));
  62. m_bitPos++;
  63. }
  64. }
  65. u_int32_t CMemoryBitstream::GetBits(u_int32_t numBits)
  66. {
  67. if (numBits + m_bitPos > m_numBits) {
  68. throw EIO;
  69. }
  70. if (numBits > 32) {
  71. throw EIO;
  72. }
  73. u_int32_t bits = 0;
  74. for (u_int8_t i = 0; i < numBits; i++) {
  75. bits <<= 1;
  76. bits |= (m_pBuf[m_bitPos >> 3] >> (7 - (m_bitPos & 7))) & 1;
  77. m_bitPos++;
  78. }
  79. return bits;
  80. }