摘要:FFmpeg中大多数数据存储比如AVFrame,AVPacket都是通过AVBufferRef管理的,而承载数据的结构为AVBuffer。本文主要通过FFmpeg源码来分析下FFmpeg中AVBuffer相关的实现。
关键字:AVBuffer、AVBufferPool、AVBufferPool
1. AVBufferRef
1.1 AVBuffer结构定义
AVBuffer声明在libavutil/buffer_internal.h文件中,而相关的操作函数定义在libavutil/buffer.c中。先简单看下AVBuffer的结构:
struct AVBuffer {
uint8_t *data; /**< data described by this buffer */
size_t size; /**< size of data in bytes */
atomic_uint refcount; //number of existing AVBufferRef instances referring to this **buffer**
void (*free)(void *opaque, uint8_t *data);//a callback for freeing the data
void *opaque;//an opaque pointer, to be used by the freeing callback
int flags;//A combination of AV_BUFFER_FLAG_*
int flags_internal;//A combination of BUFFER_FLAG_*
};
该结构比较简单,就是一个含有引用计数的数据类

文章详细介绍了FFmpeg中AVBuffer和AVBufferRef的结构及其操作函数,包括AVBuffer的data、size、refcount等属性,以及AVBufferRef作为AVBuffer的操作句柄的角色。同时,文章解析了AVBufferPool的内存池机制,如何通过AVBufferPool进行内存的分配和回收,以及其线程安全的管理方式。

884

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



