ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

libva中的图像格式说明

libva中的图像格式说明

主要内容

本文主要就libva中的2D图像的格式进行简单说明,libva版本位libva-2.6.0(版本号为1.6.0)

VAAPI图像类别

图像类别(format type)尺寸系数值说明(description)
VA_RT_FORMAT_YUV4201.50x00000001常用解码格式
VA_RT_FORMAT_YUV4222.00x00000002
VA_RT_FORMAT_YUV4443.00x00000004
VA_RT_FORMAT_YUV4111.50x00000008
VA_RT_FORMAT_YUV4001.00x00000010
VA_RT_FORMAT_YUV420_103.00x00000100
VA_RT_FORMAT_YUV422_104.00x00000200
VA_RT_FORMAT_YUV444_106.00x00000400
VA_RT_FORMAT_YUV420_123.00x00001000
VA_RT_FORMAT_YUV422_124.00x00002000
VA_RT_FORMAT_YUV444_126.00x00004000
VA_RT_FORMAT_RGB166.00x00010000
VA_RT_FORMAT_RGB324.00x00020000
VA_RT_FORMAT_RGBP3.00x00100000
VA_RT_FORMAT_RGB32_106.00x00200000
VA_RT_FORMAT_PROTECTED0.00x80000000一般不使用
VA_RT_FORMAT_RGB32_10BPP8.00x00200000与VA_RT_FORMAT_RGB32_10相同
VA_RT_FORMAT_YUV420_10BPP4.00x00000100与VA_RT_FORMAT_YUV420_10相同

YUV系列图像格式

图像格式(format)占用物理空间(bits)/像素(pix)有效物理空间(bits)/像素(pix)使用平面(planes)图像格式类型(format type)值说明(description)
YUV24241YUV444libva中不存在此格式,仅此提及而已
AYUV32321YUV4440x56555941packet格式,按照A、Y、U、V的顺序排布
444P24243YUV4440x50343434三个平面分别保存Y、U、V数据
YV2424243YUV4440x34325659三平面分别保存Y,V,U数据
YV3232324YUV4440x32335659四平面分别保存Y,V,U和A数据
Y41032321YUV4440x30313459每个像素是四字节小端值,A,V,Y,U分别位于值的[31:30], [29:20], [19:10], [9:0]位上
Y41664641YUV4440x36313459每个像素采样顺序位A,V,Y,U,每个分量占用16位
YUY216161YUV4220x32595559none
VYUY16161YUV4220x59555956none
YVYU16161YUV4220x55595659none
P20816162YUV4220x38303250两个平面分别保存,第一个平面保存Y数据,第二平面保存(U,V)数据对
422H16163YUV4220x48323234三平面分别保存Y,U,V数据
Y21032201YUV4220x30313259采样顺序为Y,U,Y,V,每个分量占用16位,但低6位被忽略
Y21632321YUV4220x36313259采样顺序为Y,U,Y,V,每个分量占用16位
YV1616161YUV4220x36315659三平面分别保存Y,V,U数据
NV1612121YUV422x两个平面分别保存,第一个平面保存Y数据,第二平面保存(U,V)数据对
NV6112121YUV422x两个平面分别保存,第一个平面保存Y数据,第二平面保存(V,U)数据对
P01032201YUV4200x30313050每个采样数据为16位小端数据,低六位被忽略,两个平面分别保存,第一个平面保存Y数据,第二平面保存(U,V)数据对
P01632321YUV4200x36313050每个采样数据为16位小端数据,两个平面分别保存,第一个平面保存Y数据,第二平面保存(U,V)数据对
NV1212122YUV4200x3231564E两个平面分别保存,第一个平面保存Y数据,第二平面保存(U,V)数据对
NV2112121YUV4200x3132564E两个平面分别保存,第一个平面保存Y数据,第二平面保存(V,U)数据对
YV1212123YUV4200x32315659三平面分别保存Y,V,U数据
I420(IYUV)12123YUV4200x30323449三平面分别保存Y,U,V数据
I01024153YUV4200x30313049每个采样数据为16位小端数据,低六位被忽略,三平面分别保存Y,V,U数据
422V16161YUV4400x56323234三平面分别保存Y,U,V数据
NV1112121YUV4110x3131564e两个平面分别保存,第一个平面保存Y数据,第二平面保存(U,V)数据对
411P12121YUV4110x50313134三平面分别保存Y,U,V数据
411R12121YUV4110x52313134三平面分别保存Y,U,V数据,但是每个第四行为全亮度数据

