bitstream.c
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:1k
源码类别:

VC书籍

开发平台:

Visual C++

  1. #include "bitstream.h"
  2. static unsigned int mask[33] =
  3. {
  4.   0x00000000, 0x00000001, 0x00000003, 0x00000007,
  5.   0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
  6.   0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
  7.   0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
  8.   0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
  9.   0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
  10.   0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
  11.   0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
  12.   0xffffffff
  13. };
  14. static unsigned char *byteptr;
  15. static int bytecnt; 
  16. static unsigned char outbfr;
  17. static int outcnt;
  18. void Bitstream_Init(void *buffer)
  19. {
  20. byteptr = (unsigned char *)buffer;
  21. bytecnt = 0;
  22. outbfr = 0;
  23. outcnt = 8;
  24. }
  25. void Bitstream_PutBits(int n, unsigned int val)
  26. {
  27. int diff;
  28. while ((diff = n - outcnt) >= 0) { 
  29. outbfr |= (unsigned char)(val >> diff);
  30. n = diff;
  31. val &= mask[n];
  32. *(byteptr ++) = outbfr;
  33. bytecnt++;
  34. outbfr = 0;
  35. outcnt = 8;
  36. }
  37. if (n > 0) { 
  38. outbfr |= (unsigned char)(val << (-diff));
  39. outcnt -= n;
  40. }
  41. }
  42. int Bitstream_Close()
  43. {
  44. while (outcnt != 8) Bitstream_PutBits(1, 1);
  45. return bytecnt;
  46. }
  47. int Bitstream_NextStartCode()
  48. {
  49. int count = outcnt;
  50. Bitstream_PutBits(1,0);
  51. while (outcnt != 8) Bitstream_PutBits(1, 1);
  52. return (count);
  53. }
  54. int Bitstream_GetLength()
  55. {
  56. return bytecnt;
  57. }