int CMediaInfo::GetVideoRotation(const wxString &filename) { MediaInfo MI; wstring To_Display; MI.Open(CConvertUtility::ConvertToStdWstring(filename)); To_Display = MI.Get(Stream_Video, 0, __T("Rotation"), Info_Text, Info_Name).c_str(); MI.Close(); if (To_Display != "") return std::stoi(To_Display); return 0; }
int main (int argc, char *argv[]) { //Information about MediaInfo MediaInfo MI; ZenLib::Ztring To_Display=MI.Option(__T("Info_Version"), __T("0.7.0.0;MediaInfoDLL_Example_MSVC;0.7.0.0")).c_str(); To_Display += __T("\r\n\r\nInfo_Parameters\r\n"); To_Display += MI.Option(__T("Info_Parameters")).c_str(); To_Display += __T("\r\n\r\nInfo_Capacities\r\n"); To_Display += MI.Option(__T("Info_Capacities")).c_str(); To_Display += __T("\r\n\r\nInfo_Codecs\r\n"); To_Display += MI.Option(__T("Info_Codecs")).c_str(); //An example of how to use the library To_Display += __T("\r\n\r\nOpen\r\n"); MI.Open(__T("Example.ogg")); To_Display += __T("\r\n\r\nInform with Complete=false\r\n"); MI.Option(__T("Complete")); To_Display += MI.Inform().c_str(); To_Display += __T("\r\n\r\nInform with Complete=true\r\n"); MI.Option(__T("Complete"), __T("1")); To_Display += MI.Inform().c_str(); To_Display += __T("\r\n\r\nCustom Inform\r\n"); MI.Option(__T("Inform"), __T("General;Example : FileSize=%FileSize%")); To_Display += MI.Inform().c_str(); To_Display += __T("\r\n\r\nGet with Stream=General and Parameter=\"FileSize\"\r\n"); To_Display += MI.Get(Stream_General, 0, __T("FileSize"), Info_Text, Info_Name).c_str(); To_Display += __T("\r\n\r\nGetI with Stream=General and Parameter=46\r\n"); To_Display += MI.Get(Stream_General, 0, 46, Info_Text).c_str(); To_Display += __T("\r\n\r\nCount_Get with StreamKind=Stream_Audio\r\n"); To_Display += ZenLib::Ztring::ToZtring(MI.Count_Get(Stream_Audio, -1)); //Warning : this is an integer To_Display += __T("\r\n\r\nGet with Stream=General and Parameter=\"AudioCount\"\r\n"); To_Display += MI.Get(Stream_General, 0, __T("AudioCount"), Info_Text, Info_Name).c_str(); To_Display += __T("\r\n\r\nGet with Stream=Audio and Parameter=\"StreamCount\"\r\n"); To_Display += MI.Get(Stream_Audio, 0, __T("StreamCount"), Info_Text, Info_Name).c_str(); To_Display += __T("\r\n\r\nClose\r\n"); MI.Close(); std::cout<<To_Display.To_Local().c_str()<<std::endl; return 0; }
vector<CMetadata> CMediaInfo::ReadMetadata(const wxString &filename) { vector<CMetadata> metadata; //Information about MediaInfo MediaInfo MI; String To_Display=MI.Option(__T("Info_Version"), __T("0.7.13;MediaInfoDLL_Example_MSVC;0.7.13")).c_str(); MI.Open(CConvertUtility::ConvertToStdWstring(filename)); std:wstring value = MI.Inform(); metadata = SplitByLine(value); MI.Close(); return metadata; }
BOOL CPPageFileMediaInfo::OnInitDialog() { __super::OnInitDialog(); if (!m_pCFont) { m_pCFont = DNew CFont; } if (!m_pCFont) { return TRUE; } MediaInfo MI; MI.Option(_T("ParseSpeed"), _T("0")); MI.Option(_T("Language"), mi_get_lang_file()); MI.Option(_T("Complete")); MI.Open(m_fn.GetString()); MI_Text = MI.Inform().c_str(); MI.Close(); if (!MI_Text.Find(_T("Unable to load"))) { MI_Text.Empty(); } LOGFONT lf; memset(&lf, 0, sizeof(lf)); lf.lfPitchAndFamily = DEFAULT_PITCH | FF_MODERN; LPCTSTR fonts[] = {_T("Consolas"), _T("Lucida Console"), _T("Courier New"), _T("") }; UINT i = 0; BOOL success; PAINTSTRUCT ps; CDC* cDC = m_mediainfo.BeginPaint(&ps); do { wcscpy_s(lf.lfFaceName, LF_FACESIZE, fonts[i]); lf.lfHeight = -MulDiv(8, cDC->GetDeviceCaps(LOGPIXELSY), 72); success = IsFontInstalled(fonts[i]) && m_pCFont->CreateFontIndirect(&lf); i++; } while (!success && i < _countof(fonts)); m_mediainfo.SetFont(m_pCFont); m_mediainfo.SetWindowText(MI_Text); m_mediainfo.EndPaint(&ps); OldControlProc = (WNDPROC)SetWindowLongPtr(m_mediainfo.m_hWnd, GWLP_WNDPROC, (LONG_PTR)ControlProc); return TRUE; }
// CDLGMediaInfo message handlers BOOL CDLGMediaInfo::OnInitDialog() { CDialog::OnInitDialog(); MediaInfo MI; MI.Open(path); MI.Option("Complete", "1"); m_edit = MI.Inform().c_str(); MI.Close(); UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control }
int main (int argc, MediaInfoLib::Char *argv[]) { //Information about MediaInfo MediaInfo MI; String To_Display=MI.Option(_T("Info_Version"), _T("0.7.0.0;MediaInfoDLL_Example_MSVC;0.7.0.0")).c_str(); To_Display += _T("\r\n\r\nInfo_Parameters\r\n"); To_Display += MI.Option(_T("Info_Parameters")).c_str(); To_Display += _T("\r\n\r\nInfo_Capacities\r\n"); To_Display += MI.Option(_T("Info_Capacities")).c_str(); To_Display += _T("\r\n\r\nInfo_Codecs\r\n"); To_Display += MI.Option(_T("Info_Codecs")).c_str(); //An example of how to use the library To_Display += _T("\r\n\r\nOpen\r\n"); MI.Open(_T("Example.ogg")); To_Display += _T("\r\n\r\nInform with Complete=false\r\n"); MI.Option(_T("Complete")); To_Display += MI.Inform().c_str(); To_Display += _T("\r\n\r\nInform with Complete=true\r\n"); MI.Option(_T("Complete"), _T("1")); To_Display += MI.Inform().c_str(); To_Display += _T("\r\n\r\nCustom Inform\r\n"); MI.Option(_T("Inform"), _T("General;Example : FileSize=%FileSize%")); To_Display += MI.Inform().c_str(); To_Display += _T("\r\n\r\nGet with Stream=General and Parameter=\"FileSize\"\r\n"); To_Display += MI.Get(Stream_General, 0, _T("FileSize"), Info_Text, Info_Name).c_str(); To_Display += _T("\r\n\r\nGetI with Stream=General and Parameter=46\r\n"); To_Display += MI.Get(Stream_General, 0, 46, Info_Text).c_str(); To_Display += _T("\r\n\r\nCount_Get with StreamKind=Stream_Audio\r\n"); #ifdef __MINGW32__ Char* C1=new Char[33]; _itot (MI.Count_Get(Stream_Audio), C1, 10); To_Display +=C1; delete[] C1; #else toStringStream SS; SS << std::setbase(10) << MI.Count_Get(Stream_Audio); To_Display += SS.str(); #endif To_Display += _T("\r\n\r\nGet with Stream=General and Parameter=\"AudioCount\"\r\n"); To_Display += MI.Get(Stream_General, 0, _T("AudioCount"), Info_Text, Info_Name).c_str(); To_Display += _T("\r\n\r\nGet with Stream=Audio and Parameter=\"StreamCount\"\r\n"); To_Display += MI.Get(Stream_Audio, 0, _T("StreamCount"), Info_Text, Info_Name).c_str(); To_Display += _T("\r\n\r\nClose\r\n"); MI.Close(); #ifdef _UNICODE std::wcout << To_Display; #else std::cout << To_Display; #endif return 1; }
HRESULT get_mediainfo(const wchar_t *filename, media_info_entry **out, bool use_localization /* = false */) { if (!out) return E_POINTER; MediaInfo MI; dwindow_log_line(L"Gettting MediaInfo for %s", filename); // localization if (use_localization) { wchar_t path[MAX_PATH]; wcscpy(path, g_apppath); wcscat(path, C(L"MediaInfoLanguageFile")); FILE *f = _wfopen(path, L"rb"); if (f) { wchar_t lang[102400] = L""; char tmp[1024]; wchar_t tmp2[1024]; USES_CONVERSION; while (fscanf(f, "%s", tmp, 1024, f) != EOF) { MultiByteToWideChar(CP_UTF8, 0, tmp, 1024, tmp2, 1024); if (wcsstr(tmp2, L";")) { wcscat(lang, tmp2); wcscat(lang, L"\n"); } } fclose(f); MI.Option(_T("Language"), W2T(lang)); } else { MI.Option(_T("Language")); } } else { MI.Option(_T("Language")); } MI.Open(filename); MI.Option(_T("Complete")); MI.Option(_T("Inform")); String str = MI.Inform().c_str(); MI.Close(); wchar_t *p = (wchar_t*)str.c_str(); wchar_t *p2 = wcsstr(p, L"\n"); wchar_t tmp[20480]; bool next_is_a_header = true; media_info_entry *pm = *out = NULL; while (true) { if (p2) { p2[0] = NULL; p2 ++; } wcscpy(tmp, p); wcstrim(tmp); wcstrim(tmp, L'\n'); wcstrim(tmp, L'\r'); wcs_replace(tmp, L" ", L" "); if (tmp[0] == NULL || tmp[0] == L'\n' || tmp[0] == L'\r') { next_is_a_header = true; } else if (next_is_a_header) { next_is_a_header = false; if (NULL == pm) pm = *out = (media_info_entry*)calloc(1, sizeof(media_info_entry)); else pm = pm->next = (media_info_entry*)calloc(1, sizeof(media_info_entry)); wcscpy(pm->key, tmp); if (wcschr(pm->key, L':')) { *((wchar_t*)wcsrchr(pm->key, L':')) = NULL; wcscpy(pm->value, wcsrchr(tmp, L':')+1); } wcstrim(pm->key); wcstrim(pm->value); pm->level_depth = 0; } else { pm = pm->next = (media_info_entry*)calloc(1, sizeof(media_info_entry)); wcscpy(pm->key, tmp); if (wcschr(pm->key, L':')) { *((wchar_t*)wcsrchr(pm->key, L':')) = NULL; wcscpy(pm->value, wcsrchr(tmp, L':')+1); } wcstrim(pm->key); wcstrim(pm->value); pm->level_depth = 1; } if (!p2) break; p = p2; p2 = wcsstr(p2, L"\n"); } if(out) { dwindow_log_line(L"MediaInfo for %s", filename); for(media_info_entry *p = *out;p; p=p->next) { wchar_t space[] = L" "; space[p->level_depth*2] = NULL; dwindow_log_line(L"%s %s - %s", space, p->key, p->value); } } return S_OK; }
void RegressionTest_Events(Ztring Files, Ztring DataBaseDirectory, int32u Scenario) { // Scenarios: // bit 0 : quick parsing / full parsing // bit 1 : next packet interface // bit 2 : demux (by container only) // bit 3 : do some seeks cout<<" Analyzing"<<endl; ZtringListListF FilesList_Source; if (FileName(Files).Extension_Get()==__T("csv")) FilesList_Source.Load(DataBaseDirectory+__T("\\Events\\FilesList.csv")); else { if (File::Exists(Files)) FilesList_Source.push_back(Files); else FilesList_Source.push_back(Files+__T("\\*.*")); } vector<Events_UserHandle_struct> FilesList; for (size_t FilesList_Source_Pos=0; FilesList_Source_Pos<FilesList_Source.size(); FilesList_Source_Pos++) { ZtringList Temp=Dir::GetAllFileNames(FilesList_Source[FilesList_Source_Pos](0)); for (size_t Temp_Pos=0; Temp_Pos<Temp.size(); Temp_Pos++) { struct Events_UserHandle_struct ToAdd; ToAdd.Name=Temp[Temp_Pos]; ToAdd.DataBaseDirectory=DataBaseDirectory; ToAdd.Files=Files; ToAdd.Scenario=Scenario; if (Scenario&(1<<0)) ToAdd.ParseSpeed=true; if (Scenario&(1<<1)) ToAdd.NextPacket=true; if (Scenario&(1<<2)) ToAdd.DemuxContainerOnly=true; if (Scenario&(1<<3)) ToAdd.Seek=true; FilesList.push_back(ToAdd); } } for (size_t FilesList_Pos=0; FilesList_Pos<FilesList.size(); FilesList_Pos++) { cout<<" "<<FilesList_Pos+1<<"/"<<FilesList.size()<<" "<<FilesList[FilesList_Pos].Name.To_Local()<<endl; MediaInfo MI; Ztring MI_Result; //********************************************************************** // Configuring //********************************************************************** // CallBack configuration // MediaInfo need pointer as text (for compatibility with older version) + 64-bit OS handling // form is "CallBack=memory://handlerInDecimal;UserHandler=memory://handlerInDecimal" // UserHandler is a unique value wich will be provided to the callback function, in order to know which MediaInfo instance send the event wostringstream Event_CallBackFunction_Text; Event_CallBackFunction_Text<<__T("CallBack=memory://")<<(MediaInfo_int64u)Event_CallBackFunction<<__T(";UserHandler=memory://")<<(MediaInfo_int64u)&FilesList[FilesList_Pos]; MI_Result=MI.Option(__T("File_Event_CallBackFunction"), Event_CallBackFunction_Text.str()); if (!MI_Result.empty()) { wcout<<__T("MediaInfo error: ")<<MI_Result<<endl; return; } //Retrieiving basic data MI.Open(FilesList[FilesList_Pos].Name); Ztring Delay_10s=Ztring().Duration_From_Milliseconds(Ztring(MI.Get(Stream_Video, 0, __T("Delay"))).To_int64u()+10000); if (FilesList[FilesList_Pos].ParseSpeed) { MI_Result=MI.Option(__T("ParseSpeed"), __T("1.0")); if (!MI_Result.empty()) { wcout<<__T("MediaInfo error: ")<<MI_Result<<endl; return; } } if (FilesList[FilesList_Pos].DemuxContainerOnly) { MI_Result=MI.Option(__T("Demux"), __T("container")); if (!MI_Result.empty()) { wcout<<__T("MediaInfo error: ")<<MI_Result<<endl; return; } MI_Result=MI.Option(__T("File_Demux_Unpacketize"), __T("1")); if (!MI_Result.empty()) { wcout<<__T("MediaInfo error: ")<<MI_Result<<endl; return; } MI_Result=MI.Option(__T("File_Demux_PCM_20bitTo16bit"), __T("1")); if (!MI_Result.empty()) { wcout<<__T("MediaInfo error: ")<<MI_Result<<endl; return; } } if (FilesList[FilesList_Pos].NextPacket) { MI_Result=MI.Option(__T("File_NextPacket"), __T("1")); if (!MI_Result.empty()) { wcout<<__T("MediaInfo error: ")<<MI_Result<<endl; return; } } MI.Open(FilesList[FilesList_Pos].Name); if (FilesList[FilesList_Pos].NextPacket) { int Counter=0; while (MI.Open_NextPacket()&0x100) { if (FilesList[FilesList_Pos].Seek) { Counter++; if (Counter==0) MI.Option(__T("File_Seek"), __T("0")); if (Counter==100) MI.Option(__T("File_Seek"), Delay_10s); if (Counter==200) MI.Option(__T("File_Seek"), __T("Frame=100")); if (Counter==300) MI.Option(__T("File_Seek"), __T("95%")); } } } FilesList[FilesList_Pos].Clear(); } cout<<" Diff"<<endl; ZtringList Ref=Dir::GetAllFileNames(DataBaseDirectory+__T("\\Events\\Ref\\")+FileName(Files).Name_Get()+__T("\\")+Ztring::ToZtring(Scenario)+__T("*.*")); ZtringList New=Dir::GetAllFileNames(DataBaseDirectory+__T("\\Events\\New\\")+FileName(Files).Name_Get()+__T("\\")+Ztring::ToZtring(Scenario)+__T("*.*")); for (size_t Ref_Pos=0; Ref_Pos<Ref.size(); Ref_Pos++) { Ztring Ref_ToFind=Ref[Ref_Pos]; Ref_ToFind.FindAndReplace(__T("\\Events\\Ref\\"), __T("\\Events\\New\\")); size_t New_RefPos=New.Find(Ref_ToFind); bool IsDiff=false; if (New_RefPos!=(size_t)-1) { File F_Ref; F_Ref.Open(Ref[Ref_Pos]); File F_New; F_New.Open(New[New_RefPos]); if (F_Ref.Size_Get()==F_New.Size_Get()) { int64u Size=F_Ref.Size_Get(); if (Size>100000000) Size=100000000; int8u* F_Ref_Buffer=new int8u[(size_t)Size]; F_Ref.Read(F_Ref_Buffer, (size_t)Size); int8u* F_New_Buffer=new int8u[(size_t)Size]; F_New.Read(F_New_Buffer, (size_t)Size); if (memcmp(F_Ref_Buffer, F_New_Buffer, (size_t)Size)) IsDiff=true; delete[] F_Ref_Buffer; delete[] F_New_Buffer; } else IsDiff=true; } if (New_RefPos==(size_t)-1 || IsDiff) { //Not in new or is different Ztring Diff_Name=Ref[Ref_Pos]; Diff_Name.FindAndReplace(__T("\\Events\\Ref\\"), __T("\\Events\\Diff\\")); if (!Dir::Exists(DataBaseDirectory+__T("\\Events\\Diff"))) Dir::Create(DataBaseDirectory+__T("\\Events\\Diff")); if (!Dir::Exists(DataBaseDirectory+__T("\\Events\\Diff\\")+FileName(Files).Name_Get())) Dir::Create(DataBaseDirectory+__T("\\Events\\Diff\\")+FileName(Files).Name_Get()); if (!Dir::Exists(DataBaseDirectory+__T("\\Events\\Diff\\")+FileName(Files).Name_Get()+__T("\\")+Ztring::ToZtring(Scenario))) Dir::Create(DataBaseDirectory+__T("\\Events\\Diff\\")+FileName(Files).Name_Get()+__T("\\")+Ztring::ToZtring(Scenario)); if (!Dir::Exists(FileName(Diff_Name).Path_Get())) Dir::Create(FileName(Diff_Name).Path_Get()); if (!IsDiff) File::Copy(Ref[Ref_Pos], Diff_Name+__T(".RefAlone.txt")); //Not in new else { File::Copy(Ref[Ref_Pos], Diff_Name+__T(".Ref.txt")); //Diff File::Copy(New[New_RefPos], Diff_Name+__T(".New.txt")); } } if (New_RefPos!=(size_t)-1) New.erase(New.begin()+New_RefPos); } for (size_t New_Pos=0; New_Pos<New.size(); New_Pos++) { //Not in ref Ztring Diff_Name=New[New_Pos]; Diff_Name.FindAndReplace(__T("\\Events\\New\\"), __T("\\Events\\Diff\\")); if (!Dir::Exists(DataBaseDirectory+__T("\\Events\\Diff"))) Dir::Create(DataBaseDirectory+__T("\\Events\\Diff")); if (!Dir::Exists(DataBaseDirectory+__T("\\Events\\Diff\\")+FileName(Files).Name_Get())) Dir::Create(DataBaseDirectory+__T("\\Events\\Diff\\")+FileName(Files).Name_Get()); if (!Dir::Exists(DataBaseDirectory+__T("\\Events\\Diff\\")+FileName(Files).Name_Get()+__T("\\")+Ztring::ToZtring(Scenario))) Dir::Create(DataBaseDirectory+__T("\\Events\\Diff\\")+FileName(Files).Name_Get()+__T("\\")+Ztring::ToZtring(Scenario)); if (!Dir::Exists(FileName(Diff_Name).Path_Get())) Dir::Create(FileName(Diff_Name).Path_Get()); File::Copy(New[New_Pos], Diff_Name+__T(".NewAlone.txt")); //Not in new } }
void NBMediaInfoModel::setupModel() { MediaInfo MI; MI.Open( FromQString( mFileName ) ); QStringList keys; for( int s = (int)Stream_General; s < (int)Stream_Max; s++ ) { size_t streamNumMax = MI.Count_Get( (stream_t)s ); if ( not streamNumMax ) continue; for( size_t j = 0; j < streamNumMax; j++ ) { QString streamKindName = FromZString( MI.Get( (stream_t)s, j, ZString( "StreamKind/String" ), Info_Text ) ); if ( streamNumMax > 1 ) streamKindName += QString( " %1" ).arg( j ); size_t infoCount = MI.Count_Get( (stream_t)s, j ); if ( not infoCount ) continue; NBMediaInfoNode *streamNode = new NBMediaInfoNode( streamKindName, QString(), rootNode ); keys.clear(); for( size_t i = 0; i < infoCount; i++ ) { QString name = FromZString( MI.Get( (stream_t)s, j, i, Info_Name_Text ) ); QString value = FromZString( MI.Get( (stream_t)s, j, i, Info_Text ) ); if ( name.contains( "Count", Qt::CaseInsensitive ) ) continue; else if ( name.contains( "name", Qt::CaseInsensitive ) and not name.contains( "track", Qt::CaseInsensitive ) ) continue; else if ( name.startsWith( "Kind of", Qt::CaseInsensitive ) ) continue; else if ( name == "File size" ) continue; else if ( name.contains( "last modification", Qt::CaseInsensitive ) ) continue; else if ( name.contains( "Extensions usually", Qt::CaseInsensitive ) ) continue; if ( value.size() ) value += FromZString( MI.Get( (stream_t)s, 0, i, Info_Measure_Text ) ); if ( not name.size() or not value.size() ) continue; if ( not keys.contains( name ) ) { keys << name; streamNode->addChild( new NBMediaInfoNode( name, value, streamNode ) ); } } rootNode->addChild( streamNode ); } } mQuickInfo = FromZString( MI.Inform() ); };