可以参考前面的文章: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)
本篇文章就分享到这里,下面会讲一些测试代码,欢迎关注,收藏,点赞,分享。
本文暂时没有评论,来添加一个吧(●'◡'●)