YUV格式内存分布

YUV格式

每个A、Y、U、V均占用1个字节 Y、U、V混合存储,Y,U,V分别都占w*h字节。每行Y,U,V都是各w个。 每个像素有Y,U,V分量都是1个,共3字节,因此一个像素占3字节。 内存分布如下: 3*w +------------------------------------+ |Y0U0V0Y1U1V1Y2U2V2Y3U3V3... | |... | h |... | | | +------------------------------------+ 第一个像素:Y0 U0 V0 第二个像素:Y1 U0 V0 第三个像素:Y2 U1 V1 第四个像素:Y3 U1 V1

AYUV格式

每个A、Y、U、V均占用1个字节 A,Y,U,V混合存储,A,Y,U,V分别都占w*h字节。每行A,Y,U,V都是各w个。 每个像素有A,Y,U,V分量都是1个,共4字节,因此一个像素占4字节。 内存分布如下: 4*w +------------------------------------+ |A0Y0U0V0A1Y1U1V1A2Y2U2V2A3Y3U3V3... | |... | h |... | | | +------------------------------------+ 第一个像素:A0 Y0 U0 V0 第二个像素:A1 Y1 U0 V0 第三个像素:A2 Y2 U1 V1 第四个像素:A3 Y3 U1 V1

YV24格式

每个Y、U、V均占用1个字节 Y,U,V分别存储,Y,U,V分别都占w*h字节。每行Y,U,V都是各w个。 每个像素有Y,U,V分量都是1个,共3字节,因此一个像素占3字节。 内存分布如下: w +------------------------------------+ |Y0Y1Y2Y3... | |... | h |... | | | +------------------------------------+ +------------------------------------+ |V0V1V2V3... | |... | h |... | | | +------------------------------------+ +------------------------------------+ |U0U1U2U3... | |... | h |... | | | +------------------------------------+ 第一个像素:Y0 U0 V0 第二个像素:Y1 U0 V0 第三个像素:Y2 U1 V1 第四个像素:Y3 U1 V1

YV32格式

每个A、Y、U、V均占用1个字节 A,Y,U,V分别存储,A,Y,U,V分别都占w*h字节。每行A,Y,U,V都是各w个。 每个像素有A,Y,U,V分量都是1个,共4字节,因此一个像素占4字节。 内存分布如下: w +------------------------------------+ |A0A1A2A3... | |... | h |... | | | +------------------------------------+ +------------------------------------+ |Y0Y1Y2Y3... | |... | h |... | | | +------------------------------------+ +------------------------------------+ |V0V1V2V3... | |... | h |... | | | +------------------------------------+ +------------------------------------+ |U0U1U2U3... | |... | h |... | | | +------------------------------------+ 第一个像素:A0 Y0 U0 V0 第二个像素:A1 Y1 U1 V1 第三个像素:A2 Y2 U2 V2 第四个像素:A3 Y3 U3 V3

Y410格式

每个A、Y、U、V均占用1个字节 A,V,Y,U混合存储,每个像素是四字节小端值, A,V,Y,U分别位于值的[31:30], [29:20], [19:10], [9:0]位上。 内存分布如下: w*4 +------------------------------------+ |A0V0Y0U01A2V2Y2U2A3V3Y3U3... | |... | h |... | | | +------------------------------------+ 第一个像素:A0 Y0 U0 V0 第二个像素:A1 Y1 U1 V1 第三个像素:A2 Y2 U2 V2 第四个像素:A3 Y3 U3 V3

Y416格式

每个A、Y、U、V均占用1个字节 A,V,Y,U混合存储,A,V,Y,U每个分量占两个字节。 内存分布如下: w*8 +------------------------------------+ |A0V0Y0U01A2V2Y2U2A3V3Y3U3... | |... | h |... | | | +------------------------------------+ 第一个像素:A0 Y0 U0 V0 第二个像素:A1 Y1 U1 V1 第三个像素:A2 Y2 U2 V2 第四个像素:A3 Y3 U3 V3

YUYV格式

每个Y、U、V均占用1个字节 YUYV格式 Y、U、V混合存储,Y占w*h,U、V分别占w*h/2。每行Y有w个,U、V各w/2个。 两个Y共用一个U和V,两个像素有Y分量2个,U、V分量各一个,共4字节,因此一个像素占2字节。 内存分布如下: 2*w +----------------------------+ |Y0U0Y1V1Y2U2Y3V3... | |... | h |... | | | +----------------------------+ 第一个像素:Y0 U0 V1 第二个像素:Y1 U0 V1 第三个像素:Y2 U2 V3 第四个像素:Y3 U2 V3

