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代码的一些分析,主要是框架吧。
MediaInfo代码阅读的更多相关文章
- 代码阅读分析工具Understand 2.0试用
Understand 2.0是一款源代码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实可以大大提高代码阅读效率.由于Understand功能十分强大,本文不可能详尽地介绍它的所有功能,所 ...
- Android 上的代码阅读器 CoderBrowserHD 修改支持 go 语言代码
我在Android上的代码阅读器用的是 https://github.com/zerob13/CoderBrowserHD 改造的版本,改造后的版本我放在 https://github.com/ghj ...
- Linux协议栈代码阅读笔记(二)网络接口的配置
Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...
- [置顶] Linux协议栈代码阅读笔记(一)
Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...
- 图形化代码阅读工具——Scitools Understand
Scitools出品的Understand 2.0.用了很多年了,比Source Insight强大很多.以前的名字叫Understand for C/C++,Understand for Java, ...
- Python - 关于代码阅读的一些建议
初始能力 让阅读思路保持清晰连贯,主力关注在流程架构和逻辑实现上,不被语法.技巧和业务流程等频繁地阻碍和打断. 建议基本满足以下条件,再开始进行代码阅读: 具备一定的语言基础:熟悉基础语法,常用的函数 ...
- Tools - 一些代码阅读的方法
1 初始能力 让阅读思路清晰连贯,保持在程序的流程架构和逻辑实现上,不被语法.编程技巧和业务流程等频繁地阻碍和打断. 语言基础:熟悉基础语法,常用的函数.库.编程技巧等: 了解设计模式.构建工具.代码 ...
- Bleve代码阅读(二)——Index Mapping
引言 Bleve是Golang实现的一个全文检索库,类似Lucene之于Java.在这里通过阅读其代码,来学习如何使用及定制检索功能.也是为了通过阅读代码,学习在具体环境下Golang的一些使用方式. ...
- Python3练习题系列(08)——代码阅读方法及字典跳转表理解
问题:分析下面代码 cities['_find'] = find_city city_found = cities['_find'](cities, state) 分析过程: 一个函数也可以作为一个变 ...
随机推荐
- jQuery中live函数的替代-【jQuery】
在老版本的jQuery中,当需要对页面上某个由ajax加载的某片段的页面内容响应事件时,可以使用live函数来响应其事件,比如: $('a').live('click', function() { b ...
- eclipse发布后在tomcat下没有文件夹,服务器的Server locations不能修改
主要是因为Server locations中的deploy路径不正确,要修改这个路径,需要移除服务器中的所有项目,然后点击清空,这时再双击服务器,既可修改这个设置.
- Python学习(十二) —— 面向对象
一.初识面向对象 面向过程的核心是过程,流水线思维,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点:极大地降低了写程序的复杂度,只需要顺着要执行的 ...
- RPG
有排成一行的n个方格,用红(Red).粉(Pink).绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.以上就是著名的RPG难题. 解 ...
- UDF、UDAF、UDTF函数编写
一.UDF函数编写 1.步骤 1.继承UDF类 2.重写evalute方法 .继承GenericUDF .实现initialize.evaluate.getDisplayString方法 2.案例 实 ...
- POJ 2155 Matrix 【二维树状数组】(二维单点查询经典题)
<题目链接> 题目大意: 给出一个初始值全为0的矩阵,对其进行两个操作. 1.给出一个子矩阵的左上角和右上角坐标,这两个坐标所代表的矩阵内0变成1,1变成0. 2.查询某个坐标的点的值. ...
- HDU 3639 Hawk-and-Chicken (强连通缩点+DFS)
<题目链接> 题目大意: 有一群孩子正在玩老鹰抓小鸡,由于想当老鹰的人不少,孩子们通过投票的方式产生,但是投票有这么一条规则:投票具有传递性,A支持B,B支持C,那么C获得2票(A.B共两 ...
- [ 严重 ] my网SQL注入
RANK 80 金币 100 数据包 POST maoyan.com/sendapp HTTP/1.1Host: xxx.maoyan.comUser-Agent: Mozilla/5.0 ( ...
- JVM 调优-给你的java应用看看病
目录 java 应用 1 cpu 负载过高 1.1 分析问题 1.2 解决方案 2 内存占用过多 2.1 从内存回收方面 2.2 从代码层面 java 应用 1 cpu 负载过高 1.1 分析问题 首 ...
- Java内存管理-一文掌握虚拟机创建对象的秘密(九)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! [福利]JVM系列学习资源无套路赠送 回顾一下: 本文是接着上一篇内容:Java内存管 ...