diff --git a/examples/ffmpegplayer/mainwindow.cpp b/examples/ffmpegplayer/mainwindow.cpp index 0b7e90a..b0a7404 100644 --- a/examples/ffmpegplayer/mainwindow.cpp +++ b/examples/ffmpegplayer/mainwindow.cpp @@ -106,6 +106,35 @@ class MainWindow::MainWindowPrivate return menu; } + auto createTargetPrimariesMenu() -> QMenu * + { + auto *group = new QActionGroup(q_ptr); + group->setExclusive(true); + auto *menu = new QMenu(QCoreApplication::translate("MainWindowPrivate", "Target Primaries"), + q_ptr); + auto primaris = QMetaEnum::fromType(); + for (int i = 0; i < primaris.keyCount(); ++i) { + auto value = primaris.value(i); + auto *action = new QAction(primaris.key(i), q_ptr); + action->setCheckable(true); + action->setData(value); + group->addAction(action); + menu->addAction(action); + if (value == Ffmpeg::ColorUtils::Primaries::Type::AUTO) { + action->setChecked(true); + } + } + q_ptr->connect(group, &QActionGroup::triggered, q_ptr, [this](QAction *action) { + primarisType = static_cast(action->data().toInt()); + if (videoRender.isNull()) { + return; + } + videoRender->setDestPrimaries(primarisType); + }); + group->checkedAction()->trigger(); + return menu; + } + void resetTrackMenu() { auto actions = audioTracksGroup->actions(); @@ -682,8 +711,7 @@ void MainWindow::initMenu() d_ptr->videoMenu->addAction(equalizerAction); d_ptr->videoMenu->addMenu(d_ptr->createtoneMappingMenu()); - - destPrimarisMenu(); + d_ptr->videoMenu->addMenu(d_ptr->createTargetPrimariesMenu()); connect(d_ptr->audioTracksGroup, &QActionGroup::triggered, this, [this](QAction *action) { d_ptr->playerPtr->addEvent(Ffmpeg::EventPtr( @@ -704,35 +732,6 @@ void MainWindow::initMenu() connect(d_ptr->mediaInfoAction, &QAction::triggered, this, &MainWindow::onShowMediaInfo); } -void MainWindow::destPrimarisMenu() -{ - auto *destPrimarisGroup = new QActionGroup(this); - destPrimarisGroup->setExclusive(true); - auto *destPrimarisMenu = new QMenu(tr("Dest Primaris"), this); - auto destPrimaris = QMetaEnum::fromType(); - for (int i = 0; i < destPrimaris.keyCount(); ++i) { - auto value = destPrimaris.value(i); - auto *action = new QAction(destPrimaris.key(i), this); - action->setCheckable(true); - action->setData(value); - destPrimarisGroup->addAction(action); - destPrimarisMenu->addAction(action); - if (value == Ffmpeg::ColorUtils::Primaries::Type::AUTO) { - action->setChecked(true); - } - } - d_ptr->videoMenu->addMenu(destPrimarisMenu); - connect(destPrimarisGroup, &QActionGroup::triggered, this, [this](QAction *action) { - d_ptr->primarisType = static_cast( - action->data().toInt()); - if (d_ptr->videoRender.isNull()) { - return; - } - d_ptr->videoRender->setDestPrimaries(d_ptr->primarisType); - }); - destPrimarisGroup->checkedAction()->trigger(); -} - void MainWindow::renderMenu() { auto *widgetAction = new QAction(tr("Widget"), this); diff --git a/examples/ffmpegplayer/mainwindow.h b/examples/ffmpegplayer/mainwindow.h index 2df3fdc..8e8e8d9 100644 --- a/examples/ffmpegplayer/mainwindow.h +++ b/examples/ffmpegplayer/mainwindow.h @@ -38,7 +38,6 @@ private slots: void setupUI(); void buildConnect(); void initMenu(); - void destPrimarisMenu(); void renderMenu(); void initPlayListMenu(); void addToPlaylist(const QList &urls); diff --git a/examples/mpvplayer/mainwindow.cc b/examples/mpvplayer/mainwindow.cc index e36316a..1e393fb 100644 --- a/examples/mpvplayer/mainwindow.cc +++ b/examples/mpvplayer/mainwindow.cc @@ -98,6 +98,27 @@ class MainWindow::MainWindowPrivate return menu; } + auto createTargetPrimariesMenu() -> QMenu * + { + auto *group = new QActionGroup(q_ptr); + group->setExclusive(true); + auto *menu = new QMenu(QCoreApplication::translate("MainWindowPrivate", "Target Primaries"), + q_ptr); + auto targetPrimaries = mpvPlayer->targetPrimaries(); + for (const auto &targetPrimary : std::as_const(targetPrimaries)) { + auto *action = new QAction(targetPrimary, q_ptr); + action->setCheckable(true); + group->addAction(action); + menu->addAction(action); + } + group->actions().at(0)->setChecked(true); + q_ptr->connect(group, &QActionGroup::triggered, q_ptr, [this](QAction *action) { + mpvPlayer->setTargetPrimaries(action->text()); + }); + + return menu; + } + void resetTrackMenu() { auto actions = audioTracksGroup->actions(); @@ -730,6 +751,7 @@ void MainWindow::initMenu() connect(equalizerAction, &QAction::triggered, this, &MainWindow::onEqualizer); d_ptr->videoMenu->addAction(equalizerAction); d_ptr->videoMenu->addMenu(d_ptr->createtoneMappingMenu()); + d_ptr->videoMenu->addMenu(d_ptr->createTargetPrimariesMenu()); connect(d_ptr->videoTracksGroup, &QActionGroup::triggered, this, [this](QAction *action) { auto data = action->data().value(); diff --git a/src/mpv/mpvplayer.cc b/src/mpv/mpvplayer.cc index b65c196..2d719e8 100644 --- a/src/mpv/mpvplayer.cc +++ b/src/mpv/mpvplayer.cc @@ -468,6 +468,35 @@ auto MpvPlayer::toneMapping() const -> QString return mpv::qt::get_property(d_ptr->mpv, "tone-mapping").toString(); } +QStringList MpvPlayer::targetPrimaries() const +{ + static QStringList list{"auto", + "bt.470m", + "bt.601-525", + "bt.601-625", + "bt.709", + "bt.2020", + "apple", + "adobe", + "prophoto", + "cie1931", + "dci-p3", + "v-gamut", + "s-gamut"}; + return list; +} + +void MpvPlayer::setTargetPrimaries(const QString &targetPrimaries) +{ + qInfo() << "target-prim: " << targetPrimaries; + mpv::qt::set_property_async(d_ptr->mpv, "target-prim", targetPrimaries); +} + +QString MpvPlayer::targetPrimariesName() const +{ + return mpv::qt::get_property(d_ptr->mpv, "target-prim").toString(); +} + void MpvPlayer::pauseAsync() { auto state = !isPaused(); diff --git a/src/mpv/mpvplayer.hpp b/src/mpv/mpvplayer.hpp index 732bd0b..4e76400 100644 --- a/src/mpv/mpvplayer.hpp +++ b/src/mpv/mpvplayer.hpp @@ -99,6 +99,10 @@ class MPV_LIB_EXPORT MpvPlayer : public QObject void setToneMapping(const QString &toneMapping); [[nodiscard]] auto toneMapping() const -> QString; + [[nodiscard]] auto targetPrimaries() const -> QStringList; + void setTargetPrimaries(const QString &targetPrimaries); + [[nodiscard]] auto targetPrimariesName() const -> QString; + void pauseAsync(); void pauseSync(bool state); auto isPaused() -> bool;