[英]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])。 这可以正常工作,期望出现以下情况:
使用如上所述确定的大小,这会在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.