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

图形图像处理

开发平台:

Visual C++

  1. // Getvlc.cpp: implementation of the CGetvlc class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "视频编解码器.h"
  6. #include "Getvlc.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. extern int quiet,fault,trace; 
  16. CGetvlc::CGetvlc()
  17. {
  18. }
  19. CGetvlc::~CGetvlc()
  20. {
  21. }
  22. int CGetvlc::getCBPY()
  23. {
  24.   int code;
  25.   code = m_getbits.showbits(6);
  26.   if (code < 2) 
  27.   { //无效的CBPY
  28.     fault = 1;
  29.     return -1;
  30.   }
  31.   if (code>=48)
  32.   {
  33.     m_getbits.flushbits(2);
  34.     return 0;
  35.   }
  36.   m_getbits.flushbits(CBPYtab[code].len);
  37.   return CBPYtab[code].code;
  38. }
  39. int CGetvlc::getTMNMV()
  40. {
  41.   int code;
  42.   if (m_getbits.getbits1())//为"1"时  运动矢量为0
  43.      return 0;
  44.  
  45.   if ((code = m_getbits.showbits(12))>=512)
  46.   {
  47.     code = (code>>8) - 2;//MV表的索引
  48.     m_getbits.flushbits(TMNMVtab0[code].len);//结构体,MV的长度
  49.                            //装入N个比特
  50.     return TMNMVtab0[code].code;
  51.   }
  52.   if (code>=128)
  53.   {
  54.     code = (code>>2) -32;
  55.     m_getbits.flushbits(TMNMVtab1[code].len);
  56.     return TMNMVtab1[code].code;
  57.   }
  58.   if ((code-=5)<0)
  59.   {
  60.     if (!quiet)
  61.       AfxMessageBox("Invalid motion_vector code!");
  62.     fault=1;
  63.     return 0;
  64.    }
  65.   m_getbits.flushbits(TMNMVtab2[code].len);
  66.   return TMNMVtab2[code].code;
  67. }
  68. int CGetvlc::getMCBPC()
  69. {
  70.  int code;
  71.   code = m_getbits.showbits(9);//得到比特数
  72.   if (code == 1)
  73.   {
  74.     // macroblock stuffing 
  75.     m_getbits.flushbits(9);//操作完后将其冲刷掉
  76.     return -1;
  77.   }
  78.   if (code == 0) 
  79.   {
  80.     fault = 1;
  81.     return 0;
  82.   }
  83.     
  84.   if (code>=256)
  85.   {
  86.     m_getbits.flushbits(1);
  87.     return 0;
  88.   }
  89.     
  90.   m_getbits.flushbits(MCBPCtab[code].len);
  91.   return MCBPCtab[code].code;
  92. }
  93. int CGetvlc::getMODB()
  94. {
  95.  int code;
  96.   int MODB;
  97.   code = m_getbits.showbits(2);
  98.   if (code < 2)
  99.   {
  100.     MODB = 0;
  101.     m_getbits.flushbits(1);
  102.   }
  103.   else if (code == 2)
  104.   {
  105.     MODB = 1;
  106.     m_getbits.flushbits(2);
  107.   }
  108.   else 
  109.   { /* code == 3 */
  110.      AfxMessageBox("11: MODB = 2!");
  111.     MODB = 2;
  112.     m_getbits.flushbits(2);
  113.   }
  114.   return MODB;
  115. }
  116. int CGetvlc::getMCBPCintra()
  117. {
  118.   int code;
  119.   code = m_getbits.showbits(9);
  120.   if (code == 1) 
  121.   {
  122.     // macroblock stuffing 
  123.     m_getbits.flushbits(9);
  124.     return -1;
  125.   }
  126.   if (code < 8)
  127.   {
  128.     fault = 1;
  129.     return 0;
  130.   }
  131.   code >>= 3;//除stuffing外最多有6比特
  132.   if (code>=32)
  133.   {
  134.     m_getbits.flushbits(1);
  135.     return 3;
  136.   }
  137.   m_getbits.flushbits(MCBPCtabintra[code].len);
  138.   return MCBPCtabintra[code].code;
  139. }