mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Provided video start position to OverlayWidget.
This commit is contained in:
parent
4dee21c0e6
commit
4f6776eeaa
4 changed files with 44 additions and 19 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Add table
Reference in a new issue