Provided video start position to OverlayWidget.

This commit is contained in:
23rd 2022-02-16 10:46:31 +03:00 committed by John Preston
parent 4dee21c0e6
commit 4f6776eeaa
4 changed files with 44 additions and 19 deletions

View file

@ -33,6 +33,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_cloud_themes.h" #include "data/data_cloud_themes.h"
#include "data/data_channel.h" #include "data/data_channel.h"
#include "media/player/media_player_instance.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_session_controller.h"
#include "window/window_controller.h" #include "window/window_controller.h"
#include "window/themes/window_theme_editor_box.h" // GenerateSlug. #include "window/themes/window_theme_editor_box.h" // GenerateSlug.
@ -443,12 +444,18 @@ bool OpenMediaTimestamp(
MsgId(parts.value(2).toLongLong())); MsgId(parts.value(2).toLongLong()));
const auto session = &controller->session(); const auto session = &controller->session();
const auto document = session->data().document(documentId); const auto document = session->data().document(documentId);
session->settings().setMediaLastPlaybackPosition( const auto timeMs = time * crl::time(1000);
documentId,
time * crl::time(1000));
if (document->isVideoFile()) { 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()) { } else if (document->isSong() || document->isVoiceMessage()) {
session->settings().setMediaLastPlaybackPosition(
documentId,
timeMs);
Media::Player::instance()->play({ document, itemId }); Media::Player::instance()->play({ document, itemId });
} }
return true; return true;

View file

@ -46,11 +46,13 @@ public:
Window::SessionController *controller, Window::SessionController *controller,
not_null<DocumentData*> document, not_null<DocumentData*> document,
HistoryItem *item, HistoryItem *item,
bool continueStreaming = false) bool continueStreaming = false,
crl::time startTime = 0)
: _controller(controller) : _controller(controller)
, _document(document) , _document(document)
, _item(item) , _item(item)
, _continueStreaming(continueStreaming) { , _continueStreaming(continueStreaming)
, _startTime(startTime) {
} }
OpenRequest( OpenRequest(
Window::SessionController *controller, Window::SessionController *controller,
@ -89,6 +91,10 @@ public:
return _continueStreaming; return _continueStreaming;
} }
crl::time startTime() const {
return _startTime;
}
private: private:
Window::SessionController *_controller = nullptr; Window::SessionController *_controller = nullptr;
DocumentData *_document = nullptr; DocumentData *_document = nullptr;
@ -97,6 +103,7 @@ private:
HistoryItem *_item = nullptr; HistoryItem *_item = nullptr;
std::optional<Data::CloudTheme> _cloudTheme = std::nullopt; std::optional<Data::CloudTheme> _cloudTheme = std::nullopt;
bool _continueStreaming = false; bool _continueStreaming = false;
crl::time _startTime = 0;
}; };

View file

@ -2375,7 +2375,7 @@ void OverlayWidget::show(OpenRequest request) {
request.cloudTheme() request.cloudTheme()
? *request.cloudTheme() ? *request.cloudTheme()
: Data::CloudTheme(), : Data::CloudTheme(),
request.continueStreaming()); { request.continueStreaming(), request.startTime() });
if (!isHidden()) { if (!isHidden()) {
preloadData(0); preloadData(0);
activateControls(); activateControls();
@ -2453,7 +2453,7 @@ void OverlayWidget::redisplayContent() {
void OverlayWidget::displayDocument( void OverlayWidget::displayDocument(
DocumentData *doc, DocumentData *doc,
const Data::CloudTheme &cloud, const Data::CloudTheme &cloud,
bool continueStreaming) { const StartStreaming &startStreaming) {
_fullScreenVideo = false; _fullScreenVideo = false;
_staticContent = QImage(); _staticContent = QImage();
clearStreaming(_document != doc); clearStreaming(_document != doc);
@ -2481,7 +2481,7 @@ void OverlayWidget::displayDocument(
} }
} else { } else {
if (_documentMedia->canBePlayed(_message) if (_documentMedia->canBePlayed(_message)
&& initStreaming(continueStreaming)) { && initStreaming(startStreaming)) {
} else if (_document->isVideoFile()) { } else if (_document->isVideoFile()) {
_documentMedia->automaticLoad(fileOrigin(), _message); _documentMedia->automaticLoad(fileOrigin(), _message);
initStreamingThumbnail(); initStreamingThumbnail();
@ -2632,7 +2632,7 @@ bool OverlayWidget::canInitStreaming() const {
|| (_photo && _photo->videoCanBePlayed()); || (_photo && _photo->videoCanBePlayed());
} }
bool OverlayWidget::initStreaming(bool continueStreaming) { bool OverlayWidget::initStreaming(const StartStreaming &startStreaming) {
Expects(canInitStreaming()); Expects(canInitStreaming());
if (_streamed) { if (_streamed) {
@ -2657,20 +2657,21 @@ bool OverlayWidget::initStreaming(bool continueStreaming) {
handleStreamingError(std::move(error)); handleStreamingError(std::move(error));
}, _streamed->instance.lifetime()); }, _streamed->instance.lifetime());
if (continueStreaming) { if (startStreaming.continueStreaming) {
_pip = nullptr; _pip = nullptr;
} }
if (!continueStreaming if (!startStreaming.continueStreaming
|| (!_streamed->instance.player().active() || (!_streamed->instance.player().active()
&& !_streamed->instance.player().finished())) { && !_streamed->instance.player().finished())) {
startStreamingPlayer(); startStreamingPlayer(startStreaming);
} else { } else {
updatePlaybackState(); updatePlaybackState();
} }
return true; return true;
} }
void OverlayWidget::startStreamingPlayer() { void OverlayWidget::startStreamingPlayer(
const StartStreaming &startStreaming) {
Expects(_streamed != nullptr); Expects(_streamed != nullptr);
const auto &player = _streamed->instance.player(); const auto &player = _streamed->instance.player();
@ -2686,8 +2687,7 @@ void OverlayWidget::startStreamingPlayer() {
} }
const auto position = _document const auto position = _document
? _document->session().settings().mediaLastPlaybackPosition( ? startStreaming.startTime
_document->id)
: _photo : _photo
? _photo->videoStartPosition() ? _photo->videoStartPosition()
: 0; : 0;

View file

@ -140,6 +140,16 @@ private:
QRectF rect; QRectF rect;
qreal rotation = 0.; 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<QWindow*> window() const; [[nodiscard]] not_null<QWindow*> window() const;
[[nodiscard]] int width() const; [[nodiscard]] int width() const;
@ -287,7 +297,7 @@ private:
void displayDocument( void displayDocument(
DocumentData *document, DocumentData *document,
const Data::CloudTheme &cloud = Data::CloudTheme(), const Data::CloudTheme &cloud = Data::CloudTheme(),
bool continueStreaming = false); const StartStreaming &startStreaming = StartStreaming());
void displayFinished(); void displayFinished();
void redisplayContent(); void redisplayContent();
void findCurrent(); void findCurrent();
@ -303,8 +313,9 @@ private:
void refreshClipControllerGeometry(); void refreshClipControllerGeometry();
void refreshCaptionGeometry(); void refreshCaptionGeometry();
bool initStreaming(bool continueStreaming = false); bool initStreaming(
void startStreamingPlayer(); const StartStreaming &startStreaming = StartStreaming());
void startStreamingPlayer(const StartStreaming &startStreaming);
void initStreamingThumbnail(); void initStreamingThumbnail();
void streamingReady(Streaming::Information &&info); void streamingReady(Streaming::Information &&info);
[[nodiscard]] bool createStreamingObjects(); [[nodiscard]] bool createStreamingObjects();