diff --git a/Telegram/SourceFiles/data/data_document.cpp b/Telegram/SourceFiles/data/data_document.cpp index a04686f472..2240510065 100644 --- a/Telegram/SourceFiles/data/data_document.cpp +++ b/Telegram/SourceFiles/data/data_document.cpp @@ -641,6 +641,17 @@ int DocumentData::resolveVideoQuality() const { : std::min(attributesSize.width(), attributesSize.height()); } +Media::VideoQuality DocumentData::initialPlaybackVideoQuality( + Media::VideoQuality request) const { + return (isVideoFile() && !filepath(true).isEmpty()) + ? Media::VideoQuality{ + .manual = 1u, + .height = uint32(std::max(resolveVideoQuality(), 0)), + .original = 1u, + } + : request; +} + auto DocumentData::resolveQualities(HistoryItem *context) const -> const std::vector> & { static const auto empty = std::vector>(); diff --git a/Telegram/SourceFiles/data/data_document.h b/Telegram/SourceFiles/data/data_document.h index 01f906fe4e..b0e53dd2a1 100644 --- a/Telegram/SourceFiles/data/data_document.h +++ b/Telegram/SourceFiles/data/data_document.h @@ -123,6 +123,8 @@ public: void automaticLoadSettingsChanged(); void setVideoQualities(std::vector> qualities); [[nodiscard]] int resolveVideoQuality() const; + [[nodiscard]] Media::VideoQuality initialPlaybackVideoQuality( + Media::VideoQuality request) const; [[nodiscard]] auto resolveQualities(HistoryItem *context) const -> const std::vector> &; [[nodiscard]] not_null chooseQuality( diff --git a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp index 742e5f81ff..61901857d5 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp @@ -2174,7 +2174,8 @@ void Gif::playAnimation(bool autoplay) { } void Gif::createStreamedPlayer() { - const auto quality = Core::App().settings().videoQuality(); + const auto quality = _data->initialPlaybackVideoQuality( + Core::App().settings().videoQuality()); const auto chosen = _data->chooseQuality(_realParent, quality); if (_streamed && _streamed->chosen == chosen) { return; @@ -2200,14 +2201,17 @@ void Gif::createStreamedPlayer() { }, _streamed->instance.lifetime()); _streamed->instance.switchQualityRequests( - ) | rpl::on_next([=](int quality) { + ) | rpl::on_next([=](int requested) { + if (quality.manual) { + return; + } auto now = Core::App().settings().videoQuality(); - if (now.manual || now.height == quality) { + if (now.manual || now.height == requested) { return; } Core::App().settings().setVideoQuality({ .manual = 0, - .height = uint32(quality), + .height = uint32(requested), }); Core::App().saveSettingsDelayed(); createStreamedPlayer(); diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index a5861063d0..d634c8028b 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -2733,7 +2733,8 @@ void OverlayWidget::assignMediaPointer(DocumentData *document) { _streamedQualityChangeFrame = QImage(); _streamedQualityChangeFinished = false; if ((_document = document)) { - _quality = Core::App().settings().videoQuality(); + _quality = _document->initialPlaybackVideoQuality( + Core::App().settings().videoQuality()); _chosenQuality = _document->chooseQuality(_message, _quality); _documentMedia = _document->createMediaView(); _videoCover = LookupVideoCover(_document, _message); @@ -5259,16 +5260,26 @@ std::vector OverlayWidget::playbackControlsQualities() { return {}; } auto result = std::vector(); - result.reserve(list.size()); - for (const auto &quality : list) { + result.reserve(list.size() + 1); + const auto add = [&](not_null quality) { + const auto height = quality->resolveVideoQuality(); + if (!height) { + return; + } const auto value = VideoQuality{ .manual = 1u, - .height = uint32(quality->resolveVideoQuality()), + .height = uint32(height), .original = (quality == _document) ? 1u : 0u, }; if (!ranges::contains(result, value)) { result.push_back(value); } + }; + if (!_document->filepath(true).isEmpty()) { + add(_document); + } + for (const auto &quality : list) { + add(quality); } return result; }