From 4b650d41522ecb0e2d2881ac53179932338fa47d Mon Sep 17 00:00:00 2001 From: dela Date: Mon, 22 Jun 2026 13:50:34 +0800 Subject: [PATCH] feat: add mpv tone mapping setting --- src/qEmbyApp/components/mpvcontroller.cpp | 12 ++++++++++-- src/qEmbyApp/views/settings/pageplayer.cpp | 12 ++++++++++++ src/qEmbyCore/config/config_keys.h | 1 + 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/qEmbyApp/components/mpvcontroller.cpp b/src/qEmbyApp/components/mpvcontroller.cpp index d44d26b..48f8d09 100644 --- a/src/qEmbyApp/components/mpvcontroller.cpp +++ b/src/qEmbyApp/components/mpvcontroller.cpp @@ -146,8 +146,16 @@ bool MpvController::init() { << "| interpolation=" << (vsyncMode == "display-resample"); - - + mpv_set_option_string(m_mpv, "target-colorspace-hint", "auto"); + mpv_set_option_string(m_mpv, "target-trc", "auto"); + const QString toneMapping = ConfigStore::instance()->get( + ConfigKeys::PlayerToneMapping, "auto"); + mpv_set_option_string(m_mpv, "tone-mapping", toneMapping.toUtf8().constData()); + qDebug() << "[MpvController] Applied HDR tone mapping" + << "| target-colorspace-hint=auto" + << "| target-trc=auto" + << "| tone-mapping=" << toneMapping; + QString hwdec = ConfigStore::instance()->get(ConfigKeys::PlayerHwDec, "auto-copy"); mpv_set_option_string(m_mpv, "hwdec", hwdec.toUtf8().constData()); diff --git a/src/qEmbyApp/views/settings/pageplayer.cpp b/src/qEmbyApp/views/settings/pageplayer.cpp index 94db112..9bcc57a 100644 --- a/src/qEmbyApp/views/settings/pageplayer.cpp +++ b/src/qEmbyApp/views/settings/pageplayer.cpp @@ -80,6 +80,18 @@ PagePlayer::PagePlayer(QEmbyCore *core, QWidget *parent) vsyncCombo, ConfigKeys::PlayerVideoSync, this, QVariant("display-resample"))); + auto *toneMappingCombo = new ModernComboBox(this); + toneMappingCombo->addItem(tr("Auto"), "auto"); + toneMappingCombo->addItem(tr("Mobius"), "mobius"); + toneMappingCombo->addItem(tr("BT.2390"), "bt.2390"); + toneMappingCombo->addItem(tr("Hable"), "hable"); + toneMappingCombo->addItem(tr("Reinhard"), "reinhard"); + m_mainLayout->addWidget( + new SettingsCard(":/svg/dark/video-output.svg", tr("Tone Mapping"), + tr("HDR to SDR tone mapping algorithm"), + toneMappingCombo, ConfigKeys::PlayerToneMapping, this, + QVariant("auto"))); + auto createLanguageRuleInput = [this](bool allowNone) { auto *input = new ModernTagInput(this); input->setPopupMode(ModernTagInput::ForcePopup); diff --git a/src/qEmbyCore/config/config_keys.h b/src/qEmbyCore/config/config_keys.h index 02dce62..4b6a8a7 100644 --- a/src/qEmbyCore/config/config_keys.h +++ b/src/qEmbyCore/config/config_keys.h @@ -106,6 +106,7 @@ constexpr const char* ImageCacheDuration = "cache/image_cache_duration"; constexpr const char* PlayerHwDec = "player/hw_decoding"; constexpr const char* PlayerVo = "player/video_output"; constexpr const char* PlayerVideoSync = "player/video_sync"; +constexpr const char* PlayerToneMapping = "player/tone_mapping"; constexpr const char* PlayerDefaultScale = "player/default_scale"; constexpr const char* PlayerAudioLang = "player/audio_lang"; constexpr const char* PlayerSubLang = "player/sub_lang";