外贸企业有哪些公司,南通seo网站优化软件,一级a做爰片免播放器网站,新开河街做网站公司/* * 本测试程序用来说明 GetBitContext 是什么? * get_bits() 函数是如何工作的. * author: hjjdebug * date: 2023年 07月 13日 星期四 16:42:45 CST */
GetBitContext 是如下定义的, 没有什么特别之处,指明了数据指针buffer,size_in_bits. typedef struct GetBi…/* * 本测试程序用来说明 GetBitContext 是什么? * get_bits() 函数是如何工作的. * author: hjjdebug * date: 2023年 07月 13日 星期四 16:42:45 CST */
GetBitContext 是如下定义的, 没有什么特别之处,指明了数据指针buffer,size_in_bits. typedef struct GetBitContext { const uint8_t *buffer, *buffer_end; int index; int size_in_bits; int size_in_bits_plus8; } GetBitContext;
unsigned int get_bits(GetBitContext *s, int n); 是如何从Ctx 中获取所需的数据位的,下面是测试程序,调试可完全搞懂.
$ cat main.c
#pragma GCC diagnostic ignored -Wunused-parameter #include libavcodec/get_bits.h
//这个函数是get_bits.h 中get_bits函数的翻版, 把宏去掉方便看清本来面目 //改名字不与头文件中的名字冲突//调试知get_bits() 原来是把左边的位去掉,把右边的位去掉,保留了所指定的 n bit位 static inline unsigned int my_get_bits(GetBitContext *s, int n) { register unsigned int tmp; //# 401 ../../FFmpeg-n4.4/libavcodec/get_bits.h unsigned int re_index (s)-index; unsigned int re_cache av_bswap32((((const union unaligned_32 *) ((s)-buffer (re_index 3)))-l)) (re_index 7); //数据会向左移动re_index位, 清理掉前面的bit位 tmp NEG_USR32(re_cache, n); //这是一个右移指令,右移32-n位,这样保留了左边的n位,清理了右边32-n位 unsigned int re_size_plus8 (s)-size_in_bits_plus8; re_index ((re_size_plus8) (re_index (n)) ? (re_index (n)) : (re_size_plus8)); // 给小的 (s)-index re_index; return tmp; }
int main() { GetBitContext gb; unsigned char data[4]; data[0]0x12; data[1]0x34; data[2]0x56; data[3]0x78; // unsigned int a NEG_USR32(0x12345678,31); 原来以为是取补呢,测试发现是右移指令,右移(32-31)位,即保留31位的意思 // printf(%x\n,a); init_get_bits8(gb,data,sizeof(data)); int d1my_get_bits(gb,1); int d2my_get_bits(gb,2); int d3my_get_bits(gb,5); int d4my_get_bits(gb,4); printf(%x %x %x %x %x\n,data[0],d1,d2,d3,d4); return 0; }