From 46a69245311fcb95c6845598833d053dcf0e4bac Mon Sep 17 00:00:00 2001 From: Karl Blomster Date: Wed, 9 Jul 2008 16:48:19 +0000 Subject: [PATCH] added support for DivX (6.x and possibly 5.x) and x264 2-pass stats file to keyframe reader. patch by Harukalover, see bugtracker issue #736. Originally committed to SVN as r2244. --- aegisub/frame_main_events.cpp | 2 +- aegisub/keyframe.cpp | 52 +++++++++++++++++++++++++++++++++-- aegisub/keyframe.h | 2 ++ 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/aegisub/frame_main_events.cpp b/aegisub/frame_main_events.cpp index 25a3b6d4f..28ad4c2e0 100644 --- a/aegisub/frame_main_events.cpp +++ b/aegisub/frame_main_events.cpp @@ -795,7 +795,7 @@ void FrameMain::OnCloseVFR(wxCommandEvent &event) { void FrameMain::OnOpenKeyframes (wxCommandEvent &event) { // Pick file wxString path = Options.AsText(_T("Last open keyframes path")); - wxString filename = wxFileSelector(_T("Select the keyframes file to open"),path,_T(""),_T(".txt"),_T("All supported formats (*.txt, *.pass)|*.txt;*.pass|All files (*.*)|*.*"),wxFD_FILE_MUST_EXIST | wxFD_OPEN); + wxString filename = wxFileSelector(_T("Select the keyframes file to open"),path,_T(""),_T(".txt"),_T("All supported formats (*.txt, *.pass, *.log)|*.txt;*.pass;*.log|All files (*.*)|*.*"),wxFD_FILE_MUST_EXIST | wxFD_OPEN); if (filename.IsEmpty()) return; Options.SetText(_T("Last open keyframes path"),filename); Options.Save(); diff --git a/aegisub/keyframe.cpp b/aegisub/keyframe.cpp index 903c514b8..579adc6a2 100644 --- a/aegisub/keyframe.cpp +++ b/aegisub/keyframe.cpp @@ -55,10 +55,12 @@ void KeyFrameFile::Load(wxString filename) { TextFileReader file(filename,_T("ASCII")); wxString cur = file.ReadLineFromFile(); - // Detect type + // Detect type (Only Xvid, DivX, x264 and Aegisub's keyframe files are currently supported) if (cur == _T("# keyframe format v1")) { OpenAegiKeyFrames(file, keyFrames); } else if (cur.StartsWith(_T("# XviD 2pass stat file"))) { OpenXviDKeyFrames(file, keyFrames); } - else { throw(_T("Invalid keyframes file.")); } + else if (cur.StartsWith(_T("##map version"))) { OpenDivXKeyFrames(file, keyFrames); } + else if (cur.StartsWith(_T("#options:"))) { Openx264KeyFrames(file, keyFrames); } + else { throw(_T("Invalid or unsupported keyframes file.")); } // Set keyframes VideoContext::Get()->SetOverKeyFrames(keyFrames); @@ -136,7 +138,7 @@ void KeyFrameFile::OpenAegiKeyFrames(TextFileReader& file, wxArrayInt& keyFrames void KeyFrameFile::OpenXviDKeyFrames(TextFileReader& file, wxArrayInt& keyFrames) { wxString cur = file.ReadLineFromFile(); - int count = 0; + unsigned int count = 0; // Read lines while (file.HasMoreLines()) { @@ -150,3 +152,47 @@ void KeyFrameFile::OpenXviDKeyFrames(TextFileReader& file, wxArrayInt& keyFrames cur = file.ReadLineFromFile(); } } + +/////////////////// +// DivX stats file +void KeyFrameFile::OpenDivXKeyFrames(TextFileReader& file, wxArrayInt& keyFrames) +{ + wxString cur = file.ReadLineFromFile(); + unsigned int count = 0; + + // Read lines + while (file.HasMoreLines()) + { + if (cur.Contains(_T("I"))) { + keyFrames.Add(count); + count++; + } + else if (cur.Contains(_T("P")) || cur.Contains(_T("B"))) { + count++; + } + cur = file.ReadLineFromFile(); + } +} + +/////////////////// +// x264 stats file +void KeyFrameFile::Openx264KeyFrames(TextFileReader& file, wxArrayInt& keyFrames) +{ + wxString cur = file.ReadLineFromFile(); + unsigned int count = 0; + size_t pos; + + // Read lines + while (file.HasMoreLines()) + { + pos = cur.Find(_T("type:")); + if (cur.Mid(pos,6).Right(1).Lower() == (_T("i"))) { + keyFrames.Add(count); + count++; + } + else if (cur.Mid(pos,6).Right(1).Lower() == (_T("p")) || cur.Mid(pos,6).Right(1).Lower() == (_T("b"))) { + count++; + } + cur = file.ReadLineFromFile(); + } +} diff --git a/aegisub/keyframe.h b/aegisub/keyframe.h index fe5feb4e3..a0c6e3146 100644 --- a/aegisub/keyframe.h +++ b/aegisub/keyframe.h @@ -49,4 +49,6 @@ public: private: static void OpenAegiKeyFrames(TextFileReader& file, wxArrayInt& keyFrames); static void OpenXviDKeyFrames(TextFileReader& file, wxArrayInt& keyFrames); + static void OpenDivXKeyFrames(TextFileReader& file, wxArrayInt& keyFrames); + static void Openx264KeyFrames(TextFileReader& file, wxArrayInt& keyFrames); };