Skip to content

Commit

Permalink
Video: remove enforced resolution least common multiple of 4 when dum…
Browse files Browse the repository at this point in the history
…ping screenshots and not videos (only videos encoders have this limit).

NOTE: this will likely trigger FIFOCI differences.
  • Loading branch information
Filoppi committed Apr 3, 2024
1 parent ed8d956 commit b7fafea
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 8 deletions.
10 changes: 10 additions & 0 deletions Source/Core/VideoCommon/FrameDumper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions Source/Core/VideoCommon/FrameDumper.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class FrameDumper
void SaveScreenshot(std::string filename);

bool IsFrameDumping() const;
int GetRequiredResolutionLeastCommonMultiple() const;

void DoState(PointerWrap& p);

Expand Down
15 changes: 7 additions & 8 deletions Source/Core/VideoCommon/Present.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,6 @@

std::unique_ptr<VideoCommon::Presenter> 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
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit b7fafea

Please sign in to comment.