我的问题有两个方面。我使用的是libav,ffmpeg,3.1。
首先,如何妥善处理缓冲区已分配av_frame_get_buffer
的帧? E.g:
AVFrame *frame = av_frame_alloc();
frame->width = ...;
frame->height = ...;
frame->format = ...;
av_frame_get_buffer(frame, ...);
除了调用av_frame_free(frame)
之外,是否必须手动释放任何缓冲区? documentation并未提及任何特殊内容,但根据我的经验,ffmpeg文档通常会遗漏重要的细节,或者至少将它们隐藏在远离明显位置的地方。我查看了av_frame_free
和av_frame_unref
的代码,但它分支了很多,我无法确定它是否涵盖了所有内容。
其次,如果需要完成av_frame_free
以外的事情,那么如果您不知道<是否有任何全能方式来清理框架< / em>如何分配数据?例如,假设someBuffer
已经分配了适当的大小:
AVFrame *frame2 = av_frame_alloc();
frame2->width = ...;
frame2->height = ...;
frame2->format = ...;
av_image_fill_arrays(frame2->data, frame2->linesize, someBuffer,
frame2->format, frame2->width, frame2->height, 1);
有没有办法在上面的示例中使用完全相同的代码释放frame
和frame2
?那是frame
,其数据应该是释放,frame2
应该被释放,但不是someBuffer
,因为libav没有分配它。
答案 0 :(得分:2)
要回答你的第一个问题 - 除非你做一些时髦的事情(你不应该这样做),否则你不需要做任何特别的事情来释放缓冲区。图像数据归AVBuffer
所有,其中包括参考计数器;以AVBuffer
的形式提及AVBufferRef
AVBufferRef
。您可以使用相关API处理libavutil/buffer.h
个实例 - 有关说明,请参阅AVFrame
。 av_frame_get_buffer
可以为其指向的数据保留参考,并且通常您不需要触摸它们,因为API会处理它。您可以使用av_frame_unref
为帧分配新缓冲区;您可以使用av_frame_free
或AVFrame
来清算&#34;框架或清理并释放它(可能不会释放图像数据,因为它被其他AVBufferRef
或编码器使用;大多数(如果不是全部)与帧相关的API也是缓冲区感知的。请确保不要直接复制av_buffer_ref
指针,因为这会绕过引用计数 - 请改用av_frame_free
。
要回答你的第二个问题 - AVBufferRef
会做到这一点。它将释放附加到AVFrame
的所有AVFrame
,然后它将释放--autodetect
本身。它不会触及任何缓冲区未引用的内容。