📄 getbits.c
字号:
#include <stdio.h>#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};static int BufPos;/* initialize buffer, call once before first getbits or showbits */void initbits(){ ld->incnt = 0; ld->rdptr = ld->rdbfr + 2048; ld->bitcnt = 0; BufPos=0;}void fillbfr(){ int l,rdSize=0; 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) { if (ld->InFrameSize>2048) rdSize=2048; else rdSize=ld->InFrameSize; for (l=0;l<rdSize;l++) { ld->rdbfr[l] = ld->InData[l+BufPos]; } ld->InFrameSize = ld->InFrameSize - l; BufPos += rdSize;/* l = read(ld->inData,ld->rdbfr,2048); */ ld->rdptr = &ld->rdbfr[0]; if (l<2048) { if (l<0) l = 0; BufPos=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 + -