YV16格式

每个Y、U、V均占用1个字节 Y、U、V分开存储,Y占w*h,U、V分别都占w*h/2。每行Y有w个,U、V都是w/2个。 两个Y共用一个U和V,两个像素有Y分量2个,U、V分量各一个,共4字节,因此一个像素占2字节。 内存分布如下: w +--------------------+ |Y0Y1Y2Y3... | |... | h |... | | | +--------------------+ |V0V1 | |... | h |... | | | +----------+ |U0U1 | |... | h |... | | | +----------+ w/2 第一个像素:Y0 U0 V0 第二个像素:Y1 U0 V0 第三个像素:Y2 U1 V1 第四个像素:Y3 U1 V1

P208格式

每个Y、U、V均占用1个字节 Y、U和V分开存储,Y占w*h,U、V分别占w*h/2。每行Y有w个,U、V各w/2个。 两个Y共用一个U和V,两个像素有Y分量2个,U、V分量各一个,共4字节,因此一个像素占2字节。 内存分布如下: w +--------------------+ |Y0Y1Y2Y3... | |... | h |... | | | +--------------------+ |U0V0U1V1... | |... | h |... | | | +--------------------+ 第一个像素:Y0 U0 V0 第二个像素:Y1 U0 V0 第三个像素:Y2 U1 V1 第四个像素:Y3 U1 V1

VYUY格式

每个Y、U、V均占用1个字节 V、Y、U、Y混合存储,Y占w*h,U、V分别占w*h/2。每行Y有w个,U、V各w/2个。 两个Y共用一个U和V,两个像素有Y分量2个,U、V分量各一个,共4字节,因此一个像素占2字节。 内存分布如下: 2*w +----------------------------+ |V0Y0U1Y1V2Y2U3Y3... | |... | h |... | | | +----------------------------+ 第一个像素:Y0 U1 V0 第二个像素:Y1 U1 V0 第三个像素:Y2 U3 V2 第四个像素:Y3 U3 V2

Y210格式

每个Y、U、V均占用2个字节 Y、U、V混合存储,Y占w*h*2,U、V分别占w*h。每行Y有w个,U、V各w/2个, 但每个分量占16位,仅仅高十位有效。 两个Y共用一个U和V,两个像素有Y分量2个,U、V分量各一个,共8字节,因此一个像素占4字节。 内存分布如下: 4*w +----------------------------+ |Y0U0Y1V1Y2U2Y3V3... | |... | h |... | | | +----------------------------+ 第一个像素:Y0 U0 V1 第二个像素:Y1 U0 V1 第三个像素:Y2 U2 V3 第四个像素:Y3 U2 V3

Y216格式

每个Y、U、V均占用2个字节 Y、U、V混合存储,Y占w*h*2,U、V分别占w*h。每行Y有w个,U、V各w/2个,但每个分量占16位。 两个Y共用一个U和V,两个像素有Y分量2个,U、V分量各一个,共8字节,因此一个像素占4字节。 内存分布如下: 4*w +----------------------------+ |Y0U0Y1V1Y2U2Y3V3... | |... | h |... | | | +----------------------------+ 第一个像素:Y0 U0 V1 第二个像素:Y1 U0 V1 第三个像素:Y2 U2 V3 第四个像素:Y3 U2 V3

P010格式

每个Y、U、V均占用2个字节 Y、U、V分开存储,Y占w*h,U、V分别占w*h/4。每两行Y有2w个,U、V各w/2个,但每个分量占16位, 仅仅高十位有效。 两个Y共用一个U和V,两个像素有Y分量2个,U、V分量各一个,共8字节,因此一个像素占4字节。 内存分布如下: w +--------------------+ |Y0Y1Y2Y3... | |YwYw+1... | h |... | | | +--------------------+ |U0V0U1V1 ..| |.... | h/2 +-----------+ 第一个像素:Y0 U0 V1 第二个像素:Y1 U0 V1 第三个像素:Y2 U2 V3 第四个像素:Y3 U2 V3

P016格式

每个Y、U、V均占用2个字节 Y、U、V分开存储,Y占w*h,U、V分别占w*h/4。每两行Y有2w个,U、V各w/2个,但每个分量占16位。 两个Y共用一个U和V,两个像素有Y分量2个,U、V分量各一个,共8字节,因此一个像素占4字节。 内存分布如下: w +--------------------+ |Y0Y1Y2Y3... | |YwYw+1... | h |... | | | +--------------------+ |U0V0U1V1 ..| |.... | h/2 +-----------+ 第一个像素:Y0 U0 V1 第二个像素:Y1 U0 V1 第三个像素:Y2 U2 V3 第四个像素:Y3 U2 V3

