Getbits.cpp
上传用户:szklck
上传日期:2007-01-22
资源大小:925k
文件大小:2k
源码类别:

图形图像处理

开发平台:

Visual C++

  1. // Getbits.cpp: implementation of the CGetbits class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "视频编解码器.h"
  6. #include "Getbits.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. extern CFile h263file;
  13. extern ldecode *ld;
  14. CGetbits::CGetbits()
  15. {
  16. }
  17. CGetbits::~CGetbits()
  18. {
  19. }
  20. static unsigned int msk[33] =
  21. {
  22.   0x00000000,0x00000001,0x00000003,0x00000007,
  23.   0x0000000f,0x0000001f,0x0000003f,0x0000007f,
  24.   0x000000ff,0x000001ff,0x000003ff,0x000007ff,
  25.   0x00000fff,0x00001fff,0x00003fff,0x00007fff,
  26.   0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff,
  27.   0x000fffff,0x001fffff,0x003fffff,0x007fffff,
  28.   0x00ffffff,0x01ffffff,0x03ffffff,0x07ffffff,
  29.   0x0fffffff,0x1fffffff,0x3fffffff,0x7fffffff,
  30.   0xffffffff
  31. };  //最多可以取出32位比特数
  32. void CGetbits::initbits()
  33. {
  34.   ld->incnt = 0;  //比特数为零
  35.   ld->rdptr = ld->rdbfr + 2048;//把缓冲区的头地址赋给指针
  36.   ld->bitcnt = 0;
  37. }
  38. void CGetbits::fillbfr()
  39. {
  40.  int l;
  41.   ld->inbfr[0] = ld->inbfr[8];
  42.   ld->inbfr[1] = ld->inbfr[9];
  43.   ld->inbfr[2] = ld->inbfr[10];
  44.   ld->inbfr[3] = ld->inbfr[11];
  45.   if (ld->rdptr>=ld->rdbfr+2048)
  46.   {
  47.     l = h263file.Read(ld->rdbfr,2048);//装入字节
  48.     ld->rdptr = ld->rdbfr;
  49.     if (l<2048)
  50.     {
  51.       if (l<0)
  52.         l = 0;
  53.       while (l<2048)   /* Add recognizable sequence end code */
  54.       {
  55.         ld->rdbfr[l++] = 0;
  56.         ld->rdbfr[l++] = 0;
  57.         ld->rdbfr[l++] = (1<<7) | (SEC<<2);
  58.       }
  59.     }
  60.   }
  61.   for (l=0; l<8; l++)
  62.     ld->inbfr[l+4] = ld->rdptr[l];
  63.   ld->rdptr+= 8;
  64.   ld->incnt+= 64;
  65. }
  66. unsigned int CGetbits::showbits(int n)
  67. {
  68.   unsigned char *v;
  69.   unsigned int b;
  70.   int c;
  71.   if (ld->incnt<n)//缓存中的比特数(incnt)小于n
  72.      fillbfr();  //载入比特数
  73.   v = ld->inbfr + ((96 - ld->incnt)>>3);
  74.   b = (v[0]<<24) | (v[1]<<16) | (v[2]<<8) | v[3];//取4个字节
  75.   c = ((ld->incnt-1) & 7) + 25;
  76.   return (b>>(c-n)) & msk[n];
  77. }
  78. unsigned int CGetbits::getbits(int n)
  79. {
  80.   unsigned int l;
  81.   l = showbits(n);
  82.   flushbits(n);
  83.   return l;
  84. }
  85. unsigned int CGetbits::getbits1()
  86. {
  87.   return getbits(1);
  88. }
  89. void CGetbits::flushbits(int n)
  90. {
  91.   ld->bitcnt+= n;
  92.   ld->incnt-= n;
  93.   if (ld->incnt < 0)
  94.     fillbfr();
  95. }