编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

讲解FFmpeg内存模型(1)(ffmpeg 内存增长)

wxchong 2024-08-08 01:13:21 开源技术 10 ℃ 0 评论

可以参考前面的文章:FFmpeg编程入门系列(1)

内存模型讲解

从现有的Packet拷贝一个新Packet的时候,有两种情况:

(1)两个Packet的buf引用的是同一数据缓存空间,这时候要注意数据缓存空间的释放问题。

(2)两个Packet的buf引用不同的数据缓存空间,每个Packet都有数据缓存空间的copy

AVPacket和AVFrame先持有AVBufferRef ,然后AVBufferRef持有真正的数据域AVBuffer。如下图。



数据结构如下图:

引用计数:

对于多个AVPacket(AVFrame采用的是同一块空间)共享同一个缓存空间,FFmpeg使用的引用计数的机制(reference-count):

(1)初始化引用计数为0,只有真正分配AVBuffer的时候,引用计数初始化为1。

(2)当有新的Packet引用共享的缓存空间时,就将引用计数+1。

(3)当释放了引用共享空间的Packet,就将引用计数-1;引用计数为0时,就释放掉引用的缓存空间AVBuffer。


AVPacket常用API

(1)只是分配了AVPacket(自身的内存),至于实际的内存并没有分配。

AVPacket *av_packet_alloc(void)

(2)释放AVPacket,与av_packet_alloc对应。

void av_packet_free(AVPacket **pkt)

(3)初始化AVPacket,只是单纯初始化pkt字段

void av_init_packet(AVPacket *pkt)

(4)给AVPacket的buf分配内存,引用计数初始化为1

int av_new_packet(AVPacket *pkt, int size)

(5)增加引用计数

int av_packet_ref(AVPacket *dst, const AVPacket *src)

(6)减少引用计数

void av_packet_unref(AVPacket *pkt)

(7)转移引用计数

void av_packet_move_ref(AVPacket *dst, AVPacket *src)

(8)相当于av_packet_alloc()+av_packet_ref()

AVPacket *av_packet_clone(const AVPacket *src)


AVFrame常用API

(1)分配AVFrame

AVFrame *av_frame_alloc(void)

(2)释放AVFrame

void av_frame_free(AVFrame **frame)

(3)增加引用计数

int av_frame_ref(AVFrame *dst, const AVFrame *src)

(4)减少引用计数

void av_frame_unref(AVFrame *frame)

(5)转移引用计数

void av_frame_move_ref(AVFrame *dst, AVFrame *src)

(6)根据AVFrame分配内存,还可以设置内存对齐,提高拷贝效率。

int av_frame_get_buffer(AVFrame *frame, int align)

(7)相当于av_frame_alloc()+av_frame_ref()

AVFrame *av_frame_clone(const AVFrame *src)

本篇文章就分享到这里,下面会讲一些测试代码,欢迎关注,收藏,点赞,分享

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表