From 4f6776eeaa8cd4300b022630d6e9d5c2146f0853 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 16 Feb 2022 10:46:31 +0300 Subject: [PATCH] Provided video start position to OverlayWidget. --- .../SourceFiles/core/local_url_handlers.cpp | 15 ++++++++++---- .../media/view/media_view_open_common.h | 11 ++++++++-- .../media/view/media_view_overlay_widget.cpp | 20 +++++++++---------- .../media/view/media_view_overlay_widget.h | 17 +++++++++++++--- 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/Telegram/SourceFiles/core/local_url_handlers.cpp b/Telegram/SourceFiles/core/local_url_handlers.cpp index 485455ed8a..c7615a5b82 100644 --- a/Telegram/SourceFiles/core/local_url_handlers.cpp +++ b/Telegram/SourceFiles/core/local_url_handlers.cpp @@ -33,6 +33,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_cloud_themes.h" #include "data/data_channel.h" #include "media/player/media_player_instance.h" +#include "media/view/media_view_open_common.h" #include "window/window_session_controller.h" #include "window/window_controller.h" #include "window/themes/window_theme_editor_box.h" // GenerateSlug. @@ -443,12 +444,18 @@ bool OpenMediaTimestamp( MsgId(parts.value(2).toLongLong())); const auto session = &controller->session(); const auto document = session->data().document(documentId); - session->settings().setMediaLastPlaybackPosition( - documentId, - time * crl::time(1000)); + const auto timeMs = time * crl::time(1000); if (document->isVideoFile()) { - controller->openDocument(document, itemId, true); + controller->window().openInMediaView(Media::View::OpenRequest( + controller, + document, + session->data().message(itemId), + false, + timeMs)); } else if (document->isSong() || document->isVoiceMessage()) { + session->settings().setMediaLastPlaybackPosition( + documentId, + timeMs); Media::Player::instance()->play({ document, itemId }); } return true; diff --git a/Telegram/SourceFiles/media/view/media_view_open_common.h b/Telegram/SourceFiles/media/view/media_view_open_common.h index 320f6d2408..b79566ba10 100644 --- a/Telegram/SourceFiles/media/view/media_view_open_common.h +++ b/Telegram/SourceFiles/media/view/media_view_open_common.h @@ -46,11 +46,13 @@ public: Window::SessionController *controller, not_null document, HistoryItem *item, - bool continueStreaming = false) + bool continueStreaming = false, + crl::time startTime = 0) : _controller(controller) , _document(document) , _item(item) - , _continueStreaming(continueStreaming) { + , _continueStreaming(continueStreaming) + , _startTime(startTime) { } OpenRequest( Window::SessionController *controller, @@ -89,6 +91,10 @@ public: return _continueStreaming; } + crl::time startTime() const { + return _startTime; + } + private: Window::SessionController *_controller = nullptr; DocumentData *_document = nullptr; @@ -97,6 +103,7 @@ private: HistoryItem *_item = nullptr; std::optional _cloudTheme = std::nullopt; bool _continueStreaming = false; + crl::time _startTime = 0; }; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 3e19f6e280..21cdaabf47 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -2375,7 +2375,7 @@ void OverlayWidget::show(OpenRequest request) { request.cloudTheme() ? *request.cloudTheme() : Data::CloudTheme(), - request.continueStreaming()); + { request.continueStreaming(), request.startTime() }); if (!isHidden()) { preloadData(0); activateControls(); @@ -2453,7 +2453,7 @@ void OverlayWidget::redisplayContent() { void OverlayWidget::displayDocument( DocumentData *doc, const Data::CloudTheme &cloud, - bool continueStreaming) { + const StartStreaming &startStreaming) { _fullScreenVideo = false; _staticContent = QImage(); clearStreaming(_document != doc); @@ -2481,7 +2481,7 @@ void OverlayWidget::displayDocument( } } else { if (_documentMedia->canBePlayed(_message) - && initStreaming(continueStreaming)) { + && initStreaming(startStreaming)) { } else if (_document->isVideoFile()) { _documentMedia->automaticLoad(fileOrigin(), _message); initStreamingThumbnail(); @@ -2632,7 +2632,7 @@ bool OverlayWidget::canInitStreaming() const { || (_photo && _photo->videoCanBePlayed()); } -bool OverlayWidget::initStreaming(bool continueStreaming) { +bool OverlayWidget::initStreaming(const StartStreaming &startStreaming) { Expects(canInitStreaming()); if (_streamed) { @@ -2657,20 +2657,21 @@ bool OverlayWidget::initStreaming(bool continueStreaming) { handleStreamingError(std::move(error)); }, _streamed->instance.lifetime()); - if (continueStreaming) { + if (startStreaming.continueStreaming) { _pip = nullptr; } - if (!continueStreaming + if (!startStreaming.continueStreaming || (!_streamed->instance.player().active() && !_streamed->instance.player().finished())) { - startStreamingPlayer(); + startStreamingPlayer(startStreaming); } else { updatePlaybackState(); } return true; } -void OverlayWidget::startStreamingPlayer() { +void OverlayWidget::startStreamingPlayer( + const StartStreaming &startStreaming) { Expects(_streamed != nullptr); const auto &player = _streamed->instance.player(); @@ -2686,8 +2687,7 @@ void OverlayWidget::startStreamingPlayer() { } const auto position = _document - ? _document->session().settings().mediaLastPlaybackPosition( - _document->id) + ? startStreaming.startTime : _photo ? _photo->videoStartPosition() : 0; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index 6d86f20e75..f881b8c6ca 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -140,6 +140,16 @@ private: QRectF rect; qreal rotation = 0.; }; + struct StartStreaming { + StartStreaming() : continueStreaming(false), startTime(0) { + } + StartStreaming(bool continueStreaming, crl::time startTime) + : continueStreaming(continueStreaming) + , startTime(startTime) { + } + const bool continueStreaming = false; + const crl::time startTime = 0; + }; [[nodiscard]] not_null window() const; [[nodiscard]] int width() const; @@ -287,7 +297,7 @@ private: void displayDocument( DocumentData *document, const Data::CloudTheme &cloud = Data::CloudTheme(), - bool continueStreaming = false); + const StartStreaming &startStreaming = StartStreaming()); void displayFinished(); void redisplayContent(); void findCurrent(); @@ -303,8 +313,9 @@ private: void refreshClipControllerGeometry(); void refreshCaptionGeometry(); - bool initStreaming(bool continueStreaming = false); - void startStreamingPlayer(); + bool initStreaming( + const StartStreaming &startStreaming = StartStreaming()); + void startStreamingPlayer(const StartStreaming &startStreaming); void initStreamingThumbnail(); void streamingReady(Streaming::Information &&info); [[nodiscard]] bool createStreamingObjects();