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 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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

perl输出中文乱码【win10】

perl输出中文乱码 运行的时候输出的内容变成了中文乱码&#xff0c;原因首先来查找一下自己的perl的模块里面是否有Encode-CN。请运行打开你的cmd并输入perldoc -l Encode::CN 如果出现了地址 则就是有&#xff0c;如果没有需要进行该模块的安装。 安装方式有很多种&#xff0…

MetaTown:一个可以自己构建数字资产的平台

摘要&#xff1a;华为云Solution as Code重磅推出《基于MetaTown构建数字资产平台》解决方案。 本文分享自华为云社区《基于MetaTown构建数字资产平台》&#xff0c;作者&#xff1a; 阿米托福。 华为云Solution as Code重磅推出《基于MetaTown构建数字资产平台》解决方案&…

“掌握更多的快速排序技巧:三路划分、双路快排和非递归的深入理解”

快速排序是一种基于分治思想的排序算法&#xff0c;它能够以极快的速度将一个乱序的数组重新排列成有序的序列。不仅如此&#xff0c;快速排序还具有简洁的实现代码和良好的可扩展性&#xff0c;成为最受欢迎的排序算法之一。接下来&#xff0c;让我带你了解一下它的魅力吧&…

Linux系统部署Nginx详细教程(图文讲解)

前言&#xff1a;本篇博客记录了我是如何使用Linux系统一步一步部署Nginx的完整过程&#xff0c;也是我学习之路上的一个笔记总结&#xff0c;每一行代码都进行了严格的测试&#xff0c;特此做一个技术分享&#xff01; 目录 一、安装依赖 二、安装Nginx 三、配置Nginx 四、…

visio 图片转换到 latex 中

调整图片大小 在Visio中&#xff0c;设计–>页面设置–>大小–>适应绘图&#xff0c;这样会自动去除多余空白&#xff0c;保留部分空白作为边界&#xff0c;无需使用Word。 2. 将新的Visio文件另存为pdf格式文件 3. latex 中插入pdf 格式图片

手把手教你搭建SpringCloud项目(八)集成Ribbon负载均衡器

什么是微服务&#xff1f;一看就会系列&#xff01; 一、手把手教你搭建SpringCloud项目&#xff08;一&#xff09;图文详解&#xff0c;傻瓜式操作 二、手把手教你搭建SpringCloud项目&#xff08;二&#xff09;生产者与消费者 三、手把手教你搭建SpringCloud项目&#x…

【数据结构】24王道考研笔记——图

六、图 目录 六、图定义及基本术语图的定义有向图以及无向图简单图以及多重图度顶点-顶点间关系连通图、强连通图子图连通分量强连通分量生成树生成森林边的权、带权网/图特殊形态的图 图的存储及基本操作邻接矩阵邻接表法十字链表邻接多重表分析对比图的基本操作 图的遍历广度…

区块链学习一:安装 Geth

区块链技术正在迅速发展&#xff0c;并在各个领域展现出巨大的潜力。如果您对区块链开发感兴趣&#xff0c;那么学习如何安装和配置以太坊客户端 Geth 是一个很好的起点。在本篇文章中&#xff0c;我们将介绍如何使用 DockerHub 上的 Geth Docker 映像来快速安装和运行 Geth 节…

vue学习笔记(一)

1.编辑器选择 是用vscode 和 webstrom 个人感觉 vscode的插件比较多&#xff0c;对vue3的支持比较好 webstorm的自动保存比较好 各有优劣吧 我学习的这个项目目前采用vscode 2.vue2 还是 vue3 框架学通了都是通用的&#xff0c;这个时间点来学肯定是学vue3 只是顾虑到团…

JavaScript XHR、Fetch

1 前端数据请求方式 2 Http协议的解析 3 XHR的基本用法 4 XHR的进阶和封装 5 Fetch的使用详解 6 前端文件上传流程 早期的页面都是后端做好&#xff0c;浏览器直接拿到页面展示的&#xff0c;用到的是jsp、asp、php等等的语言。 这个叫做服务器端渲染SSR。 这里后端向前端…

