/*
* 本测试程序用来说明 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;
}文章来源:https://www.toymoban.com/news/detail-575344.html
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 d1=my_get_bits(&gb,1);
int d2=my_get_bits(&gb,2);
int d3=my_get_bits(&gb,5);
int d4=my_get_bits(&gb,4);
printf("%x %x %x %x %x\n",data[0],d1,d2,d3,d4);
return 0;
}文章来源地址https://www.toymoban.com/news/detail-575344.html
到了这里,关于ffmpeg get_bits() 函数是如何工作的.的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!