From e429c1edd52ad69f80d0c0afa36e9848e00939ac Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 18 May 2026 15:12:11 +0400 Subject: [PATCH] Better tracking of original video quality. --- Telegram/SourceFiles/data/data_document.cpp | 15 ++++++++++++++- Telegram/SourceFiles/data/data_document.h | 1 + .../media/player/media_player_dropdown.cpp | 4 ++++ .../media/player/media_player_dropdown.h | 1 + .../media/view/media_view_overlay_widget.cpp | 14 ++++++++++---- .../media/view/media_view_playback_controls.cpp | 7 +++++++ 6 files changed, 37 insertions(+), 5 deletions(-) diff --git a/Telegram/SourceFiles/data/data_document.cpp b/Telegram/SourceFiles/data/data_document.cpp index 2240510065..3ab940a4b8 100644 --- a/Telegram/SourceFiles/data/data_document.cpp +++ b/Telegram/SourceFiles/data/data_document.cpp @@ -641,12 +641,25 @@ int DocumentData::resolveVideoQuality() const { : std::min(attributesSize.width(), attributesSize.height()); } +int DocumentData::resolveOriginalVideoQuality() const { + if (const auto data = video()) { + if (!data->realVideoSize.isEmpty()) { + const auto size = data->realVideoSize; + return std::min(size.width(), size.height()); + } + } + const auto attributesSize = isVideoFile() ? dimensions : QSize(); + return attributesSize.isEmpty() + ? 0 + : 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)), + .height = uint32(std::max(resolveOriginalVideoQuality(), 0)), .original = 1u, } : request; diff --git a/Telegram/SourceFiles/data/data_document.h b/Telegram/SourceFiles/data/data_document.h index b0e53dd2a1..88d596ccd0 100644 --- a/Telegram/SourceFiles/data/data_document.h +++ b/Telegram/SourceFiles/data/data_document.h @@ -123,6 +123,7 @@ public: void automaticLoadSettingsChanged(); void setVideoQualities(std::vector> qualities); [[nodiscard]] int resolveVideoQuality() const; + [[nodiscard]] int resolveOriginalVideoQuality() const; [[nodiscard]] Media::VideoQuality initialPlaybackVideoQuality( Media::VideoQuality request) const; [[nodiscard]] auto resolveQualities(HistoryItem *context) const diff --git a/Telegram/SourceFiles/media/player/media_player_dropdown.cpp b/Telegram/SourceFiles/media/player/media_player_dropdown.cpp index 8ac53b8fbc..fe1cfbe0b8 100644 --- a/Telegram/SourceFiles/media/player/media_player_dropdown.cpp +++ b/Telegram/SourceFiles/media/player/media_player_dropdown.cpp @@ -769,6 +769,10 @@ void SpeedController::reloadFromLookup() { } } +void SpeedController::setQualities(std::vector qualities) { + _qualities = std::move(qualities); +} + float64 SpeedController::speed() const { return _isDefault ? 1. : _speed; } diff --git a/Telegram/SourceFiles/media/player/media_player_dropdown.h b/Telegram/SourceFiles/media/player/media_player_dropdown.h index 45851da7a2..1345f98d09 100644 --- a/Telegram/SourceFiles/media/player/media_player_dropdown.h +++ b/Telegram/SourceFiles/media/player/media_player_dropdown.h @@ -140,6 +140,7 @@ public: [[nodiscard]] rpl::producer<> saved() const; [[nodiscard]] rpl::producer realtimeValue() const; void reloadFromLookup(); + void setQualities(std::vector qualities); private: void fillMenu(not_null menu) override; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index d634c8028b..38f4fbfdc0 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -5262,14 +5262,17 @@ std::vector OverlayWidget::playbackControlsQualities() { auto result = std::vector(); result.reserve(list.size() + 1); const auto add = [&](not_null quality) { - const auto height = quality->resolveVideoQuality(); + const auto original = (quality == _document); + const auto height = original + ? quality->resolveOriginalVideoQuality() + : quality->resolveVideoQuality(); if (!height) { return; } const auto value = VideoQuality{ .manual = 1u, .height = uint32(height), - .original = (quality == _document) ? 1u : 0u, + .original = original ? 1u : 0u, }; if (!ranges::contains(result, value)) { result.push_back(value); @@ -5288,10 +5291,13 @@ VideoQuality OverlayWidget::playbackControlsCurrentQuality() { if (!_chosenQuality) { return _quality; } + const auto original = (_chosenQuality == _document); return { .manual = _quality.manual, - .height = uint32(_chosenQuality->resolveVideoQuality()), - .original = (_chosenQuality == _document) ? 1u : 0u, + .height = uint32(original + ? _chosenQuality->resolveOriginalVideoQuality() + : _chosenQuality->resolveVideoQuality()), + .original = original ? 1u : 0u, }; } diff --git a/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp b/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp index 7cd01b2ea6..6fb911a43d 100644 --- a/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp +++ b/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp @@ -229,6 +229,13 @@ void PlaybackControls::saveQuality(Media::VideoQuality quality) { } void PlaybackControls::updateSpeedToggleQuality() { + const auto qualities = _delegate->playbackControlsQualities(); + if (_qualitiesList != qualities) { + _qualitiesList = qualities; + if (_speedController) { + _speedController->setQualities(qualities); + } + } _speedToggle->setQuality(_delegate->playbackControlsCurrentQuality()); }