diff --git a/Telegram/SourceFiles/data/data_media_types.cpp b/Telegram/SourceFiles/data/data_media_types.cpp index 81dc056e9..bdcf6f95b 100644 --- a/Telegram/SourceFiles/data/data_media_types.cpp +++ b/Telegram/SourceFiles/data/data_media_types.cpp @@ -551,6 +551,10 @@ DocumentData *Media::document() const { return nullptr; } +bool Media::hasQualitiesList() const { + return false; +} + PhotoData *Media::photo() const { return nullptr; } @@ -964,12 +968,14 @@ MediaFile::MediaFile( not_null parent, not_null document, bool skipPremiumEffect, + bool hasQualitiesList, bool spoiler, crl::time ttlSeconds) : Media(parent) , _document(document) , _emoji(document->sticker() ? document->sticker()->alt : QString()) , _skipPremiumEffect(skipPremiumEffect) +, _hasQualitiesList(hasQualitiesList) , _spoiler(spoiler) , _ttlSeconds(ttlSeconds) { parent->history()->owner().registerDocumentItem(_document, parent); @@ -999,6 +1005,7 @@ std::unique_ptr MediaFile::clone(not_null parent) { parent, _document, !_document->session().premium(), + _hasQualitiesList, _spoiler, _ttlSeconds); } @@ -1007,6 +1014,10 @@ DocumentData *MediaFile::document() const { return _document; } +bool MediaFile::hasQualitiesList() const { + return _hasQualitiesList; +} + bool MediaFile::uploading() const { return _document->uploading(); } diff --git a/Telegram/SourceFiles/data/data_media_types.h b/Telegram/SourceFiles/data/data_media_types.h index e1213e39a..86dd6d594 100644 --- a/Telegram/SourceFiles/data/data_media_types.h +++ b/Telegram/SourceFiles/data/data_media_types.h @@ -165,6 +165,7 @@ public: virtual std::unique_ptr clone(not_null parent) = 0; virtual DocumentData *document() const; + virtual bool hasQualitiesList() const; virtual PhotoData *photo() const; virtual WebPageData *webpage() const; virtual MediaWebPageFlags webpageFlags() const; @@ -287,6 +288,7 @@ public: not_null parent, not_null document, bool skipPremiumEffect, + bool hasQualitiesList, bool spoiler, crl::time ttlSeconds); ~MediaFile(); @@ -294,6 +296,7 @@ public: std::unique_ptr clone(not_null parent) override; DocumentData *document() const override; + bool hasQualitiesList() const override; bool uploading() const override; Storage::SharedMediaTypesMask sharedMediaTypes() const override; @@ -324,6 +327,7 @@ private: not_null _document; QString _emoji; bool _skipPremiumEffect = false; + bool _hasQualitiesList = false; bool _spoiler = false; // Video (unsupported) / Voice / Round. diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index b588c485d..9b422e1ca 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -297,12 +297,12 @@ std::unique_ptr HistoryItem::CreateMedia( return nullptr; } return document->match([&](const MTPDdocument &document) -> Result { + const auto list = media.valt_documents(); return std::make_unique( item, - item->history()->owner().processDocument( - document, - media.valt_documents()), + item->history()->owner().processDocument(document, list), media.is_nopremium(), + list && !list->v.isEmpty(), media.is_spoiler(), media.vttl_seconds().value_or_empty()); }, [](const MTPDdocumentEmpty &) -> Result { @@ -628,11 +628,13 @@ HistoryItem::HistoryItem( createComponentsHelper(std::move(fields)); const auto skipPremiumEffect = !history->session().premium(); + const auto video = document->video(); const auto spoiler = false; _media = std::make_unique( this, document, skipPremiumEffect, + video && !video->qualities.empty(), spoiler, /*ttlSeconds = */0); setText(caption); @@ -1789,6 +1791,7 @@ void HistoryItem::setStoryFields(not_null story) { this, document, /*skipPremiumEffect=*/false, + /*hasQualitiesList=*/false, spoiler, /*ttlSeconds = */0); } diff --git a/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp b/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp index 960cc51a0..46241702b 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp @@ -74,11 +74,13 @@ constexpr auto kFactcheckAboutDuration = 5 * crl::time(1000); const auto spoiler = false; for (const auto &item : data.items) { if (const auto document = std::get_if(&item)) { + const auto hasQualitiesList = false; const auto skipPremiumEffect = false; result.push_back(std::make_unique( parent, *document, skipPremiumEffect, + hasQualitiesList, spoiler, /*ttlSeconds = */0)); } else if (const auto photo = std::get_if(&item)) { diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 71fa1cc42..ae3217b05 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -2264,16 +2264,27 @@ OverlayWidget::~OverlayWidget() { _dropdown.destroy(); } +auto OverlayWidget::resolveQualities() const +-> const std::vector> & { + static const auto empty = std::vector>(); + const auto video = _document ? _document->video() : nullptr; + const auto media = _message ? _message->media() : nullptr; + if (!video || !media || media->document() != _document) { + return empty; + } + return media->hasQualitiesList() ? video->qualities : empty; +} + not_null OverlayWidget::chooseQuality() const { Expects(_document != nullptr); - const auto video = _document->video(); - if (!video || video->qualities.empty() || _quality == kOriginalQuality) { + const auto &list = resolveQualities(); + if (list.empty() || _quality == kOriginalQuality) { return _document; } auto closest = _document; auto closestAbs = std::abs(_quality - _document->resolveVideoQuality()); - for (const auto &quality : video->qualities) { + for (const auto &quality : list) { const auto abs = std::abs(_quality - quality->resolveVideoQuality()); if (abs < closestAbs) { closestAbs = abs; @@ -4428,20 +4439,20 @@ float64 OverlayWidget::playbackControlsCurrentSpeed(bool lastNonDefault) { } std::vector OverlayWidget::playbackControlsQualities() { - const auto video = _document ? _document->video() : nullptr; - if (!video || video->qualities.empty()) { + const auto &list = resolveQualities(); + if (list.empty()) { return {}; } auto result = std::vector(); - result.reserve(video->qualities.size()); - for (const auto &quality : video->qualities) { + result.reserve(list.size()); + for (const auto &quality : list) { result.push_back(quality->resolveVideoQuality()); } return result; } int OverlayWidget::playbackControlsCurrentQuality() { - return _quality; + return _chosenQuality ? _chosenQuality->resolveVideoQuality() : _quality; } void OverlayWidget::playbackControlsQualityChanged(int quality) { diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index c14124ffc..45dbbe794 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -528,6 +528,8 @@ private: [[nodiscard]] bool canInitStreaming() const; [[nodiscard]] bool saveControlLocked() const; [[nodiscard]] not_null chooseQuality() const; + [[nodiscard]] auto resolveQualities() const + -> const std::vector> &; [[nodiscard]] bool topShadowOnTheRight() const; void applyHideWindowWorkaround(); diff --git a/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp b/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp index 6f4bc0f13..132286c31 100644 --- a/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp +++ b/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp @@ -70,8 +70,12 @@ PlaybackControls::PlaybackControls( fadeUpdated(opacity); }); - _speedToggle->setSpeed(_delegate->playbackControlsCurrentSpeed(false)); - _speedToggle->setQuality(_delegate->playbackControlsCurrentQuality()); + _speedToggle->setSpeed(_speedControllable + ? _delegate->playbackControlsCurrentSpeed(false) + : 1.); + _speedToggle->setQuality(_qualitiesList.empty() + ? 0 + : _delegate->playbackControlsCurrentQuality()); if (const auto controller = _speedController.get()) { controller->menuToggledValue( diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp index 7d106c73f..b466dab84 100644 --- a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp +++ b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp @@ -295,6 +295,7 @@ void AddViewMediaHandler( state->item, owner->document(item.id), true, // skipPremiumEffect + false, // hasQualitiesList false, // spoiler 0)); // ttlSeconds }