bitstream.c
上传用户:enenge
上传日期:2007-01-08
资源大小:96k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /**************************************************************************
  2.  *                                                                        *
  3.  * This code is developed by Adam Li.  This software is an                *
  4.  * implementation of a part of one or more MPEG-4 Video tools as          *
  5.  * specified in ISO/IEC 14496-2 standard.  Those intending to use this    *
  6.  * software module in hardware or software products are advised that its  *
  7.  * use may infringe existing patents or copyrights, and any such use      *
  8.  * would be at such party's own risk.  The original developer of this     *
  9.  * software module and his/her company, and subsequent editors and their  *
  10.  * companies (including Project Mayo), will have no liability for use of  *
  11.  * this software or modifications or derivatives thereof.                 *
  12.  *                                                                        *
  13.  * Project Mayo gives users of the Codec a license to this software       *
  14.  * module or modifications thereof for use in hardware or software        *
  15.  * products claiming conformance to the MPEG-4 Video Standard as          *
  16.  * described in the Open DivX license.                                    *
  17.  *                                                                        *
  18.  * The complete Open DivX license can be found at                         *
  19.  * http://www.projectmayo.com/opendivx/license.php .                      *
  20.  *                                                                        *
  21.  **************************************************************************/
  22. /**************************************************************************
  23.  *
  24.  *  mom_bitstream.c
  25.  *
  26.  *  Copyright (C) 2001  Project Mayo
  27.  *
  28.  *  Adam Li
  29.  *
  30.  *  DivX Advance Research Center <darc@projectmayo.com>
  31.  *
  32.  **************************************************************************/
  33. #include "bitstream.h"
  34. /* to mask the n least significant bits of an integer */
  35. static unsigned int mask[33] =
  36. {
  37.   0x00000000, 0x00000001, 0x00000003, 0x00000007,
  38.   0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
  39.   0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
  40.   0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
  41.   0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
  42.   0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
  43.   0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
  44.   0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
  45.   0xffffffff
  46. };
  47. /* static data for pointers and counters */
  48. /* byte pointer to the output bitstream */
  49. static unsigned char *byteptr;
  50. /* counter of how many bytes got written to the bitstream */
  51. static int bytecnt; 
  52. /* a one byte temporary buffer */
  53. static unsigned char outbfr;
  54. /* counter of how many unused bits left in the byte buffer */
  55. static int outcnt;
  56. void Bitstream_Init(void *buffer)
  57. {
  58. byteptr = (unsigned char *)buffer;
  59. bytecnt = 0;
  60. outbfr = 0;
  61. outcnt = 8;
  62. }
  63. void Bitstream_PutBits(int n, unsigned int val)
  64. {
  65. int diff;
  66. while ((diff = n - outcnt) >= 0) { /* input is longer than what is left in the buffer */
  67. outbfr |= (unsigned char)(val >> diff);
  68. /* note that the first byte of the integer is the least significant byte */
  69. n = diff;
  70. val &= mask[n];
  71. *(byteptr ++) = outbfr;
  72. bytecnt++;
  73. outbfr = 0;
  74. outcnt = 8;
  75. }
  76. if (n > 0) { /* input is short enough to fit in what is left in the buffer */
  77. outbfr |= (unsigned char)(val << (-diff));
  78. outcnt -= n;
  79. }
  80. }
  81. int Bitstream_Close()
  82. {
  83. while (outcnt != 8) Bitstream_PutBits(1, 1);
  84. return bytecnt;
  85. }
  86. int Bitstream_NextStartCode()
  87. {
  88. int count = outcnt;
  89. Bitstream_PutBits(1,0);
  90. while (outcnt != 8) Bitstream_PutBits(1, 1);
  91. return (count);
  92. }
  93. int Bitstream_GetLength()
  94. {
  95. return bytecnt;
  96. }