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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #ifndef BITSTREAM_H
  2. #define BITSTREAM_H
  3. #include <sys/types.h>
  4. //                                    next bit in forward direction
  5. //                                  next bit in reverse direction |
  6. //                                                              v v
  7. // | | | | | | | | | | | | | | | | | | | | | | | | | | |1|1|1|1|1|1| */
  8. //                                                     ^         ^
  9. //                                                     |         bit_number = 1
  10. //                                                     bfr_size = 6
  11. typedef struct
  12. {
  13. u_int32_t bfr;  /* bfr = buffer for bits */
  14. int bit_number;   /* position of pointer in bfr */
  15. int bfr_size;    /* number of bits in bfr.  Should always be a multiple of 8 */
  16. /* If the input ptr is true, data is read from it instead of the demuxer. */
  17. unsigned char *input_ptr;
  18.   unsigned char *orig_ptr;
  19.   long buflen;
  20. } mpeg3_bits_t;
  21. /* ======================================================================== */
  22. /*                                 Entry Points */
  23. /* ======================================================================== */
  24. mpeg3_bits_t *mpeg3bits_new_stream(void);
  25. static __inline int mpeg3bits_error (mpeg3_bits_t *stream)
  26. {
  27.   return 0;
  28. }
  29. static __inline int mpeg3bits_eof (mpeg3_bits_t *stream)
  30. {
  31.   long diff = stream->input_ptr - stream->orig_ptr;
  32.   return (diff >= stream->buflen);
  33. }
  34. /* Read bytes backward from the file until the reverse_bits is full. */
  35. static __inline void mpeg3bits_fill_reverse_bits(mpeg3_bits_t* stream, int bits)
  36. {
  37. // Right justify
  38. while(stream->bit_number > 7)
  39. {
  40. stream->bfr >>= 8;
  41. stream->bfr_size -= 8;
  42. stream->bit_number -= 8;
  43. }
  44. // Insert bytes before bfr_size
  45. while(stream->bfr_size - stream->bit_number < bits)
  46. {
  47.     stream->bfr |= (unsigned int)(*--stream->input_ptr) << stream->bfr_size;
  48.     if (stream->input_ptr < stream->orig_ptr) {
  49.       printf("fill reverse past beginn");
  50.     }
  51. stream->bfr_size += 8;
  52. }
  53. }
  54. /* Read bytes forward from the file until the forward_bits is full. */
  55. static __inline void mpeg3bits_fill_bits(mpeg3_bits_t* stream, int bits)
  56. {
  57. while(stream->bit_number < bits)
  58. {
  59. stream->bfr <<= 8;
  60. stream->bfr |= *stream->input_ptr++;
  61. stream->bit_number += 8;
  62. stream->bfr_size += 8;
  63. if(stream->bfr_size > 32) stream->bfr_size = 32;
  64. }
  65. }
  66. /* Return 8 bits, advancing the file position. */
  67. static __inline unsigned int mpeg3bits_getbyte_noptr(mpeg3_bits_t* stream)
  68. {
  69. if(stream->bit_number < 8)
  70. {
  71. stream->bfr <<= 8;
  72. stream->bfr |= *stream->input_ptr++;
  73. stream->bfr_size += 8;
  74. if(stream->bfr_size > 32) stream->bfr_size = 32;
  75. return (stream->bfr >> stream->bit_number) & 0xff;
  76. }
  77. return (stream->bfr >> (stream->bit_number -= 8)) & 0xff;
  78. }
  79. static __inline unsigned int mpeg3bits_getbit_noptr(mpeg3_bits_t* stream)
  80. {
  81. if(!stream->bit_number)
  82. {
  83. stream->bfr <<= 8;
  84. stream->bfr |= *stream->input_ptr++;
  85. stream->bfr_size += 8;
  86. if(stream->bfr_size > 32) stream->bfr_size = 32;
  87. stream->bit_number = 7;
  88. return (stream->bfr >> 7) & 0x1;
  89. }
  90. return (stream->bfr >> (--stream->bit_number)) & (0x1);
  91. }
  92. /* Return n number of bits, advancing the file position. */
  93. /* Use in place of flushbits */
  94. static __inline unsigned int mpeg3bits_getbits(mpeg3_bits_t* stream, int bits)
  95. {
  96. if(bits <= 0) return 0;
  97. mpeg3bits_fill_bits(stream, bits);
  98. return (stream->bfr >> (stream->bit_number -= bits)) & (0xffffffff >> (32 - bits));
  99. }
  100. static __inline unsigned int mpeg3bits_showbits24_noptr(mpeg3_bits_t* stream)
  101. {
  102. while(stream->bit_number < 24)
  103. {
  104. stream->bfr <<= 8;
  105. stream->bfr |= *stream->input_ptr++;
  106. stream->bit_number += 8;
  107. stream->bfr_size += 8;
  108. if(stream->bfr_size > 32) stream->bfr_size = 32;
  109. }
  110. return (stream->bfr >> (stream->bit_number - 24)) & 0xffffff;
  111. }
  112. static __inline unsigned int mpeg3bits_showbits32_noptr(mpeg3_bits_t* stream)
  113. {
  114. while(stream->bit_number < 32)
  115. {
  116. stream->bfr <<= 8;
  117. stream->bfr |= *stream->input_ptr++;
  118. stream->bit_number += 8;
  119. stream->bfr_size += 8;
  120. if(stream->bfr_size > 32) stream->bfr_size = 32;
  121. }
  122. return stream->bfr;
  123. }
  124. static __inline unsigned int mpeg3bits_showbits(mpeg3_bits_t* stream, int bits)
  125. {
  126. mpeg3bits_fill_bits(stream, bits);
  127. return (stream->bfr >> (stream->bit_number - bits)) & (0xffffffff >> (32 - bits));
  128. }
  129. #if 0
  130. static __inline unsigned int mpeg3bits_getbits_reverse(mpeg3_bits_t* stream, int bits)
  131. {
  132. unsigned int result;
  133. mpeg3bits_fill_reverse_bits(stream, bits);
  134. result = (stream->bfr >> stream->bit_number) & (0xffffffff >> (32 - bits));
  135. stream->bit_number += bits;
  136. return result;
  137. }
  138. static __inline unsigned int mpeg3bits_showbits_reverse(mpeg3_bits_t* stream, int bits)
  139. {
  140. unsigned int result;
  141. mpeg3bits_fill_reverse_bits(stream, bits);
  142. result = (stream->bfr >> stream->bit_number) & (0xffffffff >> (32 - bits));
  143. return result;
  144. }
  145. #endif
  146. #ifdef __cplusplus
  147. extern "C" {
  148. #endif
  149. int mpeg3bits_use_ptr_len(mpeg3_bits_t *stream, unsigned char *buffer,
  150.   long buflen);
  151. #ifdef __cplusplus
  152. }
  153. #endif
  154. #endif