From 2a0010a92fe80ec2e37227effee2d06839417c7b Mon Sep 17 00:00:00 2001 From: thexai <58434170+thexai@users.noreply.github.com> Date: Sat, 22 Jun 2024 10:41:55 +0200 Subject: [VideoPlayer] Add GUI settings for audio/video playback queues --- .../resource.language.en_gb/resources/strings.po | 64 +++++++++++++++++++++- system/settings/settings.xml | 20 +++++++ xbmc/cores/VideoPlayer/VideoPlayer.cpp | 11 ++-- xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp | 7 ++- xbmc/settings/CMakeLists.txt | 2 + xbmc/settings/PlayerSettings.cpp | 46 ++++++++++++++++ xbmc/settings/PlayerSettings.h | 27 +++++++++ xbmc/settings/Settings.cpp | 7 +++ xbmc/settings/Settings.h | 2 + 9 files changed, 175 insertions(+), 11 deletions(-) create mode 100644 xbmc/settings/PlayerSettings.cpp create mode 100644 xbmc/settings/PlayerSettings.h diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index c81cd35e55..ba8fe579f8 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -8398,7 +8398,19 @@ msgctxt "#14128" msgid "Allow double refresh rates" msgstr "" -#empty strings from id 14129 to 14199 +#empty strings from id 14129 to 14186 + +#: system/settings/settings.xml +msgctxt "#14187" +msgid "Advanced" +msgstr "" + +#: system/settings/settings.xml +msgctxt "#14188" +msgid "Player audio/video queues" +msgstr "" + +#empty strings from id 14189 to 14199 #: system/settings/settings.xml msgctxt "#14200" @@ -22496,17 +22508,57 @@ msgstr "" #. Value of setting - MByte #: xbmc/settings/SevicesSettings.cpp +#: xbmc/settings/PlayerSettings.cpp msgctxt "#37122" msgid "{0:d} MB" msgstr "" #. Value of setting - GByte #: xbmc/settings/SevicesSettings.cpp +#: xbmc/settings/PlayerSettings.cpp msgctxt "#37123" msgid "{0:d} GB" msgstr "" -#empty strings from id 37124 to 38010 +#empty strings from id 37124 to 37127 + +#. Value of setting - second +#: xbmc/settings/PlayerSettings.cpp +msgctxt "#37128" +msgid "{0:d} second" +msgstr "" + +#. Value of setting - seconds +#: xbmc/settings/PlayerSettings.cpp +msgctxt "#37129" +msgid "{0:d} seconds" +msgstr "" + +#. Setting "Audio/video queue time" +#: system/settings/settings.xml +msgctxt "#37130" +msgid "Audio/video queue time" +msgstr "" + +#. Description of setting with label #37130 "Audio/video queue time" +#: system/settings/settings.xml +msgctxt "#37131" +msgid "Duration in seconds of audio/video queues. The duration determines the amount of data stored in memory." +msgstr "" + +#. Setting "Video queue maximum size" +#: system/settings/settings.xml +msgctxt "#37132" +msgid "Video queue maximum size" +msgstr "" + +#. Description of setting with label #37132 "Video queue maximum size" +#: system/settings/settings.xml +msgctxt "#37133" +msgid "Limits the maximum memory usage for the video queue. The amount of memory used depends on the video bitrate and the length of the queue. If the memory limit is reached, the queue time is reduced as necessary." +msgstr "" + +#empty strings from id 37134 to 38010 #. Setting #38011 "Show All Items entry" #: system/settings/settings.xml @@ -22918,7 +22970,13 @@ msgctxt "#38112" msgid "Automatically go to the visualisation window when audio playback starts" msgstr "" -#empty strings from id 38113 to 38189 +#. Description of category #14187 "Advanced" +#: system/settings/settings.xml +msgctxt "#38113" +msgid "This category contains the advanced settings for video playback" +msgstr "" + +#empty strings from id 38114 to 38189 msgctxt "#38190" msgid "Extract thumbnails from video files" diff --git a/system/settings/settings.xml b/system/settings/settings.xml index 86841efbed..bd47c128f4 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -891,6 +891,26 @@ + + + + 2 + 40 + + playerqueuetimesizes + + + + + 2 + 256 + + playerqueuedatasizes + + + + +
diff --git a/xbmc/cores/VideoPlayer/VideoPlayer.cpp b/xbmc/cores/VideoPlayer/VideoPlayer.cpp index be3d3a030b..1b800342f9 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayer.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayer.cpp @@ -73,11 +73,6 @@ using namespace KODI; using namespace std::chrono_literals; -namespace -{ -constexpr double VP_MESSAGE_QUEUE_TIME_SIZE = 8.0; -} - //------------------------------------------------------------------------------ // selection streams //------------------------------------------------------------------------------ @@ -644,7 +639,11 @@ CVideoPlayer::CVideoPlayer(IPlayerCallback& callback) m_HasVideo = false; m_HasAudio = false; m_UpdateStreamDetails = false; - m_messageQueueTimeSize = VP_MESSAGE_QUEUE_TIME_SIZE; + + const int tenthsSeconds = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( + CSettings::SETTING_VIDEOPLAYER_QUEUETIMESIZE); + + m_messageQueueTimeSize = static_cast(tenthsSeconds) / 10.0; m_SkipCommercials = true; diff --git a/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp b/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp index 6588c07001..1b22464d49 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp @@ -16,6 +16,7 @@ #include "cores/VideoPlayer/Interface/DemuxPacket.h" #include "cores/VideoPlayer/Interface/TimingConstants.h" #include "settings/AdvancedSettings.h" +#include "settings/Settings.h" #include "settings/SettingsComponent.h" #include "utils/MathUtils.h" #include "utils/log.h" @@ -68,8 +69,10 @@ CVideoPlayerVideo::CVideoPlayerVideo(CDVDClock* pClock, m_iDroppedRequest = 0; m_fForcedAspectRatio = 0; - // allows max bitrate of 128 Mbit/s (e.g. UHD Blu-Ray) during m_messageQueueTimeSize seconds - m_messageQueue.SetMaxDataSize(128 * m_messageQueueTimeSize / 8 * 1024 * 1024); + const int sizeMB = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( + CSettings::SETTING_VIDEOPLAYER_QUEUEDATASIZE); + + m_messageQueue.SetMaxDataSize(sizeMB * 1024 * 1024); m_messageQueue.SetMaxTimeSize(m_messageQueueTimeSize); m_iDroppedFrames = 0; diff --git a/xbmc/settings/CMakeLists.txt b/xbmc/settings/CMakeLists.txt index d477f51d5d..26a3156847 100644 --- a/xbmc/settings/CMakeLists.txt +++ b/xbmc/settings/CMakeLists.txt @@ -4,6 +4,7 @@ set(SOURCES AdvancedSettings.cpp LibExportSettings.cpp MediaSettings.cpp MediaSourceSettings.cpp + PlayerSettings.cpp ServicesSettings.cpp SettingAddon.cpp SettingConditions.cpp @@ -28,6 +29,7 @@ set(HEADERS AdvancedSettings.h LibExportSettings.h MediaSettings.h MediaSourceSettings.h + PlayerSettings.h ServicesSettings.h SettingAddon.h SettingConditions.h diff --git a/xbmc/settings/PlayerSettings.cpp b/xbmc/settings/PlayerSettings.cpp new file mode 100644 index 0000000000..581c63220e --- /dev/null +++ b/xbmc/settings/PlayerSettings.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2024 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "PlayerSettings.h" + +#include "guilib/LocalizeStrings.h" +#include "utils/StringUtils.h" + +void CPlayerSettings::SettingOptionsQueueTimeSizesFiller(const SettingConstPtr& setting, + std::vector& list, + int& current, + void* data) +{ + const auto& secFloat = g_localizeStrings.Get(13553); + const auto& seconds = g_localizeStrings.Get(37129); + const auto& second = g_localizeStrings.Get(37128); + + list.emplace_back(StringUtils::Format(secFloat, 0.5), 5); + list.emplace_back(StringUtils::Format(second, 1), 10); + list.emplace_back(StringUtils::Format(seconds, 2), 20); + list.emplace_back(StringUtils::Format(seconds, 4), 40); + list.emplace_back(StringUtils::Format(seconds, 8), 80); + list.emplace_back(StringUtils::Format(seconds, 16), 160); +} + +void CPlayerSettings::SettingOptionsQueueDataSizesFiller(const SettingConstPtr& setting, + std::vector& list, + int& current, + void* data) +{ + const auto& mb = g_localizeStrings.Get(37122); + const auto& gb = g_localizeStrings.Get(37123); + + list.emplace_back(StringUtils::Format(mb, 16), 16); + list.emplace_back(StringUtils::Format(mb, 32), 32); + list.emplace_back(StringUtils::Format(mb, 64), 64); + list.emplace_back(StringUtils::Format(mb, 128), 128); + list.emplace_back(StringUtils::Format(mb, 256), 256); + list.emplace_back(StringUtils::Format(mb, 512), 512); + list.emplace_back(StringUtils::Format(gb, 1), 1024); +} diff --git a/xbmc/settings/PlayerSettings.h b/xbmc/settings/PlayerSettings.h new file mode 100644 index 0000000000..683e110a50 --- /dev/null +++ b/xbmc/settings/PlayerSettings.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2024 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "settings/ISubSettings.h" +#include "settings/lib/Setting.h" + +#include + +class CPlayerSettings : public ISubSettings +{ +public: + static void SettingOptionsQueueTimeSizesFiller(const SettingConstPtr& setting, + std::vector& list, + int& current, + void* data); + static void SettingOptionsQueueDataSizesFiller(const SettingConstPtr& setting, + std::vector& list, + int& current, + void* data); +}; diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp index 5d940f674c..a32f5f17bc 100644 --- a/xbmc/settings/Settings.cpp +++ b/xbmc/settings/Settings.cpp @@ -40,6 +40,7 @@ #include "settings/DisplaySettings.h" #include "settings/MediaSettings.h" #include "settings/MediaSourceSettings.h" +#include "settings/PlayerSettings.h" #include "settings/ServicesSettings.h" #include "settings/SettingConditions.h" #include "settings/SettingsComponent.h" @@ -419,6 +420,10 @@ void CSettings::InitializeOptionFillers() "filecachereadfactors", CServicesSettings::SettingOptionsReadFactorsFiller); GetSettingsManager()->RegisterSettingOptionsFiller( "filecachechunksizes", CServicesSettings::SettingOptionsCacheChunkSizesFiller); + GetSettingsManager()->RegisterSettingOptionsFiller( + "playerqueuetimesizes", CPlayerSettings::SettingOptionsQueueTimeSizesFiller); + GetSettingsManager()->RegisterSettingOptionsFiller( + "playerqueuedatasizes", CPlayerSettings::SettingOptionsQueueDataSizesFiller); } void CSettings::UninitializeOptionFillers() @@ -470,6 +475,8 @@ void CSettings::UninitializeOptionFillers() GetSettingsManager()->UnregisterSettingOptionsFiller("filecachememorysizes"); GetSettingsManager()->UnregisterSettingOptionsFiller("filecachereadfactors"); GetSettingsManager()->UnregisterSettingOptionsFiller("filecachechunksizes"); + GetSettingsManager()->UnregisterSettingOptionsFiller("playerqueuetimesizes"); + GetSettingsManager()->UnregisterSettingOptionsFiller("playerqueuedatasizes"); } void CSettings::InitializeConditions() diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h index b1124afac1..354756d133 100644 --- a/xbmc/settings/Settings.h +++ b/xbmc/settings/Settings.h @@ -136,6 +136,8 @@ public: static constexpr auto SETTING_VIDEOPLAYER_SUPPORTMVC = "videoplayer.supportmvc"; static constexpr auto SETTING_VIDEOPLAYER_CONVERTDOVI = "videoplayer.convertdovi"; static constexpr auto SETTING_VIDEOPLAYER_ALLOWEDHDRFORMATS = "videoplayer.allowedhdrformats"; + static constexpr auto SETTING_VIDEOPLAYER_QUEUETIMESIZE = "videoplayer.queuetimesize"; + static constexpr auto SETTING_VIDEOPLAYER_QUEUEDATASIZE = "videoplayer.queuedatasize"; static constexpr auto SETTING_MYVIDEOS_SELECTACTION = "myvideos.selectaction"; static constexpr auto SETTING_MYVIDEOS_SELECTDEFAULTVERSION = "myvideos.selectdefaultversion"; static constexpr auto SETTING_MYVIDEOS_PLAYACTION = "myvideos.playaction"; -- cgit v1.2.3 From 76b9e112b2b2e1209e10054aeef4a746b04e3314 Mon Sep 17 00:00:00 2001 From: thexai <58434170+thexai@users.noreply.github.com> Date: Sat, 22 Jun 2024 18:56:06 +0200 Subject: [VideoPlayer] Improves audio/video queues time calculation Before calculated only proportionally to level but when level is e.g. 99%, playback time is not always 99% of max queue time because data amount (depending on bitrate) not always provides same playback time. Queues are data AND time based: this means queue can be full because has reached maximum data capacity OR has reached maximum playback time with e.g. half of data. In two cases level is 100%. --- xbmc/cores/VideoPlayer/DVDMessageQueue.cpp | 6 +++--- xbmc/cores/VideoPlayer/DVDMessageQueue.h | 2 +- xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp | 12 +++++------- xbmc/cores/VideoPlayer/VideoPlayerAudio.h | 1 - xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp | 10 ++++------ xbmc/cores/VideoPlayer/VideoPlayerVideo.h | 2 -- 6 files changed, 13 insertions(+), 20 deletions(-) diff --git a/xbmc/cores/VideoPlayer/DVDMessageQueue.cpp b/xbmc/cores/VideoPlayer/DVDMessageQueue.cpp index 34886cc8a3..20d1caece6 100644 --- a/xbmc/cores/VideoPlayer/DVDMessageQueue.cpp +++ b/xbmc/cores/VideoPlayer/DVDMessageQueue.cpp @@ -333,14 +333,14 @@ int CDVDMessageQueue::GetLevel() const return level; } -int CDVDMessageQueue::GetTimeSize() const +double CDVDMessageQueue::GetTimeSize() const { std::unique_lock lock(m_section); if (IsDataBased()) - return 0; + return 0.0; else - return (int)((m_TimeFront - m_TimeBack) / DVD_TIME_BASE); + return (m_TimeFront - m_TimeBack) / DVD_TIME_BASE; } bool CDVDMessageQueue::IsDataBased() const diff --git a/xbmc/cores/VideoPlayer/DVDMessageQueue.h b/xbmc/cores/VideoPlayer/DVDMessageQueue.h index 77342d4ce7..0e745512ac 100644 --- a/xbmc/cores/VideoPlayer/DVDMessageQueue.h +++ b/xbmc/cores/VideoPlayer/DVDMessageQueue.h @@ -74,7 +74,7 @@ public: } int GetDataSize() const { return m_iDataSize; } - int GetTimeSize() const; + double GetTimeSize() const; unsigned GetPacketCount(CDVDMsg::Message type); bool ReceivedAbortRequest() { return m_bAbortRequest; } void WaitUntilEmpty(); diff --git a/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp b/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp index 91220f92de..6017bf5c26 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp @@ -51,8 +51,7 @@ CVideoPlayerAudio::CVideoPlayerAudio(CDVDClock* pClock, IDVDStreamPlayerAudio(processInfo), m_messageQueue("audio"), m_messageParent(parent), - m_audioSink(pClock), - m_messageQueueTimeSize(messageQueueTimeSize) + m_audioSink(pClock) { m_pClock = pClock; m_audioClock = 0; @@ -66,8 +65,8 @@ CVideoPlayerAudio::CVideoPlayerAudio(CDVDClock* pClock, m_maxspeedadjust = 0.0; // allows max bitrate of 18 Mbit/s (TrueHD max peak) during m_messageQueueTimeSize seconds - m_messageQueue.SetMaxDataSize(18 * m_messageQueueTimeSize / 8 * 1024 * 1024); - m_messageQueue.SetMaxTimeSize(m_messageQueueTimeSize); + m_messageQueue.SetMaxDataSize(18 * messageQueueTimeSize / 8 * 1024 * 1024); + m_messageQueue.SetMaxTimeSize(messageQueueTimeSize); m_disconAdjustTimeMs = processInfo.GetMaxPassthroughOffSyncDuration(); } @@ -201,10 +200,9 @@ void CVideoPlayerAudio::OnStartup() void CVideoPlayerAudio::UpdatePlayerInfo() { - const int level = m_messageQueue.GetLevel(); std::ostringstream s; - s << "aq:" << std::setw(2) << std::min(99, level); - s << "% " << std::fixed << std::setprecision(3) << m_messageQueueTimeSize * level / 100.0; + s << "aq:" << std::setw(2) << std::min(99, m_messageQueue.GetLevel()); + s << "% " << std::fixed << std::setprecision(3) << m_messageQueue.GetTimeSize(); s << "s, Kb/s:" << std::fixed << std::setprecision(2) << m_audioStats.GetBitrate() / 1024.0; // print a/v discontinuity adjustments counter when audio is not resampled (passthrough mode) diff --git a/xbmc/cores/VideoPlayer/VideoPlayerAudio.h b/xbmc/cores/VideoPlayer/VideoPlayerAudio.h index 24c394c52c..d52fbd5b70 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayerAudio.h +++ b/xbmc/cores/VideoPlayer/VideoPlayerAudio.h @@ -120,6 +120,5 @@ protected: bool m_displayReset = false; unsigned int m_disconAdjustTimeMs = 50; // maximum sync-off before adjusting int m_disconAdjustCounter = 0; - double m_messageQueueTimeSize{0.0}; }; diff --git a/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp b/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp index 1b22464d49..9020467c88 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp @@ -54,8 +54,7 @@ CVideoPlayerVideo::CVideoPlayerVideo(CDVDClock* pClock, IDVDStreamPlayerVideo(processInfo), m_messageQueue("video"), m_messageParent(parent), - m_renderManager(renderManager), - m_messageQueueTimeSize(messageQueueTimeSize) + m_renderManager(renderManager) { m_pClock = pClock; m_pOverlayContainer = pOverlayContainer; @@ -73,7 +72,7 @@ CVideoPlayerVideo::CVideoPlayerVideo(CDVDClock* pClock, CSettings::SETTING_VIDEOPLAYER_QUEUEDATASIZE); m_messageQueue.SetMaxDataSize(sizeMB * 1024 * 1024); - m_messageQueue.SetMaxTimeSize(m_messageQueueTimeSize); + m_messageQueue.SetMaxTimeSize(messageQueueTimeSize); m_iDroppedFrames = 0; m_fFrameRate = 25; @@ -956,10 +955,9 @@ CVideoPlayerVideo::EOutputState CVideoPlayerVideo::OutputPicture(const VideoPict std::string CVideoPlayerVideo::GetPlayerInfo() { - const int level = m_processInfo.GetLevelVQ(); std::ostringstream s; - s << "vq:" << std::setw(2) << std::min(99, level); - s << "% " << std::fixed << std::setprecision(3) << m_messageQueueTimeSize * level / 100.0; + s << "vq:" << std::setw(2) << std::min(99, m_processInfo.GetLevelVQ()); + s << "% " << std::fixed << std::setprecision(3) << m_messageQueue.GetTimeSize(); s << "s, Mb/s:" << std::fixed << std::setprecision(2) << static_cast(GetVideoBitrate()) / (1024.0 * 1024.0); s << ", fr:" << std::fixed << std::setprecision(3) << m_fFrameRate; diff --git a/xbmc/cores/VideoPlayer/VideoPlayerVideo.h b/xbmc/cores/VideoPlayer/VideoPlayerVideo.h index f763334301..298b132659 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayerVideo.h +++ b/xbmc/cores/VideoPlayer/VideoPlayerVideo.h @@ -142,6 +142,4 @@ protected: VideoPicture m_picture; EOutputState m_outputSate{OUTPUT_NORMAL}; - - double m_messageQueueTimeSize{0.0}; }; -- cgit v1.2.3