YV12格式

每个Y、U、V均占用1个字节 Y、U、V分开存储,Y占w*h,U、V分别占w*h/4。每行Y有w个,U、V各w/4个。 四个Y共用一个U和V,四个像素有Y分量4个,U、V分量各一个,共6字节,因此一个像素占1.5字节。 内存分布如下: w +--------------------+ |Y0Y1Y2Y3... | |YwYw+1... | h |... | | | +--------------------+ +----------+ |V0V1 | |... | h/2 +----------+ +----------+ |U0U1 | |... | h/2 +----------+ w/2 第一个像素:Y0 U0 V0 第二个像素:Y1 U0 V0 第w+1个像素:Yw U0 V0 第w+2个像素:Yw+1 U0 V0

NV12格式

每个Y、U、V、R、G、B均占用1个字节 Y、U、V分开存储,Y占w*h,U、V分别占w*h/4。每行Y有w个,U、V各w/4个。 四个Y共用一个U和V,四个像素有Y分量4个,U、V分量各一个,共6字节,因此一个像素占1.5字节。 内存分布如下: w +--------------------+ |Y0Y1Y2Y3... | |YwYw+1... | h |... | | | +--------------------+ +-----------+ |U0V0U1V1...| |... | h/2 +-----------+ w/2 第一个像素:Y0 U0 V0 第二个像素:Y1 U0 V0 第w+1个像素:Yw U0 V0 第w+2个像素:Yw+1 U0 V0

NV21格式

每个Y、U、V、R、G、B均占用1个字节 Y、U、V分开存储,Y占w*h,U、V分别占w*h/4。每两行Y有2*w个,U、V各w/4个。 四个Y共用一个U和V,四个像素有Y分量4个,U、V分量各一个,共6字节,因此一个像素占1.5字节。 内存分布如下: w +--------------------+ |Y0Y1Y2Y3... | |YwYw+1... | h |... | | | +--------------------+ |V0U0V1U1...| |... | h/2 +-----------+ w/2 第一个像素:Y0 U0 V0 第二个像素:Y1 U0 V0 第三个像素:Yw U0 V0 第四个像素:Yw+1 U0 V0

NV16格式

每个Y、U、V均占用1个字节 Y、UV分开存储,Y占w*h,UV平面占w*h。UV平面使用(U,V)数据对的方式储存。 四个Y共用一个U和V,四个像素有Y分量4个,U、V分量各一个,共6字节,因此一个像素占1.5字节。 NV61格式的UV顺序与此相反 内存分布如下: w +--------------------+ |Y0Y1Y2Y3... | |YwYw+1... | h |... | | | +--------------------+ |U0V0U1V1... | |... | |... | h |... | +--------------------+ w 第一个像素:Y0 U0 V0 第二个像素:Y1 U0 V0 第三个像素:Y2 U1 V1 第四个像素:Y3 U1 V1

I420格式

每个Y、U、V均占用1个字节 Y、U、V分开存储,Y占w*h,U、V分别占w*h/4。每行Y有w个,U、V各w/4个。 四个Y共用一个U和V,四个像素有Y分量4个,U、V分量各一个,共6字节,因此一个像素占1.5字节。 内存分布如下: w +--------------------+ |Y0Y1Y2Y3... | |YwYw+1... | h |... | | | +--------------------+ +----------+ |U0U1 | |... | h/2 +----------+ +----------+ |V0V1 | |... | h/2 +----------+ w/2 第一个像素:Y0 U0 V0 第二个像素:Y1 U0 V0 第w+1个像素:Yw U0 V0 第w+2个像素:Yw+1 U0 V0

I010格式

每个Y、U、V均占用1个字节 Y、U、V分开存储,Y占w*h,U、V分别占w*h/4。每行Y有w个,U、V各w/4个,但每个分量占16位, 仅仅高十位有效。 四个Y共用一个U和V,四个像素有Y分量4个,U、V分量各一个,共12字节,因此一个像素占3字节。 内存分布如下: w +--------------------+ |Y0Y1Y2Y3... | |YwYw+1... | h |... | | | +--------------------+ +----------+ |V0V1 | |... | h/2 +----------+ +----------+ |U0U1 | |... | h/2 +----------+ w/2 第一个像素:Y0 U0 V0 第二个像素:Y1 U0 V0 第w+1个像素:Yw U0 V0 第w+2个像素:Yw+1 U0 V0

