gpt4 book ai didi

c++ - AVFrame 宽度、高度和线条大小之间的混淆

转载 作者:行者123 更新时间:2023-12-01 14:49:58 31 4
gpt4 key购买 nike

我试图理解 AVFrame,特别是 linesize 属性。

这是我解码的 AVFrame 属性:

width = 640 
height= 360

linesize[0] = 640
linesize[1] = 320
linesize[2] = 320

这是一个 YUV 420 平面图像 (AV_PIX_FMT_YUVJ420P)

我正在阅读this code这是处理 AVFrame 属性的部分:

int linesize = qAbs(m_format.renderFrame->linesize[i]);
AVRational widthRational = params.yuvwidths[i];
AVRational heightRational = params.yuvheights[i];
int width = linesize * widthRational.num / widthRational.den;
int height = m_format.renderFrame->height * heightRational.num / heightRational.den;
glTexImage2D ( GL_TEXTURE_2D, 0, params.yuvInternalformat[i],width ,height, 0, params.yuvGlFormat[i], params.dataType, NULL);

其中,对于 YUV420P,widthRationalheightRational 对于 1/11/1 >i=0,以及 1/21/2(对于 i = 1,2)。并且 yuvInternalformatyuvGlFormat 始终为 GL_RED

代码中有一些我无法理解的事情:

为什么他在linesize中取绝对值? linesize 可以为负数吗?文档中没有任何关于负值的内容。我明白他为什么在 height 中进行分数乘法,但为什么在 linesize 中进行? linesize 不应该是平面图像的实际 width 吗?因此不需要乘法?

那么什么是linesize,如何计算widthheight才能使用glTexImage2D

最佳答案

高度是以像素为单位的高度,没有什么特别的。

宽度是显示图像的宽度(以像素为单位)。

跨距(Stride)或行大小(linesize),内存中每行像素的宽度。线条尺寸必须等于或大于宽度。例如,1920x1080 的行大小通常为 1088,以使步幅可被 16 整除,但最右边的 8 列像素不会显示。

色度子采样是另一回事。对于某些颜色格式,例如 yuv420p,第一个平面(黑白平面)是全分辨率,但 2 个颜色平面是四分之一分辨率(半高和半宽)。在我的 1920x1080 示例中,这使得第二个和第三个平面的高度为 960,宽度为 540,步幅(最有可能)为 544 (544 = ceil(1080/16)*16)。

其他颜色格式(例如 RGB 或 yuv444p)的第二个和第三个平面的尺寸与第一个平面相同。

关于c++ - AVFrame 宽度、高度和线条大小之间的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57643062/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com