diff --git a/aegisub/options.cpp b/aegisub/options.cpp index feecd3711..4cd2efbb1 100644 --- a/aegisub/options.cpp +++ b/aegisub/options.cpp @@ -165,6 +165,7 @@ void OptionsManager::LoadDefaults(bool onlyDefaults,bool doOverride) { #else SetText(_T("Video Provider"),_T("FFMPEG"),1945); #endif + SetBool(_T("FFmpeg allow unsafe seeking"),false); SetBool(_T("Allow Ancient Avisynth"),false,1700); SetText(_T("Avisynth subs renderer"),_T("vsfilter"),1700); SetBool(_T("Avisynth render own subs"),true,1700); diff --git a/aegisub/video_provider_lavc.cpp b/aegisub/video_provider_lavc.cpp index 39ed3afd9..d77f29d10 100644 --- a/aegisub/video_provider_lavc.cpp +++ b/aegisub/video_provider_lavc.cpp @@ -57,6 +57,7 @@ #include "ass_file.h" #include "lavc_keyframes.h" #include "video_context.h" +#include "options.h" /////////////// @@ -154,6 +155,8 @@ void LAVCVideoProvider::LoadVideo(Aegisub::String filename, double fps) { // Set frame frameNumber = -1; lastFrameNumber = -1; + + allowUnsafeSeeking = Options.AsBool(_T("FFmpeg allow unsafe seeking")); } // Catch errors @@ -398,9 +401,13 @@ const AegiVideoFrame LAVCVideoProvider::GetFrame(int n,int formatType) { hasSeeked = false; // is the seek destination known? does it belong to a frame? - if (startTime < 0 || (frameNumber = FrameFromDTS(startTime)) < 0) - throw _T("ffmpeg video provider: frame accurate seeking failed"); - //frameNumber = ClosestFrameFromDTS(startTime); + if (startTime < 0 || (frameNumber = FrameFromDTS(startTime)) < 0) { + if (allowUnsafeSeeking) + frameNumber = ClosestFrameFromDTS(startTime); + else + throw _T("ffmpeg video provider: frame accurate seeking failed"); + } + } frameNumber++; diff --git a/aegisub/video_provider_lavc.h b/aegisub/video_provider_lavc.h index 91bc9ffc2..e9b393b29 100644 --- a/aegisub/video_provider_lavc.h +++ b/aegisub/video_provider_lavc.h @@ -82,6 +82,7 @@ private: wxArrayInt bytePos; + bool allowUnsafeSeeking; bool isMkv; int64_t lastDecodeTime; int frameNumber;