📄 getbits.c
字号:
/************************************************************************
*
* getbits.c, bit level routines for tmndecode (H.263 decoder)
*/
#include <stdlib.h>
#include "config.h"
#include "tmndec.h"
#include "global.h"
/* to mask the n least significant bits of an integer */
static unsigned int msk[33] =
{
0x00000000,0x00000001,0x00000003,0x00000007,
0x0000000f,0x0000001f,0x0000003f,0x0000007f,
0x000000ff,0x000001ff,0x000003ff,0x000007ff,
0x00000fff,0x00001fff,0x00003fff,0x00007fff,
0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff,
0x000fffff,0x001fffff,0x003fffff,0x007fffff,
0x00ffffff,0x01ffffff,0x03ffffff,0x07ffffff,
0x0fffffff,0x1fffffff,0x3fffffff,0x7fffffff,
0xffffffff
};
/* initialize buffer, call once before first getbits or showbits */
void initbits()
{
ld->incnt = 0;
ld->rdptr = ld->rdbfr + 2048;
ld->bitcnt = 0;
}
void fillbfr()
{
int l;
ld->inbfr[0] = ld->inbfr[8];
ld->inbfr[1] = ld->inbfr[9];
ld->inbfr[2] = ld->inbfr[10];
ld->inbfr[3] = ld->inbfr[11];
if (ld->rdptr>=ld->rdbfr+2048)
{
l = read(ld->infile,ld->rdbfr,2048);
ld->rdptr = ld->rdbfr;
if (l<2048)
{
if (l<0)
l = 0;
while (l<2048) /* Add recognizable sequence end code */
{
ld->rdbfr[l++] = 0;
ld->rdbfr[l++] = 0;
ld->rdbfr[l++] = (1<<7) | (SE_CODE<<2);
}
}
}
for (l=0; l<8; l++)
ld->inbfr[l+4] = ld->rdptr[l];
ld->rdptr+= 8;
ld->incnt+= 64;
}
/* return next n bits (right adjusted) without advancing */
unsigned int showbits(n)
int n;
{
unsigned char *v;
unsigned int b;
int c;
if (ld->incnt<n)
fillbfr();
v = ld->inbfr + ((96 - ld->incnt)>>3);
b = (v[0]<<24) | (v[1]<<16) | (v[2]<<8) | v[3];
c = ((ld->incnt-1) & 7) + 25;
return (b>>(c-n)) & msk[n];
}
/* return next bit (could be made faster than getbits(1)) */
unsigned int getbits1()
{
return getbits(1);
}
/* advance by n bits */
void flushbits(n)
int n;
{
ld->bitcnt+= n;
ld->incnt-= n;
if (ld->incnt < 0)
fillbfr();
}
/* return next n bits (right adjusted) */
unsigned int getbits(n)
int n;
{
unsigned int l;
l = showbits(n);
flushbits(n);
return l;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -