getbits.h
来自「实现在linux下的mpeg4编解码」· C头文件 代码 · 共 171 行
H
171 行
/************************************************************************** * * * This code has been developed by Eugene Kuznetsov. This software is an * * implementation of a part of one or more MPEG-4 Video tools as * * specified in ISO/IEC 14496-2 standard. Those intending to use this * * software module in hardware or software products are advised that its * * use may infringe existing patents or copyrights, and any such use * * would be at such party's own risk. The original developer of this * * software module and his/her company, and subsequent editors and their * * companies (including Project Mayo), will have no liability for use of * * this software or modifications or derivatives thereof. * * * * Project Mayo gives users of the Codec a license to this software * * module or modifications thereof for use in hardware or software * * products claiming conformance to the MPEG-4 Video Standard as * * described in the Open DivX license. * * * * The complete Open DivX license can be found at * * http://www.projectmayo.com/opendivx/license.php * * * **************************************************************************//*** Copyright (C) 2001 - Project Mayo * * Eugene Kuznetsov * * DivX Advanced Research Center <darc@projectmayo.com>***/#ifndef _DECORE_GETBITS_H#define _DECORE_GETBITS_Hvoid initbits (unsigned char * stream, int length);//void fillbfr (void);/***/#if defined(LINUX)// 486+ specific instruction// anybody want to use decore on 386?#define _SWAP(a,b) b=*(int*)a; \ __asm__ ( "bswapl %0\n" : "=g" (b) : "0" (b) )#elif defined(WIN32)#define _SWAP(a,b) \ b=*(int*)a; __asm mov eax,b __asm bswap eax __asm mov b, eax#else#define _SWAP(a,b) (b=((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]))#endif#ifdef WIN32#include <io.h>#endif/***/#ifndef _DECOREstatic 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 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) | (31 << 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 */static unsigned int showbits (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];}/* advance by n bits */static void flushbits (int n){ ld->bitcnt += n; ld->incnt -= n; if (ld->incnt < 0) fillbfr ();}#elsestatic __inline unsigned int showbits (int n){ int rbit = 32 - ld->bitcnt; unsigned int b; _SWAP(ld->rdptr, b);// return ((b & msk[rbit]) >> (rbit-n));// Is it platform independent??? return (b & (0xFFFFFFFFU >> (ld->bitcnt))) >> (rbit-n);}static __inline void flushbits (int n){ ld->bitcnt += n; if (ld->bitcnt >= 8) { ld->rdptr += ld->bitcnt / 8; ld->bitcnt = ld->bitcnt % 8; }}#endif // !_DECOREstatic __inline unsigned int getbits (int n){ unsigned int l; l = showbits (n); flushbits (n); return l;}unsigned int getbits1 (void);#endif /* _DECORE_GETBITS_H */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?