diff --git a/Core/Compatibility.cpp b/Core/Compatibility.cpp index 5d93f2ce5c35..f0d00747a6b0 100644 --- a/Core/Compatibility.cpp +++ b/Core/Compatibility.cpp @@ -140,6 +140,7 @@ void Compatibility::CheckSettings(IniFile &iniFile, const std::string &gameID) { CheckSetting(iniFile, gameID, "FramebufferAllowLargeVerticalOffset", &flags_.FramebufferAllowLargeVerticalOffset); CheckSetting(iniFile, gameID, "DisableMemcpySlicing", &flags_.DisableMemcpySlicing); CheckSetting(iniFile, gameID, "ForceEnableGPUReadback", &flags_.ForceEnableGPUReadback); + CheckSetting(iniFile, gameID, "UseFFMPEGFindStreamInfo", &flags_.UseFFMPEGFindStreamInfo); } void Compatibility::CheckVRSettings(IniFile &iniFile, const std::string &gameID) { diff --git a/Core/Compatibility.h b/Core/Compatibility.h index 2feddd7725c1..75939a534046 100644 --- a/Core/Compatibility.h +++ b/Core/Compatibility.h @@ -110,6 +110,7 @@ struct CompatFlags { bool FramebufferAllowLargeVerticalOffset; bool DisableMemcpySlicing; bool ForceEnableGPUReadback; + bool UseFFMPEGFindStreamInfo; }; struct VRCompat { diff --git a/Core/HW/MediaEngine.cpp b/Core/HW/MediaEngine.cpp index 224b46e14684..8da752aed70c 100644 --- a/Core/HW/MediaEngine.cpp +++ b/Core/HW/MediaEngine.cpp @@ -18,6 +18,7 @@ #include "Common/Serialize/SerializeFuncs.h" #include "Common/Math/CrossSIMD.h" #include "Core/Config.h" +#include "Core/Core.h" #include "Core/Debugger/MemBlockInfo.h" #include "Core/HW/MediaEngine.h" #include "Core/MemMap.h" @@ -303,7 +304,8 @@ bool MediaEngine::openContext(bool keepReadPos) { } av_dict_free(&open_opt); - if (!SetupStreams()) { + bool usedFFMPEGFindStreamInfo = false; + if (!SetupStreams() || PSP_CoreParameter().compat.flags().UseFFMPEGFindStreamInfo) { // Fallback to old behavior. Reads too much and corrupts when game doesn't read fast enough. // SetupStreams sometimes work for newer FFmpeg 3.1+ now, but sometimes framerate is missing. WARN_LOG_REPORT_ONCE(setupStreams, Log::ME, "Failed to read valid video stream data from header"); @@ -311,6 +313,7 @@ bool MediaEngine::openContext(bool keepReadPos) { closeContext(); return false; } + usedFFMPEGFindStreamInfo = true; } if (m_videoStream >= (int)m_pFormatCtx->nb_streams) { @@ -342,6 +345,11 @@ bool MediaEngine::openContext(bool keepReadPos) { setVideoDim(); m_audioContext = CreateAudioDecoder((PSPAudioType)m_audioType); m_isVideoEnd = false; + + if (PSP_CoreParameter().compat.flags().UseFFMPEGFindStreamInfo && usedFFMPEGFindStreamInfo) { + m_mpegheaderReadPos++; + av_seek_frame(m_pFormatCtx, m_videoStream, 0, 0); + } #endif // USE_FFMPEG return true; } diff --git a/assets/compat.ini b/assets/compat.ini index 821c52aa0849..bf5aa82d1ef4 100644 --- a/assets/compat.ini +++ b/assets/compat.ini @@ -1364,6 +1364,11 @@ UCET00278 = true UCUS98670 = true UCUS98646 = true +[UseFFMPEGFindStreamInfo] +# The Warriors: Works around regression (#8991) by reverting to the old behavior +ULUS10213 = true +ULES00483 = true + [ForceLowerResolutionForEffectsOn] # The water effect of DiRT 2 and Outrun doesn't work in higher resolutions.