金融数据库的战场,太平洋保险和OceanBase打了场胜仗

点击关注 文丨刘雨琦 “数据库的国产替代&#xff0c;必须经过严格的考虑&#xff0c;保证不会出错&#xff0c;所以大多数企业的领导层选择按兵不动或者简单扩容。因为不换就不会错&#xff0c;选了很久如果选错&#xff0c;还可能会出现重大事故。” 某银行数据库技术人员…

Go语言之函数补充defer语句,递归函数,章节练习

defer语句是go语言提供的一种用于注册延迟调用的机制&#xff0c;是go语言中一种很有用的特性。 defer语句注册了一个函数调用&#xff0c;这个调用会延迟到defer语句所在的函数执行完毕后执行&#xff0c;所谓执行完毕是指该函数执行了return语句、函数体已执行完最后一条语句…

语音识别开源框架 openAI-whisper

Whisper 是一种通用的语音识别模型。 它是OpenAI于2022年9月份开源的在各种音频的大型数据集上训练的语音识别模型&#xff0c;也是一个可以执行多语言语音识别、语音翻译和语言识别的多任务模型。 GitHub - yeyupiaoling/Whisper-Finetune: 微调Whisper语音识别模型和加速推理…

数据结构问答3

1. 栈、队列、线性表的区别与联系(异同) 答: 栈和队列联系:逻辑结构都是线性结构;存储结构都可以采用顺序存储结构和链式存储结构;他们的数据元素都呈线性关系,是一种的线性表,且只允许在端点处插入和删除元素 栈、队列和线性表联系:栈和队列都是一种操作受限的线性…

netty组件详解-上

netty服务端示例: private void doStart() throws InterruptedException {System.out.println("netty服务已启动");// 线程组EventLoopGroup group new NioEventLoopGroup();try {// 创建服务器端引导类ServerBootstrap server new ServerBootstrap();// 初始化服…

【嵌入式开发 Linux 常用命令系列 6 -- 字符提取 cut 命令使用】

文章目录 Cut 命令和语法指定分隔符以字符的方式提取内容根据字节提取字符 上篇文章&#xff1a;嵌入式开发 Linux 常用命令系列 5 – history 与 “&#xff01;“ 巧妙配合 Cut 命令和语法 cut 命令的基本语法如下&#xff1a; $ cut OPTION... [FILE]...cut 的一些选项如…

苹果APP安装包ipa如何安装在手机上

苹果APP安装包ipa如何安装在手机上 苹果APP的安装比安卓复杂且困难&#xff0c;很多人不知道如何将ipa文件安装到手机上。以下是几种苹果APP安装在iOS设备的方式&#xff0c;供大家参考。 一、上架App Store 这是最正规的方式。虽然审核过程复杂、时间较长&#xff0c;且审核…

数据可视化组件有什么用?

数据可视化组件在数据分析中扮演着至关重要&角色。 通过图表、图形和交互式界面&#xff0c;数据可视化组件帮助将复杂的数据转化为易于理解的视觉展示。这种形式的数据呈现有助于发现模式、趋势和异常&#xff0c;并能够快速有效地传达数据的含义和洞察。 下面简单举两个…

不使用插件预览pdf等类型文件

前端使用window.open即可 var url"file/preview.do?path"response.path"&fileName"response.name; top.window.open(url,response.name,"_blank"); 接口代码如下 RequestMapping(value "/file/preview.do")public ResponseBod…

使用Visual Studio打造强大的程序,从添加第三方库开始

使用Visual Studio打造强大的程序&#xff0c;从添加第三方库开始 博主简介一、引言二、理解第三方库三、下载和安装第三方库四、示例代码和演示五、总结 博主简介 &#x1f4a1;一个热爱分享高性能服务器后台开发知识的博主&#xff0c;目标是通过理论与代码实践的结合&#x…