Matrox Uncompressed YUY2 (M101)视频格式解码小记

Posted on 2012-04-11 17:44  一有新人  阅读(879)  评论(0编辑  收藏  举报

本文侧重于分析未知格式的过程。

【目标】 解码一个avi文件,它的FourCC 是 M101

【思路】 必须了解此种格式,知道它采用的编码框架、内部的图像数据格式(Pixel Format)

【过程】 

一、Google 后知M101格式全称为Matrox Uncompressed YUY2

从格式全称可以得到3个信息:

1.是 Matrox公司的格式

2.格式是未压缩的

3.Pixel Format 是YUY2 (最开始并不知道YUY2是一种Pixel Format )

二、Google YUY2 

YUY2(和YUYV)格式为每个像素保留Y分量,而UV分量在水平方向上每两个像素采样一次。

一个宏像素为4个字节,实际表示2个像素。(4:2:2的意思为一个宏像素中有4个Y分量、2个U分量和2个V分量。)

图像数据中YUV分量排列顺序如下:Y0 U0 Y1 V0 Y2 U2 Y3 V2 …

以上引用自:http://www.360doc.com/content/07/0501/23/26601_477595.shtml 

三、分析文件

参考文档《OpenDML AVI File Format Extensions

辅助工具 HxD(16进制查看器)、YUVviewerPlus(YUV文件预览工具)

思路:看起来格式是未压缩的,是不是意味着不需要解码呢?如果是,那么完全可以从文件中抽取出一帧并显示。

目标:抽取第一帧的数据并用 YUVviewerPlus 显示

1、分析vprp(Video Properties Header)头信息得到视频分辨率为720*576

2、寻找第一帧的索引,定位到第一帧所在的CHUNK块

   

  .........

  

  第一帧所在的CHUNK块的起始地址为 0x000201F8 ,结束地址为 0x000F81FF 。 数据的大小为0xD8000(十进制884736),数据的起始地址为0x00020200,数据的结束地址为 0x000F81FF 。

  3、保存以上数据块(从 0x00020200 到 0x000F81FF 共 884736 字节) 到文件

  4、用YUVviewerPlus 打开该文件如下:

   

  显然,没有得到我想要的结果。很纳闷,怎么回事呢,难道不是我所想的那样,Uncompressed  也是需要解码的吗?

      一行数据应该占据多少个字节呢?一个宏像素为4个字节,实际表示2个像素。平均每个像素2个字节,则一行数据应该有720*2=1440个字节。

  而884736/576=1536 ,即现在每行有1536字节,多出了1536-1440=96字节。

      于是回头去分析一行数据(1536字节):

    

   ............

   

 数据从0x00020200到0x000207FF,惊奇的发现,数据末尾竟然有96字节的00,这不正好的多存储的字节吗?检查其余各行,均是如此。于是假设这96字节是用着数据填充所用,可以忽略。

5、重新生成一帧数据。根据以上分析,去掉CHUNK块中每行数据(1536字节)的填充(96字节),得到新的文件(大小829440=1440*576),利用 YUVviewerPlus 打开之:

 

哇,终于显示出来正常的东西了!但是还是不对,一看便知,该帧分两场存储。回头查看vprp头信息,果然如此。到这里,已经知道如何解码这个文件了。

只需按奇数场读取一行,偶数场读取一行这样的顺序间隔读取,便可以形成一个完整的帧。

四、将M101解码添加到ffmpeg中

完成之后,实际解码出来的第一帧如下:

 

 大功告成!

   第一次解码,如有错误,敬请指正。

Copyright © 2024 一有新人
Powered by .NET 9.0 on Kubernetes