代码之家  ›  专栏  ›  技术社区  ›  PPP

AVFrame宽度、高度和线条尺寸之间的混淆

  •  0
  • PPP  · 技术社区  · 7 年前

    以下是我解码的AVFrame属性:

    width = 640 
    height= 360
    
    linesize[0] = 640
    linesize[1] = 320
    linesize[2] = 320
    

    这是一张YV420平面图( AV_PIX_FMT_YUVJ420P )

    我在看书 this code

    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, widthRational heightRational 1/1 对于 i=0 ,和 1/2 1/2页 i = 1,2 . 以及 yuvInternalformat yuvGlFormat 总是 GL_RED

    有几件事我无法理解:

    为什么他在 linesize ? 可以 线条尺寸 是消极的吗?文档中没有关于负值的内容。我明白他为什么做分数乘法 height 但为什么要进来 ? 不应该 线条尺寸 做真实的 width

    那是什么 ,应该怎么做 高度 为了使用 glTexImage2D

    0 回复  |  直到 6 年前
        1
  •  2
  •   szatmary    7 年前

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

    宽度是显示图像的像素宽度。

    跨距,或行大小,内存中每行像素的宽度。行大小必须等于或大于宽度。例如,1920x1080的行大小通常为1088,以使跨距均匀地被16整除,但最右边的8列像素不会显示。

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

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

    推荐文章