Skip to content

Commit

Permalink
Merge pull request xbmc#25360 from thexai/queue-settings
Browse files Browse the repository at this point in the history
[VideoPlayer] Add GUI settings for audio/video playback queues
  • Loading branch information
thexai authored Jun 26, 2024
2 parents e043814 + 76b9e11 commit 8e7a3ee
Show file tree
Hide file tree
Showing 14 changed files with 188 additions and 31 deletions.
64 changes: 61 additions & 3 deletions addons/resource.language.en_gb/resources/strings.po
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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"
Expand Down
20 changes: 20 additions & 0 deletions system/settings/settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -891,6 +891,26 @@
</setting>
</group>
</category>
<category id="advanced" label="14187" help="38113">
<group id="1" label="14188">
<setting id="videoplayer.queuetimesize" type="integer" label="37130" help="37131">
<level>2</level>
<default>40</default> <!-- 4.0 s -->
<constraints>
<options>playerqueuetimesizes</options>
</constraints>
<control type="list" format="string" />
</setting>
<setting id="videoplayer.queuedatasize" type="integer" label="37132" help="37133">
<level>2</level>
<default>256</default> <!-- 256 MB -->
<constraints>
<options>playerqueuedatasizes</options>
</constraints>
<control type="list" format="string" />
</setting>
</group>
</category>
</section>
<section id="media" label="14211" help="38101">
<category id="library" label="14202" help="39004">
Expand Down
6 changes: 3 additions & 3 deletions xbmc/cores/VideoPlayer/DVDMessageQueue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -333,14 +333,14 @@ int CDVDMessageQueue::GetLevel() const
return level;
}

int CDVDMessageQueue::GetTimeSize() const
double CDVDMessageQueue::GetTimeSize() const
{
std::unique_lock<CCriticalSection> 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
Expand Down
2 changes: 1 addition & 1 deletion xbmc/cores/VideoPlayer/DVDMessageQueue.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ class CDVDMessageQueue
}

int GetDataSize() const { return m_iDataSize; }
int GetTimeSize() const;
double GetTimeSize() const;
unsigned GetPacketCount(CDVDMsg::Message type);
bool ReceivedAbortRequest() { return m_bAbortRequest; }
void WaitUntilEmpty();
Expand Down
11 changes: 5 additions & 6 deletions xbmc/cores/VideoPlayer/VideoPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,6 @@
using namespace KODI;
using namespace std::chrono_literals;

namespace
{
constexpr double VP_MESSAGE_QUEUE_TIME_SIZE = 8.0;
}

//------------------------------------------------------------------------------
// selection streams
//------------------------------------------------------------------------------
Expand Down Expand Up @@ -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<double>(tenthsSeconds) / 10.0;

m_SkipCommercials = true;

Expand Down
12 changes: 5 additions & 7 deletions xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();
}
Expand Down Expand Up @@ -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)
Expand Down
1 change: 0 additions & 1 deletion xbmc/cores/VideoPlayer/VideoPlayerAudio.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,5 @@ class CVideoPlayerAudio : public CThread, public IDVDStreamPlayerAudio
bool m_displayReset = false;
unsigned int m_disconAdjustTimeMs = 50; // maximum sync-off before adjusting
int m_disconAdjustCounter = 0;
double m_messageQueueTimeSize{0.0};
};

17 changes: 9 additions & 8 deletions xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -53,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;
Expand All @@ -68,9 +68,11 @@ 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);
m_messageQueue.SetMaxTimeSize(m_messageQueueTimeSize);
const int sizeMB = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt(
CSettings::SETTING_VIDEOPLAYER_QUEUEDATASIZE);

m_messageQueue.SetMaxDataSize(sizeMB * 1024 * 1024);
m_messageQueue.SetMaxTimeSize(messageQueueTimeSize);

m_iDroppedFrames = 0;
m_fFrameRate = 25;
Expand Down Expand Up @@ -953,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<double>(GetVideoBitrate()) / (1024.0 * 1024.0);
s << ", fr:" << std::fixed << std::setprecision(3) << m_fFrameRate;
Expand Down
2 changes: 0 additions & 2 deletions xbmc/cores/VideoPlayer/VideoPlayerVideo.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,4 @@ class CVideoPlayerVideo : public CThread, public IDVDStreamPlayerVideo
VideoPicture m_picture;

EOutputState m_outputSate{OUTPUT_NORMAL};

double m_messageQueueTimeSize{0.0};
};
2 changes: 2 additions & 0 deletions xbmc/settings/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ set(SOURCES AdvancedSettings.cpp
LibExportSettings.cpp
MediaSettings.cpp
MediaSourceSettings.cpp
PlayerSettings.cpp
ServicesSettings.cpp
SettingAddon.cpp
SettingConditions.cpp
Expand All @@ -28,6 +29,7 @@ set(HEADERS AdvancedSettings.h
LibExportSettings.h
MediaSettings.h
MediaSourceSettings.h
PlayerSettings.h
ServicesSettings.h
SettingAddon.h
SettingConditions.h
Expand Down
46 changes: 46 additions & 0 deletions xbmc/settings/PlayerSettings.cpp
Original file line number Diff line number Diff line change
@@ -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<IntegerSettingOption>& 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<IntegerSettingOption>& 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);
}
27 changes: 27 additions & 0 deletions xbmc/settings/PlayerSettings.h
Original file line number Diff line number Diff line change
@@ -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 <vector>

class CPlayerSettings : public ISubSettings
{
public:
static void SettingOptionsQueueTimeSizesFiller(const SettingConstPtr& setting,
std::vector<IntegerSettingOption>& list,
int& current,
void* data);
static void SettingOptionsQueueDataSizesFiller(const SettingConstPtr& setting,
std::vector<IntegerSettingOption>& list,
int& current,
void* data);
};
7 changes: 7 additions & 0 deletions xbmc/settings/Settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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()
Expand Down
2 changes: 2 additions & 0 deletions xbmc/settings/Settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,8 @@ class CSettings : public CSettingsBase, public CSettingCreator, public CSettingC
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";
Expand Down

0 comments on commit 8e7a3ee

Please # to comment.