主要内容
本文主要就libva中的2D图像的格式进行简单说明,libva版本位libva-2.6.0(版本号为1.6.0)
VAAPI图像类别
| 图像类别(format type) | 尺寸系数 | 值 | 说明(description) |
|---|
| VA_RT_FORMAT_YUV420 | 1.5 | 0x00000001 | 常用解码格式 |
| VA_RT_FORMAT_YUV422 | 2.0 | 0x00000002 |
| VA_RT_FORMAT_YUV444 | 3.0 | 0x00000004 |
| VA_RT_FORMAT_YUV411 | 1.5 | 0x00000008 |
| VA_RT_FORMAT_YUV400 | 1.0 | 0x00000010 |
| VA_RT_FORMAT_YUV420_10 | 3.0 | 0x00000100 |
| VA_RT_FORMAT_YUV422_10 | 4.0 | 0x00000200 |
| VA_RT_FORMAT_YUV444_10 | 6.0 | 0x00000400 |
| VA_RT_FORMAT_YUV420_12 | 3.0 | 0x00001000 |
| VA_RT_FORMAT_YUV422_12 | 4.0 | 0x00002000 |
| VA_RT_FORMAT_YUV444_12 | 6.0 | 0x00004000 |
| VA_RT_FORMAT_RGB16 | 6.0 | 0x00010000 |
| VA_RT_FORMAT_RGB32 | 4.0 | 0x00020000 |
| VA_RT_FORMAT_RGBP | 3.0 | 0x00100000 |
| VA_RT_FORMAT_RGB32_10 | 6.0 | 0x00200000 |
| VA_RT_FORMAT_PROTECTED | 0.0 | 0x80000000 | 一般不使用 |
| VA_RT_FORMAT_RGB32_10BPP | 8.0 | 0x00200000 | 与VA_RT_FORMAT_RGB32_10相同 |
| VA_RT_FORMAT_YUV420_10BPP | 4.0 | 0x00000100 | 与VA_RT_FORMAT_YUV420_10相同 |
YUV系列图像格式
| 图像格式(format) | 占用物理空间(bits)/像素(pix) | 有效物理空间(bits)/像素(pix) | 使用平面(planes) | 图像格式类型(format type) | 值 | 说明(description) |
|---|
| YUV | 24 | 24 | 1 | YUV444 | libva中不存在此格式,仅此提及而已 |
| AYUV | 32 | 32 | 1 | YUV444 | 0x56555941 | packet格式,按照A、Y、U、V的顺序排布 |
| 444P | 24 | 24 | 3 | YUV444 | 0x50343434 | 三个平面分别保存Y、U、V数据 |
| YV24 | 24 | 24 | 3 | YUV444 | 0x34325659 | 三平面分别保存Y,V,U数据 |
| YV32 | 32 | 32 | 4 | YUV444 | 0x32335659 | 四平面分别保存Y,V,U和A数据 |
| Y410 | 32 | 32 | 1 | YUV444 | 0x30313459 | 每个像素是四字节小端值,A,V,Y,U分别位于值的[31:30], [29:20], [19:10], [9:0]位上 |
| Y416 | 64 | 64 | 1 | YUV444 | 0x36313459 | 每个像素采样顺序位A,V,Y,U,每个分量占用16位 |
| YUY2 | 16 | 16 | 1 | YUV422 | 0x32595559 | none |
| VYUY | 16 | 16 | 1 | YUV422 | 0x59555956 | none |
| YVYU | 16 | 16 | 1 | YUV422 | 0x55595659 | none |
| P208 | 16 | 16 | 2 | YUV422 | 0x38303250 | 两个平面分别保存,第一个平面保存Y数据,第二平面保存(U,V)数据对 |
| 422H | 16 | 16 | 3 | YUV422 | 0x48323234 | 三平面分别保存Y,U,V数据 |
| Y210 | 32 | 20 | 1 | YUV422 | 0x30313259 | 采样顺序为Y,U,Y,V,每个分量占用16位,但低6位被忽略 |
| Y216 | 32 | 32 | 1 | YUV422 | 0x36313259 | 采样顺序为Y,U,Y,V,每个分量占用16位 |
| YV16 | 16 | 16 | 1 | YUV422 | 0x36315659 | 三平面分别保存Y,V,U数据 |
| NV16 | 12 | 12 | 1 | YUV422 | x | 两个平面分别保存,第一个平面保存Y数据,第二平面保存(U,V)数据对 |
| NV61 | 12 | 12 | 1 | YUV422 | x | 两个平面分别保存,第一个平面保存Y数据,第二平面保存(V,U)数据对 |
| P010 | 32 | 20 | 1 | YUV420 | 0x30313050 | 每个采样数据为16位小端数据,低六位被忽略,两个平面分别保存,第一个平面保存Y数据,第二平面保存(U,V)数据对 |
| P016 | 32 | 32 | 1 | YUV420 | 0x36313050 | 每个采样数据为16位小端数据,两个平面分别保存,第一个平面保存Y数据,第二平面保存(U,V)数据对 |
| NV12 | 12 | 12 | 2 | YUV420 | 0x3231564E | 两个平面分别保存,第一个平面保存Y数据,第二平面保存(U,V)数据对 |
| NV21 | 12 | 12 | 1 | YUV420 | 0x3132564E | 两个平面分别保存,第一个平面保存Y数据,第二平面保存(V,U)数据对 |
| YV12 | 12 | 12 | 3 | YUV420 | 0x32315659 | 三平面分别保存Y,V,U数据 |
| I420(IYUV) | 12 | 12 | 3 | YUV420 | 0x30323449 | 三平面分别保存Y,U,V数据 |
| I010 | 24 | 15 | 3 | YUV420 | 0x30313049 | 每个采样数据为16位小端数据,低六位被忽略,三平面分别保存Y,V,U数据 |
| 422V | 16 | 16 | 1 | YUV440 | 0x56323234 | 三平面分别保存Y,U,V数据 |
| NV11 | 12 | 12 | 1 | YUV411 | 0x3131564e | 两个平面分别保存,第一个平面保存Y数据,第二平面保存(U,V)数据对 |
| 411P | 12 | 12 | 1 | YUV411 | 0x50313134 | 三平面分别保存Y,U,V数据 |
| 411R | 12 | 12 | 1 | YUV411 | 0x52313134 | 三平面分别保存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) |
|---|
| RGBA | 32 | 32 | 1 | 0x41424752 | none |
| BGRA | 32 | 32 | 1 | 0x41524742 | none |
| ARGB | 32 | 32 | 1 | 0x42475241 | none |
| ABGR | 32 | 32 | 1 | 0x52474241 | none |
| RGBX | 32 | 24 | 1 | 0x58424752 | 像素的数据顺序位R,G,B,X,每个数据占用16位,X代表无效数据,但占用空间 |
| BGRX | 32 | 24 | 1 | 0x58524742 | 像素的数据顺序位R,G,B,X,每个数据占用16位,X代表无效数据,但占用空间 |
| XRGB | 32 | 24 | 1 | 0x42475258 | 像素的数据顺序位X,R,G,B,每个数据占用16位,X代表无效数据,但占用空间 |
| XBGR | 32 | 24 | 1 | 0x52474258 | 像素的数据顺序位X,R,G,B,每个数据占用16位,X代表无效数据,但占用空间 |
| RGBP | 24 | 24 | 3 | 0x50424752 | 三个平面分别包含R,G,B数据 |
| BGRP | 24 | 24 | 3 | 0x50524742 | 三个平面分别包含B,G,R数据 |
| RGB565 | 16 | 16 | 1 | 0x36314752 | R,G,B的数据分别位于[15:11], [10:5],[4:0]位上 |
| BGR565 | 16 | 16 | 1 | 0x36314742 | B,G,R的数据分别位于[15:11], [10:5],[4:0]位上 |
| ARGB64 | 64 | 64 | 1 | 0x34475241 | 像素的数据顺序位A,R,G,B每个数据占用16位 |
| ABGR64 | 64 | 64 | 1 | 0x34474241 | 像素的数据顺序位A,B,G,R每个数据占用16位 |
| AR30 | 32 | 32 | 1 | 0x30335241 | 像素的数据顺序位A,R,G,B数据占用[31:30],[29:20], [19:10],[9:0] |
| AB30 | 32 | 32 | 1 | 0x30334241 | 像素的数据顺序位A,B,G,R数据占用[31:30],[29:20], [19:10],[9:0] |
GRAY系列图像格式
| 图像格式(gotmat) | 占用物理空间(bits)/像素(pix) | 有效物理空间(bits)/像素(pix) | 使用平面(planes) | 说明(description) |
|---|
| Y8 | 8 | 8 | 1 | none |
| Y800 | 8 | 8 | 1 | none |
| Y16 | 16 | 16 | 1 | 每个像素采样Y值,使用16位数据储存 |
其他系列图像格式
| 图像格式(gotmat) | 占用物理空间(bits)/像素(pix) | 有效物理空间(bits)/像素(pix) | 使用平面(planes) | 说明(description) |
|---|
| AI44 | 8 | 8 | 1 | 八个位中低四位包含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等文件