📄 getvlc.c
字号:
/************************************************************************
*
* getvlc.c, variable length decoding for tmndecode (H.263 decoder)
*/
#include <stdio.h>
#include "config.h"
#include "tmndec.h"
#include "global.h"
#include "getvlc.h"
int getTMNMV()
{
int code;
if (getbits1())
{
return 0;
}
if ((code = showbits(12))>=512)
{
code = (code>>8) - 2;
flushbits(TMNMVtab0[code].len);
return TMNMVtab0[code].val;
}
if (code>=128)
{
code = (code>>2) -32;
flushbits(TMNMVtab1[code].len);
return TMNMVtab1[code].val;
}
if ((code-=5)<0)
{
if (!quiet)
fprintf(stderr,"Invalid motion_vector code\n");
fault=1;
return 0;
}
flushbits(TMNMVtab2[code].len);
return TMNMVtab2[code].val;
}
int getMCBPC()
{
int code;
code = showbits(9);
if (code == 1) {
/* macroblock stuffing */
flushbits(9);
return 255;
}
if (code == 0) {
if (!quiet)
fprintf(stderr,"Invalid MCBPC code\n");
fault = 1;
return 0;
}
if (code>=256)
{
flushbits(1);
return 0;
}
flushbits(MCBPCtab[code].len);
return MCBPCtab[code].val;
}
int getMODB()
{
int code;
int MODB;
code = showbits(2);
if (code < 2)
{
MODB = 0;
flushbits(1);
}
else if (code == 2)
{
MODB = 1;
flushbits(2);
}
else
{ /* code == 3 */
MODB = 2;
flushbits(2);
}
return MODB;
}
int getMCBPCintra()
{
int code;
code = showbits(9);
if (code == 1)
{
/* macroblock stuffing */
flushbits(9);
return 255;
}
if (code < 8)
{
if (!quiet)
fprintf(stderr,"Invalid MCBPCintra code\n");
fault = 1;
return 0;
}
code >>= 3;
if (code>=32)
{
flushbits(1);
return 3;
}
flushbits(MCBPCtabintra[code].len);
return MCBPCtabintra[code].val;
}
int getCBPY()
{
int code;
code = showbits(6);
if (code < 2)
{
if (!quiet)
fprintf(stderr,"Invalid CBPY code\n");
fault = 1;
return -1;
}
if (code>=48)
{
flushbits(2);
return 0;
}
flushbits(CBPYtab[code].len);
return CBPYtab[code].val;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -