MediaInfo源代码分析 4:Inform()函数
我们来看一下MediaInfo中的Inform()函数的内部调用过程
首先Inform()函数封装了MediaInfo_Internal类中的Inform()函数
//返回文件信息
String MediaInfo::Inform(size_t)
{
//封装了一层
return Internal->Inform();
}
查看一下MediaInfo_Internal类中的Inform()函数的源代码:
// 获取信息
Ztring MediaInfo_Internal::Inform()
{
CS.Enter();
if (Info && Info->Status[File__Analyze::IsUpdated])
Info->Open_Buffer_Update();
CS.Leave(); if (MediaInfoLib::Config.Inform_Get()==__T("MPEG-7"))
return Export_Mpeg7().Transform(*this);
if (MediaInfoLib::Config.Inform_Get()==__T("PBCore") || MediaInfoLib::Config.Inform_Get()==__T("PBCore_1.2"))
return Export_PBCore().Transform(*this);
if (MediaInfoLib::Config.Inform_Get()==__T("reVTMD"))
return __T("reVTMD is disabled due to its non-free licensing."); //return Export_reVTMD().Transform(*this);
//获取相应的信息
if (!(
MediaInfoLib::Config.Inform_Get(__T("General")).empty()
&& MediaInfoLib::Config.Inform_Get(__T("Video")).empty()
&& MediaInfoLib::Config.Inform_Get(__T("Audio")).empty()
&& MediaInfoLib::Config.Inform_Get(__T("Text")).empty()
&& MediaInfoLib::Config.Inform_Get(__T("Chapters")).empty()
&& MediaInfoLib::Config.Inform_Get(__T("Image")).empty()
&& MediaInfoLib::Config.Inform_Get(__T("Menu")).empty()
))
{
//获取各种信息
//Retour即为返回的字符串
Ztring Retour;
Retour+=MediaInfoLib::Config.Inform_Get(__T("File_Begin"));
Retour+=MediaInfoLib::Config.Inform_Get(__T("General_Begin"));
Retour+=Inform(Stream_General, 0, false);
Retour+=MediaInfoLib::Config.Inform_Get(__T("General_End"));
if (Count_Get(Stream_Video))
Retour+=MediaInfoLib::Config.Inform_Get(__T("Video_Begin"));
for (size_t I1=0; I1<Count_Get(Stream_Video); I1++)
{
Retour+=Inform(Stream_Video, I1, false);
if (I1!=Count_Get(Stream_Video)-1)
Retour+=MediaInfoLib::Config.Inform_Get(__T("Video_Middle"));
}
if (Count_Get(Stream_Video))
Retour+=MediaInfoLib::Config.Inform_Get(__T("Video_End"));
if (Count_Get(Stream_Audio))
Retour+=MediaInfoLib::Config.Inform_Get(__T("Audio_Begin"));
for (size_t I1=0; I1<Count_Get(Stream_Audio); I1++)
{
Retour+=Inform(Stream_Audio, I1, false);
if (I1!=Count_Get(Stream_Audio)-1)
Retour+=MediaInfoLib::Config.Inform_Get(__T("Audio_Middle"));
}
if (Count_Get(Stream_Audio))
Retour+=MediaInfoLib::Config.Inform_Get(__T("Audio_End"));
if (Count_Get(Stream_Text))
Retour+=MediaInfoLib::Config.Inform_Get(__T("Text_Begin"));
for (size_t I1=0; I1<Count_Get(Stream_Text); I1++)
{
Retour+=Inform(Stream_Text, I1, false);
if (I1!=Count_Get(Stream_Text)-1)
Retour+=MediaInfoLib::Config.Inform_Get(__T("Text_Middle"));
}
if (Count_Get(Stream_Text))
Retour+=MediaInfoLib::Config.Inform_Get(__T("Text_End"));
if (Count_Get(Stream_Other))
Retour+=MediaInfoLib::Config.Inform_Get(__T("Chapters_Begin"));
for (size_t I1=0; I1<Count_Get(Stream_Other); I1++)
{
Retour+=Inform(Stream_Other, I1, false);
if (I1!=Count_Get(Stream_Other)-1)
Retour+=MediaInfoLib::Config.Inform_Get(__T("Chapters_Middle"));
}
if (Count_Get(Stream_Other))
Retour+=MediaInfoLib::Config.Inform_Get(__T("Chapters_End"));
if (Count_Get(Stream_Image))
Retour+=MediaInfoLib::Config.Inform_Get(__T("Image_Begin"));
for (size_t I1=0; I1<Count_Get(Stream_Image); I1++)
{
Retour+=Inform(Stream_Image, I1, false);
if (I1!=Count_Get(Stream_Image)-1)
Retour+=MediaInfoLib::Config.Inform_Get(__T("Image_Middle"));
}
if (Count_Get(Stream_Image))
Retour+=MediaInfoLib::Config.Inform_Get(__T("Image_End"));
if (Count_Get(Stream_Menu))
Retour+=MediaInfoLib::Config.Inform_Get(__T("Menu_Begin"));
for (size_t I1=0; I1<Count_Get(Stream_Menu); I1++)
{
Retour+=Inform(Stream_Menu, I1, false);
if (I1!=Count_Get(Stream_Menu)-1)
Retour+=MediaInfoLib::Config.Inform_Get(__T("Menu_Middle"));
}
if (Count_Get(Stream_Menu))
Retour+=MediaInfoLib::Config.Inform_Get(__T("Menu_End"));
Retour+=MediaInfoLib::Config.Inform_Get(__T("File_End"));
//可以在此加入视频质量检测----------------------------------------- //字符串替换?各种换行符统统改为“\n”-----------------------------
Retour.FindAndReplace(__T("\\r\\n"), __T("\n"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("\\r"), __T("\n"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("\\n"), __T("\n"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("\r\n"), __T("\n"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("\r"), __T("\n"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("\n"), MediaInfoLib::Config.LineSeparator_Get(), 0, Ztring_Recursive); //Special characters
Retour.FindAndReplace(__T("|SC1|"), __T("\\"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC2|"), __T("["), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC3|"), __T("]"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC4|"), __T(","), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC5|"), __T(";"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC6|"), __T("("), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC7|"), __T(")"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC8|"), __T(")"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC9|"), __T("),"), 0, Ztring_Recursive); return Retour;
} //Informations
Ztring Retour;
bool HTML=false;
bool XML=false;
bool CSV=false;
//获取配置信息(输出格式)
if (MediaInfoLib::Config.Inform_Get()==__T("HTML"))
HTML=true;
if (MediaInfoLib::Config.Inform_Get()==__T("XML"))
XML=true;
if (MediaInfoLib::Config.Inform_Get()==__T("CSV"))
CSV=true; if (HTML) Retour+=__T("<html>\n\n<head>\n<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /></head>\n<body>\n");
if (XML) Retour+=__T("<File>\n"); for (size_t StreamKind=(size_t)Stream_General; StreamKind<Stream_Max; StreamKind++)
{
//Pour chaque type de flux
for (size_t StreamPos=0; StreamPos<(size_t)Count_Get((stream_t)StreamKind); StreamPos++)
{
//Pour chaque stream
//输出为HTML
if (HTML) Retour+=__T("<table width=\"100%\" border=\"0\" cellpadding=\"1\" cellspacing=\"2\" style=\"border:1px solid Navy\">\n<tr>\n <td width=\"150\"><h2>");
//输出为XML
if (XML) Retour+=__T("<track type=\"");
Ztring A=Get((stream_t)StreamKind, StreamPos, __T("StreamKind/String"));
Ztring B=Get((stream_t)StreamKind, StreamPos, __T("StreamKindPos"));
if (!XML && !B.empty())
{
if (CSV)
A+=__T(",");
else
A+=MediaInfoLib::Config.Language_Get(__T(" Config_Text_NumberTag"));
A+=B;
}
Retour+=A;
if (XML)
{
Retour+=__T("\"");
if (!B.empty())
{
Retour+=__T(" streamid=\"");
Retour+=B;
Retour+=__T("\"");
}
}
//输出为HTML
if (HTML) Retour+=__T("</h2></td>\n </tr>");
//输出为XML
if (XML) Retour+=__T(">");
Retour+=MediaInfoLib::Config.LineSeparator_Get();
Retour+=Inform((stream_t)StreamKind, StreamPos, false);
Retour.FindAndReplace(__T("\\"), __T("|SC1|"), 0, Ztring_Recursive);
if (HTML) Retour+=__T("</table>\n<br />");
if (XML) Retour+=__T("</track>\n");
Retour+=MediaInfoLib::Config.LineSeparator_Get();
}
}
//输出为HTML
if (HTML) Retour+=__T("\n</body>\n</html>\n");
//输出为XML
if (XML) Retour+=__T("</File>\n");
//字符串替换?
Retour.FindAndReplace(__T("\\r\\n"), __T("\n"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("\\r"), __T("\n"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("\\n"), __T("\n"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("\r\n"), __T("\n"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("\r"), __T("\n"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("\n"), MediaInfoLib::Config.LineSeparator_Get(), 0, Ztring_Recursive); //Special characters
Retour.FindAndReplace(__T("|SC1|"), __T("\\"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC2|"), __T("["), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC3|"), __T("]"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC4|"), __T(","), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC5|"), __T(";"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC6|"), __T("("), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC7|"), __T(")"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC8|"), __T(")"), 0, Ztring_Recursive);
Retour.FindAndReplace(__T("|SC9|"), __T("),"), 0, Ztring_Recursive);
return Retour;
}
函数比较复杂,从代码中我们可以看出,Inform()的实质还是使用Get()一个一个取出所有的属性值。
当指定输出为XML或者是HTML的时候,在输出的字符串上加上相应的标签(例如,输出为HTML的时候,字符串每一行上加上“</tr><tr>”,首尾加上“<table></table>”)
具体每一块代码的含义已经写在注释中了。
MediaInfo源代码分析 4:Inform()函数的更多相关文章
- MediaInfo源代码分析 2:API函数
本文主要分析MediaInfo的API函数.它的API函数位于MediaInfo.h文件中的一个叫做MediaInfo的类中. 该类如下所示,部分重要的方法已经加上了注释: //MediaInfo类 ...
- MediaInfo源代码分析 3:Open()函数
我们来看一下MediaInfo中的Open()函数的内部调用过程 首先open函数封装了MediaInfo_Internal类中的open()函数 //打开文件 size_t MediaInfo::O ...
- MediaInfo源代码分析 1:整体结构
MediaInfo 用来分析视频和音频文件的编码和内容信息,是一款是自由软件 (免费使用.免费获得源代码).之前编程的时候,都是直接调用它提供的Dll,这次突然来了兴趣,想研究一下它内部究竟是怎么实现 ...
- 1.2. chromium源代码分析 - chromiumframe - 入口函数
ChromiumFrame的入口函数在main.cpp中,打开main.cpp.中包含3个类和_tWinMain函数._tWinMain就是我们要找的入口函数.我做了部分注释: int APIENTR ...
- javascript 引擎Rhino源代码分析 浅析 实例函数对象及this
http://blog.csdn.net/liantian_wu/article/details/49797481
- Media Player Classic - HC 源代码分析 6:MediaInfo选项卡 (CPPageFileMediaInfo)
===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...
- Media Player Classic - HC 源代码分析 7:详细信息选项卡(CPPageFileInfoDetails)
===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...
- Media Player Classic - HC 源代码分析 5:关于对话框 (CAboutDlg)
===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...
- Media Player Classic - HC 源代码分析 4:核心类 (CMainFrame)(3)
===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...
随机推荐
- 2016030202 - github中sshkey信息设置
根据github上面的提示生成ssh秘钥步骤 参考url:https://help.github.com/articles/generating-an-ssh-key/ 1.生成sshkey之前,检查 ...
- init_sequence所对应的函数
一.init_sequence内容 init_fnc_t *init_sequence[] = { cpu_init, /* basic cpu dependent setup */ board_in ...
- 学习Swift--属性
属性 属性将值跟特定的类.结构或枚举关联.存储属性存储常量或变量作为实例的一部分,而计算属性计算(不是存储)一个值.计算属性可以用于类.结构体和枚举,存储属性只能用于类和结构体. 存储属性和计算属性通 ...
- 字符串搜索算法Boyer-Moore
整理日: 2015年2月16日 1. 主要特征 假设文本串text长度为n,模式串pattern长度为m,BM算法的主要特征为: 从右往左进行比较匹配(一般的字符串搜索算法如KMP都是从从左往右进行匹 ...
- 利用Anaconda安装python后,如何安装opencv-python
利用Anaconda安装python后,想要安装opencv-python,但发现利用opencv-python的官方教程,没法实现opencv的安装 还好看到了另外一篇博客的方法,试一下,果然凑效 ...
- python ^M 产生的原因 及 lxml 如何获取text的原因
其实跟踪一下会发现,^M 是由于 /r/n 所造成的. article = dom_c.xpath('//td[@id="article_content"]//text()')co ...
- Hdu5517 Triple
Description Given the finite multi-set \(A\) of \(n\) pairs of integers, an another finite multi-set ...
- PHP 7 探针的安装与测试
首先,这是一篇软文,没错!就是一篇软文.因为我知道「PHP 是世界上最好的语言」,所以我相信很多人愿意读这篇用户帮忙写的软文,因为这篇软文应该能帮助 PHP 开发的同学一点小忙.我们是一家成立了7年的 ...
- 用JQUERY的deferred异步按顺序调用后端API
花了两天啊,想办法. 顺便,DJANGO分页的东东也熟悉了下. 如果不用最新的deferred这个东东,那我们以前传统的链式异步调用代码很难看,且长. 以下这个东东未作优化代码封装. this的参数用 ...
- 解除網頁無法選取文字、鎖右鍵限制:Enable Copy(Chrome 擴充套件)
有些网页因会因为某些因素而禁止浏览者直接复制网页上的内容,虽然我们了解站方的意思,不过有些时候会造成一些不必要的困扰. Enable Copy 这款Chrome 扩充套件可以帮你一键解除封锁右键和选取 ...