MediaInfo代码阅读

?

MediaInfo是一个用来分析媒体文件的开源工具。
支持的文件非常全面,基本上支持所有的媒体文件。

最近是在做HEVC开发,所以比较关注MediaInfo中关于HEVC的分析与处理。

从MeidaInfo的官网上下载下来的代码比较庞大,工程比较多,但是代码阅读的一个关键在于,先要抓住主干,然后再不断的深入。先找到自己关注的地方,然后分析,之后再进行分析一些相关的代码。

此处下载的是mediainfo 0.7.72版本。

从下图可以看出,mediaInfo中包括了诸多的工程。

?

其中,MediaInfoDll是用于生成Dll库的工程,MediaInfoLib是真正的用于分析媒体文件的库,zlib是一个用于无损压缩的库(http://www.zlib.net/),zenlib是一个C++库,其中封装了一些C++操作,比如字符串操作,configuration,bitstreams,threading,translation,和一些跨平台的函数。MediaInfo_CLI是用于生成mediainfo的命令行版本,相应的MediaInfo_GUI用于生成mediainfo的GUI版本。

?

对于MediaInfoLib工程也包括很多的文件:

?Archive:支持的各种压缩文档,包括7z,rar,zip,tar等格式

?Audio:支持的各种音频编码方式,包括aac,ac3,ape等等?

?Export:设置导出的格式,包括MPEG7格式?

?Image:支持的图片压缩编码方式,包括bmp,jpeg等常见格式?

?Muitiple:支持的文件封转格式,包括flv,mp4,mkv等格式

?Reader:支持的输入方式,一直以为MediaInfo只支持文件输入,后来发现还支持MMS这样的流媒体输入?

?Tag:支持的标签,包括idv3等等

Text:支持的文本。这个用的比较少 ?

?Video:支持的视频编码。包括H.264,H.263等。令人瞩目的是,也支持HEVC。

?

这儿我们主要看一看对HEVC的支持,位于文件File_Hevc.cpp中。

File_Hevc类是从File__Analyze继承而来,包括了对码流的分析。

为了分析VPS,SPS和PPS定义了相应的结构体:video_parameter_set_struct,seq_parameter_set_struct和pic_parameter_set_structs。

?

函数video_parameter_set()是提取VPS信息。

函数seq_parameter_set()提取SPS信息。这其中就包括了对裁剪窗口信息提取:

? ???TEST_SB_SKIP(???????????????????????????????????????????????"conformance_window_flag"?);

????????Get_UE?(conf_win_left_offset?,???????????????????????????"conf_win_left_offset"?);

????????Get_UE?(conf_win_right_offset?,??????????????????????????"conf_win_right_offset"?);

????????Get_UE?(conf_win_top_offset?,????????????????????????????"conf_win_top_offset"?);

????????Get_UE?(conf_win_bottom_offset?,?????????????????????????"conf_win_bottom_offset"?);

函数vui_parameters是分析VUI信息,因为其中包括了重要的视频信息:

? ???TEST_SB_SKIP(???????????????????????????????????????????????"vui_parameters_present_flag"?);

????????vui_parameters?(video_parameter_set_Item?,?vui_parameters_Item?);

函数pic_parameter_set()提取PPS信息。

?

函数sei_message()提取SEI信息,这个信息对于mediainfo来说也很重要。其中比较重要的是sei_message_user_data_unregistered,可能包含了编码器自定义的一些信息。当前版本中,支持x265和ateme两个编码器定义的信息。

?

函数hrd_parameters提取HRD信息,HRD信息是与码率控制相关的信息,

?

?

File_Hevc::Streams_Fill?()函数是对媒体文件中的hevc码流得到的信息填充到相应的结构中,便于被调用。

从这个函数代码可以看到,MediaINfo主要是对码流中的SPS信息进行分析。

? ? for (std::vector<seq_parameter_set_struct*>::iterator seq_parameter_set_Item=seq_parameter_sets.begin(); seq_parameter_set_Item!=seq_parameter_sets.end(); ++seq_parameter_set_Item)
??????? if ((*seq_parameter_set_Item))
??????????? Streams_Fill(seq_parameter_set_Item);

这一段代码调用另一个Streams_Fill函数来分析码流,如果存在多个SPS,会得到每个SPS的信息。

?

Stream_Fill函数中先计算了视频的分辨率大小,需要注意的是视频中可能有一些裁剪信息,需要利用这些信息来得到正确的宽高。

还有,对于MediaInfo这种主要为了分析码流信息的软件,需要特别注意HEVC中所支持的VUI,因为VUI中正是保存的视频相关的一些重要信息,包括timing_info, aspect_ratio_info等。在MediaInfo之前的版本中,由于忽略了aspect_ratio_info信息,得到的显示宽高比DAR信息是错误的。

?

?

从代码来看,mediainfo在分析码流过程中,跳过了很多的语法元素,因为很多语法元素它暂时是用不到的,它只是保存了那些需要的信息,如果以后再新版本中需要一些信息的话,估计到时候就是保存一下就可以了。

?

?

另外,在http://blog.csdn.net/leixiaohua1020/article/details/12449277处有为Mediainfo代码的一些分析,主要是框架吧。

时间: 2024-10-15 13:51:39

MediaInfo代码阅读的相关文章

《代码阅读方法与实践》阅读笔记之二

时间过得真快,一转眼,10天就过去了,感觉上次写阅读笔记的场景仿佛还历历在目.<代码阅读方法与实践>这本书真的很难写笔记,本来我看这本书的名字还以为书里大概写的都是些代码阅读的简易方法,心想着这就好写笔记了,没想到竟然好多都是我们之前学过的东西,这倒让我有点无从下手了.大概像我们这些还没有太多经历的大学生,总是习惯于尽量避免自己的工作量,总是试图找到一些完成事情的捷径吧.总之,尽管我不想承认,但我自己心里很清楚,我就是这种人.下面开始言归正传,说说接下来的几章内容归纳. 这本书在前面已经分析了

代码阅读问题

---恢复内容开始--- 下面列举阅读代码过程中遇到的问题和相应的资料查询: 1.namespace的用途:http://www.kuqin.com/language/20080107/3532.html 2.enum 的用途:http://pcedu.pconline.com.cn/empolder/gj/c/0502/562347.html 3.SFML:http://www.sfml-dev.org/ 4.双冒号的用法:http://blog.csdn.net/zimingjushi/ar

代码阅读方法与实践(三)

我们分析的许多系统都遵循一种简单的“主程序和子例程”结构.常见的.重要的结构可以归类为少数迥然相异的构架类型:集中式储存库.数据流.面向对象或分层构架.这些构架类型常常结合成一个层次结构用来控制大型系统的复杂性.接下来我们将独立的分析每种构架类型,但是一个系统可以同时展示出多种不同的构架类型.以不同的方式检查同一个系统.分许系统的不同部分.或使用不同级别的分解,都有可能发现不同的架构类型. 集中式储存库的构架模型依赖于一个中心过程或数据结构,他在系统中担任控制或信息的集线器.即使不需要数据库提供

《代码阅读方法与实践》阅读笔记三

之前已经看完了<代码阅读方法与实践>的前六章,基本上也就是看得比较粗略,没有很精细的阅读,上节课听到老师说的“学术交流会”还是很紧张的,挺害怕被问到问题,结果回答不出来可怎么办啊,不仅丢人,分也送给别人了啊,这可怎么破啊.所以呢,我打算近期再看一遍,不管有没有用,算是给自己加点自信吧. 第七章,讲的是编程规范和约定,主要就是文件的命名及组织.缩进.编排.命名约定.编程实践.过程规范之类的,其实这一章也不用我做过多的介绍,因为大家应该都有听各科老师讲过好几遍了,道理大家都懂,但是大家除了在理论上

《代码阅读方法与实践之读书笔记之一》

阅读代码是程序员的基本技能,同时也是软件开发.维护.演进.审查和重用过程中不可或缺的组成部分.<代码阅读方法与实践之读书笔记之一>这本书围绕代码阅读,详细论述了相关的知识与技能.我希望通过仔细阅读并学习本书,可以快速地提高我的代码阅读的技能与技巧,进而从现有的优秀代码.算法.构架.设计中汲取营养,提高自身的开发与设计能力.此次读了此书的前四章,以下是我从中汲取到的宝贵养分: 从第一章<导论>一节中我体会到了我们要养成一个经常花时间阅读别人编写的高品质代码的习惯,因为阅读高品质的代码

图形化代码阅读工具——Scitools Understand

Scitools出品的Understand 2.0.用了很多年了,比Source Insight强大很多.以前的名字叫Understand for C/C++,Understand for Java,Understand for Ada,最近这几年合并成了一个产品. 最值得一提的是各种关系图的绘制,以及在这些图上的交互操作:Declaration Graphs / Hierarchy Graphs / Control Flow Graphs / Dependency Graphs / UML C

NRE代码阅读记录

本来是为了论证自己的观点,把安全标签打在RunningConfig里,就写了个代码分析,结果写着写着发现的确不应该是在RunningVM里.意外的发现看代码的时候这么写写还是挺不错的,也避免了看了后面的忘记前面的.这种底层的代码实在是很难理解,对我来说就像是小学生去算高数一样,也只能硬着头皮去看了. vmmng.cc对应的就是如下界面(回头放图上来,ubuntu下没有什么截图工具,总不能把整个屏幕放上来)然后"3"键可以新建tiny-core虚拟机,对应到代码里,也就是input_th

代码阅读分析工具Understand 2.0试用

Understand 2.0是一款源码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实能够大大提高代码阅读效率.因为Understand功能十分强大,本文不可能详尽地介绍它的全部功能,所以仅仅列举本人觉得比較重要或有特色的功能,以做抛砖引玉之举. Understand 2.0能够从http://www.scitools.com/下载到,安装后能够试用15天. 使用Understand阅读代码前,要先创建一个Project,然后把全部的源码文件增加到这个Project里.这里我创建了一

Mangos代码阅读

Mangos代码阅读 2010-12-14 15:51:07|  分类: mangos研究|举报|字号 订阅 逻辑层: 类World实现了wow的World,所有的逻辑处理 MaNGOS 下载,编译,配置和运行的基本步骤 下载和安装msysgit,用于代码管理我使用的是Git-1.6.5.1-preview20091022.exe  下载和安装tortoisegit,用于代码管理我使用的是TortoiseGit-1.3.2.0-32bit.msi  使用git://github.com/mang