ffmpeg get_bits() 函数是如何工作的.

/*

* 本测试程序用来说明 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 data4;

data0=0x12;

data1=0x34;

data2=0x56;

data3=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",data0,d1,d2,d3,d4);

return 0;

}

相关推荐
可乐鸡翅yeah_19 小时前
HLS 业务 Referer‑Policy 网页元标签引发播放异常排错
前端·javascript·网络·ffmpeg·php·音视频
开开心心就好2 天前
本地文件搜索工具推荐,占用小速度还快
智能手机·ffmpeg·ocr·word·音视频·网络攻击模型·安全架构
我科绝伦(Huanhuan Zhou)2 天前
oracle坏块导致备份不了
数据库·oracle·ffmpeg
RS迷途小书童2 天前
Python+FFmpeg提取大疆无人机MP4内嵌mov_text遥测SRT字幕并做完整性校验
python·ffmpeg·大疆·srt字幕·dji
开开心心就好2 天前
视频压缩工具推荐,画质效果很能打
智能手机·ffmpeg·ocr·word·排序算法·音视频·散列表
可乐鸡翅yeah_3 天前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
redfred3 天前
HyperFrames 部署教程:5.6 万 Star 开源「写 HTML 出视频」框架,Windows 从零上手(CLI 三条命令 + 7 个避坑)
ffmpeg·开源·自动化·html·音视频
Arcai10243 天前
PostgreSQL数据备份和恢复完全指南
数据库·postgresql·ffmpeg·备份一体机·备份软件·smartstor·智备科技
可乐鸡翅yeah_3 天前
FFmpeg 生成 HLS 独立分片 independent‑segments 参数到底有什么用
javascript·ffmpeg·音视频·safari·m3u8
企业数字化笔记4 天前
视觉处理为什么会慢?解码、预处理、模型推理、后处理和编码的性能拆解
ffmpeg·gpu算力