FFmpeg 借助 struct AVBuffer 和 struct AVBufferRef 以及相关 API 实现了引用计数功能。
结构体定义
struct AVBuffer 目前共包含七个成员变量,从功能上可以划分为三部分:
- 数据部分
uint8_t *data和size_t size:指向一段长度为size的内存。void *opaque:一个指针,指向一个用户自定义类型的对象,也可为空,FFmpeg 不关心。void (*free)(void *opaque, uint8_t *data):函数指针,用于释放data和opaque。
- 计数部分:
atomic_uint refcount:引用计数,配合AVBufferRef使用,记录有多少个AVBufferRef对象引用了自己。
- 辅助部分:
int flags和int flags_internal:一些用于描述自身状态的标志变量。
完整定义如下:
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;
};
struct AVBufferRef 更为

本文详细介绍了FFmpeg中structAVBuffer和structAVBufferRef的结构及其在内存管理中的引用计数功能。通过av_buffer_alloc、av_buffer_create、av_buffer_ref和av_buffer_unref等函数,实现对内存的高效管理和引用跟踪。同时,av_buffer_is_writable和av_buffer_make_writable则用于判断和调整缓冲区的可写性。这些机制确保了FFmpeg在处理音视频数据时的内存安全和性能。
最低0.47元/天 解锁文章
1009

被折叠的 条评论
为什么被折叠?



