FFmpeg引用计数数据缓冲区相关的结构体:AVBuffer、AVBufferRef简介

news/2024/7/8 6:24:09 标签: ffmpeg

一、AVBuffer结构体的声明

AVBuffer是一个用于引用计数数据缓冲区的应用程序编程接口,它表示数据缓冲区本身。它是不透明的,不能被直接访问调用,只能通过AVBufferRef间接访问它。但是可以通过比较两个AVBuffer指针来检查是否两个不同的引用都描述了相同的数据缓冲区。

AVBuffer结构体声明在FFmpeg源码(本文演示用的FFmpeg源码版本为5.0.3)的头文件libavutil/buffer_internal.h中:

struct AVBuffer {
    uint8_t *data; /**< data described by this buffer */
    size_t size; /**< size of data in bytes */

    /**
     *  number of existing AVBufferRef instances referring to this buffer
     */
    atomic_uint refcount;

    /**
     * a callback for freeing the data
     */
    void (*free)(void *opaque, uint8_t *data);

    /**
     * an opaque pointer, to be used by the freeing callback
     */
    void *opaque;

    /**
     * A combination of AV_BUFFER_FLAG_*
     */
    int flags;

    /**
     * A combination of BUFFER_FLAG_*
     */
    int flags_internal;
};

成员变量data:指针,指向该缓冲区描述的数据。

成员变量size:data指向的缓冲区的大小,单位为字节。

成员变量refcount:refcount表示引用该缓冲区的现有AVBufferRef实例的数目,为atomic_uint(支持原子操作)的类型。atomic_uint类型表示每次操作refcount这个变量,包括读取其值、更改其值,这次操作中执行的唯一一条指令是原子的,从而保护这个变量refcount不脏读脏写,线程安全。

成员变量void (*free)(void *opaque, uint8_t *data):函数指针,指向释放数据的回调函数。

成员变量opaque:一个不透明的指针,由释放数据的回调函数(函数指针void (*free)(void *opaque, uint8_t *data)指向的函数)使用。

成员变量flags:AV_BUFFER_FLAG_*的组合。

成员变量flags_internal:BUFFER_FLAG_*的组合。

二、AVBufferRef结构体的声明

AVBufferRef是指向数据缓冲区的引用。这个结构体的大小不是公共应用程序二进制接口的一部分,也不意味着可以直接被分配。AVBufferRef对AVBuffer进行了一层封装,实现了安全机制。用户应通过AVBufferRef来访问AVBuffer,而不是直接访问AVBuffer,来保证安全。

AVBufferRef结构体声明在FFmpeg源码的头文件libavutil/buffer.h中:

/**
 * A reference to a data buffer.
 *
 * The size of this struct is not a part of the public ABI and it is not meant
 * to be allocated directly.
 */
typedef struct AVBufferRef {
    AVBuffer *buffer;

    /**
     * The data buffer. It is considered writable if and only if
     * this is the only reference to the buffer, in which case
     * av_buffer_is_writable() returns 1.
     */
    uint8_t *data;
    /**
     * Size of data in bytes.
     */
    size_t   size;
} AVBufferRef;

成员变量buffer:AVBuffer类型,为数据缓冲区本身。

成员变量data:数据缓冲区。当且仅当这是对缓冲区的唯一引用时,它才被认为是可写的,在这种情况下函数av_buffer_is_writable()返回1。

成员变量:data指向的缓冲区的大小,单位为字节。


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

相关文章

【CentOS7.6】yum 报错:Could not retrieve mirrorlist http://mirrorlist.centos.org

一、报错 1.报错内容如下 在使用 yum makecache 命令时报错&#xff0c;在 yum install -y xxx 的时候报错等等 [roothcss-ecs-a901 yum.repos.d]# yum makecache Loaded plugins: fastestmirror Determining fastest mirrors Could not retrieve mirrorlist http://mirrorl…

sql-语句

文章目录 SQL语句的学习sql是什么sql的内置命令sql的种类sql mode库&#xff0c;表属性介绍&#xff1a;字符集&#xff0c;存储引擎列的数据类型&#xff1a;数字&#xff0c;字符串&#xff0c;时间列的约束DDL: 数据定义语言库表 Online DDL(ALGORITHM) *DML :数据操纵语言资…

MySQL高级-MVCC-基本概念(当前读、快照读)

文章目录 1、MVCC基本概念1.1、当前读1.1.1、创建表 stu1.1.2、测试 1.2、快照读 1、MVCC基本概念 全称Multi-Version Concurrency Control&#xff0c;多版本并发控制。指维护一个数据的多个版本&#xff0c;使得读写操作没有冲突&#xff0c;快照读为MySQL实现MVCC提供了一个…

安装基于Ubuntu的Zorin OS

目录 前言Zorin OS 介绍准备工具硬件&#xff08;自己准备&#xff09;软件&#xff08;我会在文末提供链接&#xff09; 安装1. 磁盘分区2. 关闭Secure Boot&#xff08;可选&#xff09;3. 关闭RST4. 下载&写U盘5. U盘加载系统6. 正式安装7. 重启 总结下载链接花絮 本文由…

Eclipse 菜单:深入解析与高效使用技巧

Eclipse 菜单:深入解析与高效使用技巧 Eclipse 是一款广泛使用的集成开发环境(IDE),它为Java、C++、PHP等编程语言提供了一个强大的开发平台。Eclipse 的菜单是其用户界面的一部分,提供了丰富的功能和选项,以帮助开发者更高效地工作。本文将深入解析 Eclipse 的菜单系统…

关于Mac mini 10G网口的问题

问题: 购入一个10G网口的Mac mini M2&#xff0c;将其和自己的2.5G交换机连接&#xff0c;使用共享屏幕进行远程操作的过程中出现了频率极高的卡顿&#xff0c;几乎是几秒钟卡一下&#xff0c;使用ping进行测试发现卡的时候就ping不通了。测试使用Mac mini的无线网和雷电转2.5G…

【CUDA】 矩阵乘向量 matVecMul

Matrix - Vector Multiplication 矩阵-向量乘法是线性代数中的基本操作。它用于将一个矩阵与一个向量相乘。乘法的结果是与输入向量大小相同的向量。 矩阵和向量的乘法如图1所示。 图1 基础kernel与共享内存kernel 执行矩阵-向量乘法的基础kernel是使用单个线程执行输出向量…

网站UI:我只负责漂亮,实现的事情交给前端开发。

网页UI的美观性对于用户体验和网站的成功至关重要&#xff0c;以下是几个原因&#xff1a; 吸引用户&#xff1a;美观的网页UI可以吸引用户的注意力&#xff0c;使用户对网站产生兴趣并留下深刻印象。用户更有可能在美观的界面上停留更长时间&#xff0c;探索网站的功能和内容…