[英]Cleaning up after av_frame_get_buffer
我的问题有两个方面。 我正在使用 libav,ffmpeg,3.1。
首先,您如何适当地处理已使用av_frame_get_buffer
分配缓冲区的帧? 例如:
AVFrame *frame = av_frame_alloc();
frame->width = ...;
frame->height = ...;
frame->format = ...;
av_frame_get_buffer(frame, ...);
除了调用av_frame_free(frame)
之外,是否必须手动释放任何缓冲区? 该文档没有提及任何特别之处,但根据我的经验,ffmpeg 文档通常会遗漏重要的细节,或者至少将它们隐藏在远离明显位置的地方。 我查看了av_frame_free
和av_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);
有没有办法在上面的例子中使用完全相同的代码来释放frame
和frame2
? 那就是frame
和它的数据应该被释放,而frame2
应该被释放,但不是someBuffer
,因为 libav 没有分配它。
要回答您的第一个问题-您不需要对空闲缓冲区做任何特殊的事情,除非您正在做一些时髦的事情(不应该这样做)。 图像数据归AVBuffer
所有,其中包括一个参考计数器; 有一些以AVBuffer
形式对那个AVBuffer
的AVBufferRef
。 您可以使用相关的API处理AVBufferRef
实例-有关说明,请参见libavutil/buffer.h
。 AVFrame
可以保存指向其指向的数据的引用,通常您无需触摸它们,因为API会解决这些问题。 您可以使用av_frame_get_buffer
为该帧分配新的缓冲区。 您可以使用av_frame_unref
或av_frame_free
来“清理”帧或清理并释放它(由于某些其他AVFrame
或编码器使用了图像数据,它们可能不会释放图像数据); 大多数(如果不是全部)其他与框架相关的API也都支持缓冲区。 只需确保不直接复制AVBufferRef
指针即可,因为这会避免引用计数-使用av_buffer_ref
代替。
要回答您的第二个问题av_frame_free
将完全做到这一点。 它会释放任何AVBufferRef
小号连接到AVFrame
,然后它会释放AVFrame
本身。 它不会碰到缓冲区未引用的任何内容。
if (frame->data != NULL) av_freep(&frame->data)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.