📄 getvlc.cpp
字号:
// Getvlc.cpp: implementation of the CGetvlc class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "视频编解码器.h"
#include "Getvlc.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern int quiet,fault,trace;
CGetvlc::CGetvlc()
{
}
CGetvlc::~CGetvlc()
{
}
int CGetvlc::getCBPY()
{
int code;
code = m_getbits.showbits(6);
if (code < 2)
{ //无效的CBPY
fault = 1;
return -1;
}
if (code>=48)
{
m_getbits.flushbits(2);
return 0;
}
m_getbits.flushbits(CBPYtab[code].len);
return CBPYtab[code].code;
}
int CGetvlc::getTMNMV()
{
int code;
if (m_getbits.getbits1())//为"1"时 运动矢量为0
return 0;
if ((code = m_getbits.showbits(12))>=512)
{
code = (code>>8) - 2;//MV表的索引
m_getbits.flushbits(TMNMVtab0[code].len);//结构体,MV的长度
//装入N个比特
return TMNMVtab0[code].code;
}
if (code>=128)
{
code = (code>>2) -32;
m_getbits.flushbits(TMNMVtab1[code].len);
return TMNMVtab1[code].code;
}
if ((code-=5)<0)
{
if (!quiet)
AfxMessageBox("Invalid motion_vector code!");
fault=1;
return 0;
}
m_getbits.flushbits(TMNMVtab2[code].len);
return TMNMVtab2[code].code;
}
int CGetvlc::getMCBPC()
{
int code;
code = m_getbits.showbits(9);//得到比特数
if (code == 1)
{
// macroblock stuffing
m_getbits.flushbits(9);//操作完后将其冲刷掉
return -1;
}
if (code == 0)
{
fault = 1;
return 0;
}
if (code>=256)
{
m_getbits.flushbits(1);
return 0;
}
m_getbits.flushbits(MCBPCtab[code].len);
return MCBPCtab[code].code;
}
int CGetvlc::getMODB()
{
int code;
int MODB;
code = m_getbits.showbits(2);
if (code < 2)
{
MODB = 0;
m_getbits.flushbits(1);
}
else if (code == 2)
{
MODB = 1;
m_getbits.flushbits(2);
}
else
{ /* code == 3 */
AfxMessageBox("11: MODB = 2!");
MODB = 2;
m_getbits.flushbits(2);
}
return MODB;
}
int CGetvlc::getMCBPCintra()
{
int code;
code = m_getbits.showbits(9);
if (code == 1)
{
// macroblock stuffing
m_getbits.flushbits(9);
return -1;
}
if (code < 8)
{
fault = 1;
return 0;
}
code >>= 3;//除stuffing外最多有6比特
if (code>=32)
{
m_getbits.flushbits(1);
return 3;
}
m_getbits.flushbits(MCBPCtabintra[code].len);
return MCBPCtabintra[code].code;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -