Media SDK的decoder,vpp,encoder对输入输出格式有着严格的限制,现在仅仅支持NV12。那么如何从其他格式转化为NV12是日常工作中经常遇到的事情。本篇文章以此为目的,讨论如何将YV12格式转化为NV12格式。
YV12格式是常用的CODEC格式,它的格式如图1所示。
图1 YV12格式
图1中:
W表示图像的宽度,即Width的缩写。
H表示图像的高度,即Height的缩写
Stride表示图像行的跨度,超出Width部分为填充数据,主要目的是为了字节对齐,一般以16字节或者32字节对齐居多。
NV12是英特尔定义的视频格式,它在英特尔硬件平台上是原生态支持,它的格式如图2所示。
图2 NV12格式
从图1,图2可以看出,YV12和NV12基本上相似:
- Y有相同的格式
- U和V不同。YV12将VU分开存储,而NV12将其交叉存储。
程序伪代码实现YV12转成NV12
1. 拷贝Y数据
memcpy( NV12->Y, YV12->Y, Height * Stride );
2. 拷贝UV数据
while ( 有数据 )
{
NV12->U[ index ] = YV12->U[ index ];
NV12->V[ index ] = YV12->V[ index ];
++ NV12->U;
++ NV12->V;
++ YV12->U;
++ YV12->V;
++ index
}