Skip to content

Commit 4e8cd86

Browse files
committed
[优化mpvplayer示例中的GPU设置功能]:对mpvplayer示例程序进行了改进,新增了硬件加速(H/W)和GPU API选项的动态菜单,并更新了相关设置方法。
- 移除了`gpuAction`的实现,并替换为两个新的函数`createHWMenu`和`createGpuApiMenu`,用于动态创建硬件加速和GPU API选项的菜单。 - 在`MpvPlayer`类中新增了硬件加速和GPU API相关的函数,包括获取可用选项列表、设置和获取当前选项。 - 更新了`MainWindow`的`initMenu`函数,使用新的菜单创建函数添加硬件加速和GPU API选项到菜单中。 - 修改了`onRenderChanged`函数,移除了旧的逻辑,替换为使用新的硬件加速和GPU API设置。 - 更新了`MpvPlayer`的析构函数和`previewwidget.cc`中的`MpvPlayer`初始化逻辑,使用新的硬件加速设置。
1 parent 5a01e1b commit 4e8cd86

File tree

4 files changed

+109
-56
lines changed

4 files changed

+109
-56
lines changed

examples/mpvplayer/mainwindow.cc

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ class MainWindow::MainWindowPrivate
5252
//playlistView->setMaximumWidth(250);
5353

5454
menu = new QMenu(q_ptr);
55-
gpuAction = new QAction(QCoreApplication::translate("MainWindowPrivate", "H/W"), q_ptr);
56-
gpuAction->setCheckable(true);
5755
videoMenu = new QMenu(QCoreApplication::translate("MainWindowPrivate", "Video"), q_ptr);
5856
audioMenu = new QMenu(QCoreApplication::translate("MainWindowPrivate", "Audio"), q_ptr);
5957
subMenu = new QMenu(QCoreApplication::translate("MainWindowPrivate", "Subtitles"), q_ptr);
@@ -77,6 +75,46 @@ class MainWindow::MainWindowPrivate
7775

7876
~MainWindowPrivate() = default;
7977

