MediaInfo源代码分析 3:Open()函数

来源:互联网 发布:数据库系统有哪些特点 编辑:程序博客网 时间:2024/05/21 09:15

=====================================================

MediaInfo源代码分析系列文章列表:

MediaInfo源代码分析 1:整体结构
MediaInfo源代码分析 2:API函数
MediaInfo源代码分析 3:Open()函数
MediaInfo源代码分析 4:Inform()函数
MediaInfo源代码分析 5:JPEG解析代码分析

=====================================================


我们来看一下MediaInfo中的Open()函数的内部调用过程

首先open函数封装了MediaInfo_Internal类中的open()函数

//打开文件size_t MediaInfo::Open(const String &File_Name_){//封装了一层    return Internal->Open(File_Name_);}


查看一下MediaInfo_Internal类中的open()函数的源代码:

//打开文件size_t MediaInfo_Internal::Open(const String &File_Name_){    Close();    CS.Enter();    MEDIAINFO_DEBUG_CONFIG_TEXT(Debug+=__T("Open, File=");Debug+=Ztring(File_Name_).c_str();)    //清空文件列表Config.File_Names.clear();    if (Config.File_FileNameFormat_Get()==__T("CSV"))    {        Config.File_Names.Separator_Set(0, __T(","));        Config.File_Names.Write(File_Name_);    }//添加文件名到文件名列表    else if (!File_Name_.empty())        Config.File_Names.push_back(File_Name_);    if (Config.File_Names.empty())    {        CS.Leave();        return 0;    }    Config.File_Names_Pos=1;    CS.Leave();    //Parsing//解析    if (BlockMethod==1)    {        if (!IsInThread) //If already created, the routine will read the new files        {            Run();            IsInThread=true;        }        return 0;    }    else    {        Entry(); //Normal parsing        return Count_Get(Stream_General);    }}


在打开之前首先调用Close()进行清理,将文件路径添加到一个列表(实际上是一个Vector)中,调用Entry()进行解析。

查看一下Entry()函数的源代码:

//解析函数void MediaInfo_Internal::Entry(){    CS.Enter();    MEDIAINFO_DEBUG_CONFIG_TEXT(Debug+=__T("Entry");)    Config.State_Set(0);    CS.Leave();//解析文件名(是否包含MMS?)//需要libmms    if ((Config.File_Names[0].size()>=6        && Config.File_Names[0][0]==__T('m')        && Config.File_Names[0][1]==__T('m')        && Config.File_Names[0][2]==__T('s')        && Config.File_Names[0][3]==__T(':')        && Config.File_Names[0][4]==__T('/')        && Config.File_Names[0][5]==__T('/'))        || (Config.File_Names[0].size()>=7        && Config.File_Names[0][0]==__T('m')        && Config.File_Names[0][1]==__T('m')        && Config.File_Names[0][2]==__T('s')        && Config.File_Names[0][3]==__T('h')        && Config.File_Names[0][4]==__T(':')        && Config.File_Names[0][5]==__T('/')        && Config.File_Names[0][6]==__T('/')))        #if defined(MEDIAINFO_LIBMMS_YES)            Reader_libmms().Format_Test(this, Config.File_Names[0]);        #else //MEDIAINFO_LIBMMS_YES            {            #if MEDIAINFO_EVENTS                struct MediaInfo_Event_Log_0 Event;                Event.EventCode=MediaInfo_EventCode_Create(MediaInfo_Parser_None, MediaInfo_Event_Log, 0);                Event.Type=0xC0;                Event.Severity=0xFF;                Event.MessageCode=0;                Event.MessageStringU=L"Libmms cupport is disabled due to compilation options";                Event.MessageStringA="Libmms cupport is disabled due to compilation options";                MediaInfoLib::Config.Event_Send((const int8u*)&Event, sizeof(MediaInfo_Event_Log_0));            #endif //MEDIAINFO_EVENTS            }        #endif //MEDIAINFO_LIBMMS_YES//是否包含网络协议?(标记为://)//需要使用libcurl - the multiprotocol file transfer library    else if (Config.File_Names[0].find(__T("://"))!=string::npos)        #if defined(MEDIAINFO_LIBCURL_YES)        {            CS.Enter();            if (Reader)            {                CS.Leave();                return; //There is a problem            }            Reader=new Reader_libcurl();            CS.Leave();            Reader->Format_Test(this, Config.File_Names[0]);            #if MEDIAINFO_NEXTPACKET                if (Config.NextPacket_Get())                    return;            #endif //MEDIAINFO_NEXTPACKET        }        #else //MEDIAINFO_LIBCURL_YES            {            #if MEDIAINFO_EVENTS                struct MediaInfo_Event_Log_0 Event;                Event.EventCode=MediaInfo_EventCode_Create(MediaInfo_Parser_None, MediaInfo_Event_Log, 0);                Event.Type=0xC0;                Event.Severity=0xFF;                Event.MessageCode=0;                Event.MessageStringU=L"Libcurl support is disabled due to compilation options";                Event.MessageStringA="Libcurl support is disabled due to compilation options";                MediaInfoLib::Config.Event_Send((const int8u*)&Event, sizeof(MediaInfo_Event_Log_0));            #endif //MEDIAINFO_EVENTS            }        #endif //MEDIAINFO_LIBCURL_YES    #if defined(MEDIAINFO_DIRECTORY_YES)        else if (Dir::Exists(Config.File_Names[0]))            Reader_Directory().Format_Test(this, Config.File_Names[0]);    #endif //MEDIAINFO_DIRECTORY_YES//是普通文件,并且文件存在    #if defined(MEDIAINFO_FILE_YES)        else if (File::Exists(Config.File_Names[0]))        {            #if defined(MEDIAINFO_REFERENCES_YES)                string Dxw;                if (Config.File_CheckSideCarFiles_Get() && !Config.File_IsReferenced_Get())                {//Zenlib中竟然包含专用于文件名操作的类!                    FileName Test(Config.File_Names[0]);//获得小写的文件名后缀                    Ztring FileExtension=Test.Extension_Get();                    FileExtension.MakeLowerCase();//逐个比较(这些都是文本文件的后缀)                    if (FileExtension!=__T("dfxp"))                    {                        Test.Extension_Set(__T("dfxp"));                        if (File::Exists(Test))                            Dxw+=" <clip file=\""+Test.Name_Get().To_UTF8()+".dfxp\" />\r\n";                    }                    if (FileExtension!=__T("sami"))                    {                        Test.Extension_Set(__T("sami"));                        if (File::Exists(Test))                            Dxw+=" <clip file=\""+Test.Name_Get().To_UTF8()+".sami\" />\r\n";                    }                    if (FileExtension!=__T("sc2"))                    {                        Test.Extension_Set(__T("sc2"));                        if (File::Exists(Test))                            Dxw+=" <clip file=\""+Test.Name_Get().To_UTF8()+".sc2\" />\r\n";                    }                    if (FileExtension!=__T("scc"))                    {                        Test.Extension_Set(__T("scc"));                        if (File::Exists(Test))                            Dxw+=" <clip file=\""+Test.Name_Get().To_UTF8()+".scc\" />\r\n";                    }                    if (FileExtension!=__T("smi"))                    {                        Test.Extension_Set(__T("smi"));                        if (File::Exists(Test))                            Dxw+=" <clip file=\""+Test.Name_Get().To_UTF8()+".smi\" />\r\n";                    }//字幕                    if (FileExtension!=__T("srt"))                    {                        Test.Extension_Set(__T("srt"));                        if (File::Exists(Test))                            Dxw+=" <clip file=\""+Test.Name_Get().To_UTF8()+".srt\" />\r\n";                    }                    if (FileExtension!=__T("stl"))                    {                        Test.Extension_Set(__T("stl"));                        if (File::Exists(Test))                            Dxw+=" <clip file=\""+Test.Name_Get().To_UTF8()+".stl\" />\r\n";                    }                    Ztring Name=Test.Name_Get();                    Ztring BaseName=Name.SubString(Ztring(), __T("_"));                    if (!BaseName.empty())                    {                        ZtringList List;                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_audio.mp4"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_sub.dfxp"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_sub.sami"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_sub.sc2"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_sub.scc"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_sub.smi"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_sub.srt"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_sub.stl"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_forcesub.dfxp"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_forcesub.sami"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_forcesub.sc2"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_forcesub.scc"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_forcesub.smi"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_forcesub.srt"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_forcesub.stl"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_cc.dfxp"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_cc.sami"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_cc.sc2"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_cc.scc"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_cc.smi"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_cc.srt"), Dir::Include_Files);                        List+=Dir::GetAllFileNames(Test.Path_Get()+PathSeparator+BaseName+__T("_*_cc.stl"), Dir::Include_Files);                        for (size_t Pos=0; Pos<List.size(); Pos++)                            Dxw+=" <clip file=\""+List[Pos].To_UTF8()+"\" />\r\n";                    }                    if (!Dxw.empty())                    {                        Dxw.insert(0, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n"                                "<indexFile xmlns=\"urn:digimetrics-xml-wrapper\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:digimetrics-xml-wrapper DMSCLIP.XSD\">\r\n"                                " <clip source=\"main\" file=\""+FileName(Config.File_Names[0]).Name_Get().To_UTF8()+"."+FileName(Config.File_Names[0]).Extension_Get().To_UTF8()+"\" />\r\n");                        Dxw.append("</indexFile>\r\n");                        Config.File_FileNameFormat_Set(__T("Dxw"));                    }                }//为空                if (Dxw.empty())                {                    CS.Enter();                    if (Reader)                    {                        CS.Leave();                        return; //There is a problem                    }                    Reader=new Reader_File();                    CS.Leave();//测试格式                    Reader->Format_Test(this, Config.File_Names[0]);                }                else                {//初始化Buffer                    Open_Buffer_Init(Dxw.size(), FileName(Config.File_Names[0]).Path_Get()+PathSeparator+FileName(Config.File_Names[0]).Name_Get());                    Open_Buffer_Continue((const int8u*)Dxw.c_str(), Dxw.size());                    Open_Buffer_Finalize();                }            #else //defined(MEDIAINFO_REFERENCES_YES)                CS.Enter();                if (Reader)                {                    CS.Leave();                    return; //There is a problem                }                Reader=new Reader_File();                CS.Leave();                Reader->Format_Test(this, Config.File_Names[0]);            #endif //defined(MEDIAINFO_REFERENCES_YES)            #if MEDIAINFO_NEXTPACKET                if (Config.NextPacket_Get())                    return;            #endif //MEDIAINFO_NEXTPACKET        }    #endif //MEDIAINFO_FILE_YES    CS.Enter();    Config.State_Set(1);    CS.Leave();}


