From f0d215ed5894690cc5ca7880e21bc1e97d2b4dd6 Mon Sep 17 00:00:00 2001 From: Johannes Baiter Date: Tue, 23 Apr 2024 23:08:49 +0200 Subject: [PATCH] gui: Add new 'custom' quality preset for placebo Will monitor the file `pl_render_params.conf` in the Chiaki config directory for custom rendering settings and apply them to the running stream. For available options see [1], the syntax is simply a set of `key=value` pairs, separated from each other with either whitespace, comma, semicolon, colon or newline characters. [1] https://libplacebo.org/options/ --- gui/include/qmlmainwindow.h | 7 +++++- gui/include/settings.h | 3 ++- gui/src/qml/SettingsDialog.qml | 3 ++- gui/src/qmlmainwindow.cpp | 42 ++++++++++++++++++++++++++++++++++ gui/src/settings.cpp | 3 ++- 5 files changed, 54 insertions(+), 4 deletions(-) diff --git a/gui/include/qmlmainwindow.h b/gui/include/qmlmainwindow.h index 91216375d..5cb367c4b 100644 --- a/gui/include/qmlmainwindow.h +++ b/gui/include/qmlmainwindow.h @@ -6,6 +6,7 @@ #include #include #include +#include extern "C" { #include @@ -55,7 +56,8 @@ class QmlMainWindow : public QWindow enum class VideoPreset { Fast, Default, - HighQuality + HighQuality, + Custom }; Q_ENUM(VideoPreset); @@ -154,6 +156,9 @@ class QmlMainWindow : public QWindow bool quick_frame = false; bool quick_need_sync = false; std::atomic quick_need_render = {false}; + QFileSystemWatcher *renderparams_watcher = {}; + pl_options renderparams_opts = {}; + bool renderparams_changed = false; struct { PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; diff --git a/gui/include/settings.h b/gui/include/settings.h index f64d0d476..198046401 100644 --- a/gui/include/settings.h +++ b/gui/include/settings.h @@ -45,7 +45,8 @@ enum class Decoder enum class PlaceboPreset { Fast, Default, - HighQuality + HighQuality, + Custom }; enum class WindowType { diff --git a/gui/src/qml/SettingsDialog.qml b/gui/src/qml/SettingsDialog.qml index d183377e3..aaf251cdf 100644 --- a/gui/src/qml/SettingsDialog.qml +++ b/gui/src/qml/SettingsDialog.qml @@ -283,7 +283,7 @@ DialogView { C.ComboBox { Layout.preferredWidth: 400 - model: [qsTr("Fast"), qsTr("Default"), qsTr("High Quality")] + model: [qsTr("Fast"), qsTr("Default"), qsTr("High Quality"), qsTr("Custom")] currentIndex: Chiaki.settings.videoPreset onActivated: (index) => { Chiaki.settings.videoPreset = index; @@ -291,6 +291,7 @@ DialogView { case 0: Chiaki.window.videoPreset = ChiakiWindow.VideoPreset.Fast; break; case 1: Chiaki.window.videoPreset = ChiakiWindow.VideoPreset.Default; break; case 2: Chiaki.window.videoPreset = ChiakiWindow.VideoPreset.HighQuality; break; + case 3: Chiaki.window.videoPreset = ChiakiWindow.VideoPreset.Custom; break; } } } diff --git a/gui/src/qmlmainwindow.cpp b/gui/src/qmlmainwindow.cpp index d03f5ed72..e021642c9 100644 --- a/gui/src/qmlmainwindow.cpp +++ b/gui/src/qmlmainwindow.cpp @@ -55,6 +55,13 @@ static QString shader_cache_path() return path; } + +static const char *render_params_path() +{ + static QString path = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/Chiaki/pl_render_params.conf"; + return qPrintable(path); +} + class RenderControl : public QQuickRenderControl { public: @@ -134,6 +141,7 @@ QmlMainWindow::~QmlMainWindow() pl_renderer_destroy(&placebo_renderer); pl_vulkan_destroy(&placebo_vulkan); pl_vk_inst_destroy(&placebo_vk_inst); + pl_options_free(&renderparams_opts); pl_log_destroy(&placebo_log); } @@ -510,6 +518,21 @@ void QmlMainWindow::init(Settings *settings) dropped_frames_current = 0; }); + this->renderparams_opts = pl_options_alloc(this->placebo_log); + pl_options_reset(this->renderparams_opts, &pl_render_high_quality_params); + + this->renderparams_watcher = new QFileSystemWatcher(this); + this->renderparams_watcher->addPath(render_params_path()); + this->renderparams_changed = true; + connect( + this->renderparams_watcher, + &QFileSystemWatcher::fileChanged, this, + [this](const QString &path) { + this->renderparams_changed = true; + this->renderparams_watcher->addPath(render_params_path()); + }); + + switch (settings->GetPlaceboPreset()) { case PlaceboPreset::Fast: setVideoPreset(VideoPreset::Fast); @@ -517,6 +540,9 @@ void QmlMainWindow::init(Settings *settings) case PlaceboPreset::Default: setVideoPreset(VideoPreset::Default); break; + case PlaceboPreset::Custom: + setVideoPreset(VideoPreset::Custom); + break; case PlaceboPreset::HighQuality: default: setVideoPreset(VideoPreset::HighQuality); @@ -783,6 +809,22 @@ void QmlMainWindow::render() case VideoPreset::HighQuality: render_params = &pl_render_high_quality_params; break; + case VideoPreset::Custom: + if (renderparams_changed) { + renderparams_changed = false; + QFile paramsFile(render_params_path()); + bool loaded = false; + if (paramsFile.open(QIODevice::ReadOnly)) { + QByteArray paramsData = paramsFile.readAll(); + if (!pl_options_load(this->renderparams_opts, paramsData.constData())) { + qCCritical(chiakiGui) << "Failed to load custom render params!"; + } else { + qCInfo(chiakiGui) << "Updated custom render parameters."; + } + } + } + render_params = &(this->renderparams_opts->params); + break; } if (current_frame.num_planes) { diff --git a/gui/src/settings.cpp b/gui/src/settings.cpp index 5f38c95ae..85bab1880 100644 --- a/gui/src/settings.cpp +++ b/gui/src/settings.cpp @@ -403,7 +403,8 @@ void Settings::SetDecoder(Decoder decoder) static const QMap placebo_preset_values = { { PlaceboPreset::Fast, "fast" }, { PlaceboPreset::Default, "default" }, - { PlaceboPreset::HighQuality, "high_quality" } + { PlaceboPreset::HighQuality, "high_quality" }, + { PlaceboPreset::Custom, "custom" } }; PlaceboPreset Settings::GetPlaceboPreset() const