78+
auto createHWMenu() -> QMenu *
79+
{
80+
hwdecGroup = new QActionGroup(q_ptr);
81+
hwdecGroup->setExclusive(true);
82+
auto *menu = new QMenu(QCoreApplication::translate("MainWindowPrivate", "H/W"), q_ptr);
83+
auto hwdecs = mpvPlayer->hwdecs();
84+
for (const auto &hwdec : std::as_const(hwdecs)) {
85+
auto *action = new QAction(hwdec, q_ptr);
86+
action->setCheckable(true);
87+
hwdecGroup->addAction(action);
88+
menu->addAction(action);
89+
}
90+
hwdecGroup->actions().at(1)->setChecked(true);
91+
q_ptr->connect(hwdecGroup, &QActionGroup::triggered, q_ptr, [this](QAction *action) {
92+
mpvPlayer->setHwdec(action->text());
93+
});
94+
95+
return menu;
96+
}
97+
98+
auto createGpuApiMenu() -> QMenu *
99+
{
100+
gpuApiGroup = new QActionGroup(q_ptr);
101+
gpuApiGroup->setExclusive(true);
102+
auto *menu = new QMenu(QCoreApplication::translate("MainWindowPrivate", "Gpu Api"), q_ptr);
103+
auto gpuApis = mpvPlayer->gpuApis();
104+
for (const auto &gpuApi : std::as_const(gpuApis)) {
105+
auto *action = new QAction(gpuApi, q_ptr);
106+
action->setCheckable(true);
107+
gpuApiGroup->addAction(action);
108+
menu->addAction(action);
109+
}
110+
gpuApiGroup->actions().at(0)->setChecked(true);
111+
q_ptr->connect(gpuApiGroup, &QActionGroup::triggered, q_ptr, [this](QAction *action) {
112+
mpvPlayer->setGpuApi(action->text());
113+
});
114+
115+
return menu;
116+
}
117+
80118
auto createtoneMappingMenu() -> QMenu *
81119
{
82120
auto *group = new QActionGroup(q_ptr);
@@ -269,7 +307,8 @@ class MainWindow::MainWindowPrivate
269307
PlaylistModel *playlistModel;
270308

271309
QMenu *menu;
272-
QAction *gpuAction;
310+
QActionGroup *hwdecGroup;
311+
QActionGroup *gpuApiGroup;
273312

274313
QMenu *videoMenu;
275314
QPointer<QMenu> videoTracksMenuPtr;
@@ -421,11 +460,10 @@ void MainWindow::onChapterChanged()
421460

422461
void MainWindow::onRenderChanged(QAction *action)
423462
{
424-
auto value = static_cast<Mpv::MpvPlayer::GpuApiType>(action->data().toInt());
425463
d_ptr->mpvPlayer->initMpv(d_ptr->mpvWidget);
426-
d_ptr->mpvPlayer->setGpuApi(value);
427464
d_ptr->mpvPlayer->setPrintToStd(true);
428-
d_ptr->mpvPlayer->setUseGpu(d_ptr->gpuAction->isChecked());
465+
d_ptr->mpvPlayer->setHwdec(d_ptr->hwdecGroup->checkedAction()->text());
466+
d_ptr->mpvPlayer->setGpuApi(d_ptr->gpuApiGroup->checkedAction()->text());
429467
auto index = d_ptr->playlistModel->playlist()->currentIndex();
430468
if (index > -1) {
431469
playlistPositionChanged(d_ptr->playlistModel->playlist()->currentIndex());
@@ -721,28 +759,8 @@ void MainWindow::initMenu()
721759
d_ptr->menu->addAction(tr("Open Local Media"), this, &MainWindow::onOpenLocalMedia);
722760
d_ptr->menu->addAction(tr("Open Web Media"), this, &MainWindow::onOpenWebMedia);
723761

724-
d_ptr->menu->addAction(d_ptr->gpuAction);
725-
connect(d_ptr->gpuAction, &QAction::toggled, d_ptr->mpvPlayer, [this](bool checked) {
726-
d_ptr->mpvPlayer->setUseGpu(checked);
727-
});
728-
d_ptr->gpuAction->setChecked(true);
729-
#ifdef Q_OS_WIN
730-
auto *menu = new QMenu(tr("Render"), this);
731-
auto *actionGroup = new QActionGroup(this);
732-
actionGroup->setExclusive(true);
733-
auto metaEnum = QMetaEnum::fromType<Mpv::MpvPlayer::GpuApiType>();
734-
for (int i = 0; i < metaEnum.keyCount(); i++) {
735-
auto value = metaEnum.value(i);
736-
auto *action = new QAction(metaEnum.valueToKey(value), this);
737-
action->setData(value);
738-
action->setCheckable(true);
739-
actionGroup->addAction(action);
740-
menu->addAction(action);
741-
action->setChecked(i == 0);
742-
}
743-
connect(actionGroup, &QActionGroup::triggered, this, &MainWindow::onRenderChanged);
744-
d_ptr->menu->addMenu(menu);
745-
#endif
762+
d_ptr->menu->addMenu(d_ptr->createHWMenu());
763+
d_ptr->menu->addMenu(d_ptr->createGpuApiMenu());
746764
d_ptr->menu->addMenu(d_ptr->videoMenu);
747765
d_ptr->menu->addMenu(d_ptr->audioMenu);
748766
d_ptr->menu->addMenu(d_ptr->subMenu);

src/mpv/mpvplayer.cc

Lines changed: 55 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -311,28 +311,68 @@ auto MpvPlayer::cacheSpeed() const -> double
311311

312312
void MpvPlayer::setCacheSpeed(double speed)
313313
{
314+
qInfo() << "cache-speed: " << speed;
314315
mpv::qt::set_property_async(d_ptr->mpv, "cache-speed", speed);
315316
}
316317

317-
void MpvPlayer::setUseGpu(bool use)
318+
QStringList MpvPlayer::hwdecs() const
319+
{
320+
static QStringList list{"no",
321+
"auto-safe",
322+
"auto",
323+
"yes",
324+
"auto-copy",
325+
"d3d11va",
326+
"d3d11va-copy",
327+
"videotoolbox",
328+
"videotoolbox-copy",
329+
"vaapi",
330+
"vaapi-copy",
331+
"nvdec",
332+
"nvdec-copy",
333+
"drm",
334+
"drm-copy",
335+
"vulkan",
336+
"vulkan-copy"};
337+
// list.append(QStringList{"dxva2",
338+
// "dxva2-copy",
339+
// "vdpau",
340+
// "vdpau-copy",
341+
// "mediacodec",
342+
// "mediacodec-copy",
343+
// "cuda",
344+
// "cuda-copy",
345+
// "crystalhd",
346+
// "rkmpp"});
347+
return list;
348+
}
349+
350+
void MpvPlayer::setHwdec(const QString &hwdec)
318351
{
319-
mpv::qt::set_property_async(d_ptr->mpv, "hwdec", use ? "auto-safe" : "no");
320-
//mpv::qt::set_property_async(d_ptr->mpv, "d3d11va-zero-copy", "yes");
352+
qInfo() << "hwdec: " << hwdec;
353+
mpv::qt::set_property_async(d_ptr->mpv, "hwdec", hwdec);
321354
}
322355

323-
void MpvPlayer::setGpuApi(GpuApiType type)
356+
QString MpvPlayer::hwdec() const
324357
{
325-
QString typeStr;
326-
switch (type) {
327-
case Opengl: typeStr = "opengl"; break;
328-
case Vulkan: typeStr = "vulkan"; break;
329-
#ifdef Q_OS_WIN
330-
case D3d11: typeStr = "d3d11"; break;
331-
#endif
332-
default: typeStr = "auto"; break;
333-
}
334-
mpv::qt::set_property(d_ptr->mpv, "gpu-api", typeStr);
335-
qInfo() << "GpuApi: " << typeStr;
358+
return mpv::qt::get_property(d_ptr->mpv, "hwdec").toString();
359+
}
360+
361+
QStringList MpvPlayer::gpuApis() const
362+
{
363+
static QStringList list{"auto", "opengl", "vulkan", "d3d11"};
364+
return list;
365+
}
366+
367+
void MpvPlayer::setGpuApi(const QString &gpuApi)
368+
{
369+
qInfo() << "gpu-api: " << gpuApi;
370+
mpv::qt::set_property_async(d_ptr->mpv, "gpu-api", gpuApi);
371+
}
372+
373+
QString MpvPlayer::gpuApi() const
374+
{
375+
return mpv::qt::get_property(d_ptr->mpv, "gpu-api").toString();
336376
}
337377

338378
void MpvPlayer::setVolume(int value)

src/mpv/mpvplayer.hpp

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,6 @@ class MPV_LIB_EXPORT MpvPlayer : public QObject
1414
{
1515
Q_OBJECT
1616
public:
17-
enum GpuApiType {
18-
Auto,
19-
Opengl,
20-
Vulkan,
21-
#ifdef Q_OS_WIN
22-
D3d11
23-
#endif
24-
};
25-
Q_ENUM(GpuApiType)
26-
2717
explicit MpvPlayer(QObject *parent = nullptr);
2818
~MpvPlayer() override;
2919

@@ -64,8 +54,13 @@ class MPV_LIB_EXPORT MpvPlayer : public QObject
6454
[[nodiscard]] auto cacheSpeed() const -> double; // seconds
6555
void setCacheSpeed(double speed); // bytes / seconds
6656

67-
void setUseGpu(bool use);
68-
void setGpuApi(GpuApiType type);
57+
[[nodiscard]] auto hwdecs() const -> QStringList;
58+
void setHwdec(const QString &hwdec);
59+
[[nodiscard]] auto hwdec() const -> QString;
60+
61+
[[nodiscard]] auto gpuApis() const -> QStringList;
62+
void setGpuApi(const QString &gpuApi);
63+
[[nodiscard]] auto gpuApi() const -> QString;
6964

7065
void setVolume(int value);
7166
[[nodiscard]] auto volume() const -> int;

src/mpv/previewwidget.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class PreviewWidget::PreviewWidgetPrivate
2121
mpvWidget = new Mpv::MpvOpenglWidget(mpvPlayer, owner);
2222
mpvPlayer->initMpv(nullptr);
2323
#endif
24-
mpvPlayer->setUseGpu(true);
24+
mpvPlayer->setHwdec("auto-safe");
2525
mpvPlayer->setCache(false);
2626
mpvPlayer->pauseAsync();
2727
}

0 commit comments

Comments
 (0)