繁体   English   中英

AVFrame:如何获取/替换平面数据缓冲区和大小?

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

我正在研究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]似乎在单个连续缓冲区中,所以我简单地使用了Y平面的大小为(data [1]-数据[0]),U / V平面的大小为(data [2]-data [1])。 这可以正常工作,期望出现以下情况:

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

使用如上所述确定的大小,这会在V平面(数据[2])的内存中产生SEGFAULT。 在覆盖摄像机之前,流将显示为完全精细...因此,由于某种原因,黑屏会改变平面尺寸?

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

不要使用(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相同的公式。
希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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