From 66592f79f2230bf5589bccb1f51da72150bf89c9 Mon Sep 17 00:00:00 2001 From: Filoppi Date: Sun, 3 Mar 2024 15:10:23 +0200 Subject: [PATCH] Video: remove enforced resolution least common multiple of 4 when dumping screenshots and not videos (only videos encoders have this limit). NOTE: this will likely trigger FIFOCI differences. --- Source/Core/VideoCommon/FrameDumper.cpp | 10 ++++++++++ Source/Core/VideoCommon/FrameDumper.h | 1 + Source/Core/VideoCommon/Present.cpp | 15 +++++++-------- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Source/Core/VideoCommon/FrameDumper.cpp b/Source/Core/VideoCommon/FrameDumper.cpp index db4ef5205e..30f6a40e10 100644 --- a/Source/Core/VideoCommon/FrameDumper.cpp +++ b/Source/Core/VideoCommon/FrameDumper.cpp @@ -18,6 +18,9 @@ #include "VideoCommon/Present.h" #include "VideoCommon/VideoConfig.h" +// The video encoder needs the image to be a multiple of x samples. +static constexpr int VIDEO_ENCODER_LCM = 4; + static bool DumpFrameToPNG(const FrameData& frame, const std::string& file_name) { return Common::ConvertRGBAToRGBAndSavePNG(file_name, frame.data, frame.width, frame.height, @@ -354,6 +357,13 @@ bool FrameDumper::IsFrameDumping() const return false; } +int FrameDumper::GetRequiredResolutionLeastCommonMultiple() const +{ + if (Config::Get(Config::MAIN_MOVIE_DUMP_FRAMES)) + return VIDEO_ENCODER_LCM; + return 1; +} + void FrameDumper::DoState(PointerWrap& p) { #ifdef HAVE_FFMPEG diff --git a/Source/Core/VideoCommon/FrameDumper.h b/Source/Core/VideoCommon/FrameDumper.h index 859a4140e3..abf3bac38a 100644 --- a/Source/Core/VideoCommon/FrameDumper.h +++ b/Source/Core/VideoCommon/FrameDumper.h @@ -33,6 +33,7 @@ public: void SaveScreenshot(std::string filename); bool IsFrameDumping() const; + int GetRequiredResolutionLeastCommonMultiple() const; void DoState(PointerWrap& p); diff --git a/Source/Core/VideoCommon/Present.cpp b/Source/Core/VideoCommon/Present.cpp index 3a026bedd5..7de27f5049 100644 --- a/Source/Core/VideoCommon/Present.cpp +++ b/Source/Core/VideoCommon/Present.cpp @@ -25,9 +25,6 @@ std::unique_ptr g_presenter; -// The video encoder needs the image to be a multiple of x samples. -static constexpr int VIDEO_ENCODER_LCM = 4; - namespace VideoCommon { // Stretches the native/internal analog resolution aspect ratio from ~4:3 to ~16:9 @@ -246,16 +243,18 @@ void Presenter::ProcessFrameDumping(u64 ticks) const int width = target_rect.GetWidth(); int height = target_rect.GetHeight(); - // Ensure divisibility by "VIDEO_ENCODER_LCM" and a min of 1 to make it compatible with all the + const int resolution_lcm = g_frame_dumper->GetRequiredResolutionLeastCommonMultiple(); + + // Ensure divisibility by the dumper LCM and a min of 1 to make it compatible with all the // video encoders. Note that this is theoretically only necessary when recording videos and not // screenshots. // We always scale positively to make sure the least amount of information is lost. // // TODO: this should be added as black padding on the edges by the frame dumper. - if ((width % VIDEO_ENCODER_LCM) != 0 || width == 0) - width += VIDEO_ENCODER_LCM - (width % VIDEO_ENCODER_LCM); - if ((height % VIDEO_ENCODER_LCM) != 0 || height == 0) - height += VIDEO_ENCODER_LCM - (height % VIDEO_ENCODER_LCM); + if ((width % resolution_lcm) != 0 || width == 0) + width += resolution_lcm - (width % resolution_lcm); + if ((height % resolution_lcm) != 0 || height == 0) + height += resolution_lcm - (height % resolution_lcm); // Remove any black borders, there would be no point in including them in the recording target_rect.left = 0;