AVFrame:如何 get/replace 平面数据缓冲区和大小?

AVFrame: How to get/replace plane data buffer(s) and size?

我正在研究 gstreamer1.0-libav (1.6.3),试图从 gstreamer 0.10 移植基于自定义 FPGA 的 H264 视频加速。

在 gstreamer 0.10 中,数据平面 (YUV) 曾经由一个简单的 malloc 分配,因此我们只是将 AVFrame.data[i] 指针替换为视频加速核心中的内存指针。在 gstreamer 1.12 中似乎要复杂得多。

首先,我尝试将 YUV 平面从 AVFrame.data[i] 复制到一个单独的缓冲区 - 效果很好!由于我还没有看到立即获得 AVFrame.data[i] 大小的方法,而且我认识到数据 [0]、数据[1]、数据[2] 似乎在一个连续的缓冲区中,我简单地使用 (data[1] - data [0]) 作为 Y 平面的大小, (data[2] - data[1]) 分别作为 U/V 平面的大小。这工作正常,预期一种情况:

这会导致使用如上所述确定的大小的 V 平面 (data[2]) 的 memcpy 中出现 SEGFAULT。在遮住相机之前,流显示完全正常......所以出于某种原因,黑屏改变了平面尺寸?

我的最终目标是将 gstreamer 分配的 data[i] 指针替换为我的自定义内存分配(用于进一步处理)...这些缓冲区的确切分配位置,我可以更改它们吗以及如何获得大小每个平面的 (data[0], data[1], data[2])?

不要使用像 (data[1] - data [0]) 平面可能有填充的 hack。
您可以获得这样的缓冲区大小:

Y = data[0]  
U = data[1]  
V = data[2]

YUV444/422 Format:
Size of data[0] is linesize[0] * AVFrame::height
Size of data[1] is linesize[1] * AVFrame::height
Size of data[2] is linesize[2] * AVFrame::height

YUV420 Format:
Size of data[0] is linesize[0] * AVFrame::height
Size of data[1] is linesize[1] * (AVFrame::height / 2)
Size of data[2] is linesize[2] * (AVFrame::height / 2)

如果有 alpha 通道 使用与 Y 相同的公式。
希望对您有所帮助。