财位在家的哪个位置:博客聚合 - MSDK格式转化篇(三)从YVYU到NV12 : sokerspace.com

来源:百度文库 编辑:九乡新闻网 时间:2024/04/27 20:16:35

MSDK格式转化篇(三)从YVYU到NV12


作者: Yanqing Wang (Intel) |英特尔® 软件网络博客 - 中文
日期: 2010/7/28 16:24
点击: 1

在MSDK格式转化篇(二)从YUY2到NV12中,作者已经讲述了YUY2的格式,以及如何将其转化为NV12的方法。在本篇文章中,将会介绍另外一种常用格式YVYU,及其如何将其转化为NV12格式。


首先认识一下YVYU的基本格式是如何?


YVYU的基本格式是 Y0V0Y1U0      Y2V1Y3U1      Y4V2Y5U2 ...,如图1所示:



                                                                               图1 YVYU格式


请注意,图1是按照数据的YUV的格式标注,它不同于采样格式。YVYU的采样格式如下:

Y0V0Y1U0      Y2V2Y3U2      Y4V4Y5U4 ...


细心的网友可能发现,YVYU和YUY2基本上格式一致,仅仅是红蓝位置相互颠倒了。

即:

YUY2是YUYV



YVYU是YVYU


对于它们之间的格式转化,仅仅是将UV的数据交换就可以实现。


图2展示了NV12的基本格式。



                                                                               图2 NV12格式


可以相仿YUY2的方式将它转化为NV12格式,算法如下:

for ( row = 0; row < Height; ++ row )

{

for ( col = 0; col < Width; ++ col )

{

NV12->Y[ index1 ++ ] = YUY2->Data[ index ++ ];

NV12->V[ index3 ++ ] = YUY2->Data[ index ++ ];

NV12->U[ index2 ++ ] = YUY2->Data[ index ++ ];

NV12->Y[ index1 ++ ] = YUY2->Data[ index ++ ];

}

index += (Stride - Width);

}


【小结】

- YVYU和YUY2格式仅仅是UV互换了一下,转化算法可以参考YUY2。

- 如果使用SSEx进行优化,那么可以定义统一内敛汇编进行转化,比如:

#define YUY2ToNV12( Y, U, V ) UNIFORM_MACO( Y, U, V )

#define YVYUToNV12( Y, U, V ) UNIFORM_MACO( Y, V, U )


<< MeeGo兼容问题的一些思考我在google code上建了一个项目。 >>
URL:http://www.sokerspace.com/modules/planet/view.article.php/687
Trackback:http://www.sokerspace.com/modules/planet/trackback.php/687