diff --git a/Source/Core/Core/FifoPlayer/FifoPlayer.cpp b/Source/Core/Core/FifoPlayer/FifoPlayer.cpp index 7761abea48..0a76098cfd 100644 --- a/Source/Core/Core/FifoPlayer/FifoPlayer.cpp +++ b/Source/Core/Core/FifoPlayer/FifoPlayer.cpp @@ -242,7 +242,9 @@ FifoPlayer& FifoPlayer::GetInstance() void FifoPlayer::WriteFrame(const FifoFrameInfo& frame, const AnalyzedFrameInfo& info) { // Core timing information - m_CyclesPerFrame = SystemTimers::GetTicksPerSecond() / VideoInterface::GetTargetRefreshRate(); + m_CyclesPerFrame = static_cast(SystemTimers::GetTicksPerSecond()) * + VideoInterface::GetTargetRefreshRateDenominator() / + VideoInterface::GetTargetRefreshRateNumerator(); m_ElapsedCycles = 0; m_FrameFifoSize = static_cast(frame.fifoData.size()); diff --git a/Source/Core/Core/HW/VideoInterface.cpp b/Source/Core/Core/HW/VideoInterface.cpp index f9f3afc069..14466f906b 100644 --- a/Source/Core/Core/HW/VideoInterface.cpp +++ b/Source/Core/Core/HW/VideoInterface.cpp @@ -60,7 +60,9 @@ static UVIBorderBlankRegister m_BorderHBlank; // 0xcc002076 - 0xcc00207f is full of 0x00FF: unknown // 0xcc002080 - 0xcc002100 even more unknown -static u32 s_target_refresh_rate = 0; +static double s_target_refresh_rate = 0; +static u32 s_target_refresh_rate_numerator = 0; +static u32 s_target_refresh_rate_denominator = 1; static constexpr std::array s_clock_freqs{{ 27000000, @@ -102,14 +104,11 @@ void DoState(PointerWrap& p) p.Do(m_DTVStatus); p.Do(m_FBWidth); p.Do(m_BorderHBlank); - p.Do(s_target_refresh_rate); p.Do(s_ticks_last_line_start); p.Do(s_half_line_count); p.Do(s_half_line_of_next_si_poll); - p.Do(s_even_field_first_hl); - p.Do(s_odd_field_first_hl); - p.Do(s_even_field_last_hl); - p.Do(s_odd_field_last_hl); + + UpdateParameters(); } // Executed after Init, before game boot @@ -698,15 +697,27 @@ void UpdateParameters() s_even_field_first_hl = equ_hl + m_VBlankTimingEven.PRB + GetHalfLinesPerOddField(); s_even_field_last_hl = s_even_field_first_hl + acv_hl - 1; - s_target_refresh_rate = lround(2.0 * SystemTimers::GetTicksPerSecond() / - (GetTicksPerEvenField() + GetTicksPerOddField())); + s_target_refresh_rate_numerator = SystemTimers::GetTicksPerSecond() * 2; + s_target_refresh_rate_denominator = GetTicksPerEvenField() + GetTicksPerOddField(); + s_target_refresh_rate = + static_cast(s_target_refresh_rate_numerator) / s_target_refresh_rate_denominator; } -u32 GetTargetRefreshRate() +double GetTargetRefreshRate() { return s_target_refresh_rate; } +u32 GetTargetRefreshRateNumerator() +{ + return s_target_refresh_rate_numerator; +} + +u32 GetTargetRefreshRateDenominator() +{ + return s_target_refresh_rate_denominator; +} + u32 GetTicksPerSample() { return 2 * SystemTimers::GetTicksPerSecond() / s_clock_freqs[m_Clock]; diff --git a/Source/Core/Core/HW/VideoInterface.h b/Source/Core/Core/HW/VideoInterface.h index 3daf3cbf7c..5da04ab3e6 100644 --- a/Source/Core/Core/HW/VideoInterface.h +++ b/Source/Core/Core/HW/VideoInterface.h @@ -363,7 +363,10 @@ void UpdateInterrupts(); // Change values pertaining to video mode void UpdateParameters(); -u32 GetTargetRefreshRate(); +double GetTargetRefreshRate(); +u32 GetTargetRefreshRateNumerator(); +u32 GetTargetRefreshRateDenominator(); + u32 GetTicksPerSample(); u32 GetTicksPerHalfLine(); u32 GetTicksPerField(); diff --git a/Source/Core/Core/State.cpp b/Source/Core/Core/State.cpp index 7c41674aa5..2124ebca45 100644 --- a/Source/Core/Core/State.cpp +++ b/Source/Core/Core/State.cpp @@ -74,7 +74,7 @@ static Common::Event g_compressAndDumpStateSyncEvent; static std::thread g_save_thread; // Don't forget to increase this after doing changes on the savestate system -constexpr u32 STATE_VERSION = 120; // Last changed in PR 8904 +constexpr u32 STATE_VERSION = 121; // Last changed in PR 8988 // Maps savestate versions to Dolphin versions. // Versions after 42 don't need to be added to this list, diff --git a/Source/Core/VideoCommon/FrameDump.cpp b/Source/Core/VideoCommon/FrameDump.cpp index 7615542d95..117fc5cad8 100644 --- a/Source/Core/VideoCommon/FrameDump.cpp +++ b/Source/Core/VideoCommon/FrameDump.cpp @@ -186,11 +186,11 @@ bool FrameDump::CreateVideoFile() s_codec_context->codec_tag = MKTAG('X', 'V', 'I', 'D'); s_codec_context->codec_type = AVMEDIA_TYPE_VIDEO; - s_codec_context->bit_rate = g_Config.iBitrateKbps * 1000; + s_codec_context->bit_rate = static_cast(g_Config.iBitrateKbps) * 1000; s_codec_context->width = s_width; s_codec_context->height = s_height; - s_codec_context->time_base.num = 1; - s_codec_context->time_base.den = VideoInterface::GetTargetRefreshRate(); + s_codec_context->time_base.num = VideoInterface::GetTargetRefreshRateDenominator(); + s_codec_context->time_base.den = VideoInterface::GetTargetRefreshRateNumerator(); s_codec_context->gop_size = 1; s_codec_context->level = 1; s_codec_context->pix_fmt = g_Config.bUseFFV1 ? AV_PIX_FMT_BGR0 : AV_PIX_FMT_YUV420P;