我们可以看出,MediaInfo支持流媒体协议作为输入源(例如mms),但前提是要使用相应的库(libmms,或者libcurl)。它会首先查找文件路径中有没有“://”,判断是否是流媒体输入。

大多数情况下,我们使用本地文件路径作为输入源。这是我们就进入了代码中“#if defined(MEDIAINFO_FILE_YES) "部分下面的代码。具体每块代码的左右都写在代码注释中了,不再细说。最后使用 Reader_File的Format_Test()测试输入文件的格式。

看一下Reader_File的Format_Test()的源代码:

//用于测试文件格式size_t Reader_File::Format_Test(MediaInfo_Internal* MI, String File_Name){    //std::cout<<Ztring(File_Name).To_Local().c_str()<<std::endl;    //With Parser MultipleParsing    /*    MI->Open_Buffer_Init((int64u)-1, File_Name);    if (Format_Test_PerParser(MI, File_Name))         return 1;    return 0; //There is a problem    */    //Get the Extension//文件后缀    Ztring Extension=FileName::Extension_Get(File_Name);    Extension.MakeLowerCase();    //Search the theorical format from extension    InfoMap &FormatList=MediaInfoLib::Config.Format_Get();    InfoMap::iterator Format=FormatList.end();    if (!MI->Config.File_ForceParser_Get().empty())        Format=FormatList.find(MI->Config.File_ForceParser_Get());    if (Format==FormatList.end())    {        Format=FormatList.begin();        while (Format!=FormatList.end())        {            const Ztring &Extensions=FormatList.Get(Format->first, InfoFormat_Extensions);            if (Extensions.find(Extension)!=Error)            {                if(Extension.size()==Extensions.size())                    break; //Only one extenion in the list                if(Extensions.find(Extension+__T(" "))!=Error                || Extensions.find(__T(" ")+Extension)!=Error)                    break;            }            ++Format;        }    }    if (Format!=FormatList.end())    {        const Ztring &Parser=Format->second(InfoFormat_Parser);        if (MI->SelectFromExtension(Parser))        {            //Test the theorical format            if (Format_Test_PerParser(MI, File_Name)>0)                 return 1;        }    }//遍历所有支持格式,测试格式    size_t ToReturn=MI->ListFormats(File_Name);    return ToReturn;}


