/*  Copyright (c) MediaArea.net SARL. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license that can
 *  be found in the License.html file in the root of the source tree.
 */
 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Global configuration of MediaInfo
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
//---------------------------------------------------------------------------
// Pre-compilation
#include "MediaInfo/PreComp.h"
#ifdef __BORLANDC__
    #pragma hdrstop
#endif
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
// Debug
#ifdef MEDIAINFO_DEBUG
    #include <stdio.h>
    #include <windows.h>
    namespace MediaInfo_Config_Debug
    {
        FILE* F;
        std::string Debug;
        SYSTEMTIME st_In;
 
        void Debug_Open(bool Out)
        {
            F=fopen("C:\\Temp\\MediaInfo_Debug.txt", "a+t");
            Debug.clear();
            SYSTEMTIME st;
            GetLocalTime( &st );
 
            char Duration[100];
            if (Out)
            {
                FILETIME ft_In;
                if (SystemTimeToFileTime(&st_In, &ft_In))
                {
                    FILETIME ft_Out;
                    if (SystemTimeToFileTime(&st, &ft_Out))
                    {
                        ULARGE_INTEGER UI_In;
                        UI_In.HighPart=ft_In.dwHighDateTime;
                        UI_In.LowPart=ft_In.dwLowDateTime;
 
                        ULARGE_INTEGER UI_Out;
                        UI_Out.HighPart=ft_Out.dwHighDateTime;
                        UI_Out.LowPart=ft_Out.dwLowDateTime;
 
                        ULARGE_INTEGER UI_Diff;
                        UI_Diff.QuadPart=UI_Out.QuadPart-UI_In.QuadPart;
 
                        FILETIME ft_Diff;
                        ft_Diff.dwHighDateTime=UI_Diff.HighPart;
                        ft_Diff.dwLowDateTime=UI_Diff.LowPart;
 
                        SYSTEMTIME st_Diff;
                        if (FileTimeToSystemTime(&ft_Diff, &st_Diff))
                        {
                            sprintf(Duration, "%02hd:%02hd:%02hd.%03hd", st_Diff.wHour, st_Diff.wMinute, st_Diff.wSecond, st_Diff.wMilliseconds);
                        }
                        else
                            strcpy(Duration, "            ");
                    }
                    else
                        strcpy(Duration, "            ");
 
                }
                else
                    strcpy(Duration, "            ");
            }
            else
            {
                st_In=st;
                strcpy(Duration, "            ");
            }
 
            fprintf(F,"                                       %02hd:%02hd:%02hd.%03hd %s", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, Duration);
        }
 
        void Debug_Close()
        {
            Debug += "\r\n";
            fwrite(Debug.c_str(), Debug.size(), 1, F); \
            fclose(F);
        }
    }
    using namespace MediaInfo_Config_Debug;
 
    #define MEDIAINFO_DEBUG1(_NAME,_TOAPPEND) \
        Debug_Open(false); \
        Debug+=", ";Debug+=_NAME; \
        _TOAPPEND; \
        Debug_Close();
 
    #define MEDIAINFO_DEBUG2(_NAME,_TOAPPEND) \
        Debug_Open(true); \
        Debug+=", ";Debug+=_NAME; \
        _TOAPPEND; \
        Debug_Close();
#else // MEDIAINFO_DEBUG
    #define MEDIAINFO_DEBUG1(_NAME,_TOAPPEND)
    #define MEDIAINFO_DEBUG2(_NAME,_TOAPPEND)
#endif // MEDIAINFO_DEBUG
 
//---------------------------------------------------------------------------
#include "MediaInfo/Setup.h"
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include "MediaInfo/MediaInfo_Config.h"
#include "ZenLib/ZtringListListF.h"
#if defined(MEDIAINFO_FILE_YES)
#include "ZenLib/File.h"
#endif //defined(MEDIAINFO_REFERENCES_YES)
#include <algorithm>
#if defined(MEDIAINFO_LIBCURL_YES)
    #include "MediaInfo/Reader/Reader_libcurl.h"
#endif //defined(MEDIAINFO_LIBCURL_YES)
#if defined(MEDIAINFO_GRAPHVIZ_YES)
    #include "MediaInfo/Export/Export_Graph.h"
#endif //defined(MEDIAINFO_GRAPHVIZ_YES)
#if defined(MEDIAINFO_EBUCORE_YES)
    #include "MediaInfo/Export/Export_EbuCore.h"
#endif //defined(MEDIAINFO_EBUCORE_YES)
using namespace ZenLib;
using namespace std;
//---------------------------------------------------------------------------
 
