FFmpeg源码:skip_bits、skip_bits1、show_bits函数分析

news/2024/9/18 22:22:18 标签: ffmpeg

=================================================================

GetBitContext结构体和其相关的函数分析:

FFmpeg中位操作相关的源码:GetBitContext结构体,init_get_bits函数、get_bits1函数和get_bits函数分析

FFmpeg源码:skip_bits、skip_bits1、show_bits函数分析

=================================================================

一、skip_bits函数

skip_bits函数定义在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的头文件libavcodec/get_bits.h中:

static inline void skip_bits(GetBitContext *s, int n)
{
    OPEN_READER(re, s);
    LAST_SKIP_BITS(re, s, n);
    CLOSE_READER(re, s);
}

该函数在已使用init_get_bits函数进行初始化后,才能被调用。其作用是跳过s->buffer指向的缓冲区中的从第s->index位开始的音视频码流二进制数据,总共跳过n位(bit)。执行完skip_bits函数后,s->index的值会加n。

形参s:既是输入型参数也是输出型参数。指向已经被初始化的GetBitContext类型的变量。

形参n:输入型参数。需要跳过的位数。

返回值:无

二、skip_bits1函数

skip_bits1函数定义在FFmpeg源码的头文件libavcodec/get_bits.h中:

static inline void skip_bits1(GetBitContext *s)
{
    skip_bits(s, 1);
}

该函数在已使用init_get_bits函数进行初始化后,才能被调用。其作用是跳过s->buffer指向的缓冲区中的第s->index位音视频码流二进制数据,总共跳过1位(bit)。执行完skip_bits1函数后,s->index的值会加1。

形参s:既是输入型参数也是输出型参数。指向已经被初始化的GetBitContext类型的变量。

返回值:无

三、show_bits函数

show_bits函数定义在FFmpeg源码的头文件libavcodec/get_bits.h中:

/**
 * Show 1-25 bits.
 */
static inline unsigned int show_bits(GetBitContext *s, int n)
{
    register unsigned int tmp;
    OPEN_READER_NOSIZE(re, s);
    av_assert2(n>0 && n<=25);
    UPDATE_CACHE(re, s);
    tmp = SHOW_UBITS(re, s, n);
    return tmp;
}

该函数在已使用init_get_bits函数进行初始化后,才能被调用。其作用是展示s->buffer指向的缓冲区中的从第s->index位开始的音视频码流二进制数据,总共展示n位(bit)。执行show_bits函数后,s->index的值不会增加。

形参s:输入型参数。指向已经被初始化的GetBitContext类型的变量。

形参n:输入型参数。总共需要展示的位数。

返回值:被展示的n位(bit)的数据的值。


http://www.niftyadmin.cn/n/5664617.html

相关文章

EfficientFormerV2:重新思考视觉变换器以实现与MobileNet相当的尺寸和速度。

摘要 https://arxiv.org/pdf/2212.08059 随着视觉变换器&#xff08;ViTs&#xff09;在计算机视觉任务中的成功&#xff0c;近期的研究尝试优化ViTs的性能和复杂度&#xff0c;以实现在移动设备上的高效部署。提出了多种方法来加速注意力机制&#xff0c;改进低效设计&#xf…

Rust GUI框架Tauri V1 入门

文章目录 Tauri介绍Vite开始创建 Rust 项目 调用指令window.__TAURI_INVOKE__.invoke is undefined 问题 参考资料JavaScript 模块Vue 框架Vue RouteviteNuxt gitignore文件上传到csdn gitcode网站端本地端 gitcode发布 Tauri介绍 Tauri是一款用Rust构建的开源框架&#xff0c…

电池管理仓的拆解

拆解视频里面可以学习到大厂的设计思想和创意&#xff0c;接触到比较行业化的设计方案&#xff0c;从而提升设计电路的水平。 电池仓&#xff1a; 电池管家的芯片用的就是前段时间了解到的STM32G030C8T6&#xff0c;便宜好用的典范&#xff1a; 弧形走线较为推荐&#xff1a; …

SpringCloud解读

在Java中&#xff0c;Spring Cloud是一个基于Spring Boot的一站式企业级分布式应用开发框架。它整合了多种分布式系统的常见模式&#xff0c;如配置管理、服务发现、断路器、智能路由、微代理、控制总线等&#xff0c;使得开发者能够轻松地构建分布式系统。Spring Cloud的核心组…

C语言17--条件编译

条件编译 概念&#xff1a;有条件的编译&#xff0c;通过判断某些宏的值&#xff0c;来决定编译哪段代码&#xff08;选择性使用某一段代码&#xff09;。判断宏的值是否为真&#xff1a; 形式1&#xff1a;判断表达式 MACRO 是否为真&#xff0c;据此决定其所包含的代码段是否…

tidb 集群搭建

官网的搭建文档&#xff1a;使用 TiUP 部署 TiDB 集群 | TiDB 文档中心 我本地使用三台 centos7.9 服务器搭建&#xff0c;要保证三台服务器之间是可以互相通信的&#xff1b; 搭建集群的命令在其中一台服务器上执行即可&#xff1b; 1、安装tiup&#xff1a; curl --proto …

iKuai使用及设置流程

iKuai使用及设置流程 iKuai安装步骤 一、配置主机 1.电脑连接ETH0网口 2.ETH1网口连接猫上面的千兆口 3.手动配置pc的IP地址和192.168.1.1./24在同一网段 3.浏览器输入192.168.1.1 admin admin 二、外网设置 1.直接联通电信网络设置 2.点击 网络设置-内外网设置-点击接…

现在量化中普遍使用QMT和PTrade?哪家可以同时提供QMT/PTrade?

QMT的特点 全面的功能集成&#xff1a; QMT集成了行情显示、策略研究、交易执行和风控管理于一体&#xff0c;为投资者提供了一站式的量化交易解决方案。 高效的交易执行能力&#xff1a; 通过全内存交易实现低延迟的交易执行&#xff0c;单笔延时小于1ms&#xff0c;确保了交易…