在av_frame_get_buffer之后清理

时间:2016-11-03 22:02:07

标签: c++ ffmpeg libav

我的问题有两个方面。我使用的是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_freeav_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);

有没有办法在上面的示例中使用完全相同的代码释放frameframe2那是frame,其数据应该是释放,frame2应该被释放,但不是someBuffer,因为libav没有分配它。

1 个答案:

答案 0 :(得分:2)

要回答你的第一个问题 - 除非你做一些时髦的事情(你不应该这样做),否则你不需要做任何特别的事情来释放缓冲区。图像数据归AVBuffer所有,其中包括参考计数器;以AVBuffer的形式提及AVBufferRef AVBufferRef。您可以使用相关API处理libavutil/buffer.h个实例 - 有关说明,请参阅AVFrameav_frame_get_buffer可以为其指向的数据保留参考,并且通常您不需要触摸它们,因为API会处理它。您可以使用av_frame_unref为帧分配新缓冲区;您可以使用av_frame_freeAVFrame来清算&#34;框架或清理并释放它(可能不会释放图像数据,因为它被其他AVBufferRef或编码器使用;大多数(如果不是全部)与帧相关的API也是缓冲区感知的。请确保不要直接复制av_buffer_ref指针,因为这会绕过引用计数 - 请改用av_frame_free

要回答你的第二个问题 - AVBufferRef会做到这一点。它将释放附加到AVFrame的所有AVFrame,然后它将释放--autodetect本身。它不会触及任何缓冲区未引用的内容。