NV11格式

每个Y、U、V、R、G、B均占用1个字节 Y、U、V分开存储,Y占w*h,U、V分别占w*h/2。每行Y有w个,U、V各w/4个。 四个Y共用一个U和V,四个像素有Y分量4个,U、V分量各一个,共6字节, 因此一个像素占1.5字节。 内存分布如下: w +--------------------+ |Y0Y1Y2Y3... | |YwYw+1... | h |... | | | +--------------------+ +-----------+ |U0V0U1V1...| |... | |... | h |... | +-----------+ w/2 第一个像素:Y0 U0 V0 第二个像素:Y1 U0 V0 第三个像素:Y2 U0 V0 第四个像素:Y3 U0 V0

422V格式:

每个Y、U、V均占用1个字节 422V格式 Y、U、V分开存储,Y占w*h,U、V分别占w*h/2。每行Y有w个,U、V各w/2个。 四个Y共用两个U和V,四个像素有Y分量4个,U、V分量各两个,共8字节,因此一个像素占2字节。 内存分布如下: w +--------------------+ |Y0Y1Y2Y3... | |YwYw+1... | h |... | | | +--------------------+ +-----------+ |U0U1U2.....| |... | |... | h |... | +-----------+ +-----------+ |V0V1V2.....| |... | |... | h |... | +-----------+ w/2 第一个像素:Y0 U0 V0 第二个像素:Y1 U1 V1 第W+1个像素:Yw U0 V0 第W+2个像素:Yw+1 U1 V1

RGB系列图像格式

图像格式(gotmat)占用物理空间(bits)/像素(pix)有效物理空间(bits)/像素(pix)使用平面(planes)值说明(description)
RGBA323210x41424752none
BGRA323210x41524742none
ARGB323210x42475241none
ABGR323210x52474241none
RGBX322410x58424752像素的数据顺序位R,G,B,X,每个数据占用16位,X代表无效数据,但占用空间
BGRX322410x58524742像素的数据顺序位R,G,B,X,每个数据占用16位,X代表无效数据,但占用空间
XRGB322410x42475258像素的数据顺序位X,R,G,B,每个数据占用16位,X代表无效数据,但占用空间
XBGR322410x52474258像素的数据顺序位X,R,G,B,每个数据占用16位,X代表无效数据,但占用空间
RGBP242430x50424752三个平面分别包含R,G,B数据
BGRP242430x50524742三个平面分别包含B,G,R数据
RGB565161610x36314752R,G,B的数据分别位于[15:11], [10:5],[4:0]位上
BGR565161610x36314742B,G,R的数据分别位于[15:11], [10:5],[4:0]位上
ARGB64646410x34475241像素的数据顺序位A,R,G,B每个数据占用16位
ABGR64646410x34474241像素的数据顺序位A,B,G,R每个数据占用16位
AR30323210x30335241像素的数据顺序位A,R,G,B数据占用[31:30],[29:20], [19:10],[9:0]
AB30323210x30334241像素的数据顺序位A,B,G,R数据占用[31:30],[29:20], [19:10],[9:0]

GRAY系列图像格式

图像格式(gotmat)占用物理空间(bits)/像素(pix)有效物理空间(bits)/像素(pix)使用平面(planes)说明(description)
Y8881none
Y800881none
Y1616161每个像素采样Y值,使用16位数据储存

其他系列图像格式

图像格式(gotmat)占用物理空间(bits)/像素(pix)有效物理空间(bits)/像素(pix)使用平面(planes)说明(description)
AI44881八个位中低四位包含Y数据,高四位包含A数据

注意

YUV 4:1:1 是指水平 Y 取样四个点,UV 各只取样一个点,水平的 Y 和 UV 的取样比例是 4:1,也就是

Y Y Y Y 一个 U 一个 V ....

YUV 4:2:0 是指水平和垂直 Y 各取样两个点,UV 各只取样一个点,水平的取样比例是 2:1,重直的取样比例 2:1,也就是

Y Y Y Y 一个 U 一个 V ....

和 YUV 4:1:1 一样,色度和亮度差 1/2 * 1/2 = 1/4,只是取样的方式不同。
同理YUV440和YUV422也是类似。
相关格式的转换问题可以参考ffmpeg的libswscale的rgb2yuv.c,input.c,rgb2rgb_template.c.utils.c等文件

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进