From 5167eb47aeddf53bf5936d53c29b430d1ded40a4 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 30 Mar 2022 15:20:11 +0400 Subject: [PATCH] Add hardware acceleartion video decoding setting. --- Telegram/Resources/langs/lang.strings | 1 + Telegram/SourceFiles/core/core_settings.cpp | 12 ++++++++++-- Telegram/SourceFiles/core/core_settings.h | 8 ++++++++ .../media/view/media_view_overlay_widget.cpp | 2 +- .../SourceFiles/media/view/media_view_pip.cpp | 2 +- .../SourceFiles/settings/settings_advanced.cpp | 18 ++++++++++++++++++ 6 files changed, 39 insertions(+), 4 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index e2af7d4e42..04ad0be16f 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -492,6 +492,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_system_integration" = "System integration"; "lng_settings_performance" = "Performance"; "lng_settings_enable_animations" = "Enable animations"; +"lng_settings_enable_hwaccel" = "Hardware accelerated video decoding"; "lng_settings_enable_opengl" = "Enable OpenGL rendering for media"; "lng_settings_angle_backend" = "ANGLE graphics backend"; "lng_settings_angle_backend_auto" = "Auto"; diff --git a/Telegram/SourceFiles/core/core_settings.cpp b/Telegram/SourceFiles/core/core_settings.cpp index fcc262f174..0d16402883 100644 --- a/Telegram/SourceFiles/core/core_settings.cpp +++ b/Telegram/SourceFiles/core/core_settings.cpp @@ -128,7 +128,7 @@ QByteArray Settings::serialize() const { + Serialize::bytearraySize(_photoEditorBrush) + sizeof(qint32) * 3 + Serialize::stringSize(_customDeviceModel.current()) - + sizeof(qint32) * 2; + + sizeof(qint32) * 4; auto result = QByteArray(); result.reserve(size); @@ -236,6 +236,9 @@ QByteArray Settings::serialize() const { for (const auto &id : _accountsOrder) { stream << quint64(id); } + + stream + << qint32(_hardwareAcceleratedVideo ? 1 : 0); } return result; } @@ -325,6 +328,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) { qint32 macWarnBeforeQuit = _macWarnBeforeQuit ? 1 : 0; qint32 accountsOrderCount = 0; std::vector accountsOrder; + qint32 hardwareAcceleratedVideo = _hardwareAcceleratedVideo ? 1 : 0; stream >> themesAccentColors; if (!stream.atEnd()) { @@ -506,6 +510,9 @@ void Settings::addFromSerialized(const QByteArray &serialized) { } } } + if (!stream.atEnd()) { + stream >> hardwareAcceleratedVideo; + } if (stream.status() != QDataStream::Ok) { LOG(("App Error: " "Bad data for Core::Settings::constructFromSerialized()")); @@ -661,7 +668,8 @@ void Settings::addFromSerialized(const QByteArray &serialized) { case Media::Player::OrderMode::Reverse: case Media::Player::OrderMode::Shuffle: _playerOrderMode = uncheckedPlayerOrderMode; break; } - _macWarnBeforeQuit = macWarnBeforeQuit ? 1 : 0; + _macWarnBeforeQuit = (macWarnBeforeQuit == 1); + _hardwareAcceleratedVideo = (hardwareAcceleratedVideo == 1); } QString Settings::getSoundPath(const QString &key) const { diff --git a/Telegram/SourceFiles/core/core_settings.h b/Telegram/SourceFiles/core/core_settings.h index f411bd4bf4..cc51ff3ccd 100644 --- a/Telegram/SourceFiles/core/core_settings.h +++ b/Telegram/SourceFiles/core/core_settings.h @@ -663,6 +663,13 @@ public: _accountsOrder = order; } + [[nodiscard]] bool hardwareAcceleratedVideo() const { + return _hardwareAcceleratedVideo; + } + void setHardwareAcceleratedVideo(bool value) { + _hardwareAcceleratedVideo = value; + } + void setMacWarnBeforeQuit(bool value) { _macWarnBeforeQuit = value; } @@ -775,6 +782,7 @@ private: rpl::variable _playerOrderMode; bool _macWarnBeforeQuit = true; std::vector _accountsOrder; + bool _hardwareAcceleratedVideo = true; bool _tabbedReplacedWithInfo = false; // per-window rpl::event_stream _tabbedReplacedWithInfoValue; // per-window diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 992129ee56..24c560bba0 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -3116,7 +3116,7 @@ void OverlayWidget::restartAtSeekPosition(crl::time position) { } auto options = Streaming::PlaybackOptions(); options.position = position; - options.hwAllowed = true; + options.hwAllowed = Core::App().settings().hardwareAcceleratedVideo(); if (!_streamed->withSound) { options.mode = Streaming::Mode::Video; options.loop = true; diff --git a/Telegram/SourceFiles/media/view/media_view_pip.cpp b/Telegram/SourceFiles/media/view/media_view_pip.cpp index e63f961b47..5110f945b9 100644 --- a/Telegram/SourceFiles/media/view/media_view_pip.cpp +++ b/Telegram/SourceFiles/media/view/media_view_pip.cpp @@ -1604,7 +1604,7 @@ void Pip::restartAtSeekPosition(crl::time position) { auto options = Streaming::PlaybackOptions(); options.position = position; - options.hwAllowed = true; + options.hwAllowed = Core::App().settings().hardwareAcceleratedVideo(); options.audioId = _instance.player().prepareLegacyState().id; Assert(8 && _delegate->pipPlaybackSpeed() >= 0.5 diff --git a/Telegram/SourceFiles/settings/settings_advanced.cpp b/Telegram/SourceFiles/settings/settings_advanced.cpp index 4ea6ae1758..19554b10f0 100644 --- a/Telegram/SourceFiles/settings/settings_advanced.cpp +++ b/Telegram/SourceFiles/settings/settings_advanced.cpp @@ -582,6 +582,23 @@ void SetupAnimations(not_null container) { }, container->lifetime()); } +void SetupHardwareAcceleration(not_null container) { + const auto settings = &Core::App().settings(); + AddButton( + container, + tr::lng_settings_enable_hwaccel(), + st::settingsButtonNoIcon + )->toggleOn( + rpl::single(settings->hardwareAcceleratedVideo()) + )->toggledValue( + ) | rpl::filter([=](bool enabled) { + return (enabled != settings->hardwareAcceleratedVideo()); + }) | rpl::start_with_next([=](bool enabled) { + settings->setHardwareAcceleratedVideo(enabled); + Core::App().saveSettingsDelayed(); + }, container->lifetime()); +} + #ifdef Q_OS_WIN void SetupANGLE( not_null controller, @@ -695,6 +712,7 @@ void SetupPerformance( not_null controller, not_null container) { SetupAnimations(container); + SetupHardwareAcceleration(container); #ifdef Q_OS_WIN SetupANGLE(controller, container); #else // Q_OS_WIN