可以看出,最后遍历了所有支持的格式,试图找出合适的格式。

 最后我们看一下ListFormats()函数,用于找出匹配的格式。

由代码可见,遍历测试每一种支持的格式。

int MediaInfo_Internal::ListFormats(const String &File_Name){    // Multiple// 看看这些格式都是否支持//从上往下遍历//如果遇到某一格式,返回值为1,便不再进行//否则就进行下一个,直到遍历完    #if defined(MEDIAINFO_BDAV_YES)        delete Info; Info=new File_MpegTs(); ((File_MpegTs*)Info)->BDAV_Size=4; if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_BDMV_YES)        delete Info; Info=new File_Bdmv();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_CDXA_YES)        delete Info; Info=new File_Cdxa();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_DCP_YES)        delete Info; Info=new File_Dcp();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_DVDIF_YES)        delete Info; Info=new File_DvDif();              if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_DVDV_YES)        delete Info; Info=new File_Dvdv();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_DXW_YES)        delete Info; Info=new File_Dxw();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_FLV_YES)//检测        delete Info; Info=new File_Flv();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_GXF_YES)        delete Info; Info=new File_Gxf();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_HLS_YES)        delete Info; Info=new File_Hls();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_IBI_YES)        delete Info; Info=new File_Ibi();                 if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_ISM_YES)        delete Info; Info=new File_Ism();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_IVF_YES)        delete Info; Info=new File_Ivf();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_LXF_YES)        delete Info; Info=new File_Lxf();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_MK_YES)        delete Info; Info=new File_Mk();                 if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_MPEG4_YES)        delete Info; Info=new File_Mpeg4();              if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_MPEGPS_YES)        delete Info; Info=new File_MpegPs();             if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_MPEGTS_YES)        delete Info; Info=new File_MpegTs();             if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_MPLI_YES)        delete Info; Info=new File_Mpli();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_MXF_YES)        delete Info; Info=new File_Mxf();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_NUT_YES)        delete Info; Info=new File_Nut();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_OGG_YES)        delete Info; Info=new File_Ogg();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_P2_YES)        delete Info; Info=new File_P2_Clip();            if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_PMP_YES)        delete Info; Info=new File_Pmp();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_RIFF_YES)        delete Info; Info=new File_Riff();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_RM_YES)        delete Info; Info=new File_Rm();                 if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_SEQUENCEINFO_YES)        delete Info; Info=new File_SequenceInfo();       if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_SKM_YES)        delete Info; Info=new File_Skm();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_SWF_YES)        delete Info; Info=new File_Swf();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_TSP_YES)        delete Info; Info=new File_MpegTs(); ((File_MpegTs*)Info)->TSP_Size=16; if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_WM_YES)        delete Info; Info=new File_Wm();                 if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_XDCAM_YES)        delete Info; Info=new File_Xdcam_Clip();         if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_DPG_YES)        delete Info; Info=new File_Dpg();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    // Video    #if defined(MEDIAINFO_AVC_YES)        delete Info; Info=new File_Avc();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_HEVC_YES)        delete Info; Info=new File_Hevc();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_AVSV_YES)        delete Info; Info=new File_AvsV();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_DIRAC_YES)        delete Info; Info=new File_Dirac();              if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_FLIC_YES)        delete Info; Info=new File_Flic();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_H263_YES)        delete Info; Info=new File_H263();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_MPEG4V_YES)        delete Info; Info=new File_Mpeg4v();             if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_MPEGV_YES)        delete Info; Info=new File_Mpegv();              if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_VC1_YES)        delete Info; Info=new File_Vc1();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_VC3_YES)        delete Info; Info=new File_Vc3();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_Y4M_YES)        delete Info; Info=new File_Y4m();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    // Audio    #if defined(MEDIAINFO_AAC_YES)        delete Info; Info=new File_Aac();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_AC3_YES)        delete Info; Info=new File_Ac3();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_SMPTEST0337_YES)        delete Info; Info=new File_SmpteSt0337();        if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_ALS_YES)        delete Info; Info=new File_Als();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_AMR_YES)        delete Info; Info=new File_Amr();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_AMV_YES)        delete Info; Info=new File_Amv();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_APE_YES)        delete Info; Info=new File_Ape();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_AU_YES)        delete Info; Info=new File_Au();                 if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_DTS_YES)        delete Info; Info=new File_Dts();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif//    Too many false-positives//    #if defined(MEDIAINFO_DOLBYE_YES)//        delete Info; Info=new File_DolbyE();             if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;//    #endif    #if defined(MEDIAINFO_FLAC_YES)        delete Info; Info=new File_Flac();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_IT_YES)        delete Info; Info=new File_ImpulseTracker();     if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_LA_YES)        delete Info; Info=new File_La();                 if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_MIDI_YES)        delete Info; Info=new File_Midi();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_MOD_YES)        delete Info; Info=new File_Module();             if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_MPC_YES)        delete Info; Info=new File_Mpc();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_MPCSV8_YES)        delete Info; Info=new File_MpcSv8();             if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_MPEGA_YES)        delete Info; Info=new File_Mpega();              if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_RKAU_YES)        delete Info; Info=new File_Rkau();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_TAK_YES)        delete Info; Info=new File_Tak();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_S3M_YES)        delete Info; Info=new File_ScreamTracker3();     if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_TTA_YES)        delete Info; Info=new File_Tta();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_TWINVQ_YES)        delete Info; Info=new File_TwinVQ();             if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_WVPK_YES)        delete Info; Info=new File_Wvpk();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_XM_YES)        delete Info; Info=new File_ExtendedModule();     if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    // Text    #if defined(MEDIAINFO_N19_YES)        delete Info; Info=new File_N19();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_SCC_YES)        delete Info; Info=new File_Scc();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_SUBRIP_YES)        delete Info; Info=new File_SubRip();             if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_TTML_YES)        delete Info; Info=new File_Ttml();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_OTHERTEXT_YES)        delete Info; Info=new File_OtherText();          if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    // Image    #if defined(MEDIAINFO_BMP_YES)        delete Info; Info=new File_Bmp();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_DPX_YES)        delete Info; Info=new File_Dpx();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_GIF_YES)        delete Info; Info=new File_Gif();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_ICO_YES)        delete Info; Info=new File_Ico();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_JPEG_YES)        delete Info; Info=new File_Jpeg();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_PCX_YES)        delete Info; Info=new File_Pcx();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_PNG_YES)        delete Info; Info=new File_Png();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_PSD_YES)        delete Info; Info=new File_Psd();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_TIFF_YES)        delete Info; Info=new File_Tiff();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_TGA_YES)        delete Info; Info=new File_Tga();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    // Archive    #if defined(MEDIAINFO_ACE_YES)        delete Info; Info=new File_Ace();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_7Z_YES)        delete Info; Info=new File_7z();                 if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_BZIP2_YES)        delete Info; Info=new File_Bzip2();              if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_ELF_YES)        delete Info; Info=new File_Elf();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_GZIP_YES)        delete Info; Info=new File_Gzip();               if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_ISO9660_YES)        delete Info; Info=new File_Iso9660();            if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_MZ_YES)        delete Info; Info=new File_Mz();                 if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_RAR_YES)        delete Info; Info=new File_Rar();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_TAR_YES)        delete Info; Info=new File_Tar();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    #if defined(MEDIAINFO_ZIP_YES)        delete Info; Info=new File_Zip();                if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    // Other    #if !defined(MEDIAINFO_OTHER_NO)        delete Info; Info=new File_Other();              if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    #endif    // Default (empty)        delete Info; Info=new File_Unknown();            if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1;    return 0;}


 

至此Open()函数的分析完毕。

原创粉丝点击