1

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

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

对于初学者,我尝试将 YUV 平面从 AVFrame.data[i] 复制到单独的缓冲区 - 效果很好!由于我还没有看到获得 AVFrame.data[i] 大小的直接方法,并且我认识到 data[0]、data[1]、data[2] 似乎在一个连续的缓冲区中,所以我只是使用了(data[1] - data [0]) 用于 Y 平面的大小, (data[2] - data[1]) 分别用于 U/V 平面的大小。这工作正常,期待一种情况:

  • 输入 H264 流,分辨率为 800x600 或更高
  • 相机被覆盖(夹克,手,......)

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

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

4

1 回答 1

0

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

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 相同的公式
。希望有帮助。

于 2018-07-19T12:57:18.207 回答