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 ...
随机推荐
- 彻底删除sql2008r2
一. SQL2008卸载. 1.从控制面板卸载 1)点击计算机右下角“开始”,点击“控制面板” 2)点击“卸载程序”. 3)在程序列表中找到“Microsoft SQL Server 2008” ...
- 两个winform窗体同步
/// <summary> /// 初始left距离 /// </summary> int initx = 0; /// ...
- linux shell获取时间
获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量DATE=$(date +%Y%m%d) 有时候我们需要使用今天之前或者往后的日期,这时可以使用 ...
- 【python】运算优先级
来源:小甲鱼 课件
- Day21 Django之Form文件上传、原生Ajax和实现抽屉实例
一.Form文件上传 """ Django settings for prev_chouti project. Generated by 'django-admin st ...
- 基于page的简单页面推送技术
我们可以先看下简单效果,打开2个页面可以看到推送效果 服务端我们只需要下面一个方法 using System; using System.Collections.Generic; using Syst ...
- ASP.NET MVC轻教程 Step By Step 9——分页
现在我们要把Index视图的留言信息进行分页显示. Step 1. 创建路由 我们希望以类似地址http://localhost:41583/Page1来表示第一页,Page2表示第二页,以此类推.在 ...
- Application(全局对象,ViewState
Application对象生存期和Web应用程序生存期一样长,生存期从Web应用程序网页被访问开始,HttpApplication类对象Application被自动创建,直到没有一个网页被访问时结束, ...
- C# mvc 验证码2
public class ValidateCode { /// <summary> /// 產生圖形驗證碼. /// </su ...
- java web 代码
原 30套JSP网站源代码合集 IT小白白 发布时间: 2012/12/28 14:30 阅读: 272 收藏: 3 点赞: 0 评论: 0 JSP技术是以Java语言作为脚本语言的,JSP网页为整个 ...