2016-11-03 22 views
0

我的问题有两个方面。我正在使用libav,ffmpeg,3.1。清理后av_frame_get_buffer


首先,如何恰当地处理缓冲区已分配av_frame_get_buffer的帧?例如: -

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需要做的事情,那么有没有包罗万象的方式来清理框,如果你不知道如何它的数据已被分配?例如,假设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

要回答你的第一个问题 - 你不需要做任何特别的事情来释放缓冲区,除非你做了一些有趣的事情(你不应该这样做)。图像数据由AVBuffer拥有,其中包括一个参考计数器;有一些对AVBuffer的引用,形式为AVBufferRef。您可以使用相关API处理AVBufferRef实例 - 有关说明,请参阅libavutil/buffer.hAVFrame可以保存它指向的数据的引用,并且通常你不需要触摸它们,因为API会照顾到它。您可以使用av_frame_get_buffer为该帧分配新的缓冲区;您可以使用av_frame_unrefav_frame_free“清理”框架或清理并释放它(由于其他AVFrame或编码器使用它可能不会释放图像数据)。大部分(如果不是全部)其他与帧相关的API也具有缓冲感知能力。只要确保不要直接复制AVBufferRef指针,因为这将绕过引用计数 - 请改为使用av_buffer_ref

要回答你的第二个问题 - av_frame_free将做到这一点。它会发布AVFrame附带的任何AVBufferRef,然后它将自行释放AVFrame本身。它不会碰到没有被缓冲区引用的任何东西。