Merge pull request #13046 from SuperSamus/vi-overclock

Add VBI Frequency Override
This commit is contained in:
JMC47
2025-05-12 13:36:55 -04:00
committed by GitHub
20 changed files with 189 additions and 17 deletions

View File

@ -62,13 +62,13 @@ struct FrameDumpContext
namespace
{
AVRational GetTimeBaseForCurrentRefreshRate()
AVRational GetTimeBaseForCurrentRefreshRate(s64 max_denominator)
{
auto& vi = Core::System::GetInstance().GetVideoInterface();
int num;
int den;
av_reduce(&num, &den, int(vi.GetTargetRefreshRateDenominator()),
int(vi.GetTargetRefreshRateNumerator()), std::numeric_limits<int>::max());
int(vi.GetTargetRefreshRateNumerator()), max_denominator);
return AVRational{num, den};
}
@ -248,11 +248,16 @@ bool FFMpegFrameDump::CreateVideoFile()
return false;
}
m_max_denominator = std::numeric_limits<s64>::max();
// Force XVID FourCC for better compatibility when using H.263
if (codec->id == AV_CODEC_ID_MPEG4)
{
m_context->codec->codec_tag = MKTAG('X', 'V', 'I', 'D');
m_max_denominator = std::numeric_limits<unsigned short>::max();
}
const auto time_base = GetTimeBaseForCurrentRefreshRate();
const auto time_base = GetTimeBaseForCurrentRefreshRate(m_max_denominator);
INFO_LOG_FMT(FRAMEDUMP, "Creating video file: {} x {} @ {}/{} fps", m_context->width,
m_context->height, time_base.den, time_base.num);
@ -535,7 +540,7 @@ FrameState FFMpegFrameDump::FetchState(u64 ticks, int frame_number) const
state.frame_number = frame_number;
state.savestate_index = m_savestate_index;
const auto time_base = GetTimeBaseForCurrentRefreshRate();
const auto time_base = GetTimeBaseForCurrentRefreshRate(m_max_denominator);
state.refresh_rate_num = time_base.den;
state.refresh_rate_den = time_base.num;
return state;

View File

@ -4,6 +4,7 @@
#pragma once
#include <ctime>
#include <limits>
#include <memory>
#include "Common/CommonTypes.h"
@ -62,6 +63,9 @@ private:
// Used for filename generation.
std::time_t m_start_time = {};
u32 m_file_index = 0;
// Some codecs (like MPEG4) have a limit to this
int64_t m_max_denominator = std::numeric_limits<s64>::max();
};
#if !defined(HAVE_FFMPEG)