From 9b05b380cde2c7a2e6c890211bfc4cca21578d6a Mon Sep 17 00:00:00 2001 From: Joachim Breuer Date: Thu, 1 Jun 2023 08:40:22 +0200 Subject: [PATCH 1/4] Implement subtitle frame rate correction Allows the user to specify different assumed fps for the subtitles, to enable use of subtitle files from a different (telecine/pulldown) variant of the media. --- .../resources/strings.po | 11 ++++++++ xbmc/application/ApplicationPlayer.cpp | 10 ++++++- xbmc/application/ApplicationPlayer.h | 4 ++- xbmc/cores/IPlayer.h | 7 +++-- xbmc/cores/VideoPlayer/IVideoPlayer.h | 2 ++ xbmc/cores/VideoPlayer/VideoPlayer.cpp | 20 +++++++++++++ xbmc/cores/VideoPlayer/VideoPlayer.h | 2 ++ xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp | 9 ++++-- xbmc/cores/VideoPlayer/VideoPlayerVideo.h | 3 ++ xbmc/cores/VideoSettings.cpp | 9 ++++++ xbmc/cores/VideoSettings.h | 28 +++++++++++++++++++ .../dialogs/GUIDialogSubtitleSettings.cpp | 20 +++++++++++++ .../video/dialogs/GUIDialogSubtitleSettings.h | 3 +- 13 files changed, 120 insertions(+), 8 deletions(-) diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index 9fb3dcb2b0627..5892fd4365e43 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -23789,6 +23789,17 @@ msgctxt "#39201" msgid "HDR10+" msgstr "" +#: xbmc/dialogs/GUIDialogSubtitles.cpp +msgctxt "#39202" +msgid "Subtitle frame rate correction" +msgstr "" + +#: xbmc/dialogs/GUIDialogSubtitles.cpp +msgctxt "#39203" +msgid "Same as video" +msgstr "" + + # 40000 to 40800 are reserved for Video Versions feature #. Generic video versions label (plural) diff --git a/xbmc/application/ApplicationPlayer.cpp b/xbmc/application/ApplicationPlayer.cpp index 9d14233e2217b..06741e0b317d7 100644 --- a/xbmc/application/ApplicationPlayer.cpp +++ b/xbmc/application/ApplicationPlayer.cpp @@ -737,6 +737,13 @@ void CApplicationPlayer::SetSubTitleDelay(float fValue) player->SetSubTitleDelay(fValue); } +void CApplicationPlayer::SetSubtitleFPS(ESUBTITLEFPS value) +{ + std::shared_ptr player = GetInternal(); + if (player) + player->SetSubtitleFPS(value); +} + void CApplicationPlayer::SetAVDelay(float fValue) { std::shared_ptr player = GetInternal(); @@ -765,7 +772,8 @@ void CApplicationPlayer::GetAudioCapabilities(std::vector& audioCaps) const player->GetAudioCapabilities(audioCaps); } -void CApplicationPlayer::GetSubtitleCapabilities(std::vector& subCaps) const +void CApplicationPlayer::GetSubtitleCapabilities( + std::vector& subCaps) const { const std::shared_ptr player = GetInternal(); if (player) diff --git a/xbmc/application/ApplicationPlayer.h b/xbmc/application/ApplicationPlayer.h index 2a641d0815849..9166cd571de3b 100644 --- a/xbmc/application/ApplicationPlayer.h +++ b/xbmc/application/ApplicationPlayer.h @@ -95,8 +95,9 @@ class CApplicationPlayer : public IApplicationComponent std::string GetPlayerState(); PLAYLIST::Id GetPreferredPlaylist() const; int GetSubtitleDelay() const; + ESUBTITLEFPS GetSubtitleFPS() const; int GetSubtitle(); - void GetSubtitleCapabilities(std::vector& subCaps) const; + void GetSubtitleCapabilities(std::vector& subCaps) const; int GetSubtitleCount() const; void GetSubtitleStreamInfo(int index, SubtitleStreamInfo& info) const; bool GetSubtitleVisible() const; @@ -152,6 +153,7 @@ class CApplicationPlayer : public IApplicationComponent bool SetPlayerState(const std::string& state); void SetSubtitle(int iStream); void SetSubTitleDelay(float fValue = 0.0f); + void SetSubtitleFPS(ESUBTITLEFPS value); void SetSubtitleVisible(bool bVisible); /*! diff --git a/xbmc/cores/IPlayer.h b/xbmc/cores/IPlayer.h index 9b04674c41573..939b702f900a1 100644 --- a/xbmc/cores/IPlayer.h +++ b/xbmc/cores/IPlayer.h @@ -64,7 +64,8 @@ enum IPlayerSubtitleCapabilities IPC_SUBS_ALL, IPC_SUBS_SELECT, IPC_SUBS_EXTERNAL, - IPC_SUBS_OFFSET + IPC_SUBS_OFFSET, + IPC_SUBS_STRETCH }; enum ERENDERFEATURE @@ -117,6 +118,8 @@ class IPlayer virtual void SetSubTitleDelay(float fValue = 0.0f) {} virtual float GetSubTitleDelay() { return 0.0f; } + virtual void SetSubtitleFPS(ESUBTITLEFPS value = ST_FPS_SAME) {} + virtual ESUBTITLEFPS GetSubtitleFPS() { return ST_FPS_SAME; } virtual int GetSubtitleCount() const { return 0; } virtual int GetSubtitle() { return -1; } virtual void GetSubtitleStreamInfo(int index, SubtitleStreamInfo& info) const {} @@ -217,7 +220,7 @@ class IPlayer /*! \brief define the subtitle capabilities of the player */ - virtual void GetSubtitleCapabilities(std::vector& subCaps) const + virtual void GetSubtitleCapabilities(std::vector& subCaps) const { subCaps.assign(1, IPC_SUBS_ALL); } diff --git a/xbmc/cores/VideoPlayer/IVideoPlayer.h b/xbmc/cores/VideoPlayer/IVideoPlayer.h index cf30266692fdb..08cd04e32299b 100644 --- a/xbmc/cores/VideoPlayer/IVideoPlayer.h +++ b/xbmc/cores/VideoPlayer/IVideoPlayer.h @@ -88,6 +88,8 @@ class IDVDStreamPlayerVideo : public IDVDStreamPlayer virtual bool IsSubtitleEnabled() = 0; virtual double GetSubtitleDelay() = 0; virtual void SetSubtitleDelay(double delay) = 0; + virtual double GetSubtitleFPS() = 0; + virtual void SetSubtitleFPS(double fps) = 0; bool IsStalled() const override = 0; virtual bool IsRewindStalled() const { return false; } virtual double GetCurrentPts() = 0; diff --git a/xbmc/cores/VideoPlayer/VideoPlayer.cpp b/xbmc/cores/VideoPlayer/VideoPlayer.cpp index 22ff11050108d..d30a7a64fa8b5 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayer.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayer.cpp @@ -3347,6 +3347,26 @@ float CVideoPlayer::GetSubTitleDelay() return (float) -m_VideoPlayerVideo->GetSubtitleDelay() / DVD_TIME_BASE; } +void CVideoPlayer::SetSubtitleFPS(ESUBTITLEFPS value) +{ + m_processInfo->GetVideoSettingsLocked().SetSubtitleFPS(value); + double dValue = 0.0; + if (value != ST_FPS_SAME) + dValue = ((int)value) / 1000.0; + m_VideoPlayerVideo->SetSubtitleFPS(dValue); +} + +ESUBTITLEFPS CVideoPlayer::GetSubtitleFPS() +{ + // return m_processInfo->GetVideoSettings().m_subtitleFPS; + double dValue = m_VideoPlayerVideo->GetSubtitleFPS(); + // simplistic implementation, could properly have acceptance ranges for each setting or such + if (dValue == 0.0) + return ST_FPS_SAME; + else + return static_cast((int)(dValue * 1000.0)); +} + bool CVideoPlayer::GetSubtitleVisible() const { if (m_pInputStream && m_pInputStream->IsStreamType(DVDSTREAM_TYPE_DVD)) diff --git a/xbmc/cores/VideoPlayer/VideoPlayer.h b/xbmc/cores/VideoPlayer/VideoPlayer.h index 01cbca01197f6..7d61d324d7135 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayer.h +++ b/xbmc/cores/VideoPlayer/VideoPlayer.h @@ -282,6 +282,8 @@ class CVideoPlayer : public IPlayer, public CThread, public IVideoPlayer, void SetSubTitleDelay(float fValue = 0.0f) override; float GetSubTitleDelay() override; + void SetSubtitleFPS(ESUBTITLEFPS value) override; + ESUBTITLEFPS GetSubtitleFPS() override; int GetSubtitleCount() const override; int GetSubtitle() override; void GetSubtitleStreamInfo(int index, SubtitleStreamInfo& info) const override; diff --git a/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp b/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp index 092470370244a..00746d0f7fac2 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp @@ -63,6 +63,7 @@ CVideoPlayerVideo::CVideoPlayerVideo(CDVDClock* pClock m_paused = false; m_syncState = IDVDStreamPlayer::SYNC_STARTING; m_iSubtitleDelay = 0; + m_subtitleFPS = 0.0; m_iLateFrames = 0; m_iDroppedRequest = 0; m_fForcedAspectRatio = 0; @@ -802,9 +803,11 @@ void CVideoPlayerVideo::Flush(bool sync) void CVideoPlayerVideo::ProcessOverlays(const VideoPicture* pSource, double pts) { + double pts1 = (m_subtitleFPS == 0.0) ? pts : pts * (m_fFrameRate / m_subtitleFPS); + // remove any overlays that are out of time if (m_syncState == IDVDStreamPlayer::SYNC_INSYNC) - m_pOverlayContainer->CleanUp(pts - m_iSubtitleDelay); + m_pOverlayContainer->CleanUp(pts1 - m_iSubtitleDelay); VecOverlays overlays; @@ -822,7 +825,7 @@ void CVideoPlayerVideo::ProcessOverlays(const VideoPicture* pSource, double pts) if(!pOverlay->bForced && !m_bRenderSubs) continue; - double pts2 = pOverlay->bForced ? pts : pts - m_iSubtitleDelay; + double pts2 = pOverlay->bForced ? pts1 : pts1 - m_iSubtitleDelay; if((pOverlay->iPTSStartTime <= pts2 && (pOverlay->iPTSStopTime > pts2 || pOverlay->iPTSStopTime == 0LL))) { @@ -837,7 +840,7 @@ void CVideoPlayerVideo::ProcessOverlays(const VideoPicture* pSource, double pts) for(it = overlays.begin(); it != overlays.end(); ++it) { - double pts2 = (*it)->bForced ? pts : pts - m_iSubtitleDelay; + double pts2 = (*it)->bForced ? pts1 : pts1 - m_iSubtitleDelay; m_renderManager.AddOverlay(*it, pts2); } } diff --git a/xbmc/cores/VideoPlayer/VideoPlayerVideo.h b/xbmc/cores/VideoPlayer/VideoPlayerVideo.h index d0c83172f0748..1be7f2e42d539 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayerVideo.h +++ b/xbmc/cores/VideoPlayer/VideoPlayerVideo.h @@ -65,6 +65,8 @@ class CVideoPlayerVideo : public CThread, public IDVDStreamPlayerVideo bool IsSubtitleEnabled() override { return m_bRenderSubs; } double GetSubtitleDelay() override { return m_iSubtitleDelay; } void SetSubtitleDelay(double delay) override { m_iSubtitleDelay = delay; } + double GetSubtitleFPS() override { return m_subtitleFPS; } + void SetSubtitleFPS(double fps) override { m_subtitleFPS = fps; } bool IsStalled() const override { return m_stalled; } bool IsRewindStalled() const override { return m_rewindStalled; } double GetCurrentPts() override; @@ -105,6 +107,7 @@ class CVideoPlayerVideo : public CThread, public IDVDStreamPlayerVideo int CalcDropRequirement(double pts); double m_iSubtitleDelay; + double m_subtitleFPS; int m_iLateFrames; int m_iDroppedFrames; diff --git a/xbmc/cores/VideoSettings.cpp b/xbmc/cores/VideoSettings.cpp index ec474b3ff95dd..ab572abc01476 100644 --- a/xbmc/cores/VideoSettings.cpp +++ b/xbmc/cores/VideoSettings.cpp @@ -24,6 +24,7 @@ CVideoSettings::CVideoSettings() m_AudioStream = -1; m_SubtitleStream = -1; m_SubtitleDelay = 0.0f; + m_subtitleFPS = ST_FPS_SAME; m_subtitleVerticalPosition = 0; m_subtitleVerticalPositionSave = false; m_SubtitleOn = true; @@ -57,6 +58,8 @@ bool CVideoSettings::operator!=(const CVideoSettings &right) const if (m_AudioStream != right.m_AudioStream) return true; if (m_SubtitleStream != right.m_SubtitleStream) return true; if (m_SubtitleDelay != right.m_SubtitleDelay) return true; + if (m_subtitleFPS != right.m_subtitleFPS) + return true; if (m_subtitleVerticalPosition != right.m_subtitleVerticalPosition) return true; if (m_subtitleVerticalPositionSave != right.m_subtitleVerticalPositionSave) @@ -125,6 +128,12 @@ void CVideoSettingsLocked::SetSubtitleDelay(float delay) m_videoSettings.m_SubtitleDelay = delay; } +void CVideoSettingsLocked::SetSubtitleFPS(double stretch) +{ + std::unique_lock lock(m_critSection); + m_videoSettings.m_subtitleFPS = stretch; +} + void CVideoSettingsLocked::SetSubtitleVerticalPosition(int value, bool save) { std::unique_lock lock(m_critSection); diff --git a/xbmc/cores/VideoSettings.h b/xbmc/cores/VideoSettings.h index a7135da5d8734..b5786adb731c7 100644 --- a/xbmc/cores/VideoSettings.h +++ b/xbmc/cores/VideoSettings.h @@ -177,6 +177,32 @@ struct fmt::formatter : fmt::formatter "add/remove a mapping?"); }; +enum ESUBTITLEFPS +{ + ST_FPS_SAME = 0, + ST_FPS_24 = 23976, + ST_FPS_25 = 25000 +}; + +template<> +struct fmt::formatter : fmt::formatter +{ +public: + template + constexpr auto format(const ESUBTITLEFPS& subtitleFPS, FormatContext& ctx) + { + const auto it = subtitleFPSMap.find(subtitleFPS); + if (it == subtitleFPSMap.cend()) + throw std::range_error("no subtitle stretch string found"); + + return fmt::formatter::format(it->second, ctx); + } + +private: + static constexpr auto subtitleFPSMap = make_map( + {{ST_FPS_SAME, "Same as video"}, {ST_FPS_24, "24 fps"}, {ST_FPS_25, "25 fps"}}); +}; + enum ViewMode { ViewModeNormal = 0, @@ -210,6 +236,7 @@ class CVideoSettings float m_VolumeAmplification; int m_SubtitleStream; float m_SubtitleDelay; + double m_subtitleFPS; int m_subtitleVerticalPosition{0}; bool m_subtitleVerticalPositionSave{false}; bool m_SubtitleOn; @@ -246,6 +273,7 @@ class CVideoSettingsLocked void SetVideoStream(int stream); void SetAudioDelay(float delay); void SetSubtitleDelay(float delay); + void SetSubtitleFPS(double stretch); /*! * \brief Set the subtitle vertical position, diff --git a/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp b/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp index 171c69a294bfe..9e5b765f224c7 100644 --- a/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp +++ b/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp @@ -46,6 +46,7 @@ #define SETTING_SUBTITLE_ENABLE "subtitles.enable" #define SETTING_SUBTITLE_DELAY "subtitles.delay" +#define SETTING_SUBTITLE_FPS "subtitles.fps" #define SETTING_SUBTITLE_STREAM "subtitles.stream" #define SETTING_SUBTITLE_BROWSER "subtitles.browser" #define SETTING_SUBTITLE_SEARCH "subtitles.search" @@ -111,6 +112,12 @@ void CGUIDialogSubtitleSettings::OnSettingChanged(const std::shared_ptr(std::static_pointer_cast(setting)->GetValue()); appPlayer->SetSubTitleDelay(value); } + else if (settingId == SETTING_SUBTITLE_FPS) + { + ESUBTITLEFPS value = + static_cast(std::static_pointer_cast(setting)->GetValue()); + appPlayer->SetSubtitleFPS(value); + } else if (settingId == SETTING_SUBTITLE_STREAM) { m_subtitleStream = std::static_pointer_cast(setting)->GetValue(); @@ -303,6 +310,19 @@ void CGUIDialogSubtitleSettings::InitializeSettings() std::static_pointer_cast(settingSubtitleDelay->GetControl())->SetFormatter(SettingFormatterDelay); } + if (SupportsSubtitleFeature(IPC_SUBS_STRETCH)) + { + IntegerSettingOptions entries; + + entries.clear(); + entries.push_back(IntegerSettingOption(g_localizeStrings.Get(39203), ST_FPS_SAME)); + entries.push_back(IntegerSettingOption(fmt::format("{}", ST_FPS_24), ST_FPS_24)); + entries.push_back(IntegerSettingOption(fmt::format("{}", ST_FPS_25), ST_FPS_25)); + + AddSpinner(groupSubtitles, SETTING_SUBTITLE_FPS, 39202, SettingLevel::Basic, + videoSettings.m_subtitleFPS, entries); + } + // subtitle stream setting if (SupportsSubtitleFeature(IPC_SUBS_SELECT)) AddSubtitleStreams(groupSubtitles, SETTING_SUBTITLE_STREAM); diff --git a/xbmc/video/dialogs/GUIDialogSubtitleSettings.h b/xbmc/video/dialogs/GUIDialogSubtitleSettings.h index 65216ede389c9..f5490a477cc17 100644 --- a/xbmc/video/dialogs/GUIDialogSubtitleSettings.h +++ b/xbmc/video/dialogs/GUIDialogSubtitleSettings.h @@ -8,6 +8,7 @@ #pragma once +#include "cores/IPlayer.h" #include "cores/VideoPlayer/Interface/StreamInfo.h" #include "settings/dialogs/GUIDialogSettingsManualBase.h" @@ -53,7 +54,7 @@ class CGUIDialogSubtitleSettings : public CGUIDialogSettingsManualBase bool m_subtitleVisible; std::shared_ptr m_subtitleStreamSetting; - std::vector m_subtitleCapabilities; + std::vector m_subtitleCapabilities; static std::string FormatFlags(StreamFlags flags); static void SubtitleStreamsOptionFiller(const std::shared_ptr& setting, From 929a307eb744a9b1ee331bb92db642308e3d3804 Mon Sep 17 00:00:00 2001 From: Joachim Breuer Date: Fri, 14 Jul 2023 21:13:46 +0200 Subject: [PATCH 2/4] Make SubtitleFPS an enum class, minor cleanups --- xbmc/application/ApplicationPlayer.cpp | 2 +- xbmc/application/ApplicationPlayer.h | 4 +-- xbmc/cores/IPlayer.h | 4 +-- xbmc/cores/VideoPlayer/VideoPlayer.cpp | 12 ++++----- xbmc/cores/VideoPlayer/VideoPlayer.h | 4 +-- xbmc/cores/VideoSettings.cpp | 2 +- xbmc/cores/VideoSettings.h | 27 +++---------------- .../dialogs/GUIDialogSubtitleSettings.cpp | 10 +++---- 8 files changed, 23 insertions(+), 42 deletions(-) diff --git a/xbmc/application/ApplicationPlayer.cpp b/xbmc/application/ApplicationPlayer.cpp index 06741e0b317d7..062a925cc5fe1 100644 --- a/xbmc/application/ApplicationPlayer.cpp +++ b/xbmc/application/ApplicationPlayer.cpp @@ -737,7 +737,7 @@ void CApplicationPlayer::SetSubTitleDelay(float fValue) player->SetSubTitleDelay(fValue); } -void CApplicationPlayer::SetSubtitleFPS(ESUBTITLEFPS value) +void CApplicationPlayer::SetSubtitleFPS(SubtitleFPS value) { std::shared_ptr player = GetInternal(); if (player) diff --git a/xbmc/application/ApplicationPlayer.h b/xbmc/application/ApplicationPlayer.h index 9166cd571de3b..7e5bf7f3913ef 100644 --- a/xbmc/application/ApplicationPlayer.h +++ b/xbmc/application/ApplicationPlayer.h @@ -95,7 +95,7 @@ class CApplicationPlayer : public IApplicationComponent std::string GetPlayerState(); PLAYLIST::Id GetPreferredPlaylist() const; int GetSubtitleDelay() const; - ESUBTITLEFPS GetSubtitleFPS() const; + SubtitleFPS GetSubtitleFPS() const; int GetSubtitle(); void GetSubtitleCapabilities(std::vector& subCaps) const; int GetSubtitleCount() const; @@ -153,7 +153,7 @@ class CApplicationPlayer : public IApplicationComponent bool SetPlayerState(const std::string& state); void SetSubtitle(int iStream); void SetSubTitleDelay(float fValue = 0.0f); - void SetSubtitleFPS(ESUBTITLEFPS value); + void SetSubtitleFPS(SubtitleFPS value); void SetSubtitleVisible(bool bVisible); /*! diff --git a/xbmc/cores/IPlayer.h b/xbmc/cores/IPlayer.h index 939b702f900a1..8be420f514eb2 100644 --- a/xbmc/cores/IPlayer.h +++ b/xbmc/cores/IPlayer.h @@ -118,8 +118,8 @@ class IPlayer virtual void SetSubTitleDelay(float fValue = 0.0f) {} virtual float GetSubTitleDelay() { return 0.0f; } - virtual void SetSubtitleFPS(ESUBTITLEFPS value = ST_FPS_SAME) {} - virtual ESUBTITLEFPS GetSubtitleFPS() { return ST_FPS_SAME; } + virtual void SetSubtitleFPS(SubtitleFPS value = SubtitleFPS::SAME) {} + virtual SubtitleFPS GetSubtitleFPS() { return SubtitleFPS::SAME; } virtual int GetSubtitleCount() const { return 0; } virtual int GetSubtitle() { return -1; } virtual void GetSubtitleStreamInfo(int index, SubtitleStreamInfo& info) const {} diff --git a/xbmc/cores/VideoPlayer/VideoPlayer.cpp b/xbmc/cores/VideoPlayer/VideoPlayer.cpp index d30a7a64fa8b5..c13b3068635ed 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayer.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayer.cpp @@ -3347,24 +3347,24 @@ float CVideoPlayer::GetSubTitleDelay() return (float) -m_VideoPlayerVideo->GetSubtitleDelay() / DVD_TIME_BASE; } -void CVideoPlayer::SetSubtitleFPS(ESUBTITLEFPS value) +void CVideoPlayer::SetSubtitleFPS(SubtitleFPS value) { - m_processInfo->GetVideoSettingsLocked().SetSubtitleFPS(value); double dValue = 0.0; - if (value != ST_FPS_SAME) + if (value != SubtitleFPS::SAME) dValue = ((int)value) / 1000.0; + m_processInfo->GetVideoSettingsLocked().SetSubtitleFPS(dValue); m_VideoPlayerVideo->SetSubtitleFPS(dValue); } -ESUBTITLEFPS CVideoPlayer::GetSubtitleFPS() +SubtitleFPS CVideoPlayer::GetSubtitleFPS() { // return m_processInfo->GetVideoSettings().m_subtitleFPS; double dValue = m_VideoPlayerVideo->GetSubtitleFPS(); // simplistic implementation, could properly have acceptance ranges for each setting or such if (dValue == 0.0) - return ST_FPS_SAME; + return SubtitleFPS::SAME; else - return static_cast((int)(dValue * 1000.0)); + return static_cast((int)(dValue * 1000.0)); } bool CVideoPlayer::GetSubtitleVisible() const diff --git a/xbmc/cores/VideoPlayer/VideoPlayer.h b/xbmc/cores/VideoPlayer/VideoPlayer.h index 7d61d324d7135..92363edead27b 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayer.h +++ b/xbmc/cores/VideoPlayer/VideoPlayer.h @@ -282,8 +282,8 @@ class CVideoPlayer : public IPlayer, public CThread, public IVideoPlayer, void SetSubTitleDelay(float fValue = 0.0f) override; float GetSubTitleDelay() override; - void SetSubtitleFPS(ESUBTITLEFPS value) override; - ESUBTITLEFPS GetSubtitleFPS() override; + void SetSubtitleFPS(SubtitleFPS value) override; + SubtitleFPS GetSubtitleFPS() override; int GetSubtitleCount() const override; int GetSubtitle() override; void GetSubtitleStreamInfo(int index, SubtitleStreamInfo& info) const override; diff --git a/xbmc/cores/VideoSettings.cpp b/xbmc/cores/VideoSettings.cpp index ab572abc01476..a28bfe2e5a677 100644 --- a/xbmc/cores/VideoSettings.cpp +++ b/xbmc/cores/VideoSettings.cpp @@ -24,7 +24,7 @@ CVideoSettings::CVideoSettings() m_AudioStream = -1; m_SubtitleStream = -1; m_SubtitleDelay = 0.0f; - m_subtitleFPS = ST_FPS_SAME; + m_subtitleFPS = 0.0; m_subtitleVerticalPosition = 0; m_subtitleVerticalPositionSave = false; m_SubtitleOn = true; diff --git a/xbmc/cores/VideoSettings.h b/xbmc/cores/VideoSettings.h index b5786adb731c7..6e1dd3c4c06c4 100644 --- a/xbmc/cores/VideoSettings.h +++ b/xbmc/cores/VideoSettings.h @@ -177,30 +177,11 @@ struct fmt::formatter : fmt::formatter "add/remove a mapping?"); }; -enum ESUBTITLEFPS +enum class SubtitleFPS { - ST_FPS_SAME = 0, - ST_FPS_24 = 23976, - ST_FPS_25 = 25000 -}; - -template<> -struct fmt::formatter : fmt::formatter -{ -public: - template - constexpr auto format(const ESUBTITLEFPS& subtitleFPS, FormatContext& ctx) - { - const auto it = subtitleFPSMap.find(subtitleFPS); - if (it == subtitleFPSMap.cend()) - throw std::range_error("no subtitle stretch string found"); - - return fmt::formatter::format(it->second, ctx); - } - -private: - static constexpr auto subtitleFPSMap = make_map( - {{ST_FPS_SAME, "Same as video"}, {ST_FPS_24, "24 fps"}, {ST_FPS_25, "25 fps"}}); + SAME = 0, + FPS_24 = 23976, + FPS_25 = 25000 }; enum ViewMode diff --git a/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp b/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp index 9e5b765f224c7..bb7a79c856fe9 100644 --- a/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp +++ b/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp @@ -114,8 +114,8 @@ void CGUIDialogSubtitleSettings::OnSettingChanged(const std::shared_ptr(std::static_pointer_cast(setting)->GetValue()); + SubtitleFPS value = + static_cast(std::static_pointer_cast(setting)->GetValue()); appPlayer->SetSubtitleFPS(value); } else if (settingId == SETTING_SUBTITLE_STREAM) @@ -315,9 +315,9 @@ void CGUIDialogSubtitleSettings::InitializeSettings() IntegerSettingOptions entries; entries.clear(); - entries.push_back(IntegerSettingOption(g_localizeStrings.Get(39203), ST_FPS_SAME)); - entries.push_back(IntegerSettingOption(fmt::format("{}", ST_FPS_24), ST_FPS_24)); - entries.push_back(IntegerSettingOption(fmt::format("{}", ST_FPS_25), ST_FPS_25)); + entries.push_back(IntegerSettingOption(g_localizeStrings.Get(39203), (int)SubtitleFPS::SAME)); + entries.push_back(IntegerSettingOption(fmt::format("{}", ((int)SubtitleFPS::FPS_24)/1000.0), (int)SubtitleFPS::FPS_24)); + entries.push_back(IntegerSettingOption(fmt::format("{}", ((int)SubtitleFPS::FPS_25)/1000.0), (int)SubtitleFPS::FPS_25)); AddSpinner(groupSubtitles, SETTING_SUBTITLE_FPS, 39202, SettingLevel::Basic, videoSettings.m_subtitleFPS, entries); From f4f049e9e758cea929ba8a9656e8ec79172a51af Mon Sep 17 00:00:00 2001 From: Joachim Breuer Date: Tue, 12 Mar 2024 09:43:45 +0100 Subject: [PATCH 3/4] Simplify (esp usage) for the only practically relevant 24 vs 25 fps case --- .../resources/strings.po | 7 +------ xbmc/application/ApplicationPlayer.cpp | 12 ++++++++++-- xbmc/application/ApplicationPlayer.h | 4 ++-- xbmc/cores/IPlayer.h | 4 ++-- xbmc/cores/VideoPlayer/IVideoPlayer.h | 4 ++-- xbmc/cores/VideoPlayer/VideoPlayer.cpp | 19 +++++-------------- xbmc/cores/VideoPlayer/VideoPlayer.h | 4 ++-- xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp | 18 ++++++++++++++++-- xbmc/cores/VideoPlayer/VideoPlayerVideo.h | 6 +++--- xbmc/cores/VideoSettings.cpp | 8 ++++---- xbmc/cores/VideoSettings.h | 11 ++--------- .../dialogs/GUIDialogSubtitleSettings.cpp | 16 ++++------------ .../video/dialogs/GUIDialogSubtitleSettings.h | 1 + 13 files changed, 54 insertions(+), 60 deletions(-) diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index 5892fd4365e43..f5e17dbfc8465 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -23791,12 +23791,7 @@ msgstr "" #: xbmc/dialogs/GUIDialogSubtitles.cpp msgctxt "#39202" -msgid "Subtitle frame rate correction" -msgstr "" - -#: xbmc/dialogs/GUIDialogSubtitles.cpp -msgctxt "#39203" -msgid "Same as video" +msgid "Fix 24/25 fps mismatch" msgstr "" diff --git a/xbmc/application/ApplicationPlayer.cpp b/xbmc/application/ApplicationPlayer.cpp index 062a925cc5fe1..8b514247d3729 100644 --- a/xbmc/application/ApplicationPlayer.cpp +++ b/xbmc/application/ApplicationPlayer.cpp @@ -737,11 +737,19 @@ void CApplicationPlayer::SetSubTitleDelay(float fValue) player->SetSubTitleDelay(fValue); } -void CApplicationPlayer::SetSubtitleFPS(SubtitleFPS value) +void CApplicationPlayer::SetSubtitleCompensateFPS(bool bValue) { std::shared_ptr player = GetInternal(); if (player) - player->SetSubtitleFPS(value); + player->SetSubtitleCompensateFPS(bValue); +} + +bool CApplicationPlayer::GetSubtitleCompensateFPS() const +{ + std::shared_ptr player = GetInternal(); + if (player) + return player->GetSubtitleCompensateFPS(); + return false; } void CApplicationPlayer::SetAVDelay(float fValue) diff --git a/xbmc/application/ApplicationPlayer.h b/xbmc/application/ApplicationPlayer.h index 7e5bf7f3913ef..a2cc8ee6e9981 100644 --- a/xbmc/application/ApplicationPlayer.h +++ b/xbmc/application/ApplicationPlayer.h @@ -95,7 +95,7 @@ class CApplicationPlayer : public IApplicationComponent std::string GetPlayerState(); PLAYLIST::Id GetPreferredPlaylist() const; int GetSubtitleDelay() const; - SubtitleFPS GetSubtitleFPS() const; + bool GetSubtitleCompensateFPS() const; int GetSubtitle(); void GetSubtitleCapabilities(std::vector& subCaps) const; int GetSubtitleCount() const; @@ -153,7 +153,7 @@ class CApplicationPlayer : public IApplicationComponent bool SetPlayerState(const std::string& state); void SetSubtitle(int iStream); void SetSubTitleDelay(float fValue = 0.0f); - void SetSubtitleFPS(SubtitleFPS value); + void SetSubtitleCompensateFPS(bool bDoCompensate = false); void SetSubtitleVisible(bool bVisible); /*! diff --git a/xbmc/cores/IPlayer.h b/xbmc/cores/IPlayer.h index 8be420f514eb2..77fca49088dc6 100644 --- a/xbmc/cores/IPlayer.h +++ b/xbmc/cores/IPlayer.h @@ -118,8 +118,8 @@ class IPlayer virtual void SetSubTitleDelay(float fValue = 0.0f) {} virtual float GetSubTitleDelay() { return 0.0f; } - virtual void SetSubtitleFPS(SubtitleFPS value = SubtitleFPS::SAME) {} - virtual SubtitleFPS GetSubtitleFPS() { return SubtitleFPS::SAME; } + virtual void SetSubtitleCompensateFPS(bool bValue = false) {} + virtual bool GetSubtitleCompensateFPS() const { return false; } virtual int GetSubtitleCount() const { return 0; } virtual int GetSubtitle() { return -1; } virtual void GetSubtitleStreamInfo(int index, SubtitleStreamInfo& info) const {} diff --git a/xbmc/cores/VideoPlayer/IVideoPlayer.h b/xbmc/cores/VideoPlayer/IVideoPlayer.h index 08cd04e32299b..aed583a08e807 100644 --- a/xbmc/cores/VideoPlayer/IVideoPlayer.h +++ b/xbmc/cores/VideoPlayer/IVideoPlayer.h @@ -88,8 +88,8 @@ class IDVDStreamPlayerVideo : public IDVDStreamPlayer virtual bool IsSubtitleEnabled() = 0; virtual double GetSubtitleDelay() = 0; virtual void SetSubtitleDelay(double delay) = 0; - virtual double GetSubtitleFPS() = 0; - virtual void SetSubtitleFPS(double fps) = 0; + virtual bool GetSubtitleCompensateFPS() const = 0; + virtual void SetSubtitleCompensateFPS(bool bDoCompensate) = 0; bool IsStalled() const override = 0; virtual bool IsRewindStalled() const { return false; } virtual double GetCurrentPts() = 0; diff --git a/xbmc/cores/VideoPlayer/VideoPlayer.cpp b/xbmc/cores/VideoPlayer/VideoPlayer.cpp index c13b3068635ed..65672875d9fab 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayer.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayer.cpp @@ -3347,24 +3347,15 @@ float CVideoPlayer::GetSubTitleDelay() return (float) -m_VideoPlayerVideo->GetSubtitleDelay() / DVD_TIME_BASE; } -void CVideoPlayer::SetSubtitleFPS(SubtitleFPS value) +void CVideoPlayer::SetSubtitleCompensateFPS(bool bDoCompensate) { - double dValue = 0.0; - if (value != SubtitleFPS::SAME) - dValue = ((int)value) / 1000.0; - m_processInfo->GetVideoSettingsLocked().SetSubtitleFPS(dValue); - m_VideoPlayerVideo->SetSubtitleFPS(dValue); + m_processInfo->GetVideoSettingsLocked().SetSubtitleCompensateFPS(bDoCompensate); + m_VideoPlayerVideo->SetSubtitleCompensateFPS(bDoCompensate); } -SubtitleFPS CVideoPlayer::GetSubtitleFPS() +bool CVideoPlayer::GetSubtitleCompensateFPS() const { - // return m_processInfo->GetVideoSettings().m_subtitleFPS; - double dValue = m_VideoPlayerVideo->GetSubtitleFPS(); - // simplistic implementation, could properly have acceptance ranges for each setting or such - if (dValue == 0.0) - return SubtitleFPS::SAME; - else - return static_cast((int)(dValue * 1000.0)); + return m_VideoPlayerVideo->GetSubtitleCompensateFPS(); } bool CVideoPlayer::GetSubtitleVisible() const diff --git a/xbmc/cores/VideoPlayer/VideoPlayer.h b/xbmc/cores/VideoPlayer/VideoPlayer.h index 92363edead27b..deb5a4c44a72a 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayer.h +++ b/xbmc/cores/VideoPlayer/VideoPlayer.h @@ -282,8 +282,8 @@ class CVideoPlayer : public IPlayer, public CThread, public IVideoPlayer, void SetSubTitleDelay(float fValue = 0.0f) override; float GetSubTitleDelay() override; - void SetSubtitleFPS(SubtitleFPS value) override; - SubtitleFPS GetSubtitleFPS() override; + void SetSubtitleCompensateFPS(bool bValue) override; + bool GetSubtitleCompensateFPS() const override; int GetSubtitleCount() const override; int GetSubtitle() override; void GetSubtitleStreamInfo(int index, SubtitleStreamInfo& info) const override; diff --git a/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp b/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp index 00746d0f7fac2..2060d42f9f0c1 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp @@ -63,7 +63,7 @@ CVideoPlayerVideo::CVideoPlayerVideo(CDVDClock* pClock m_paused = false; m_syncState = IDVDStreamPlayer::SYNC_STARTING; m_iSubtitleDelay = 0; - m_subtitleFPS = 0.0; + m_subtitleCompensateFPS = 0.0; m_iLateFrames = 0; m_iDroppedRequest = 0; m_fForcedAspectRatio = 0; @@ -803,7 +803,21 @@ void CVideoPlayerVideo::Flush(bool sync) void CVideoPlayerVideo::ProcessOverlays(const VideoPicture* pSource, double pts) { - double pts1 = (m_subtitleFPS == 0.0) ? pts : pts * (m_fFrameRate / m_subtitleFPS); + double pts1 = pts; + if (m_subtitleCompensateFPS) { + double stFrameRate = m_fFrameRate; + while (stFrameRate > 44.0) + stFrameRate /= 2.0; + if ((stFrameRate > 24.9 && stFrameRate < 25.1) || (stFrameRate > 49.9 && stFrameRate < 50.1)) + // 25fps material, 24fps subtitles + // use 23.976 since it's waay more common + // in the ultra-rare cases of true 24.0 fps, it's still only a 86 frames + // = ~ 3.6 seconds difference per hour, something I feel one could deal + // with using the subtitle offset feature if need be. + pts1 = pts * (stFrameRate / 23.976); + else // 24 fps material, compensate 25fps subtitles + pts1 = pts * (stFrameRate / 25.0); + } // remove any overlays that are out of time if (m_syncState == IDVDStreamPlayer::SYNC_INSYNC) diff --git a/xbmc/cores/VideoPlayer/VideoPlayerVideo.h b/xbmc/cores/VideoPlayer/VideoPlayerVideo.h index 1be7f2e42d539..46222bd33555a 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayerVideo.h +++ b/xbmc/cores/VideoPlayer/VideoPlayerVideo.h @@ -65,8 +65,8 @@ class CVideoPlayerVideo : public CThread, public IDVDStreamPlayerVideo bool IsSubtitleEnabled() override { return m_bRenderSubs; } double GetSubtitleDelay() override { return m_iSubtitleDelay; } void SetSubtitleDelay(double delay) override { m_iSubtitleDelay = delay; } - double GetSubtitleFPS() override { return m_subtitleFPS; } - void SetSubtitleFPS(double fps) override { m_subtitleFPS = fps; } + bool GetSubtitleCompensateFPS() const override { return m_subtitleCompensateFPS; } + void SetSubtitleCompensateFPS(bool bDoCompensate) override { m_subtitleCompensateFPS = bDoCompensate; } bool IsStalled() const override { return m_stalled; } bool IsRewindStalled() const override { return m_rewindStalled; } double GetCurrentPts() override; @@ -107,7 +107,7 @@ class CVideoPlayerVideo : public CThread, public IDVDStreamPlayerVideo int CalcDropRequirement(double pts); double m_iSubtitleDelay; - double m_subtitleFPS; + bool m_subtitleCompensateFPS; int m_iLateFrames; int m_iDroppedFrames; diff --git a/xbmc/cores/VideoSettings.cpp b/xbmc/cores/VideoSettings.cpp index a28bfe2e5a677..0d770d5a83615 100644 --- a/xbmc/cores/VideoSettings.cpp +++ b/xbmc/cores/VideoSettings.cpp @@ -24,7 +24,7 @@ CVideoSettings::CVideoSettings() m_AudioStream = -1; m_SubtitleStream = -1; m_SubtitleDelay = 0.0f; - m_subtitleFPS = 0.0; + m_subtitleCompensateFPS = false; m_subtitleVerticalPosition = 0; m_subtitleVerticalPositionSave = false; m_SubtitleOn = true; @@ -58,7 +58,7 @@ bool CVideoSettings::operator!=(const CVideoSettings &right) const if (m_AudioStream != right.m_AudioStream) return true; if (m_SubtitleStream != right.m_SubtitleStream) return true; if (m_SubtitleDelay != right.m_SubtitleDelay) return true; - if (m_subtitleFPS != right.m_subtitleFPS) + if (m_subtitleCompensateFPS != right.m_subtitleCompensateFPS) return true; if (m_subtitleVerticalPosition != right.m_subtitleVerticalPosition) return true; @@ -128,10 +128,10 @@ void CVideoSettingsLocked::SetSubtitleDelay(float delay) m_videoSettings.m_SubtitleDelay = delay; } -void CVideoSettingsLocked::SetSubtitleFPS(double stretch) +void CVideoSettingsLocked::SetSubtitleCompensateFPS(bool doCompensate) { std::unique_lock lock(m_critSection); - m_videoSettings.m_subtitleFPS = stretch; + m_videoSettings.m_subtitleCompensateFPS = doCompensate; } void CVideoSettingsLocked::SetSubtitleVerticalPosition(int value, bool save) diff --git a/xbmc/cores/VideoSettings.h b/xbmc/cores/VideoSettings.h index 6e1dd3c4c06c4..a20637c8a036c 100644 --- a/xbmc/cores/VideoSettings.h +++ b/xbmc/cores/VideoSettings.h @@ -177,13 +177,6 @@ struct fmt::formatter : fmt::formatter "add/remove a mapping?"); }; -enum class SubtitleFPS -{ - SAME = 0, - FPS_24 = 23976, - FPS_25 = 25000 -}; - enum ViewMode { ViewModeNormal = 0, @@ -217,7 +210,7 @@ class CVideoSettings float m_VolumeAmplification; int m_SubtitleStream; float m_SubtitleDelay; - double m_subtitleFPS; + double m_subtitleCompensateFPS; int m_subtitleVerticalPosition{0}; bool m_subtitleVerticalPositionSave{false}; bool m_SubtitleOn; @@ -254,7 +247,7 @@ class CVideoSettingsLocked void SetVideoStream(int stream); void SetAudioDelay(float delay); void SetSubtitleDelay(float delay); - void SetSubtitleFPS(double stretch); + void SetSubtitleCompensateFPS(bool doCompensate); /*! * \brief Set the subtitle vertical position, diff --git a/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp b/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp index bb7a79c856fe9..8c60823b976f4 100644 --- a/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp +++ b/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp @@ -114,9 +114,8 @@ void CGUIDialogSubtitleSettings::OnSettingChanged(const std::shared_ptr(std::static_pointer_cast(setting)->GetValue()); - appPlayer->SetSubtitleFPS(value); + bool value = std::static_pointer_cast(setting)->GetValue(); + appPlayer->SetSubtitleCompensateFPS(value); } else if (settingId == SETTING_SUBTITLE_STREAM) { @@ -312,15 +311,8 @@ void CGUIDialogSubtitleSettings::InitializeSettings() if (SupportsSubtitleFeature(IPC_SUBS_STRETCH)) { - IntegerSettingOptions entries; - - entries.clear(); - entries.push_back(IntegerSettingOption(g_localizeStrings.Get(39203), (int)SubtitleFPS::SAME)); - entries.push_back(IntegerSettingOption(fmt::format("{}", ((int)SubtitleFPS::FPS_24)/1000.0), (int)SubtitleFPS::FPS_24)); - entries.push_back(IntegerSettingOption(fmt::format("{}", ((int)SubtitleFPS::FPS_25)/1000.0), (int)SubtitleFPS::FPS_25)); - - AddSpinner(groupSubtitles, SETTING_SUBTITLE_FPS, 39202, SettingLevel::Basic, - videoSettings.m_subtitleFPS, entries); + m_subtitleCompensateFPS = appPlayer->GetSubtitleCompensateFPS(); + AddToggle(groupSubtitles, SETTING_SUBTITLE_FPS, 39202, SettingLevel::Basic, m_subtitleCompensateFPS); } // subtitle stream setting diff --git a/xbmc/video/dialogs/GUIDialogSubtitleSettings.h b/xbmc/video/dialogs/GUIDialogSubtitleSettings.h index f5490a477cc17..c9cd963886d0d 100644 --- a/xbmc/video/dialogs/GUIDialogSubtitleSettings.h +++ b/xbmc/video/dialogs/GUIDialogSubtitleSettings.h @@ -52,6 +52,7 @@ class CGUIDialogSubtitleSettings : public CGUIDialogSettingsManualBase int m_subtitleStream; bool m_subtitleVisible; + bool m_subtitleCompensateFPS; std::shared_ptr m_subtitleStreamSetting; std::vector m_subtitleCapabilities; From 6b0f3d766a7fcf536741ed727134cb289ff226dd Mon Sep 17 00:00:00 2001 From: Joachim Breuer Date: Thu, 14 Mar 2024 08:44:44 +0100 Subject: [PATCH 4/4] Formatting cleanups as per Jenkins --- xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp | 5 +++-- xbmc/cores/VideoPlayer/VideoPlayerVideo.h | 5 ++++- xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp b/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp index 2060d42f9f0c1..2730c7b9d8712 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp @@ -804,7 +804,8 @@ void CVideoPlayerVideo::Flush(bool sync) void CVideoPlayerVideo::ProcessOverlays(const VideoPicture* pSource, double pts) { double pts1 = pts; - if (m_subtitleCompensateFPS) { + if (m_subtitleCompensateFPS) + { double stFrameRate = m_fFrameRate; while (stFrameRate > 44.0) stFrameRate /= 2.0; @@ -814,7 +815,7 @@ void CVideoPlayerVideo::ProcessOverlays(const VideoPicture* pSource, double pts) // in the ultra-rare cases of true 24.0 fps, it's still only a 86 frames // = ~ 3.6 seconds difference per hour, something I feel one could deal // with using the subtitle offset feature if need be. - pts1 = pts * (stFrameRate / 23.976); + pts1 = pts * (stFrameRate / 23.976); else // 24 fps material, compensate 25fps subtitles pts1 = pts * (stFrameRate / 25.0); } diff --git a/xbmc/cores/VideoPlayer/VideoPlayerVideo.h b/xbmc/cores/VideoPlayer/VideoPlayerVideo.h index 46222bd33555a..734845e8ead4a 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayerVideo.h +++ b/xbmc/cores/VideoPlayer/VideoPlayerVideo.h @@ -66,7 +66,10 @@ class CVideoPlayerVideo : public CThread, public IDVDStreamPlayerVideo double GetSubtitleDelay() override { return m_iSubtitleDelay; } void SetSubtitleDelay(double delay) override { m_iSubtitleDelay = delay; } bool GetSubtitleCompensateFPS() const override { return m_subtitleCompensateFPS; } - void SetSubtitleCompensateFPS(bool bDoCompensate) override { m_subtitleCompensateFPS = bDoCompensate; } + void SetSubtitleCompensateFPS(bool bDoCompensate) override + { + m_subtitleCompensateFPS = bDoCompensate; + } bool IsStalled() const override { return m_stalled; } bool IsRewindStalled() const override { return m_rewindStalled; } double GetCurrentPts() override; diff --git a/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp b/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp index 8c60823b976f4..7e8ed9485cbb5 100644 --- a/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp +++ b/xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp @@ -312,7 +312,8 @@ void CGUIDialogSubtitleSettings::InitializeSettings() if (SupportsSubtitleFeature(IPC_SUBS_STRETCH)) { m_subtitleCompensateFPS = appPlayer->GetSubtitleCompensateFPS(); - AddToggle(groupSubtitles, SETTING_SUBTITLE_FPS, 39202, SettingLevel::Basic, m_subtitleCompensateFPS); + AddToggle(groupSubtitles, SETTING_SUBTITLE_FPS, 39202, SettingLevel::Basic, + m_subtitleCompensateFPS); } // subtitle stream setting