=================================================================
FFmpeg内存管理相关的源码分析:
FFmpeg中内存分配和释放相关的源码:av_malloc函数、av_mallocz函数、av_free函数和av_freep函数分析
FFmpeg引用计数数据缓冲区相关的结构体:AVBuffer、AVBufferRef简介
FFmpeg源码:buffer_create、av_buffer_create、av_buffer_default_free、av_buffer_alloc、av_buffer_allocz函数分析
FFmpeg源码:av_buffer_ref、av_buffer_unref函数分析
=================================================================
一、引言
FFmpeg源码里面很多结构体,比如AVPacket、AVFrame都使用了AVBufferRef和AVBuffer来管理缓冲区。AVBuffer里面通过成员变量refcount记录资源使用的次数,控制资源的释放。本文对AVBuffer和AVBufferRef结构体进行简介。
二、AVBuffer结构体的声明
AVBuffer是一个用于引用计数数据缓冲区的应用程序编程接口,它表示数据缓冲区本身。它是不透明的,不能被使用FFmpeg API的用户直接访问调用。用户只能通过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不脏读脏写,线程安全。FFmpeg源码中通过av_buffer_ref函数增加AVBuffer的引用计数,av_buffer_unref减少引用计数。
成员变量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指向的缓冲区的大小,单位为字节。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » FFmpeg引用计数数据缓冲区相关的结构体:AVBuffer、AVBufferRef简介
发表评论 取消回复