namespace MediaInfoLib
{
 
//---------------------------------------------------------------------------
const Char*  MediaInfo_Version=__T("MediaInfoLib - v21.09");
const Char*  MediaInfo_Url=__T("http://MediaArea.net/MediaInfo");
      Ztring EmptyZtring;       //Use it when we can't return a reference to a true Ztring
const Ztring EmptyZtring_Const; //Use it when we can't return a reference to a true Ztring, const version
const ZtringListList EmptyZtringListList_Const; //Use it when we can't return a reference to a true ZtringListList, const version
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
extern const int16u Ztring_MacRoman[128]=
{
    0x00C4,
    0x00C5,
    0x00C7,
    0x00C9,
    0x00D1,
    0x00D6,
    0x00DC,
    0x00E1,
    0x00E0,
    0x00E2,
    0x00E4,
    0x00E3,
    0x00E5,
    0x00E7,
    0x00E9,
    0x00E8,
    0x00EA,
    0x00EB,
    0x00ED,
    0x00EC,
    0x00EE,
    0x00EF,
    0x00F1,
    0x00F3,
    0x00F2,
    0x00F4,
    0x00F6,
    0x00F5,
    0x00FA,
    0x00F9,
    0x00FB,
    0x00FC,
    0x2020,
    0x00B0,
    0x00A2,
    0x00A3,
    0x00A7,
    0x2022,
    0x00B6,
    0x00DF,
    0x00AE,
    0x00A9,
    0x2122,
    0x00B4,
    0x00A8,
    0x2260,
    0x00C6,
    0x00D8,
    0x221E,
    0x00B1,
    0x2264,
    0x2265,
    0x00A5,
    0x00B5,
    0x2202,
    0x2211,
    0x220F,
    0x03C0,
    0x222B,
    0x00AA,
    0x00BA,
    0x03A9,
    0x00E6,
    0x00F8,
    0x00BF,
    0x00A1,
    0x00AC,
    0x221A,
    0x0192,
    0x2248,
    0x2206,
    0x00AB,
    0x00BB,
    0x2026,
    0x00A0,
    0x00C0,
    0x00C3,
    0x00D5,
    0x0152,
    0x0153,
    0x2013,
    0x2014,
    0x201C,
    0x201D,
    0x2018,
    0x2019,
    0x00F7,
    0x25CA,
    0x00FF,
    0x0178,
    0x2044,
    0x20AC,
    0x2039,
    0x203A,
    0xFB01,
    0xFB02,
    0x2021,
    0x00B7,
    0x201A,
    0x201E,
    0x2030,
    0x00C2,
    0x00CA,
    0x00C1,
    0x00CB,
    0x00C8,
    0x00CD,
    0x00CE,
    0x00CF,
    0x00CC,
    0x00D3,
    0x00D4,
    0xF8FF,
    0x00D2,
    0x00DA,
    0x00DB,
    0x00D9,
    0x0131,
    0x02C6,
    0x02DC,
    0x00AF,
    0x02D8,
    0x02D9,
    0x02DA,
    0x00B8,
    0x02DD,
    0x02DB,
    0x02C7,
};
 
//---------------------------------------------------------------------------
void MediaInfo_Config_CodecID_General_Mpeg4   (InfoMap &Info);
void MediaInfo_Config_CodecID_Video_Matroska  (InfoMap &Info);
void MediaInfo_Config_CodecID_Video_Mpeg4     (InfoMap &Info);
void MediaInfo_Config_CodecID_Video_Ogg       (InfoMap &Info);
void MediaInfo_Config_CodecID_Video_Real      (InfoMap &Info);
void MediaInfo_Config_CodecID_Video_Riff      (InfoMap &Info);
void MediaInfo_Config_CodecID_Audio_Matroska  (InfoMap &Info);
void MediaInfo_Config_CodecID_Audio_Mpeg4     (InfoMap &Info);
void MediaInfo_Config_CodecID_Audio_Ogg       (InfoMap &Info);
void MediaInfo_Config_CodecID_Audio_Real      (InfoMap &Info);
void MediaInfo_Config_CodecID_Audio_Riff      (InfoMap &Info);
void MediaInfo_Config_CodecID_Text_Matroska   (InfoMap &Info);
void MediaInfo_Config_CodecID_Text_Mpeg4      (InfoMap &Info);
void MediaInfo_Config_CodecID_Text_Riff       (InfoMap &Info);
void MediaInfo_Config_CodecID_Other_Mpeg4     (InfoMap &Info);
void MediaInfo_Config_Codec                   (InfoMap &Info);
void MediaInfo_Config_DefaultLanguage         (Translation &Info);
void MediaInfo_Config_Iso639_1                (InfoMap &Info);
void MediaInfo_Config_Iso639_2                (InfoMap &Info);
void MediaInfo_Config_General                 (ZtringListList &Info);
void MediaInfo_Config_Video                   (ZtringListList &Info);
void MediaInfo_Config_Audio                   (ZtringListList &Info);
void MediaInfo_Config_Text                    (ZtringListList &Info);
void MediaInfo_Config_Other                   (ZtringListList &Info);
void MediaInfo_Config_Image                   (ZtringListList &Info);
void MediaInfo_Config_Menu                    (ZtringListList &Info);
void MediaInfo_Config_Summary                 (ZtringListList &Info);
void MediaInfo_Config_Format                  (InfoMap &Info);
void MediaInfo_Config_Library_DivX            (InfoMap &Info);
void MediaInfo_Config_Library_XviD            (InfoMap &Info);
void MediaInfo_Config_Library_MainConcept_Avc (InfoMap &Info);
void MediaInfo_Config_Library_VorbisCom       (InfoMap &Info);
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
// Output formats
 
static const size_t output_formats_item_size = 3;
static const char* OutputFormats_JSONFields[output_formats_item_size] =
{
    "name",
    "desc",
    "mime",
};
typedef const char* output_formats_item[output_formats_item_size];
static const size_t output_formats_size = 15;
static output_formats_item OutputFormats[output_formats_size] =
{
    { "Text",                   "Text",                                                         "text/plain",       },
    { "HTML",                   "HTML",                                                         "text/html",        },
    { "XML",                    "MediaInfo XML",                                                "text/xml",         },
    { "JSON",                   "MediaInfo JSON",                                               "text/json",        },
    { "EBUCore_1.8_ps",         "EBUCore 1.8 (XML; acq. metadata: parameter then segment)",     "text/xml",         },
    { "EBUCore_1.8_sp",         "EBUCore 1.8 (XML; acq. metadata: segment then parameter)",     "text/xml",         },
    { "EBUCore_1.8_ps_JSON",    "EBUCore 1.8 (JSON; acq. metadata: parameter then segment)",    "text/json",        },
    { "EBUCore_1.8_sp_JSON",    "EBUCore 1.8 (JSON; acq. metadata: segment then parameter)",    "text/json",        },
    { "EBUCore_1.6",            "EBUCore 1.6",                                                  "text/xml",         },
    { "FIMS_1.3",               "FIMS 1.3",                                                     "text/xml",         },
    { "MPEG-7",                 "MPEG-7",                                                       "text/xml",         },
    { "PBCore_2.1",             "PBCore 2.1",                                                   "text/xml",         },
    { "PBCore_2.0",             "PBCore 2.0",                                                   "text/xml",         },
    { "PBCore_1.2",             "PBCore 1.2",                                                   "text/xml",         },
    { "NISO_Z39.87",            "NISO Z39.87",                                                  "text/xml",         },
};
 
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
MediaInfo_Config Config;
//---------------------------------------------------------------------------
 
//***************************************************************************
// Constructor/Destructor
//***************************************************************************
 
void MediaInfo_Config::Init(bool Force)
{
    {
        CriticalSectionLocker CSL(CS);
    //We use Init() instead of COnstructor because for some backends (like WxWidgets...) does NOT like constructor of static object with Unicode conversion
 
    //Test
    if (Force)
    {
        #if defined(MEDIAINFO_EBUCORE_YES) || defined(MEDIAINFO_NISO_YES) || MEDIAINFO_ADVANCED
            ExternalMetadata.clear();
            ExternalMetaDataConfig.clear();
        #endif //defined(MEDIAINFO_EBUCORE_YES) || defined(MEDIAINFO_NISO_YES) || MEDIAINFO_ADVANCED
        #ifdef MEDIAINFO_ADVANCED
            ParseOnlyKnownExtensions.clear();
        #endif
        Trace_Layers.reset();
        Trace_Modificators.clear();
        Version.clear();
        ColumnSeparator.clear();
        LineSeparator.clear();
        TagSeparator.clear();
        Quote.clear();
        DecimalPoint.clear();
        ThousandsPoint.clear();
        CarriageReturnReplace.clear();
        Language.clear();
        Custom_View.clear();
        Custom_View_Replace.clear();
        Container.clear();
        for (size_t Format=0; Format<InfoCodecID_Format_Max; Format++)
            for (size_t StreamKind=0; StreamKind<Stream_Max; StreamKind++)
                CodecID[Format][StreamKind].clear();
        Format.clear();
        Codec.clear();
        for (size_t Format=0; Format<InfoLibrary_Format_Max; Format++)
            Library[Format].clear();
        Iso639_1.clear();
        Iso639_2.clear();
        for (size_t StreamKind=0; StreamKind<Stream_Max; StreamKind++)
            Info[StreamKind].clear();
        SubFile_Config.clear();
        CustomMapping.clear();
        #if defined(MEDIAINFO_LIBCURL_YES)
            Ssh_PublicKeyFileName.clear();
            Ssh_PrivateKeyFileName.clear();
            Ssh_KnownHostsFileName.clear();
            Ssl_CertificateFileName.clear();
            Ssl_CertificateFormat.clear();
            Ssl_PrivateKeyFileName.clear();
            Ssl_PrivateKeyFormat.clear();
            Ssl_CertificateAuthorityFileName.clear();
            Ssl_CertificateAuthorityPath.clear();
            Ssl_CertificateRevocationListFileName.clear();
        #endif //defined(MEDIAINFO_LIBCURL_YES)
    }
    else if (!LineSeparator.empty())
    {
        return; //Already done
    }
 
    //Filling
    FormatDetection_MaximumOffset=0;
    #if MEDIAINFO_ADVANCED
        VariableGopDetection_Occurences=4;
        VariableGopDetection_GiveUp=false;
        InitDataNotRepeated_Occurences=(int64u)-1; //Disabled by default
        InitDataNotRepeated_GiveUp=false;
    #endif //MEDIAINFO_ADVANCED
    #if MEDIAINFO_ADVANCED && defined(MEDIAINFO_FILE_YES)
        TimeOut=(int64u)-1;
    #endif //MEDIAINFO_ADVANCED && defined(MEDIAINFO_FILE_YES)
    MpegTs_MaximumOffset=64*1024*1024;
    MpegTs_MaximumScanDuration=30000000000LL;
    MpegTs_ForceStreamDisplay=false;
    #if MEDIAINFO_ADVANCED
        MpegTs_VbrDetection_Delta=0;
        MpegTs_VbrDetection_Occurences=4;
        MpegTs_VbrDetection_GiveUp=false;
    #endif //MEDIAINFO_ADVANCED
    #if MEDIAINFO_ADVANCED
        Format_Profile_Split=false;
    #endif //MEDIAINFO_ADVANCED
    #if defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
        Graph_Adm_ShowTrackUIDs=false;
        Graph_Adm_ShowChannelFormats=false;
    #endif //defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
    #if defined(MEDIAINFO_EBUCORE_YES)
        AcquisitionDataOutputMode=Export_EbuCore::AcquisitionDataOutputMode_Default;
    #endif //defined(MEDIAINFO_EBUCORE_YES)
    #if defined(MEDIAINFO_EBUCORE_YES) || defined(MEDIAINFO_NISO_YES)
        ExternalMetadata=Ztring();
        ExternalMetaDataConfig=Ztring();
    #endif //defined(MEDIAINFO_EBUCORE_YES) || defined(MEDIAINFO_NISO_YES)
 
    Complete=0;
    BlockMethod=0;
    Internet=0;
    MultipleValues=0;
    ShowFiles_Nothing=1;
    ShowFiles_VideoAudio=1;
    ShowFiles_VideoOnly=1;
    ShowFiles_AudioOnly=1;
    ShowFiles_TextOnly=1;
    ParseSpeed=(float32)0.5;
    Verbosity=(float32)0.5;
    Trace_Level=(float32)0.0;
    Compat=70778;
    Https=true;
    Trace_TimeSection_OnlyFirstOccurrence=false;
    Trace_Format=Trace_Format_Tree;
    Language_Raw=false;
    ReadByHuman=true;
    Inform_Version=false;
    Inform_Timestamp=false;
    Legacy=false;
    LegacyStreamDisplay=false;
    SkipBinaryData=false;
    Demux=0;
    LineSeparator=EOL;
    ColumnSeparator=__T(";");
    TagSeparator=__T(" / ");
    Quote=__T("\"");
    DecimalPoint=__T(".");
    ThousandsPoint=Ztring();
    CarriageReturnReplace=__T(" / ");
    #if MEDIAINFO_EVENTS
        Event_CallBackFunction=NULL;
        Event_UserHandler=NULL;
    #endif //MEDIAINFO_EVENTS
    #if defined(MEDIAINFO_LIBCURL_YES)
        URLEncode=URLEncode_Guess;
        Ssh_IgnoreSecurity=false;
        Ssl_IgnoreSecurity=false;
    #endif //defined(MEDIAINFO_LIBCURL_YES)
    #if MEDIAINFO_FIXITY
        TryToFix=false;
    #endif //MEDIAINFO_FIXITY
    #if MEDIAINFO_FLAG1
        Flags1=0;
    #endif //MEDIAINFO_FLAGX
    #if MEDIAINFO_FLAGX
        FlagsX=0;
    #endif //MEDIAINFO_FLAGX
 
    }
 
    ZtringListList ZLL1; Language_Set(ZLL1);
}
 
//***************************************************************************
// Info
//***************************************************************************
 
static inline int _OctDigitValue(const String::value_type &ch)
{
    switch (ch)
    {
    case __T('0'): return 0;
    case __T('1'): return 1;
    case __T('2'): return 2;
    case __T('3'): return 3;
    case __T('4'): return 4;
    case __T('5'): return 5;
    case __T('6'): return 6;
    case __T('7'): return 7;
    }
    return -1;
}
 
static inline int _HexDigitValue(const String::value_type &ch)
{
    switch (ch)
    {
    case __T('0'): return 0;
    case __T('1'): return 1;
    case __T('2'): return 2;
    case __T('3'): return 3;
    case __T('4'): return 4;
    case __T('5'): return 5;
    case __T('6'): return 6;
    case __T('7'): return 7;
    case __T('8'): return 8;
    case __T('9'): return 9;
    case __T('a'): case __T('A'): return 10;
    case __T('b'): case __T('B'): return 11;
    case __T('c'): case __T('C'): return 12;
    case __T('d'): case __T('D'): return 13;
    case __T('e'): case __T('E'): return 14;
    case __T('f'): case __T('F'): return 15;
    }
    return -1;
}
 
static String _DecodeEscapeC(String::const_iterator first, String::const_iterator last)
{
    String decoded;
    for (String::const_iterator it = first; it != last; ++it)
    {
        String::value_type ch = 0;
        int inc = 0;
        if (*it == __T('\\') && (it+1) != last)
        {
            switch (*(it+1))
            {
            case __T('a'):   ch = __T('\a'); inc = 1; break;
            case __T('b'):   ch = __T('\b'); inc = 1; break;
            case __T('f'):   ch = __T('\f'); inc = 1; break;
            case __T('n'):   ch = __T('\n'); inc = 1; break;
            case __T('r'):   ch = __T('\r'); inc = 1; break;
            case __T('t'):   ch = __T('\t'); inc = 1; break;
            case __T('v'):   ch = __T('\v'); inc = 1; break;
            case __T('\''):  ch = __T('\''); inc = 1; break;
            case __T('\"'):  ch = __T('\"'); inc = 1; break;
            case __T('\\'):  ch = __T('\\'); inc = 1; break;
            case __T('?'):   ch = __T('?');  inc = 1; break;
            case __T('x'): // Hex
                {
                    int d;
                    if ((it+2) != last && (d = _HexDigitValue(*(it+2))) >= 0)
                    {
                        ch = String::value_type(d);
                        inc = 2;
                        if ((it+3) != last && (d = _HexDigitValue(*(it+3))) >= 0)
                        {
                            ch = (ch << 4) | String::value_type(d);
                            ++inc;
                        }
                    }
                }
                break;
#if defined(__UNICODE__)
            case __T('u'): case __T('U'): // Unicode
                {
                    int d;
                    if ((it+2) != last && (d = _HexDigitValue(*(it+2))) >= 0)
                    {
                        ch = String::value_type(d);
                        inc = 2;
                        for (int i = 0; i < 3; ++i)
                        {
                            if ((it+3+i) != last && (d = _HexDigitValue(*(it+3+i))) >= 0)
                            {
                                ch = (ch << 4) | String::value_type(d);
                                ++inc;
                            }
                        }
                    }
                }
                break;
#endif
            default:
                {
                    int d;
                    if ((d = _OctDigitValue(*(it+1))) >= 0) // Oct
                    {
                        ch = String::value_type(d);
                        inc = 1;
                        if ((it+2) != last && (d = _OctDigitValue(*(it+2))) >= 0)
                        {
                            ch = (ch << 3) | String::value_type(d);
                            ++inc;
                            if ((it+3) != last && (d = _OctDigitValue(*(it+3))) >= 0)
                            {
                                ch = (ch << 3) | String::value_type(d);
                                ++inc;
                            }
                        }
                    }
                }
                break;
            }
        }
        if (inc > 0)
        {
            decoded += ch;
            it += inc;
        }
        else
        {
            decoded += *it;
        }
    }
    return decoded;
}
 
Ztring MediaInfo_Config::Option (const String &Option, const String &Value_Raw)
{
    {
    CriticalSectionLocker CSL(CS);
    SubFile_Config(Option)=Value_Raw;
    }
 
    String Option_Lower(Option);
    size_t Egal_Pos=Option_Lower.find(__T('='));
    if (Egal_Pos==string::npos)
        Egal_Pos=Option_Lower.size();
    transform(Option_Lower.begin(), Option_Lower.begin()+Egal_Pos, Option_Lower.begin(), (int(*)(int))tolower); //(int(*)(int)) is a patch for unix
 
    //Parsing pointer to a file
    Ztring Value;
    #if defined(MEDIAINFO_FILE_YES)
    if (Value_Raw.find(__T("file://"))==0)
    {
        //Open
        Ztring FileName(Value_Raw, 7, Ztring::npos);
        File F(FileName.c_str());
 
        //Read
        int64u Size=F.Size_Get();
        if (Size>=0xFFFFFFFF)
            Size=1024*1024;
        int8u* Buffer=new int8u[(size_t)Size+1];
        size_t Pos=F.Read(Buffer, (size_t)Size);
        F.Close();
        Buffer[Pos]='\0';
        Ztring FromFile; FromFile.From_UTF8((char*)Buffer);
        if (FromFile.empty())
             FromFile.From_UTF8((char*)Buffer);
        delete[] Buffer; //Buffer=NULL;
 
        //Merge
        Value=FromFile;
    }
    else
    #endif //defined(MEDIAINFO_FILE_YES)
    if (Value_Raw.substr(0, 7)==__T("cstr://"))
    {
        Value=_DecodeEscapeC(Value_Raw.begin() + 7, Value_Raw.end());
    }
    else
        Value=Value_Raw;
 
    if (Option_Lower.empty())
    {
        return Ztring();
    }
    if (Option_Lower==__T("charset_config"))
    {
        return Ztring(); //Only used in DLL, no Library action
    }
    if (Option_Lower==__T("charset_output"))
    {
        return Ztring(); //Only used in DLL, no Library action
    }
    if (Option_Lower==__T("complete"))
    {
        Complete_Set(Value.To_int8u()?true:false);
        return Ztring();
    }
    if (Option_Lower==__T("complete_get"))
    {
        if (Complete_Get())
            return __T("1");
        else
            return Ztring();
    }
    if (Option_Lower==__T("blockmethod"))
    {
        if (Value.empty())
            BlockMethod_Set(0);
        else
            BlockMethod_Set(1);
        return Ztring();
    }
    if (Option_Lower==__T("blockmethod_get"))
    {
        if (BlockMethod_Get())
            return __T("1");
        else
            return Ztring();
    }
    if (Option_Lower==__T("internet"))
    {
        if (Value.empty())
            Internet_Set(0);
        else
            Internet_Set(1);
        return Ztring();
    }
    if (Option_Lower==__T("internet_get"))
    {
        if (Internet_Get())
            return __T("1");
        else
            return Ztring();
    }
    if (Option_Lower==__T("demux"))
    {
        String Value_Lower(Value);
        transform(Value_Lower.begin(), Value_Lower.end(), Value_Lower.begin(), (int(*)(int))tolower); //(int(*)(int)) is a patch for unix
 
             if (Value_Lower==__T("all"))
            Demux_Set(7);
        else if (Value_Lower==__T("frame"))
            Demux_Set(1);
        else if (Value_Lower==__T("container"))
            Demux_Set(2);
        else if (Value_Lower==__T("elementary"))
            Demux_Set(4);
        else
            Demux_Set(0);
        return Ztring();
    }
    if (Option_Lower==__T("demux_get"))
    {
        switch (Demux_Get())
        {
            case 7 : return __T("All");
            case 1 : return __T("Frame");
            case 2 : return __T("Container");
            case 4 : return __T("Elementary");
            default: return Ztring();
        }
    }
    if (Option_Lower==__T("multiplevalues"))
    {
        if (Value.empty())
            MultipleValues_Set(0);
        else
            MultipleValues_Set(1);
        return Ztring();
    }
    if (Option_Lower==__T("multiplevalues_get"))
    {
        if (MultipleValues_Get())
            return __T("1");
        else
            return Ztring();
    }
    if (Option_Lower==__T("parseonlyknownextensions"))
    {
        #if MEDIAINFO_ADVANCED
            ParseOnlyKnownExtensions_Set(Value);
            return Ztring();
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("parseonlyknownextensions_get"))
    {
        #if MEDIAINFO_ADVANCED
            return ParseOnlyKnownExtensions_Get();
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("parseonlyknownextensions_getlist"))
    {
        #if MEDIAINFO_ADVANCED
            return ParseOnlyKnownExtensions_GetList_String();
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("parseunknownextensions"))
    {
        #if MEDIAINFO_ADVANCED
            if (Value==__T("0"))
                ParseOnlyKnownExtensions_Set(__T("1"));
            else
                ParseOnlyKnownExtensions_Set(Ztring());
            return Ztring();
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("parseunknownextensions_get"))
    {
        #if MEDIAINFO_ADVANCED
            if (ParseOnlyKnownExtensions_Get().empty())
                return __T("1");
            else
                return Ztring();
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("showfiles_set"))
    {
        ShowFiles_Set(Value.c_str());
        return Ztring();
    }
    if (Option_Lower==__T("readbyhuman"))
    {
        ReadByHuman_Set(Value.To_int8u()?true:false);
        return Ztring();
    }
    if (Option_Lower==__T("readbyhuman_get"))
    {
        return ReadByHuman_Get()?__T("1"):__T("0");
    }
    if (Option_Lower==__T("legacy"))
    {
        Legacy_Set(Value.To_int8u()?true:false);
        return Ztring();
    }
    if (Option_Lower==__T("legacy_get"))
    {
        return Legacy_Get()?__T("1"):__T("0");
    }
    if (Option_Lower==__T("legacystreamdisplay"))
    {
        LegacyStreamDisplay_Set(Value.To_int8u()?true:false);
        return Ztring();
    }
    if (Option_Lower==__T("legacystreamdisplay_get"))
    {
        return LegacyStreamDisplay_Get()?__T("1"):__T("0");
    }
    if (Option_Lower==__T("skipbinarydata"))
    {
        SkipBinaryData_Set(Value.To_int8u()?true:false);
        return Ztring();
    }
    if (Option_Lower==__T("skipbinarydata_get"))
    {
        return SkipBinaryData_Get()?__T("1"):__T("0");
    }
    if (Option_Lower==__T("parsespeed"))
    {
        ParseSpeed_Set(Value.To_float32());
        return Ztring();
    }
    if (Option_Lower==__T("parsespeed_get"))
    {
        return Ztring::ToZtring(ParseSpeed_Get(), 3);
    }
    if (Option_Lower==__T("verbosity"))
    {
        Verbosity_Set(Value.To_float32());
        return Ztring();
    }
    if (Option_Lower==__T("verbosity_get"))
    {
        return Ztring::ToZtring(Verbosity_Get(), 3);
    }
    if (Option_Lower==__T("lineseparator"))
    {
        LineSeparator_Set(Value);
        return Ztring();
    }
    if (Option_Lower==__T("lineseparator_get"))
    {
        return LineSeparator_Get();
    }
    if (Option_Lower==__T("version"))
    {
        Version_Set(Value);
        return Ztring();
    }
    if (Option_Lower==__T("version_get"))
    {
        return Version_Get();
    }
    if (Option_Lower==__T("columnseparator"))
    {
        ColumnSeparator_Set(Value);
        return Ztring();
    }
    if (Option_Lower==__T("columnseparator_get"))
    {
        return ColumnSeparator_Get();
    }
    if (Option_Lower==__T("tagseparator"))
    {
        TagSeparator_Set(Value);
        return Ztring();
    }
    if (Option_Lower==__T("tagseparator_get"))
    {
        return TagSeparator_Get();
    }
    if (Option_Lower==__T("quote"))
    {
        Quote_Set(Value);
        return Ztring();
    }
    if (Option_Lower==__T("quote_get"))
    {
        return Quote_Get();
    }
    if (Option_Lower==__T("decimalpoint"))
    {
        DecimalPoint_Set(Value);
        return Ztring();
    }
    if (Option_Lower==__T("decimalpoint_get"))
    {
        return DecimalPoint_Get();
    }
    if (Option_Lower==__T("thousandspoint"))
    {
        ThousandsPoint_Set(Value);
        return Ztring();
    }
    if (Option_Lower==__T("thousandspoint_get"))
    {
        return ThousandsPoint_Get();
    }
    if (Option_Lower==__T("carriagereturnreplace"))
    {
        if (Value.find_first_of(__T("\r\n"))!=string::npos)
            return __T("\\r or \\n in CarriageReturnReplace is not supported");
        CarriageReturnReplace_Set(Value);
        return Ztring();
    }
    if (Option_Lower==__T("carriagereturnreplace_get"))
    {
        return CarriageReturnReplace_Get();
    }
    if (Option_Lower==__T("streammax"))
    {
        ZtringListList StreamMax=Value.c_str();
        StreamMax_Set(StreamMax);
        return Ztring();
    }
    if (Option_Lower==__T("streammax_get"))
    {
        return StreamMax_Get();
    }
    if (Option_Lower==__T("language"))
    {
        ZtringListList Language=Value.c_str();
        Language_Set(Language);
        return Ztring();
    }
    if (Option_Lower==__T("language_get"))
    {
        return Language_Get();
    }
    if (Option_Lower==__T("inform"))
    {
        Inform_Set(Value.c_str());
        return Ztring();
    }
    if (Option_Lower==__T("output"))
    {
        Inform_Set(Value.c_str());
        return Ztring();
    }
    if (Option_Lower==__T("inform_get"))
    {
        return Inform_Get();
    }
    if (Option_Lower==__T("output_get"))
    {
        return Inform_Get();
    }
    if (Option_Lower==__T("inform_replace"))
    {
        Inform_Replace_Set(Value.c_str());
        return Ztring();
    }
    if (Option_Lower==__T("inform_replace_get"))
    {
        return Inform_Get();
    }
    if (Option_Lower==__T("inform_version"))
    {
        Inform_Version_Set(Value.To_int8u()?true:false);
        return Ztring();
    }
    if (Option_Lower==__T("inform_version_get"))
    {
        return Inform_Version_Get()?__T("1"):__T("0");
    }
    if (Option_Lower==__T("inform_timestamp"))
    {
        Inform_Timestamp_Set(Value.To_int8u()?true:false);
        return Ztring();
    }
    if (Option_Lower==__T("inform_timestamp_get"))
    {
        return Inform_Timestamp_Get()?__T("1"):__T("0");
    }
    #if MEDIAINFO_ADVANCED
        if (Option_Lower==__T("cover_data"))
        {
            return Cover_Data_Set(Value.c_str());
        }
        if (Option_Lower==__T("cover_data_get"))
        {
            return Cover_Data_Get();
        }
    #endif //MEDIAINFO_COMPRESS
    #if MEDIAINFO_COMPRESS
        if (Option_Lower==__T("inform_compress"))
        {
            return Inform_Compress_Set(Value.c_str());
        }
        if (Option_Lower==__T("inform_compress_get"))
        {
            return Inform_Compress_Get();
        }
        if (Option_Lower==__T("input_compressed"))
        {
            return Input_Compressed_Set(Value.c_str());
        }
        if (Option_Lower==__T("input_compressed_get"))
        {
            return Input_Compressed_Get();
        }
    #endif //MEDIAINFO_COMPRESS
    if (Option_Lower==__T("details")) //Legacy for trace_level
    {
        if (Value == __T("0"))
            Trace_Level=0;
        return MediaInfo_Config::Option(__T("Trace_Level"), Value);
    }
    if (Option_Lower==__T("details_get")) //Legacy for trace_level
    {
        return MediaInfo_Config::Option(__T("Trace_Level_Get"), Value);
    }
    if (Option_Lower==__T("detailslevel")) //Legacy for trace_level
    {
        return MediaInfo_Config::Option(__T("Trace_Level"), Value);
    }
    if (Option_Lower==__T("detailslevel_get")) //Legacy for trace_level
    {
        return MediaInfo_Config::Option(__T("Trace_Level_Get"), Value);
    }
    if (Option_Lower==__T("trace_level"))
    {
        Trace_Level_Set(Value);
        if (Inform_Get()==__T("MAXML"))
            Trace_Format_Set(Trace_Format_XML); // All must be XML
        if (Inform_Get()==__T("XML") || Inform_Get()==__T("MAXML"))
        {
            Inform_Set(Ztring());
            Trace_Format_Set(Trace_Format_XML); // TODO: better coherency in options
        }
        if (Inform_Get()==__T("MICRO_XML"))
        {
            Inform_Set(Ztring());
            Trace_Format_Set(Trace_Format_MICRO_XML);
        }
        return Ztring();
    }
    if (Option_Lower==__T("trace_level_get"))
    {
        return Ztring::ToZtring(Trace_Level_Get());
    }
    if (Option_Lower==__T("https"))
    {
        Https_Set(Value.To_int64u()?true:false);
        return Ztring();
    }
    if (Option_Lower==__T("no-https"))
    {
        Https_Set(false);
        return Ztring();
    }
    if (Option_Lower==__T("https_get"))
    {
        return Https_Get()?__T("1"):__T("0");
    }
    if (Option_Lower==__T("trace_timesection_onlyfirstoccurrence"))
    {
        Trace_TimeSection_OnlyFirstOccurrence_Set(Value.To_int64u()?true:false);
        return Ztring();
    }
    if (Option_Lower==__T("trace_timesection_onlyfirstoccurrence_get"))
    {
        return Trace_TimeSection_OnlyFirstOccurrence_Get()?__T("1"):__T("0");
    }
    if (Option_Lower==__T("detailsformat")) //Legacy for trace_format
    {
        return MediaInfo_Config::Option(__T("Trace_Format"), Value);
    }
    if (Option_Lower==__T("detailsformat_get")) //Legacy for trace_format
    {
        return MediaInfo_Config::Option(__T("Trace_Format_Get"), Value);
    }
    if (Option_Lower==__T("trace_format"))
    {
        String NewValue_Lower(Value);
        transform(NewValue_Lower.begin(), NewValue_Lower.end(), NewValue_Lower.begin(), (int(*)(int))tolower); //(int(*)(int)) is a patch for unix
 
        if (NewValue_Lower==__T("csv"))
            Trace_Format_Set(Trace_Format_CSV);
        else if (NewValue_Lower==__T("xml") || NewValue_Lower==__T("MAXML"))
            Trace_Format_Set(Trace_Format_XML);
        else if (NewValue_Lower==__T("micro_xml"))
            Trace_Format_Set(Trace_Format_MICRO_XML);
        else
            Trace_Format_Set(Trace_Format_Tree);
        return Ztring();
    }
    if (Option_Lower==__T("trace_format_get"))
    {
        switch (Trace_Format_Get())
        {
            case Trace_Format_CSV : return __T("CSV");
            default : return __T("Tree");
        }
    }
    if (Option_Lower==__T("detailsmodificator"))
    {
        Trace_Modificator_Set(Value);
        return Ztring();
    }
    if (Option_Lower==__T("detailsmodificator_get"))
    {
        return Trace_Modificator_Get(Value);
    }
    if (Option_Lower==__T("hideparameter"))
    {
        return HideShowParameter(Value, __T('N'));
    }
    if (Option_Lower==__T("showparameter"))
    {
        return HideShowParameter(Value, __T('Y'));
    }
    if (Option_Lower==__T("info_parameters"))
    {
        ZtringListList ToReturn=Info_Parameters_Get();
 
        //Adapt first column
        for (size_t Pos=0; Pos<ToReturn.size(); Pos++)
        {
            Ztring &C1=ToReturn(Pos, 0);
            if (!ToReturn(Pos, 1).empty())
            {
                C1.resize(25, ' ');
                ToReturn(Pos, 0)=C1 + __T(" :");
            }
        }
 
        ToReturn.Separator_Set(0, LineSeparator_Get());
        ToReturn.Separator_Set(1, __T(" "));
        ToReturn.Quote_Set(Ztring());
        return ToReturn.Read();
    }
    if (Option_Lower==__T("info_outputformats"))
    {
        return Info_OutputFormats_Get(BasicFormat_Text);
    }
    if (Option_Lower==__T("info_outputformats_csv"))
    {
        return Info_OutputFormats_Get(BasicFormat_CSV);
    }
    if (Option_Lower==__T("info_outputformats_json"))
    {
        return Info_OutputFormats_Get(BasicFormat_JSON);
    }
    if (Option_Lower==__T("info_parameters_csv"))
    {
        return Info_Parameters_Get(Value==__T("Complete"));
    }
    if (Option_Lower==__T("info_codecs"))
    {
        return Info_Codecs_Get();
    }
    if (Option_Lower==__T("info_version"))
    {
        return Info_Version_Get();
    }
    if (Option_Lower==__T("info_url"))
    {
        return Info_Url_Get();
    }
    if (Option_Lower==__T("formatdetection_maximumoffset"))
    {
        FormatDetection_MaximumOffset_Set(Value==__T("-1")?(int64u)-1:((Ztring*)&Value)->To_int64u());
        return Ztring();
    }
    if (Option_Lower==__T("formatdetection_maximumoffset_get"))
    {
        return FormatDetection_MaximumOffset_Get()==(int64u)-1?Ztring(__T("-1")):Ztring::ToZtring(FormatDetection_MaximumOffset_Get());
    }
    if (Option_Lower==__T("variablegopdetection_occurences"))
    {
        #if MEDIAINFO_ADVANCED
            VariableGopDetection_Occurences_Set(Value.To_int64u());
            return Ztring();
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("variablegopdetection_occurences_get"))
    {
        #if MEDIAINFO_ADVANCED
            return Ztring::ToZtring(VariableGopDetection_Occurences_Get());
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("variablegopdetection_giveup"))
    {
        #if MEDIAINFO_ADVANCED
            VariableGopDetection_GiveUp_Set(Value.To_int8u()?true:false);
            return Ztring();
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("variablegopdetection_giveup_get"))
    {
        #if MEDIAINFO_ADVANCED
            return VariableGopDetection_GiveUp_Get()?__T("1"):__T("0");
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("initdatanotrepeated_occurences"))
    {
        #if MEDIAINFO_ADVANCED
            InitDataNotRepeated_Occurences_Set(Value.To_int64u());
            return Ztring();
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("initdatanotrepeated_occurences_get"))
    {
        #if MEDIAINFO_ADVANCED
            return Ztring::ToZtring(InitDataNotRepeated_Occurences_Get());
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("initdatanotrepeated_giveup"))
    {
        #if MEDIAINFO_ADVANCED
            InitDataNotRepeated_GiveUp_Set(Value.To_int8u()?true:false);
            return Ztring();
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("initdatanotrepeated_giveup_get"))
    {
        #if MEDIAINFO_ADVANCED
            return InitDataNotRepeated_GiveUp_Get()?__T("1"):__T("0");
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("timeout"))
    {
        #if MEDIAINFO_ADVANCED && defined(MEDIAINFO_FILE_YES)
            TimeOut_Set(Value.empty()?((int64u)-1):Value.To_int64u());
            return Ztring();
        #else // MEDIAINFO_ADVANCED && defined(MEDIAINFO_FILE_YES)
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED && defined(MEDIAINFO_FILE_YES)
    }
    if (Option_Lower==__T("timeout_get"))
    {
        #if MEDIAINFO_ADVANCED && defined(MEDIAINFO_FILE_YES)
            return Ztring::ToZtring(TimeOut_Get());
        #else // MEDIAINFO_ADVANCED && defined(MEDIAINFO_FILE_YES)
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED && defined(MEDIAINFO_FILE_YES)
    }
    if (Option_Lower==__T("mpegts_maximumoffset"))
    {
        MpegTs_MaximumOffset_Set(Value==__T("-1")?(int64u)-1:((Ztring*)&Value)->To_int64u());
        return Ztring();
    }
    if (Option_Lower==__T("mpegts_maximumoffset_get"))
    {
        return MpegTs_MaximumOffset_Get()==(int64u)-1?Ztring(__T("-1")):Ztring::ToZtring(MpegTs_MaximumOffset_Get());
    }
    if (Option_Lower==__T("mpegts_vbrdetection_delta"))
    {
        #if MEDIAINFO_ADVANCED
            MpegTs_VbrDetection_Delta_Set(Value.To_float64());
            return Ztring();
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("mpegts_vbrdetection_delta_get"))
    {
        #if MEDIAINFO_ADVANCED
            return Ztring::ToZtring(MpegTs_VbrDetection_Delta_Get(), 9);
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("mpegts_vbrdetection_occurences"))
    {
        #if MEDIAINFO_ADVANCED
            MpegTs_VbrDetection_Occurences_Set(Value.To_int64u());
            return Ztring();
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("mpegts_vbrdetection_occurences_get"))
    {
        #if MEDIAINFO_ADVANCED
            return Ztring::ToZtring(MpegTs_VbrDetection_Occurences_Get());
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("mpegts_vbrdetection_giveup"))
    {
        #if MEDIAINFO_ADVANCED
            MpegTs_VbrDetection_GiveUp_Set(Value.To_int8u()?true:false);
            return Ztring();
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("mpegts_vbrdetection_giveup_get"))
    {
        #if MEDIAINFO_ADVANCED
            return MpegTs_VbrDetection_GiveUp_Get()?__T("1"):__T("0");
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("mpegts_maximumscanduration"))
    {
        MpegTs_MaximumScanDuration_Set(float64_int64s((((Ztring*)&Value)->To_float64())*1000000000));
        return Ztring();
    }
    if (Option_Lower==__T("mpegts_maximumscanduration_get"))
    {
        return MpegTs_MaximumScanDuration_Get()==(int64u)-1?Ztring(__T("-1")):Ztring::ToZtring(MpegTs_MaximumOffset_Get());
    }
    if (Option_Lower==__T("mpegts_forcestreamdisplay"))
    {
        MpegTs_ForceStreamDisplay_Set(Value.To_int8u()?true:false);
        return Ztring();
    }
    if (Option_Lower==__T("mpegts_forcestreamdisplay_get"))
    {
        return MpegTs_ForceStreamDisplay_Get()?__T("1"):__T("0");
    }
    if (Option_Lower == __T("mpegts_forcetextstreamdisplay"))
    {
        MpegTs_ForceTextStreamDisplay_Set(Value.To_int8u() ? true : false);
        return Ztring();
    }
    if (Option_Lower == __T("mpegts_forcetextstreamdisplay_get"))
    {
        return MpegTs_ForceTextStreamDisplay_Get() ? __T("1") : __T("0");
    }
    if (Option_Lower==__T("maxml_streamkinds"))
    {
        #if MEDIAINFO_ADVANCED
            return MAXML_StreamKinds_Get();
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("maxml_fields"))
    {
        #if MEDIAINFO_ADVANCED
            return MAXML_Fields_Get(Value);
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("custommapping"))
    {
        CustomMapping_Set(Value);
        return Ztring();
    }
    if (Option_Lower==__T("format_profile_split"))
    {
        #if MEDIAINFO_ADVANCED
            Format_Profile_Split_Set(Value.To_int8u()?true:false);
            return Ztring();
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("format_profile_split_get"))
    {
        #if MEDIAINFO_ADVANCED
            return Format_Profile_Split_Get()?__T("1"):__T("0");;
        #else // MEDIAINFO_ADVANCED
            return __T("advanced features are disabled due to compilation options");
        #endif // MEDIAINFO_ADVANCED
    }
    if (Option_Lower==__T("graph_adm_showtrackuids"))
    {
        #if defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
            Graph_Adm_ShowTrackUIDs_Set(Value.To_int8u()?true:false);
            return Ztring();
        #else //defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
            return __T("Feature disabled due to compilation options");
        #endif // defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
    }
    if (Option_Lower == __T("graph_adm_showtrackuids_get"))
    {
        #if defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
            return Graph_Adm_ShowTrackUIDs_Get()?__T("1"):__T("0");
        #else //defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
            return __T("Feature disabled due to compilation options");
        #endif // defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
    }
    if (Option_Lower==__T("graph_adm_showchannelformats"))
    {
        #if defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
            Graph_Adm_ShowChannelFormats_Set(Value.To_int8u()?true:false);
            return Ztring();
        #else //defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
            return __T("Feature disabled due to compilation options");
        #endif // defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
    }
    if (Option_Lower == __T("graph_adm_showchannelformats_get"))
    {
        #if defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
            return Graph_Adm_ShowChannelFormats_Get()?__T("1"):__T("0");
        #else //defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
            return __T("Feature disabled due to compilation options");
        #endif // defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
    }
    if (Option_Lower==__T("acquisitiondataoutputmode"))
    {
        #if defined(MEDIAINFO_EBUCORE_YES)
            Ztring Mode(Value);
            Mode.MakeLowerCase();
            if (     Mode==__T("default"))
                AcquisitionDataOutputMode_Set(Export_EbuCore::AcquisitionDataOutputMode_Default);
            else if (Mode==__T("parametersegment"))
                AcquisitionDataOutputMode_Set(Export_EbuCore::AcquisitionDataOutputMode_parameterSegment);
            else if (Mode==__T("segmentparameter"))
                AcquisitionDataOutputMode_Set(Export_EbuCore::AcquisitionDataOutputMode_segmentParameter);
            else
                return __T("Invalid value");
            return Ztring();
        #else // MEDIAINFO_EBUCORE_YES
            return __T("EBUCore features are disabled due to compilation options");
        #endif // MEDIAINFO_EBUCORE_YES
    }
    if (Option_Lower==__T("externalmetadata"))
    {
        #if defined(MEDIAINFO_EBUCORE_YES) || defined(MEDIAINFO_NISO_YES)
            ExternalMetadata_Set(Value);
            return Ztring();
        #else // MEDIAINFO_EBUCORE_YES || defined(MEDIAINFO_NISO_YES)
            return __T("Feature disabled due to compilation options");
        #endif // MEDIAINFO_EBUCORE_YES || defined(MEDIAINFO_NISO_YES)
    }
    if (Option_Lower==__T("externalmetadataconfig"))
    {
        #if defined(MEDIAINFO_EBUCORE_YES) || defined(MEDIAINFO_NISO_YES)
            ExternalMetaDataConfig_Set(Value);
            return Ztring();
        #else // MEDIAINFO_EBUCORE_YES || defined(MEDIAINFO_NISO_YES)
            return __T("Features disabled due to compilation options");
        #endif // MEDIAINFO_EBUCORE_YES || defined(MEDIAINFO_NISO_YES)
    }
    if (Option_Lower==__T("event_callbackfunction"))
    {
        #if MEDIAINFO_EVENTS
            return Event_CallBackFunction_Set(Value);
        #else //MEDIAINFO_EVENTS
            return __T("Event manager is disabled due to compilation options");
        #endif //MEDIAINFO_EVENTS
    }
    if (Option_Lower==__T("urlencode"))
    {
        #if defined(MEDIAINFO_LIBCURL_YES)
            String Value_Lower(Value);
            transform(Value_Lower.begin(), Value_Lower.end(), Value_Lower.begin(), (int(*)(int))tolower); //(int(*)(int)) is a patch for unix
 
                 if (Value_Lower==__T("guess"))
                URLEncode_Set(URLEncode_Guess);
            else
                URLEncode_Set(Value.To_int8u()?URLEncode_Yes:URLEncode_No);
            return Ztring();
        #else // defined(MEDIAINFO_LIBCURL_YES)
            return __T("Libcurl support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_LIBCURL_YES)
    }
    if (Option_Lower==__T("ssh_knownhostsfilename"))
    {
        #if defined(MEDIAINFO_LIBCURL_YES)
            Ssh_KnownHostsFileName_Set(Value);
            return Ztring();
        #else // defined(MEDIAINFO_LIBCURL_YES)
            return __T("Libcurl support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_LIBCURL_YES)
    }
 
    if (Option_Lower==__T("info_graph_svg_plugin_state"))
    {
        #if defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_GRAPHVIZ_YES)
            return GraphSvgPluginState()?__T("1"):__T("0");
        #else // defined(MEDIAINFO_GRAPHVIZ_YES)
            return __T("Graphviz support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_GRAPHVIZ_YES)
    }
 
    if (Option_Lower==__T("info_canhandleurls"))
    {
        #if defined(MEDIAINFO_LIBCURL_YES)
            return CanHandleUrls()?__T("1"):__T("0");
        #else // defined(MEDIAINFO_LIBCURL_YES)
            return __T("Libcurl support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_LIBCURL_YES)
    }
    if (Option_Lower==__T("ssh_publickeyfilename"))
    {
        #if defined(MEDIAINFO_LIBCURL_YES)
            Ssh_PublicKeyFileName_Set(Value);
            return Ztring();
        #else // defined(MEDIAINFO_LIBCURL_YES)
            return __T("Libcurl support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_LIBCURL_YES)
    }
    if (Option_Lower==__T("ssh_privatekeyfilename"))
    {
        #if defined(MEDIAINFO_LIBCURL_YES)
            Ssh_PrivateKeyFileName_Set(Value);
            return Ztring();
        #else // defined(MEDIAINFO_LIBCURL_YES)
            return __T("Libcurl support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_LIBCURL_YES)
    }
    if (Option_Lower==__T("ssh_ignoresecurity"))
    {
        #if defined(MEDIAINFO_LIBCURL_YES)
            Ssh_IgnoreSecurity_Set(Value.empty() || Value.To_float32());
            return Ztring();
        #else // defined(MEDIAINFO_LIBCURL_YES)
            return __T("Libcurl support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_LIBCURL_YES)
    }
    if (Option_Lower==__T("ssl_certificatefilename"))
    {
        #if defined(MEDIAINFO_LIBCURL_YES)
            Ssl_CertificateFileName_Set(Value);
            return Ztring();
        #else // defined(MEDIAINFO_LIBCURL_YES)
            return __T("Libcurl support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_LIBCURL_YES)
    }
    if (Option_Lower==__T("ssl_certificateFormat"))
    {
        #if defined(MEDIAINFO_LIBCURL_YES)
            Ssl_CertificateFormat_Set(Value);
            return Ztring();
        #else // defined(MEDIAINFO_LIBCURL_YES)
            return __T("Libcurl support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_LIBCURL_YES)
    }
    if (Option_Lower==__T("ssl_privatekeyfilename"))
    {
        #if defined(MEDIAINFO_LIBCURL_YES)
            Ssl_PrivateKeyFileName_Set(Value);
            return Ztring();
        #else // defined(MEDIAINFO_LIBCURL_YES)
            return __T("Libcurl support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_LIBCURL_YES)
    }
    if (Option_Lower==__T("ssl_privatekeyformat"))
    {
        #if defined(MEDIAINFO_LIBCURL_YES)
            Ssl_PrivateKeyFormat_Set(Value);
            return Ztring();
        #else // defined(MEDIAINFO_LIBCURL_YES)
            return __T("Libcurl support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_LIBCURL_YES)
    }
    if (Option_Lower==__T("ssl_certificateauthorityfilename"))
    {
        #if defined(MEDIAINFO_LIBCURL_YES)
            Ssl_CertificateAuthorityFileName_Set(Value);
            return Ztring();
        #else // defined(MEDIAINFO_LIBCURL_YES)
            return __T("Libcurl support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_LIBCURL_YES)
    }
    if (Option_Lower==__T("ssl_certificateauthoritypath"))
    {
        #if defined(MEDIAINFO_LIBCURL_YES)
            Ssl_CertificateAuthorityPath_Set(Value);
            return Ztring();
        #else // defined(MEDIAINFO_LIBCURL_YES)
            return __T("Libcurl support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_LIBCURL_YES)
    }
    if (Option_Lower==__T("ssl_certificaterevocationlistfilename"))
    {
        #if defined(MEDIAINFO_LIBCURL_YES)
            Ssl_CertificateRevocationListFileName_Set(Value);
            return Ztring();
        #else // defined(MEDIAINFO_LIBCURL_YES)
            return __T("Libcurl support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_LIBCURL_YES)
    }
    if (Option_Lower==__T("ssl_ignoresecurity"))
    {
        #if defined(MEDIAINFO_LIBCURL_YES)
            Ssl_IgnoreSecurity_Set(Value.empty() || Value.To_float32());
            return Ztring();
        #else // defined(MEDIAINFO_LIBCURL_YES)
            return __T("Libcurl support is disabled due to compilation options");
        #endif // defined(MEDIAINFO_LIBCURL_YES)
    }
    if (Option_Lower==__T("trytofix"))
    {
        #if MEDIAINFO_FIXITY
            TryToFix_Set(!(Value==__T("0") || Value.empty()));
            return Ztring();
        #else //MEDIAINFO_FIXITY
            return __T("Fixity support is disabled due to compilation options");
        #endif //MEDIAINFO_FIXITY
    }
    return __T("Option not known");
}
 
//***************************************************************************
// Info
//***************************************************************************
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Complete_Set (size_t NewValue)
{
    CriticalSectionLocker CSL(CS);
    Complete=NewValue;
}
 
size_t MediaInfo_Config::Complete_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Complete;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::BlockMethod_Set (size_t NewValue)
{
    CriticalSectionLocker CSL(CS);
    BlockMethod=NewValue;
}
 
size_t MediaInfo_Config::BlockMethod_Get ()
{
    CriticalSectionLocker CSL(CS);
    return BlockMethod;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Internet_Set (size_t NewValue)
{
    CriticalSectionLocker CSL(CS);
    Internet=NewValue;
}
 
size_t MediaInfo_Config::Internet_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Internet;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::MultipleValues_Set (size_t NewValue)
{
    CriticalSectionLocker CSL(CS);
    MultipleValues=NewValue;
}
 
size_t MediaInfo_Config::MultipleValues_Get ()
{
    CriticalSectionLocker CSL(CS);
    return MultipleValues;
}
 
//---------------------------------------------------------------------------
#if MEDIAINFO_ADVANCED
void MediaInfo_Config::ParseOnlyKnownExtensions_Set(const Ztring &NewValue)
{
    CriticalSectionLocker CSL(CS);
    ParseOnlyKnownExtensions=NewValue;
}
 
Ztring MediaInfo_Config::ParseOnlyKnownExtensions_Get()
{
    CriticalSectionLocker CSL(CS);
    return ParseOnlyKnownExtensions;
}
 
bool MediaInfo_Config::ParseOnlyKnownExtensions_IsSet()
{
    CriticalSectionLocker CSL(CS);
    return !ParseOnlyKnownExtensions.empty();
}
 
set<Ztring> MediaInfo_Config::ParseOnlyKnownExtensions_GetList_Set()
{
    // Example: "+M,-dat" add all extensions for Containers (M) except "dat"
 
    if (!ParseOnlyKnownExtensions_IsSet())
        return set<Ztring>();
 
    Ztring Value=ParseOnlyKnownExtensions_Get();
    Ztring StreamKinds;
    bool DefaultList;
    set<Ztring> List;
    set<Ztring> Excluded;
 
    // Know extensions
    if (Value.empty() || (Value[0]==__T('1') && (Value.size()==1 || Value[1]==__T(',') || Value[1]==__T(';'))))
    {
        DefaultList=true;
        if (Value.size()>=2)
            Value.erase(0, 2);
        else
            Value.clear();
    }
    else
        DefaultList=false;
 
    //With custom list
    if (!Value.empty())
    {
        ZtringList ValidExtensions;
        size_t SeparatorPos=Value.find_first_of(__T(",;"));
        if (SeparatorPos==string::npos)
            List.insert(Value);
        else
        {
            ValidExtensions.Separator_Set(0, Ztring(1, Value[SeparatorPos]));
            ValidExtensions.Write(Value);
        }
        for (size_t i = 0; i<ValidExtensions.size(); i++)
        {
            if (!ValidExtensions[i].empty())
            {
                switch (ValidExtensions[i][0])
                {
                    case __T('+'):
                                    StreamKinds+=ValidExtensions[i].substr(1);
                                    DefaultList=true;
                                    continue;
                    case __T('-'):
                                    Excluded.insert(ValidExtensions[i].substr(1));
                                    DefaultList=true;
                                    continue;
                    default:;
                }
            }
            List.insert(ValidExtensions[i]);
        }
    }
 
    //Default list
    if (DefaultList)
    {
        InfoMap &FormatList=MediaInfoLib::Config.Format_Get();
        for (InfoMap::iterator Format=FormatList.begin(); Format!=FormatList.end(); Format++)
            if (InfoFormat_Extensions<Format->second.size())
            {
                if (!StreamKinds.empty() && Format->second[InfoFormat_KindofFormat].find_first_of(StreamKinds)==string::npos)
                    continue;
 
                ZtringList ValidExtensions;
                ValidExtensions.Separator_Set(0, __T(" "));
                ValidExtensions.Write(Format->second[InfoFormat_Extensions]);
                for (size_t i=0; i<ValidExtensions.size(); i++)
                    if (Excluded.find(ValidExtensions[i])==Excluded.end())
                        List.insert(ValidExtensions[i]);
            }
    }
 
    return List;
}
 
Ztring MediaInfo_Config::ParseOnlyKnownExtensions_GetList_String()
{
    set<Ztring> Extensions=ParseOnlyKnownExtensions_GetList_Set();
    Ztring List;
    for (set<Ztring>::iterator Extension=Extensions.begin(); Extension!=Extensions.end(); Extension++)
    {
        List+=*Extension;
        List+=__T(',');
    }
    if (!List.empty())
        List.resize(List.size()-1);
 
    return List;
}
#endif //MEDIAINFO_ADVANCED
 
//---------------------------------------------------------------------------
void MediaInfo_Config::ShowFiles_Set (const ZtringListList &NewShowFiles)
{
    CriticalSectionLocker CSL(CS);
    for  (size_t Pos=0; Pos<NewShowFiles.size(); Pos++)
    {
        const Ztring& Object=NewShowFiles.Read(Pos, 0);
             if (Object==__T("Nothing"))
            ShowFiles_Nothing=NewShowFiles.Read(Pos, 1).empty()?1:0;
        else if (Object==__T("VideoAudio"))
            ShowFiles_VideoAudio=NewShowFiles.Read(Pos, 1).empty()?1:0;
        else if (Object==__T("VideoOnly"))
            ShowFiles_VideoOnly=NewShowFiles.Read(Pos, 1).empty()?1:0;
        else if (Object==__T("AudioOnly"))
            ShowFiles_AudioOnly=NewShowFiles.Read(Pos, 1).empty()?1:0;
        else if (Object==__T("TextOnly"))
            ShowFiles_TextOnly=NewShowFiles.Read(Pos, 1).empty()?1:0;
    }
}
 
size_t MediaInfo_Config::ShowFiles_Nothing_Get ()
{
    CriticalSectionLocker CSL(CS);
    return ShowFiles_Nothing;
}
 
size_t MediaInfo_Config::ShowFiles_VideoAudio_Get ()
{
    CriticalSectionLocker CSL(CS);
    return ShowFiles_VideoAudio;
}
 
size_t MediaInfo_Config::ShowFiles_VideoOnly_Get ()
{
    CriticalSectionLocker CSL(CS);
    return ShowFiles_VideoOnly;
}
 
size_t MediaInfo_Config::ShowFiles_AudioOnly_Get ()
{
    CriticalSectionLocker CSL(CS);
    return ShowFiles_AudioOnly;
}
 
size_t MediaInfo_Config::ShowFiles_TextOnly_Get ()
{
    CriticalSectionLocker CSL(CS);
    return ShowFiles_TextOnly;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::ParseSpeed_Set (float32 NewValue)
{
    CriticalSectionLocker CSL(CS);
    ParseSpeed=NewValue;
}
 
float32 MediaInfo_Config::ParseSpeed_Get ()
{
    CriticalSectionLocker CSL(CS);
    return ParseSpeed;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Verbosity_Set (float32 NewValue)
{
    CriticalSectionLocker CSL(CS);
    Verbosity=NewValue;
}
 
float32 MediaInfo_Config::Verbosity_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Verbosity;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::ReadByHuman_Set (bool NewValue)
{
    CriticalSectionLocker CSL(CS);
    ReadByHuman=NewValue;
}
 
bool MediaInfo_Config::ReadByHuman_Get ()
{
    CriticalSectionLocker CSL(CS);
    return ReadByHuman;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Legacy_Set (bool NewValue)
{
    CriticalSectionLocker CSL(CS);
    Legacy=NewValue;
}
 
bool MediaInfo_Config::Legacy_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Legacy;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::LegacyStreamDisplay_Set (bool NewValue)
{
    CriticalSectionLocker CSL(CS);
    LegacyStreamDisplay=NewValue;
}
 
bool MediaInfo_Config::LegacyStreamDisplay_Get ()
{
    CriticalSectionLocker CSL(CS);
    return LegacyStreamDisplay;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::SkipBinaryData_Set (bool NewValue)
{
    CriticalSectionLocker CSL(CS);
    SkipBinaryData=NewValue;
}
 
bool MediaInfo_Config::SkipBinaryData_Get ()
{
    CriticalSectionLocker CSL(CS);
    return SkipBinaryData;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Trace_Level_Set (const ZtringListList &NewTrace_Level)
{
    CriticalSectionLocker CSL(CS);
 
    //Global
    if (NewTrace_Level.size()==1 && NewTrace_Level[0].size()==1)
    {
        Trace_Level=NewTrace_Level[0][0].To_float32();
        if (Trace_Layers.to_ulong()==0) //if not set to a specific layer
            Trace_Layers.set();
        return;
    }
 
    //Per item
    else
    {
        Trace_Layers.reset();
        for (size_t Pos=0; Pos<NewTrace_Level.size(); Pos++)
        {
            if (NewTrace_Level[Pos].size()==2)
            {
                if (NewTrace_Level[Pos][0]==__T("Container1"))
                    Trace_Layers.set(0, NewTrace_Level[Pos][1].To_int64u()?true:false);
            }
        }
    }
}
 
float32 MediaInfo_Config::Trace_Level_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Trace_Level;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Compat_Set (int64u NewValue)
{
    CriticalSectionLocker CSL(CS);
    Compat=NewValue;
}
 
int64u MediaInfo_Config::Compat_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Compat;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Https_Set(bool NewValue)
{
    CriticalSectionLocker CSL(CS);
    Https=NewValue;
}
 
bool MediaInfo_Config::Https_Get()
{
    CriticalSectionLocker CSL(CS);
    return Https;
}
 
//---------------------------------------------------------------------------
std::bitset<32> MediaInfo_Config::Trace_Layers_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Trace_Layers;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Trace_TimeSection_OnlyFirstOccurrence_Set (bool Value)
{
    CriticalSectionLocker CSL(CS);
    Trace_TimeSection_OnlyFirstOccurrence=Value;
}
 
bool MediaInfo_Config::Trace_TimeSection_OnlyFirstOccurrence_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Trace_TimeSection_OnlyFirstOccurrence;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Trace_Format_Set (trace_Format NewValue)
{
    CriticalSectionLocker CSL(CS);
    Trace_Format=NewValue;
}
 
MediaInfo_Config::trace_Format MediaInfo_Config::Trace_Format_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Trace_Format;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Trace_Modificator_Set (const ZtringList &NewValue)
{
    ZtringList List(NewValue);
    if (List.size()!=2)
        return;
    transform(List[0].begin(), List[0].end(), List[0].begin(), (int(*)(int))tolower); //(int(*)(int)) is a patch for unix
 
    CriticalSectionLocker CSL(CS);
    Trace_Modificators[List[0]]=List[1]==__T("1");
}
 
Ztring MediaInfo_Config::Trace_Modificator_Get (const Ztring &Value)
{
    CriticalSectionLocker CSL(CS);
    std::map<Ztring, bool>::iterator ToReturn=Trace_Modificators.find(Value);
    if (ToReturn!=Trace_Modificators.end())
        return ToReturn->second?__T("1"):__T("0");
    else
        return Ztring();
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Demux_Set (int8u NewValue)
{
    CriticalSectionLocker CSL(CS);
    Demux=NewValue;
}
 
int8u MediaInfo_Config::Demux_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Demux;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::LineSeparator_Set (const Ztring &NewValue)
{
    CriticalSectionLocker CSL(CS);
    LineSeparator=NewValue;
}
 
Ztring MediaInfo_Config::LineSeparator_Get ()
{
    CriticalSectionLocker CSL(CS);
    return LineSeparator;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Version_Set (const Ztring &NewValue)
{
    CriticalSectionLocker CSL(CS);
    Version=ZtringListList(NewValue).Read(0); //Only the 1st value
}
 
Ztring MediaInfo_Config::Version_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Version;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::ColumnSeparator_Set (const Ztring &NewValue)
{
    CriticalSectionLocker CSL(CS);
    ColumnSeparator=NewValue;
}
 
Ztring MediaInfo_Config::ColumnSeparator_Get ()
{
    CriticalSectionLocker CSL(CS);
    return ColumnSeparator;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::TagSeparator_Set (const Ztring &NewValue)
{
    CriticalSectionLocker CSL(CS);
    TagSeparator=NewValue;
}
 
Ztring MediaInfo_Config::TagSeparator_Get ()
{
    CriticalSectionLocker CSL(CS);
    return TagSeparator;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Quote_Set (const Ztring &NewValue)
{
    CriticalSectionLocker CSL(CS);
    Quote=NewValue;
}
 
Ztring MediaInfo_Config::Quote_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Quote;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::DecimalPoint_Set (const Ztring &NewValue)
{
    CriticalSectionLocker CSL(CS);
    DecimalPoint=NewValue;
}
 
Ztring MediaInfo_Config::DecimalPoint_Get ()
{
    CriticalSectionLocker CSL(CS);
    return DecimalPoint;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::ThousandsPoint_Set (const Ztring &NewValue)
{
    CriticalSectionLocker CSL(CS);
    ThousandsPoint=NewValue;
}
 
Ztring MediaInfo_Config::ThousandsPoint_Get ()
{
    CriticalSectionLocker CSL(CS);
    return ThousandsPoint;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::CarriageReturnReplace_Set (const Ztring &NewValue)
{
    CriticalSectionLocker CSL(CS);
    CarriageReturnReplace=NewValue;
}
 
Ztring MediaInfo_Config::CarriageReturnReplace_Get ()
{
    CriticalSectionLocker CSL(CS);
    return CarriageReturnReplace;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::StreamMax_Set (const ZtringListList &)
{
    CriticalSectionLocker CSL(CS);
    //TODO : implementation
}
 
Ztring MediaInfo_Config::StreamMax_Get ()
{
    CriticalSectionLocker CSL(CS);
    ZtringListList StreamMax;
    //TODO : implementation
    return StreamMax.Read();
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Language_Set (const ZtringListList &NewValue)
{
    CriticalSectionLocker CSL(CS);
 
    //Which language to choose?
    //-Raw
         if (NewValue.size()==1 && NewValue[0].size()==1 && NewValue[0][0]==__T("raw"))
    {
        Language_Raw=true;
        Language.clear();
        //Exceptions
        Language.Write(__T("  Config_Text_ColumnSize"), __T("32"));
        Language.Write(__T("  Config_Text_Separator"), __T(" : "));
        Language.Write(__T("  Config_Text_NumberTag"), __T(" #"));
        Language.Write(__T("  Config_Text_FloatSeparator"), __T("."));
        Language.Write(__T("  Config_Text_ThousandsSeparator"), Ztring());
    }
    //-Add custom language to English language
    else
    {
        Language_Raw=false;
        //Fill base words (with English translation)
        MediaInfo_Config_DefaultLanguage(Language);
        //Add custom language to English language
        for (size_t Pos=0; Pos<NewValue.size(); Pos++)
            if (NewValue[Pos].size()>=2)
                Language.Write(NewValue[Pos][0], NewValue[Pos][1]);
            else if (NewValue[Pos].size()==1 && NewValue[0]==__T("  Config_Text_ThousandsSeparator")) // Only the thousands separator is authorized to be empty, else empty content means keeping default value
                Language.Write(NewValue[Pos][0], Ztring());
    }
 
    //Fill Info
    for (size_t StreamKind=0; StreamKind<Stream_Max; StreamKind++)
        if (!Info[StreamKind].empty())
            Language_Set((stream_t)StreamKind);
}
 
void MediaInfo_Config::Language_Set (stream_t StreamKind)
{
    //CriticalSectionLocker CSL(CS); //No, only used internaly
 
    //Fill Info
    for (size_t Pos=0; Pos<Info[StreamKind].size(); Pos++)
    {
        //Strings - Info_Name_Text
        Ztring ToReplace=Info[StreamKind](Pos, Info_Name);
        if (!Language_Raw && ToReplace.find(__T("/String"))!=Error)
        {
            ToReplace.FindAndReplace(__T("/String1"), Ztring());
            ToReplace.FindAndReplace(__T("/String2"), Ztring());
            ToReplace.FindAndReplace(__T("/String3"), Ztring());
            ToReplace.FindAndReplace(__T("/String4"), Ztring());
            ToReplace.FindAndReplace(__T("/String5"), Ztring());
            ToReplace.FindAndReplace(__T("/String6"), Ztring());
            ToReplace.FindAndReplace(__T("/String7"), Ztring());
            ToReplace.FindAndReplace(__T("/String8"), Ztring());
            ToReplace.FindAndReplace(__T("/String9"), Ztring());
            ToReplace.FindAndReplace(__T("/String"),  Ztring());
        }
        if (!Language_Raw && ToReplace.find(__T('/'))!=Error) //Complex values, like XXX/YYY --> We translate both XXX and YYY
        {
            Ztring ToReplace1=ToReplace.SubString(Ztring(), __T("/"));
            Ztring ToReplace2=ToReplace.SubString(__T("/"), Ztring());
            Info[StreamKind](Pos, Info_Name_Text)=Language.Get(ToReplace1);
            Info[StreamKind](Pos, Info_Name_Text)+=__T("/");
            Info[StreamKind](Pos, Info_Name_Text)+=Language.Get(ToReplace2);
        }
        else
            Info[StreamKind](Pos, Info_Name_Text)=Language.Get(ToReplace);
        //Strings - Info_Measure_Text
        Info[StreamKind](Pos, Info_Measure_Text).clear(); //I don(t know why, but if I don't do this Delphi/C# debugger make crashing the calling program
        Info[StreamKind](Pos, Info_Measure_Text)=Language.Get(Info[StreamKind](Pos, Info_Measure));
        //Slashes
 
    }
}
 
Ztring MediaInfo_Config::Language_Get ()
{
    CriticalSectionLocker CSL(CS);
    Ztring ToReturn;//TODO =Language.Read();
    return ToReturn;
}
 
Ztring MediaInfo_Config::Language_Get_Translate(const Ztring &Par, const Ztring &Value)
{
    const Ztring Translated = Language_Get(Par + Value);
    return Translated.find(Par.c_str()) ? Translated : Value;
}
 
Ztring MediaInfo_Config::Language_Get (const Ztring &Value)
{
    CriticalSectionLocker CSL(CS);
 
    if (Value.find(__T(" / "))==string::npos)
    {
        if (Value.size()<7 || Value.find(__T("/String"))+7!=Value.size())
            return Language.Get(Value);
        Ztring Temp(Value);
        Temp.resize(Value.size()-7);
        return Language.Get(Temp);
    }
 
    ZtringList List;
    List.Separator_Set(0, __T(" / "));
    List.Write(Value);
 
    //Per value
    for (size_t Pos=0; Pos<List.size(); Pos++)
        List[Pos]=Language.Get(List[Pos]);
 
    return List.Read();
}
 
//---------------------------------------------------------------------------
Ztring MediaInfo_Config::Language_Get (const Ztring &Count, const Ztring &Value, bool ValueIsAlwaysSame)
{
    //Integrity
    if (Count.empty() || Count.find_first_not_of(__T("0123456789.+-/*() "))!=string::npos)
        return Count;
 
    //Different Plurals are available or not?
    Ztring Value1=Value+__T('1');
    if (!ValueIsAlwaysSame && Language_Get(Value1)==Value1)
        ValueIsAlwaysSame=true;
 
    //Detecting plural form for multiple plurals
    int8u  Form=(int8u)-1;
 
    if (!ValueIsAlwaysSame)
    {
        //Polish has 2 plurial, Algorithm of Polish
        size_t CountI=Count.To_int32u();
        size_t Pos3=CountI/100;
        int8u  Pos2=(int8u)((CountI-Pos3*100)/10);
        int8u  Pos1=(int8u)(CountI-Pos3*100-Pos2*10);
        if (Pos3==0)
        {
            if (Pos2==0)
            {
                     if (Pos1==0 && Count.size()==1) //Only "0", not "0.xxx"
                    Form=0; //000 to 000 kanal?
                else if (Pos1<=1)
                    Form=1; //001 to 001 kanal
                else if (Pos1<=4)
                    Form=2; //002 to 004 kanaly
                else //if (Pos1>=5)
                    Form=3; //005 to 009 kanalow
            }
            else if (Pos2==1)
                    Form=3; //010 to 019 kanalow
            else //if (Pos2>=2)
            {
                     if (Pos1<=1)
                    Form=3; //020 to 021, 090 to 091 kanalow
                else if (Pos1<=4)
                    Form=2; //022 to 024, 092 to 094 kanali
                else //if (Pos1>=5)
                    Form=3; //025 to 029, 095 to 099 kanalow
            }
        }
        else //if (Pos3>=1)
        {
            if (Pos2==0)
            {
                     if (Pos1<=1)
                    Form=3; //100 to 101 kanalow
                else if (Pos1<=4)
                    Form=2; //102 to 104 kanaly
                else //if (Pos1>=5)
                    Form=3; //105 to 109 kanalow
            }
            else if (Pos2==1)
                    Form=3; //110 to 119 kanalow
            else //if (Pos2>=2)
            {
                     if (Pos1<=1)
                    Form=3; //120 to 121, 990 to 991 kanalow
                else if (Pos1<=4)
                    Form=2; //122 to 124, 992 to 994 kanali
                else //if (Pos1>=5)
                    Form=3; //125 to 129, 995 to 999 kanalow
            }
        }
    }
 
    //Replace dot and thousand separator
    Ztring ToReturn=Count;
    Ztring DecimalPoint=Ztring().From_Number(0.0, 1).substr(1, 1); //Getting Decimal point
    size_t DotPos=ToReturn.find(DecimalPoint);
    if (DotPos!=string::npos)
        ToReturn.FindAndReplace(DecimalPoint, Language_Get(__T("  Config_Text_FloatSeparator")), DotPos);
    else
        DotPos=ToReturn.size();
    if (DotPos>3 && ToReturn[0]==__T('-'))
        DotPos--;
    if (DotPos>3)
        ToReturn.insert(DotPos-3, Language_Get(__T("  Config_Text_ThousandsSeparator")));
 
    //Selecting the form
         if (Form==0)
        ToReturn =Language_Get(Value+__T("0")); //Only the translation
    else if (Form==1)
        ToReturn+=Language_Get(Value+__T("1"));
    else if (Form==2)
        ToReturn+=Language_Get(Value+__T("2"));
    else if (Form==3)
        ToReturn+=Language_Get(Value+__T("3"));
    else
        ToReturn+=Language_Get(Value);
    return ToReturn;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Inform_Set (const ZtringListList &NewValue)
{
    if (NewValue.Read(0, 0)==__T("Details"))
        Trace_Level_Set(NewValue.Read(0, 1));
    else if (Trace_Level_Get() && NewValue.Read(0, 0)==__T("XML"))
    {
        Trace_Format_Set(Trace_Format_XML); // TODO: better coherency in options
        return;
    }
    else if (Trace_Level_Get() && NewValue.Read(0, 0)==__T("MICRO_XML"))
    {
        Trace_Format_Set(Trace_Format_MICRO_XML);
        return;
    }
    else
    {
        if (NewValue.Read(0, 0)==__T("MAXML"))
            Trace_Format_Set(Trace_Format_XML); //All must be XML
        else
            Trace_Format_Set(Trace_Format_Tree); // TODO: better coherency in options
 
        CriticalSectionLocker CSL(CS);
 
        //Inform
        if (NewValue==__T("Summary"))
            MediaInfo_Config_Summary(Custom_View);
        else
            Custom_View=NewValue;
    }
 
    CriticalSectionLocker CSL(CS);
 
    //Parsing pointers to files in streams
    #if defined(MEDIAINFO_FILE_YES)
    for (size_t Pos=0; Pos<Custom_View.size(); Pos++)
    {
        if (Custom_View[Pos].size()>1 && Custom_View(Pos, 1).find(__T("file://"))==0)
        {
            //Open
            Ztring FileName(Custom_View(Pos, 1), 7, Ztring::npos);
            File F(FileName.c_str());
 
            //Read
            int64u Size=F.Size_Get();
            if (Size>=0xFFFFFFFF)
                Size=1024*1024;
            int8u* Buffer=new int8u[(size_t)Size+1];
            size_t F_Offset=F.Read(Buffer, (size_t)Size);
            F.Close();
            Buffer[F_Offset]='\0';
            Ztring FromFile; FromFile.From_UTF8((char*)Buffer);
            delete[] Buffer; //Buffer=NULL;
 
            //Merge
            FromFile.FindAndReplace(__T("\r\n"), __T("\\r\\n"), 0, Ztring_Recursive);
            FromFile.FindAndReplace(__T("\n"), __T("\\r\\n"), 0, Ztring_Recursive);
            Custom_View(Pos, 1)=FromFile;
        }
    }
    #endif //defined(MEDIAINFO_FILE_YES)
}
 
Ztring MediaInfo_Config::Inform_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Custom_View.Read();
}
 
Ztring MediaInfo_Config::Inform_Get (const Ztring &Value)
{
    CriticalSectionLocker CSL(CS);
    size_t Pos=Custom_View.Find(Value);
    if (Pos==Error || 1>=Custom_View[Pos].size())
        return EmptyString_Get();
    return Custom_View[Pos][1];
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Inform_Replace_Set (const ZtringListList &NewValue_Replace)
{
    CriticalSectionLocker CSL(CS);
 
    //Parsing
    for (size_t Pos=0; Pos<NewValue_Replace.size(); Pos++)
    {
        if (NewValue_Replace[Pos].size()==2)
            Custom_View_Replace(NewValue_Replace[Pos][0])=NewValue_Replace[Pos][1];
    }
}
 
ZtringListList MediaInfo_Config::Inform_Replace_Get_All ()
{
    CriticalSectionLocker CSL(CS);
    return Custom_View_Replace;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Inform_Version_Set (bool NewValue)
{
    CriticalSectionLocker CSL(CS);
    Inform_Version=NewValue;
}
 
bool MediaInfo_Config::Inform_Version_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Inform_Version;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Inform_Timestamp_Set (bool NewValue)
{
    CriticalSectionLocker CSL(CS);
    Inform_Timestamp=NewValue;
}
 
bool MediaInfo_Config::Inform_Timestamp_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Inform_Timestamp;
}
 
//---------------------------------------------------------------------------
#if MEDIAINFO_ADVANCED
Ztring MediaInfo_Config::Cover_Data_Set (const Ztring &NewValue_)
{
    Ztring NewValue(NewValue_);
    transform(NewValue.begin(), NewValue.end(), NewValue.begin(), (int(*)(int))tolower); //(int(*)(int)) is a patch for unix
    const int64u Mask=~((1<<Flags_Cover_Data_base64));
    int64u Value;
    if (NewValue.empty())
        Value=0;
    else if (NewValue==__T("base64"))
        Value=(1<< Flags_Cover_Data_base64);
    else
        return __T("Unsupported");
 
    CriticalSectionLocker CSL(CS);
    Flags1&=Mask;
    Flags1|=Value;
    return Ztring();
}
 
Ztring MediaInfo_Config::Cover_Data_Get ()
{
    CriticalSectionLocker CSL(CS);
    Ztring ToReturn;
    if (Flags1&(1<< Flags_Cover_Data_base64))
        ToReturn=__T("base64");
 
    return ToReturn;
}
#endif //MEDIAINFO_ADVANCED
 
//---------------------------------------------------------------------------
#if MEDIAINFO_COMPRESS
Ztring MediaInfo_Config::Inform_Compress_Set (const Ztring &NewValue_)
{
    Ztring NewValue(NewValue_);
    transform(NewValue.begin(), NewValue.end(), NewValue.begin(), (int(*)(int))tolower); //(int(*)(int)) is a patch for unix
    const int64u Mask=~((1<<Flags_Inform_zlib)|(1<<Flags_Inform_base64));
    int64u Value;
    if (NewValue.empty())
        Value=0;
    else if (NewValue== __T("base64"))
        Value=(1<<Flags_Inform_base64);
    else if (NewValue== __T("zlib+base64"))
        Value=(1<<Flags_Inform_zlib)|(1<<Flags_Inform_base64);
    else
        return __T("Unsupported");
 
    CriticalSectionLocker CSL(CS);
    FlagsX&=Mask;
    FlagsX|=Value;
    return Ztring();
}
 
Ztring MediaInfo_Config::Inform_Compress_Get ()
{
    CriticalSectionLocker CSL(CS);
    Ztring ToReturn;
    if (FlagsX&(1<<Flags_Inform_zlib))
        ToReturn=__T("zlib");
    if (FlagsX&(1<<Flags_Inform_base64))
    {
        if (!ToReturn.empty())
            ToReturn+=__T('+');
        ToReturn+=__T("base64");
    }
 
    return ToReturn;
}
#endif //MEDIAINFO_COMPRESS
 
//---------------------------------------------------------------------------
#if MEDIAINFO_COMPRESS
Ztring MediaInfo_Config::Input_Compressed_Set (const Ztring &NewValue_)
{
    Ztring NewValue(NewValue_);
    transform(NewValue.begin(), NewValue.end(), NewValue.begin(), (int(*)(int))tolower); //(int(*)(int)) is a patch for unix
    const int64u Mask=~((1<<Flags_Input_zlib)|(1<<Flags_Input_base64));
    int64u Value;
    if (NewValue.empty())
        Value=0;
    else if (NewValue== __T("zlib"))
        Value=(1<<Flags_Input_zlib);
    else if (NewValue== __T("base64"))
        Value=(1<<Flags_Input_base64);
    else if (NewValue== __T("zlib+base64"))
        Value=(1<<Flags_Input_zlib)|(1<<Flags_Input_base64);
    else
        return __T("Unsupported");
 
    CriticalSectionLocker CSL(CS);
    FlagsX&=Mask;
    FlagsX|=Value;
    return Ztring();
}
 
Ztring MediaInfo_Config::Input_Compressed_Get ()
{
    CriticalSectionLocker CSL(CS);
    Ztring ToReturn;
    if (FlagsX&(1<<Flags_Input_zlib))
        ToReturn=__T("zlib");
    if (FlagsX&(1<<Flags_Input_base64))
    {
        if (!ToReturn.empty())
            ToReturn+=__T('+');
        ToReturn+=__T("base64");
    }
 
    return ToReturn;
}
#endif //MEDIAINFO_COMPRESS
 
//---------------------------------------------------------------------------
const Ztring &MediaInfo_Config::Format_Get (const Ztring &Value, infoformat_t KindOfFormatInfo)
{
    //Loading codec table if not yet done
    {
        CriticalSectionLocker CSL(CS);
    if (Format.empty())
        MediaInfo_Config_Format(Format);
    }
 
    return Format.Get(Value, KindOfFormatInfo);
}
 
//---------------------------------------------------------------------------
InfoMap &MediaInfo_Config::Format_Get ()
{
    //Loading codec table if not yet done
    {
        CriticalSectionLocker CSL(CS);
    if (Format.empty())
        MediaInfo_Config_Format(Format);
    }
 
    return Format;
}
 
//---------------------------------------------------------------------------
const Ztring &MediaInfo_Config::Codec_Get (const Ztring &Value, infocodec_t KindOfCodecInfo)
{
    //Loading codec table if not yet done
    {
        CriticalSectionLocker CSL(CS);
    if (Codec.empty())
        MediaInfo_Config_Codec(Codec);
    }
 
    return Codec.Get(Value, KindOfCodecInfo);
}
 
//---------------------------------------------------------------------------
const Ztring &MediaInfo_Config::Codec_Get (const Ztring &Value, infocodec_t KindOfCodecInfo, stream_t KindOfStream)
{
    //Loading codec table if not yet done
    {
    CriticalSectionLocker CSL(CS);
    if (Codec.empty())
        MediaInfo_Config_Codec(Codec);
    }
 
    //Transform to text
    Ztring KindOfStreamS;
    switch (KindOfStream)
    {
        case Stream_General  : KindOfStreamS=__T("G"); break;
        case Stream_Video    : KindOfStreamS=__T("V"); break;
        case Stream_Audio    : KindOfStreamS=__T("A"); break;
        case Stream_Text     : KindOfStreamS=__T("T"); break;
        case Stream_Image    : KindOfStreamS=__T("I"); break;
        case Stream_Other : KindOfStreamS=__T("C"); break;
        case Stream_Menu     : KindOfStreamS=__T("M"); break;
        case Stream_Max      : KindOfStreamS=__T(" "); break;
    }
 
    return Codec.Get(Value, KindOfCodecInfo, KindOfStreamS, InfoCodec_KindOfStream);
}
 
//---------------------------------------------------------------------------
const Ztring &MediaInfo_Config::CodecID_Get (stream_t KindOfStream, infocodecid_format_t Format, const Ztring &Value, infocodecid_t KindOfCodecIDInfo)
{
    if (Format>=InfoCodecID_Format_Max || KindOfStream>=Stream_Max)
        return EmptyString_Get();
    {
    CriticalSectionLocker CSL(CS);
    if (CodecID[Format][KindOfStream].empty())
    {
        switch (KindOfStream)
        {
            case Stream_General :
                                    switch (Format)
                                    {
                                        case InfoCodecID_Format_Mpeg4 : MediaInfo_Config_CodecID_General_Mpeg4(CodecID[Format][KindOfStream]); break;
                                        default: ;
                                    }
                                    break;
            case Stream_Video   :
                                    switch (Format)
                                    {
                                        case InfoCodecID_Format_Matroska : MediaInfo_Config_CodecID_Video_Matroska(CodecID[Format][KindOfStream]); break;
                                        case InfoCodecID_Format_Mpeg4    : MediaInfo_Config_CodecID_Video_Mpeg4(CodecID[Format][KindOfStream]); break;
                                        case InfoCodecID_Format_Real     : MediaInfo_Config_CodecID_Video_Real(CodecID[Format][KindOfStream]); break;
                                        case InfoCodecID_Format_Riff     : MediaInfo_Config_CodecID_Video_Riff(CodecID[Format][KindOfStream]); break;
                                        default: ;
                                    }
                                    break;
            case Stream_Audio   :
                                    switch (Format)
                                    {
                                        case InfoCodecID_Format_Matroska : MediaInfo_Config_CodecID_Audio_Matroska(CodecID[Format][KindOfStream]); break;
                                        case InfoCodecID_Format_Mpeg4    : MediaInfo_Config_CodecID_Audio_Mpeg4(CodecID[Format][KindOfStream]); break;
                                        case InfoCodecID_Format_Real     : MediaInfo_Config_CodecID_Audio_Real(CodecID[Format][KindOfStream]); break;
                                        case InfoCodecID_Format_Riff     : MediaInfo_Config_CodecID_Audio_Riff(CodecID[Format][KindOfStream]); break;
                                        default: ;
                                    }
                                    break;
            case Stream_Text    :
                                    switch (Format)
                                    {
                                        case InfoCodecID_Format_Matroska : MediaInfo_Config_CodecID_Text_Matroska(CodecID[Format][KindOfStream]); break;
                                        case InfoCodecID_Format_Mpeg4    : MediaInfo_Config_CodecID_Text_Mpeg4(CodecID[Format][KindOfStream]); break;
                                        case InfoCodecID_Format_Riff     : MediaInfo_Config_CodecID_Text_Riff(CodecID[Format][KindOfStream]); break;
                                        default: ;
                                    }
                                    break;
            case Stream_Other   :
                                    switch (Format)
                                    {
                                        case InfoCodecID_Format_Mpeg4    : MediaInfo_Config_CodecID_Other_Mpeg4(CodecID[Format][KindOfStream]); break;
                                        default: ;
                                    }
                                    break;
            default: ;
        }
    }
    }
    return CodecID[Format][KindOfStream].Get(Value, KindOfCodecIDInfo);
}
 
//---------------------------------------------------------------------------
const Ztring &MediaInfo_Config::Library_Get (infolibrary_format_t Format, const Ztring &Value, infolibrary_t KindOfLibraryInfo)
{
    if (Format>=InfoLibrary_Format_Max)
        return EmptyString_Get();
    {
    CriticalSectionLocker CSL(CS);
    if (Library[Format].empty())
    {
        switch (Format)
        {
            case InfoLibrary_Format_DivX : MediaInfo_Config_Library_DivX(Library[Format]); break;
            case InfoLibrary_Format_XviD : MediaInfo_Config_Library_XviD(Library[Format]); break;
            case InfoLibrary_Format_MainConcept_Avc : MediaInfo_Config_Library_MainConcept_Avc(Library[Format]); break;
            case InfoLibrary_Format_VorbisCom : MediaInfo_Config_Library_VorbisCom(Library[Format]); break;
            default: ;
        }
    }
    }
    return Library[Format].Get(Value, KindOfLibraryInfo);
}
 
//---------------------------------------------------------------------------
const Ztring &MediaInfo_Config::Iso639_1_Get (const Ztring &Value)
{
    //Loading codec table if not yet done
    {
        CriticalSectionLocker CSL(CS);
    if (Iso639_1.empty())
        MediaInfo_Config_Iso639_1(Iso639_1);
    }
 
    return Iso639_1.Get(Ztring(Value).MakeLowerCase(), 1);
}
 
//---------------------------------------------------------------------------
const Ztring &MediaInfo_Config::Iso639_2_Get (const Ztring &Value)
{
    //Loading codec table if not yet done
    {
        CriticalSectionLocker CSL(CS);
    if (Iso639_2.empty())
        MediaInfo_Config_Iso639_2(Iso639_2);
    }
 
    return Iso639_2.Get(Ztring(Value).MakeLowerCase(), 1);
}
 
//---------------------------------------------------------------------------
const Ztring MediaInfo_Config::Iso639_Find (const Ztring &Value)
{
    Translation Info;
    MediaInfo_Config_DefaultLanguage (Info);
    Ztring Value_Lower(Value);
    Value_Lower.MakeLowerCase();
 
    for (Translation::iterator Trans=Info.begin(); Trans!=Info.end(); ++Trans)
    {
        Trans->second.MakeLowerCase();
        if (Trans->second==Value_Lower && Trans->first.find(__T("Language_"))==0)
            return Trans->first.substr(9, string::npos);
    }
    return Ztring();
}
 
//---------------------------------------------------------------------------
const Ztring MediaInfo_Config::Iso639_Translate (const Ztring Value)
{
    Ztring Code(Value);
    if (Code.size()==3 && !MediaInfoLib::Config.Iso639_1_Get(Code).empty())
        Code=MediaInfoLib::Config.Iso639_1_Get(Code);
    if (Code.size()>3 && !MediaInfoLib::Config.Iso639_Find(Code).empty())
        Code=MediaInfoLib::Config.Iso639_Find(Code);
    if (Code.size()>3)
        return Value;
    Ztring Language_Translated=MediaInfoLib::Config.Language_Get(__T("Language_")+Code);
    if (Language_Translated.find(__T("Language_"))==0)
        return Value; //No translation found
    return Language_Translated;
}
 
//---------------------------------------------------------------------------
void MediaInfo_Config::Language_Set_Internal(stream_t KindOfStream)
{
    //Loading codec table if not yet done
    if (Info[KindOfStream].empty())
        switch (KindOfStream)
        {
            case Stream_General :   MediaInfo_Config_General(Info[Stream_General]);   Language_Set(Stream_General); break;
            case Stream_Video :     MediaInfo_Config_Video(Info[Stream_Video]);       Language_Set(Stream_Video); break;
            case Stream_Audio :     MediaInfo_Config_Audio(Info[Stream_Audio]);       Language_Set(Stream_Audio); break;
            case Stream_Text :      MediaInfo_Config_Text(Info[Stream_Text]);         Language_Set(Stream_Text); break;
            case Stream_Other :     MediaInfo_Config_Other(Info[Stream_Other]);       Language_Set(Stream_Other); break;
            case Stream_Image :     MediaInfo_Config_Image(Info[Stream_Image]);       Language_Set(Stream_Image); break;
            case Stream_Menu :      MediaInfo_Config_Menu(Info[Stream_Menu]);         Language_Set(Stream_Menu); break;
        default:;
        }
}
 
//---------------------------------------------------------------------------
const Ztring &MediaInfo_Config::Info_Get (stream_t KindOfStream, const Ztring &Value, info_t KindOfInfo)
{
    Language_Set_All(KindOfStream);
    if (KindOfStream>=Stream_Max)
        return EmptyString_Get();
    size_t Pos=Info[KindOfStream].Find(Value);
    if (Pos==Error || (size_t)KindOfInfo>=Info[KindOfStream][Pos].size())
        return EmptyString_Get();
    return Info[KindOfStream][Pos][KindOfInfo];
}
 
const Ztring &MediaInfo_Config::Info_Get (stream_t KindOfStream, size_t Pos, info_t KindOfInfo)
{
    Language_Set_All(KindOfStream);
 
    if (KindOfStream>=Stream_Max)
        return EmptyString_Get();
    if (Pos>=Info[KindOfStream].size() || (size_t)KindOfInfo>=Info[KindOfStream][Pos].size())
        return EmptyString_Get();
    return Info[KindOfStream][Pos][KindOfInfo];
}
 
const ZtringListList &MediaInfo_Config::Info_Get(stream_t KindOfStream)
{
    if (KindOfStream>=Stream_Max)
        return EmptyStringListList_Get();
 
    Language_Set_All(KindOfStream);
 
    return Info[KindOfStream];
}
 
//---------------------------------------------------------------------------
Ztring MediaInfo_Config::Info_Parameters_Get (bool Complete)
{
    ZtringListList ToReturn;
    {
    CriticalSectionLocker CSL(CS);
 
    //Loading all
    MediaInfo_Config_General(Info[Stream_General]);
    MediaInfo_Config_Video(Info[Stream_Video]);
    MediaInfo_Config_Audio(Info[Stream_Audio]);
    MediaInfo_Config_Text(Info[Stream_Text]);
    MediaInfo_Config_Other(Info[Stream_Other]);
    MediaInfo_Config_Image(Info[Stream_Image]);
    MediaInfo_Config_Menu(Info[Stream_Menu]);
 
    //Building
    size_t ToReturn_Pos=0;
 
    for (size_t StreamKind=0; StreamKind<Stream_Max; StreamKind++)
    {
        ToReturn(ToReturn_Pos, 0)=Info[StreamKind].Read(__T("StreamKind"), Info_Text);
        ToReturn_Pos++;
        for (size_t Pos=0; Pos<Info[StreamKind].size(); Pos++)
            if (!Info[StreamKind].Read(Pos, Info_Name).empty())
            {
                if (Complete)
                    ToReturn.push_back(Info[StreamKind].Read(Pos));
                else
                {
                    ToReturn(ToReturn_Pos, 0)=Info[StreamKind].Read(Pos, Info_Name);
                    ToReturn(ToReturn_Pos, 1)=Info[StreamKind].Read(Pos, Info_Info);
                }
                ToReturn_Pos++;
            }
        ToReturn_Pos++;
    }
    }
 
    //Reset of language file
    Language_Set(Ztring()); //TODO: it is reseted to English, it should actually not modify the language config (MediaInfo_Config_xxx() modifies the language config)
 
    return ToReturn.Read();
}
 
//---------------------------------------------------------------------------
Ztring MediaInfo_Config::HideShowParameter(const Ztring &Value, Char Show)
{
    ZtringList List;
    List.Separator_Set(0, __T(","));
    List.Write(Value);
 
    for (size_t j=0; j<List.size(); j++)
    {
        String KindOfStreamS=List[j].substr(0, List[j].find(__T('_')));
        stream_t StreamKind=Stream_Max;
        if (KindOfStreamS==__T("General")) StreamKind=Stream_General;
        if (KindOfStreamS==__T("Video")) StreamKind=Stream_Video;
        if (KindOfStreamS==__T("Audio")) StreamKind= Stream_Audio;
        if (KindOfStreamS==__T("Text")) StreamKind= Stream_Text;
        if (KindOfStreamS==__T("Other")) StreamKind= Stream_Other;
        if (KindOfStreamS==__T("Image")) StreamKind= Stream_Image;
        if (KindOfStreamS==__T("Menu")) StreamKind= Stream_Menu;
        if (StreamKind==Stream_Max)
            return List[j]+=__T(" is unknown");
 
        //Loading codec table if not yet done
        {
        CriticalSectionLocker CSL(CS);
        if (Info[StreamKind].empty())
            switch (StreamKind)
            {
                case Stream_General :   MediaInfo_Config_General(Info[Stream_General]);   Language_Set(Stream_General); break;
                case Stream_Video :     MediaInfo_Config_Video(Info[Stream_Video]);       Language_Set(Stream_Video); break;
                case Stream_Audio :     MediaInfo_Config_Audio(Info[Stream_Audio]);       Language_Set(Stream_Audio); break;
                case Stream_Text :      MediaInfo_Config_Text(Info[Stream_Text]);         Language_Set(Stream_Text); break;
                case Stream_Other :     MediaInfo_Config_Other(Info[Stream_Other]);       Language_Set(Stream_Other); break;
                case Stream_Image :     MediaInfo_Config_Image(Info[Stream_Image]);       Language_Set(Stream_Image); break;
                case Stream_Menu :      MediaInfo_Config_Menu(Info[Stream_Menu]);         Language_Set(Stream_Menu); break;
                default:;
            }
        }
 
        String FieldName=List[j].substr(List[j].find(__T('_'))+1);
        bool Found=false;
        for (size_t i=0; i<Info[StreamKind].size(); i++)
            if (Info[StreamKind][i](Info_Name)==FieldName)
            {
                if (Info_Options<Info[StreamKind][i].size())
                {
                    Info[StreamKind][i][Info_Options].resize(InfoOption_Max, __T(' '));
                    Info[StreamKind][i][Info_Options][InfoOption_ShowInInform]=Show;
                    Info[StreamKind][i][Info_Options][InfoOption_ShowInXml]=Show;
                }
                Found=true;
                break;
            }
        if (!Found)
            return List[j]+=__T(" is unknown");
    }
 
    return Ztring();
}
 
//---------------------------------------------------------------------------
Ztring MediaInfo_Config::Info_OutputFormats_Get(basicformat Format)
{
    switch (Format)
    {
        case BasicFormat_Text:
                                {
                                ZtringListList ToReturn;
                                for (size_t i = 0; i < output_formats_size; i++)
                                    for (size_t j = 0; j < output_formats_item_size; j++)
                                        ToReturn(i, j).From_UTF8(OutputFormats[i][j]);
 
                                size_t max_len = 0;
                                for (size_t i = 0; i < ToReturn.size(); i++)
                                    max_len = std::max(max_len, ToReturn(i, 0).size());
                                //Adapt first column
                                for (size_t Pos = 0; Pos<ToReturn.size(); Pos++)
                                {
                                    Ztring &C1 = ToReturn(Pos, 0);
                                    if (!ToReturn(Pos, 1).empty())
                                    {
                                        C1.resize(max_len + 1, ' ');
                                        C1 += __T(':');
                                    }
                                }
                                ToReturn.Separator_Set(0, LineSeparator_Get());
                                ToReturn.Separator_Set(1, __T(" "));
                                ToReturn.Quote_Set(Ztring());
                                return ToReturn.Read();
                                }
        case BasicFormat_CSV:
                                {
                                ZtringListList ToReturn;
                                for (size_t i = 0; i < output_formats_size; i++)
                                    for (size_t j = 0; j < output_formats_item_size; j++)
                                        ToReturn(i, j).From_UTF8(OutputFormats[i][j]);
 
                                ToReturn.Separator_Set(0, EOL);
                                ToReturn.Separator_Set(1, ",");
                                return ToReturn.Read();
                                }
        case BasicFormat_JSON:
                                {
                                string ToReturn("{\"output\":[");
                                for (size_t i = 0; i < output_formats_size; i++)
                                {
                                    ToReturn += "{";
                                    for (size_t j = 0; j < output_formats_item_size; j++)
                                    {
                                        ToReturn += "\"";
                                        ToReturn += OutputFormats_JSONFields[j];
                                        ToReturn += "\":\"";
                                        ToReturn += OutputFormats[i][j];
                                        ToReturn += (j + 1 < output_formats_item_size)?"\",":"\"";
                                    }
                                    ToReturn += (i + 1 < output_formats_size)?"},":"}";
                                }
                                ToReturn += "]}";
                                return Ztring().From_UTF8(ToReturn.c_str());
                                }
        default: return String();
    }
}
 
//---------------------------------------------------------------------------
Ztring MediaInfo_Config::Info_Tags_Get () const
{
    return Ztring();
}
 
Ztring MediaInfo_Config::Info_Codecs_Get ()
{
    CriticalSectionLocker CSL(CS);
 
    //Loading
    MediaInfo_Config_Codec(Codec);
 
    //Building
    Ztring ToReturn;
    InfoMap::iterator Temp=Codec.begin();
    while (Temp!=Codec.end())
    {
        ToReturn+=Temp->second.Read();
        ToReturn+=EOL;
        ++Temp;
    }
 
    return ToReturn;
}
 
Ztring MediaInfo_Config::Info_Version_Get () const
{
    return MediaInfo_Version;
}
 
Ztring MediaInfo_Config::Info_Url_Get () const
{
    return MediaInfo_Url;
}
 
const Ztring &MediaInfo_Config::EmptyString_Get () const
{
    return EmptyZtring_Const;
}
 
const ZtringListList &MediaInfo_Config::EmptyStringListList_Get () const
{
    return EmptyZtringListList_Const;
}
 
void MediaInfo_Config::FormatDetection_MaximumOffset_Set (int64u Value)
{
    CriticalSectionLocker CSL(CS);
    FormatDetection_MaximumOffset=Value;
}
 
int64u MediaInfo_Config::FormatDetection_MaximumOffset_Get ()
{
    CriticalSectionLocker CSL(CS);
    return FormatDetection_MaximumOffset;
}
 
#if MEDIAINFO_ADVANCED
void MediaInfo_Config::VariableGopDetection_Occurences_Set (int64u Value)
{
    CriticalSectionLocker CSL(CS);
    VariableGopDetection_Occurences=Value;
}
 
int64u MediaInfo_Config::VariableGopDetection_Occurences_Get ()
{
    CriticalSectionLocker CSL(CS);
    return VariableGopDetection_Occurences;
}
#endif // MEDIAINFO_ADVANCED
 
#if MEDIAINFO_ADVANCED
void MediaInfo_Config::VariableGopDetection_GiveUp_Set (bool Value)
{
    CriticalSectionLocker CSL(CS);
    VariableGopDetection_GiveUp=Value;
}
 
bool MediaInfo_Config::VariableGopDetection_GiveUp_Get ()
{
    CriticalSectionLocker CSL(CS);
    return VariableGopDetection_GiveUp;
}
#endif // MEDIAINFO_ADVANCED
 
#if MEDIAINFO_ADVANCED
void MediaInfo_Config::InitDataNotRepeated_Occurences_Set (int64u Value)
{
    CriticalSectionLocker CSL(CS);
    InitDataNotRepeated_Occurences=Value;
}
 
int64u MediaInfo_Config::InitDataNotRepeated_Occurences_Get ()
{
    CriticalSectionLocker CSL(CS);
    return InitDataNotRepeated_Occurences;
}
#endif // MEDIAINFO_ADVANCED
 
#if MEDIAINFO_ADVANCED
void MediaInfo_Config::InitDataNotRepeated_GiveUp_Set (bool Value)
{
    CriticalSectionLocker CSL(CS);
    InitDataNotRepeated_GiveUp=Value;
}
 
bool MediaInfo_Config::InitDataNotRepeated_GiveUp_Get ()
{
    CriticalSectionLocker CSL(CS);
    return InitDataNotRepeated_GiveUp;
}
#endif // MEDIAINFO_ADVANCED
 
 
#if MEDIAINFO_ADVANCED && defined(MEDIAINFO_FILE_YES)
void MediaInfo_Config::TimeOut_Set (int64u Value)
{
    CriticalSectionLocker CSL(CS);
    TimeOut=Value;
}
 
int64u MediaInfo_Config::TimeOut_Get ()
{
    CriticalSectionLocker CSL(CS);
    return TimeOut;
}
#endif // MEDIAINFO_ADVANCED && defined(MEDIAINFO_FILE_YES)
 
void MediaInfo_Config::MpegTs_MaximumOffset_Set (int64u Value)
{
    CriticalSectionLocker CSL(CS);
    MpegTs_MaximumOffset=Value;
}
 
int64u MediaInfo_Config::MpegTs_MaximumOffset_Get ()
{
    CriticalSectionLocker CSL(CS);
    return MpegTs_MaximumOffset;
}
 
void MediaInfo_Config::MpegTs_MaximumScanDuration_Set (int64u Value)
{
    CriticalSectionLocker CSL(CS);
    MpegTs_MaximumScanDuration=Value;
}
 
int64u MediaInfo_Config::MpegTs_MaximumScanDuration_Get ()
{
    CriticalSectionLocker CSL(CS);
    return MpegTs_MaximumScanDuration;
}
 
#if MEDIAINFO_ADVANCED
void MediaInfo_Config::MpegTs_VbrDetection_Delta_Set (float64 Value)
{
    CriticalSectionLocker CSL(CS);
    MpegTs_VbrDetection_Delta=Value;
}
 
float64 MediaInfo_Config::MpegTs_VbrDetection_Delta_Get ()
{
    CriticalSectionLocker CSL(CS);
    return MpegTs_VbrDetection_Delta;
}
#endif // MEDIAINFO_ADVANCED
 
#if MEDIAINFO_ADVANCED
void MediaInfo_Config::MpegTs_VbrDetection_Occurences_Set (int64u Value)
{
    CriticalSectionLocker CSL(CS);
    MpegTs_VbrDetection_Occurences=Value;
}
 
int64u MediaInfo_Config::MpegTs_VbrDetection_Occurences_Get ()
{
    CriticalSectionLocker CSL(CS);
    return MpegTs_VbrDetection_Occurences;
}
#endif // MEDIAINFO_ADVANCED
 
#if MEDIAINFO_ADVANCED
void MediaInfo_Config::MpegTs_VbrDetection_GiveUp_Set (bool Value)
{
    CriticalSectionLocker CSL(CS);
    MpegTs_VbrDetection_GiveUp=Value;
}
 
bool MediaInfo_Config::MpegTs_VbrDetection_GiveUp_Get ()
{
    CriticalSectionLocker CSL(CS);
    return MpegTs_VbrDetection_GiveUp;
}
#endif // MEDIAINFO_ADVANCED
 
void MediaInfo_Config::MpegTs_ForceStreamDisplay_Set (bool Value)
{
    CriticalSectionLocker CSL(CS);
    MpegTs_ForceStreamDisplay=Value;
}
 
bool MediaInfo_Config::MpegTs_ForceStreamDisplay_Get ()
{
    CriticalSectionLocker CSL(CS);
    return MpegTs_ForceStreamDisplay;
}
 
void MediaInfo_Config::MpegTs_ForceTextStreamDisplay_Set(bool Value)
{
    CriticalSectionLocker CSL(CS);
    MpegTs_ForceTextStreamDisplay = Value;
}
 
bool MediaInfo_Config::MpegTs_ForceTextStreamDisplay_Get()
{
    CriticalSectionLocker CSL(CS);
    return MpegTs_ForceTextStreamDisplay;
}
 
#if MEDIAINFO_ADVANCED
Ztring MediaInfo_Config::MAXML_StreamKinds_Get ()
{
    ZtringList List;
    CriticalSectionLocker CSL(CS);
    for (size_t StreamKind=0; StreamKind<Stream_Max; StreamKind++)
    {
        Language_Set_Internal(stream_t(StreamKind));
        List.push_back(Info[StreamKind](__T("StreamKind"), Info_Name, Info_Text));
    }
 
    List.Separator_Set(0, __T(","));
    return List.Read();
}
#endif // MEDIAINFO_ADVANCED
 
#if MEDIAINFO_ADVANCED
extern Ztring Xml_Name_Escape_0_7_78 (const Ztring &Name);
Ztring MediaInfo_Config::MAXML_Fields_Get (const Ztring &StreamKind_String)
{
    CriticalSectionLocker CSL(CS);
 
    size_t StreamKind=Stream_General;
    for (; StreamKind<Stream_Max; StreamKind++)
    {
        Language_Set_Internal(stream_t(StreamKind));
 
        if (StreamKind_String==Info[StreamKind](__T("StreamKind"), Info_Name, Info_Text))
            break;
    }
 
    if (StreamKind>=Stream_Max)
        return Ztring();
 
    ZtringList List;
    for (size_t FieldPos = 0; FieldPos < Info[StreamKind].size(); FieldPos++)
        if (Info_Options < Info[StreamKind][FieldPos].size()
         && InfoOption_ShowInXml < Info[StreamKind][FieldPos][Info_Options].size()
         && Info[StreamKind][FieldPos][Info_Options][InfoOption_ShowInXml]==__T('Y'))
            List.push_back(Xml_Name_Escape_0_7_78(Info[StreamKind][FieldPos][Info_Name]));
 
    List.Separator_Set(0, __T(","));
    return List.Read();
}
#endif // MEDIAINFO_ADVANCED
 
//***************************************************************************
// SubFile
//***************************************************************************
 
//---------------------------------------------------------------------------
ZtringListList MediaInfo_Config::SubFile_Config_Get ()
{
    CriticalSectionLocker CSL(CS);
 
    return SubFile_Config;
}
 
//***************************************************************************
// Custom mapping
//***************************************************************************
 
void MediaInfo_Config::CustomMapping_Set (const Ztring &Value)
{
    ZtringList List; List.Separator_Set(0, __T(","));
    List.Write(Value);
    if (List.size()==3)
    {
        CriticalSectionLocker CSL(CS);
        CustomMapping[List[0]][List[1]]=List[2];
    }
}
 
Ztring MediaInfo_Config::CustomMapping_Get (const Ztring &Format, const Ztring &Field)
{
    CriticalSectionLocker CSL(CS);
    return CustomMapping[Format][Field];
}
 
bool MediaInfo_Config::CustomMapping_IsPresent(const Ztring &Format, const Ztring &Field)
{
    CriticalSectionLocker CSL(CS);
    std::map<Ztring, std::map<Ztring, Ztring> >::iterator PerFormat=CustomMapping.find(Format);
    if (PerFormat==CustomMapping.end())
        return false;
    std::map<Ztring, Ztring>::iterator PerField=PerFormat->second.find(Field);
    if (PerField==PerFormat->second.end())
        return false;
    return true;
}
 
//***************************************************************************
// Report changes
//***************************************************************************
 
#if MEDIAINFO_ADVANCED
void MediaInfo_Config::Format_Profile_Split_Set(bool Value)
{
    CriticalSectionLocker CSL(CS);
    Format_Profile_Split=Value;
}
 
bool MediaInfo_Config::Format_Profile_Split_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Format_Profile_Split;
}
#endif // MEDIAINFO_ADVANCED
 
#if defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
void MediaInfo_Config::Graph_Adm_ShowTrackUIDs_Set(bool Value)
{
    CriticalSectionLocker CSL(CS);
    Graph_Adm_ShowTrackUIDs=Value;
}
 
bool MediaInfo_Config::Graph_Adm_ShowTrackUIDs_Get()
{
    CriticalSectionLocker CSL(CS);
    return Graph_Adm_ShowTrackUIDs;
}
 
void MediaInfo_Config::Graph_Adm_ShowChannelFormats_Set(bool Value)
{
    CriticalSectionLocker CSL(CS);
    Graph_Adm_ShowChannelFormats=Value;
}
 
bool MediaInfo_Config::Graph_Adm_ShowChannelFormats_Get()
{
    CriticalSectionLocker CSL(CS);
    return Graph_Adm_ShowChannelFormats;
}
#endif //defined(MEDIAINFO_GRAPH_YES) && defined(MEDIAINFO_ADM_YES)
 
#if defined(MEDIAINFO_EBUCORE_YES)
void MediaInfo_Config::AcquisitionDataOutputMode_Set(size_t Value)
{
    CriticalSectionLocker CSL(CS);
    AcquisitionDataOutputMode=Value;
}
 
size_t MediaInfo_Config::AcquisitionDataOutputMode_Get ()
{
    CriticalSectionLocker CSL(CS);
    return AcquisitionDataOutputMode;
}
#endif // MEDIAINFO_EBUCORE_YES
#if defined(MEDIAINFO_EBUCORE_YES) || defined(MEDIAINFO_NISO_YES) || MEDIAINFO_ADVANCED
void MediaInfo_Config::ExternalMetadata_Set(Ztring Value)
{
    CriticalSectionLocker CSL(CS);
    if (!ExternalMetadata.empty() && !Value.empty() && Value.find_first_of(__T("\r\n"))==string::npos) //Exception: if new value is on a single line, we add content to the previous content
    {
        ExternalMetadata+=LineSeparator;
        ExternalMetadata+=Value;
        return;
    }
    ExternalMetadata=Value;
}
 
Ztring MediaInfo_Config::ExternalMetadata_Get ()
{
    CriticalSectionLocker CSL(CS);
    return ExternalMetadata;
}
 
void MediaInfo_Config::ExternalMetaDataConfig_Set(Ztring Value)
{
    CriticalSectionLocker CSL(CS);
    ExternalMetaDataConfig=Value;
}
 
Ztring MediaInfo_Config::ExternalMetaDataConfig_Get ()
{
    CriticalSectionLocker CSL(CS);
    return ExternalMetaDataConfig;
}
#endif //defined(MEDIAINFO_EBUCORE_YES) || defined(MEDIAINFO_NISO_YES) || MEDIAINFO_ADVANCED
 
//***************************************************************************
// Event
//***************************************************************************
 
//---------------------------------------------------------------------------
#if MEDIAINFO_EVENTS
bool MediaInfo_Config::Event_CallBackFunction_IsSet ()
{
    CriticalSectionLocker CSL(CS);
 
    return Event_CallBackFunction?true:false;
}
#endif //MEDIAINFO_EVENTS
 
//---------------------------------------------------------------------------
#if MEDIAINFO_EVENTS
Ztring MediaInfo_Config::Event_CallBackFunction_Set (const Ztring &Value)
{
    ZtringList List=Value;
 
    CriticalSectionLocker CSL(CS);
 
    if (List.empty())
    {
        Event_CallBackFunction=(MediaInfo_Event_CallBackFunction*)NULL;
        Event_UserHandler=NULL;
    }
    else
        for (size_t Pos=0; Pos<List.size(); Pos++)
        {
            if (List[Pos].find(__T("CallBack=memory://"))==0)
                Event_CallBackFunction=(MediaInfo_Event_CallBackFunction*)Ztring(List[Pos].substr(18, std::string::npos)).To_int64u();
            else if (List[Pos].find(__T("UserHandle=memory://"))==0)
                Event_UserHandler=(void*)Ztring(List[Pos].substr(20, std::string::npos)).To_int64u();
            else if (List[Pos].find(__T("UserHandler=memory://"))==0)
                Event_UserHandler=(void*)Ztring(List[Pos].substr(21, std::string::npos)).To_int64u();
            else
                return("Problem during Event_CallBackFunction value parsing");
        }
 
    return Ztring();
}
#endif //MEDIAINFO_EVENTS
 
//---------------------------------------------------------------------------
#if MEDIAINFO_EVENTS
Ztring MediaInfo_Config::Event_CallBackFunction_Get ()
{
    CriticalSectionLocker CSL(CS);
 
    return __T("CallBack=memory://")+Ztring::ToZtring((size_t)Event_CallBackFunction)+__T(";UserHandler=memory://")+Ztring::ToZtring((size_t)Event_UserHandler);
}
#endif //MEDIAINFO_EVENTS
 
//---------------------------------------------------------------------------
#if MEDIAINFO_EVENTS
void MediaInfo_Config::Event_Send (const int8u* Data_Content, size_t Data_Size)
{
    CriticalSectionLocker CSL(CS);
 
    if (Event_CallBackFunction)
    {
        MEDIAINFO_DEBUG1(   "Event",
                            Debug+=", EventID=";Debug+=Ztring::ToZtring(LittleEndian2int32u(Data_Content), 16).To_UTF8();)
 
        Event_CallBackFunction ((unsigned char*)Data_Content, Data_Size, Event_UserHandler);
 
        MEDIAINFO_DEBUG2(   "Event",
                            )
    }
}
#endif //MEDIAINFO_EVENTS
 
//---------------------------------------------------------------------------
#if MEDIAINFO_EVENTS
void MediaInfo_Config::Event_Send (const int8u* Data_Content, size_t Data_Size, const Ztring &File_Name)
{
    CriticalSectionLocker CSL(CS);
 
    if (Event_CallBackFunction)
    {
        MEDIAINFO_DEBUG1(   "Event",
                            Debug+=", EventID=";Debug+=Ztring::ToZtring(LittleEndian2int32u(Data_Content), 16).To_UTF8();)
 
        Event_CallBackFunction ((unsigned char*)Data_Content, Data_Size, Event_UserHandler);
 
        MEDIAINFO_DEBUG2(   "Event",
                            )
    }
}
#endif //MEDIAINFO_EVENTS
 
//---------------------------------------------------------------------------
#if MEDIAINFO_EVENTS
void MediaInfo_Config::Log_Send (int8u Type, int8u Severity, int32u MessageCode, const Ztring &Message)
{
    struct MediaInfo_Event_Log_0 Event;
    Event.EventCode=MediaInfo_EventCode_Create(MediaInfo_Parser_None, MediaInfo_Event_Log, 0);
    Event.Type=Type;
    Event.Severity=Severity;
    Event.Reserved2=(int8u)-1;
    Event.Reserved3=(int8u)-1;
    Event.MessageCode=MessageCode;
    Event.Reserved4=(int32u)-1;
    wstring MessageU=Message.To_Unicode();
    string MessageA=Message.To_Local();
    Event.MessageStringU=MessageU.c_str();
    Event.MessageStringA=MessageA.c_str();
    Event_Send((const int8u*)&Event, sizeof(MediaInfo_Event_Log_0));
}
#endif //MEDIAINFO_EVENTS
 
//***************************************************************************
// Graphviz
//***************************************************************************
 
#if defined(MEDIAINFO_GRAPHVIZ_YES)
bool MediaInfo_Config::GraphSvgPluginState()
{
    CriticalSectionLocker CSL(CS);
    return Export_Graph::Load();
}
#endif //defined(MEDIAINFO_GRAPHVIZ_YES)
 
//***************************************************************************
// Curl
//***************************************************************************
 
#if defined(MEDIAINFO_LIBCURL_YES)
bool MediaInfo_Config::CanHandleUrls()
{
    CriticalSectionLocker CSL(CS);
    return Reader_libcurl::Load();
}
 
void MediaInfo_Config::URLEncode_Set (MediaInfo_Config::urlencode Value)
{
    CriticalSectionLocker CSL(CS);
    URLEncode=Value;
}
 
MediaInfo_Config::urlencode MediaInfo_Config::URLEncode_Get()
{
    CriticalSectionLocker CSL(CS);
    return URLEncode;
}
 
void MediaInfo_Config::Ssh_PublicKeyFileName_Set (const Ztring &Value)
{
    CriticalSectionLocker CSL(CS);
    Ssh_PublicKeyFileName=Value;
}
 
Ztring MediaInfo_Config::Ssh_PublicKeyFileName_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Ssh_PublicKeyFileName;
}
 
void MediaInfo_Config::Ssh_PrivateKeyFileName_Set (const Ztring &Value)
{
    CriticalSectionLocker CSL(CS);
    Ssh_PrivateKeyFileName=Value;
}
 
Ztring MediaInfo_Config::Ssh_PrivateKeyFileName_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Ssh_PrivateKeyFileName;
}
 
void MediaInfo_Config::Ssh_KnownHostsFileName_Set (const Ztring &Value)
{
    if (Value.empty())
        return; //empty value means "disable security" for libcurl, not acceptable
 
    CriticalSectionLocker CSL(CS);
    Ssh_KnownHostsFileName=Value;
}
 
Ztring MediaInfo_Config::Ssh_KnownHostsFileName_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Ssh_KnownHostsFileName;
}
 
void MediaInfo_Config::Ssh_IgnoreSecurity_Set (bool Value)
{
    CriticalSectionLocker CSL(CS);
    Ssh_IgnoreSecurity=Value;
}
 
bool MediaInfo_Config::Ssh_IgnoreSecurity_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Ssh_IgnoreSecurity;
}
 
void MediaInfo_Config::Ssl_CertificateFileName_Set (const Ztring &Value)
{
    CriticalSectionLocker CSL(CS);
    Ssl_CertificateFileName=Value;
}
 
Ztring MediaInfo_Config::Ssl_CertificateFileName_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Ssl_CertificateFileName;
}
 
void MediaInfo_Config::Ssl_CertificateFormat_Set (const Ztring &Value)
{
    CriticalSectionLocker CSL(CS);
    Ssl_CertificateFormat=Value;
}
 
Ztring MediaInfo_Config::Ssl_CertificateFormat_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Ssl_CertificateFormat;
}
 
void MediaInfo_Config::Ssl_PrivateKeyFileName_Set (const Ztring &Value)
{
    CriticalSectionLocker CSL(CS);
    Ssl_PrivateKeyFileName=Value;
}
 
Ztring MediaInfo_Config::Ssl_PrivateKeyFileName_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Ssl_PrivateKeyFileName;
}
 
void MediaInfo_Config::Ssl_PrivateKeyFormat_Set (const Ztring &Value)
{
    CriticalSectionLocker CSL(CS);
    Ssl_PrivateKeyFormat=Value;
}
 
Ztring MediaInfo_Config::Ssl_PrivateKeyFormat_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Ssl_PrivateKeyFormat;
}
 
void MediaInfo_Config::Ssl_CertificateAuthorityFileName_Set (const Ztring &Value)
{
    CriticalSectionLocker CSL(CS);
    Ssl_CertificateAuthorityFileName=Value;
}
 
Ztring MediaInfo_Config::Ssl_CertificateAuthorityFileName_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Ssl_CertificateAuthorityFileName;
}
 
void MediaInfo_Config::Ssl_CertificateAuthorityPath_Set (const Ztring &Value)
{
    CriticalSectionLocker CSL(CS);
    Ssl_CertificateAuthorityPath=Value;
}
 
Ztring MediaInfo_Config::Ssl_CertificateAuthorityPath_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Ssl_CertificateAuthorityPath;
}
 
void MediaInfo_Config::Ssl_CertificateRevocationListFileName_Set (const Ztring &Value)
{
    CriticalSectionLocker CSL(CS);
    Ssl_CertificateRevocationListFileName=Value;
}
 
Ztring MediaInfo_Config::Ssl_CertificateRevocationListFileName_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Ssl_CertificateRevocationListFileName;
}
 
void MediaInfo_Config::Ssl_IgnoreSecurity_Set (bool Value)
{
    CriticalSectionLocker CSL(CS);
    Ssl_IgnoreSecurity=Value;
}
 
bool MediaInfo_Config::Ssl_IgnoreSecurity_Get ()
{
    CriticalSectionLocker CSL(CS);
    return Ssl_IgnoreSecurity;
}
#endif //defined(MEDIAINFO_LIBCURL_YES)
 
 
#if MEDIAINFO_FIXITY
//---------------------------------------------------------------------------
void MediaInfo_Config::TryToFix_Set (bool NewValue)
{
    CriticalSectionLocker CSL(CS);
    TryToFix=NewValue;
}
 
bool MediaInfo_Config::TryToFix_Get ()
{
    CriticalSectionLocker CSL(CS);
    return TryToFix;
}
#endif //MEDIAINFO_FIXITY
 
} //NameSpace

V621 Consider inspecting the 'for' operator. It's possible that the loop will be executed incorrectly or won't be executed at all.

V621 Consider inspecting the 'for' operator. It's possible that the loop will be executed incorrectly or won't be executed at all.

V654 The condition 'i < ToReturn.size()' of loop is always false.

V654 The condition 'Pos < ToReturn.size()' of loop is always false.

V797 The 'find' function is used as if it returned a bool type. The return value of the function should probably be compared with std::string::npos.

V688 The 'Language' local variable possesses the same name as one of the class members, which can result in a confusion.

V688 The 'Format' local variable possesses the same name as one of the class members, which can result in a confusion.

V688 The 'Format' local variable possesses the same name as one of the class members, which can result in a confusion.

V688 The 'Format' local variable possesses the same name as one of the class members, which can result in a confusion.

V688 The 'DecimalPoint' local variable possesses the same name as one of the class members, which can result in a confusion.

V688 The 'Format' function argument possesses the same name as one of the class members, which can result in a confusion.

V688 The 'Format' function argument possesses the same name as one of the class members, which can result in a confusion.

V688 The 'Info' local variable possesses the same name as one of the class members, which can result in a confusion.

V688 The 'Complete' function argument possesses the same name as one of the class members, which can result in a confusion.

V688 The 'Format' function argument possesses the same name as one of the class members, which can result in a confusion.

V688 The 'Format' function argument possesses the same name as one of the class members, which can result in a confusion.

V688 The 'Format' function argument possesses the same name as one of the class members, which can result in a confusion.

V801 Decreased performance. It is better to redefine the first function argument as a reference. Consider replacing 'const .. Value' with 'const .. &Value'.

V803 Decreased performance. In case 'Format' is iterator it's more effective to use prefix form of increment. Replace iterator++ with ++iterator.

V803 Decreased performance. In case 'Extension' is iterator it's more effective to use prefix form of increment. Replace iterator++ with ++iterator.

V813 Decreased performance. The 'Value' argument should probably be rendered as a constant reference.

V813 Decreased performance. The 'Value' argument should probably be rendered as a constant reference.

V820 The 'FromFile' variable is not used after copying. Copying can be replaced with move/swap for optimization.

V820 The 'Value' variable is not used after copying. Copying can be replaced with move/swap for optimization.

V820 The 'Value' variable is not used after copying. Copying can be replaced with move/swap for optimization.

V823 Decreased performance. Object may be created in-place in the 'List' container. Consider replacing methods: 'push_back' -> 'emplace_back'.