繁体   English   中英

av_frame_get_buffer 后清理

[英]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_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 没有分配它。

要回答您的第一个问题-您不需要对空闲缓冲区做任何特殊的事情,除非您正在做一些时髦的事情(不应该这样做)。 图像数据归AVBuffer所有,其中包括一个参考计数器; 有一些以AVBuffer形式对那个AVBufferAVBufferRef 您可以使用相关的API处理AVBufferRef实例-有关说明,请参见libavutil/buffer.h AVFrame可以保存指向其指向的数据的引用,通常您无需触摸它们,因为API会解决这些问题。 您可以使用av_frame_get_buffer为该帧分配新的缓冲区。 您可以使用av_frame_unrefav_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM