mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2026-07-25 06:54:43 +00:00
Avoid using streaming loader with external video player
Streaming loader is unnecessary slow for this use-case Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
@@ -547,7 +547,7 @@ void DocumentData::setVideoQualities(
|
||||
return document->isVideoFile()
|
||||
&& !document->dimensions.isEmpty()
|
||||
&& !document->inappPlaybackFailed()
|
||||
&& document->useStreamingLoader()
|
||||
&& document->useStreamingLoader(nullptr)
|
||||
&& document->canBeStreamed(nullptr);
|
||||
};
|
||||
ranges::sort(
|
||||
@@ -1533,29 +1533,35 @@ bool DocumentData::hasRemoteLocation() const {
|
||||
return (_dc != 0 && _access != 0);
|
||||
}
|
||||
|
||||
bool DocumentData::useStreamingLoader() const {
|
||||
bool DocumentData::canVideoBeStreamed(HistoryItem *item) const {
|
||||
if (!isVideoFile()) {
|
||||
return false;
|
||||
}
|
||||
// Streaming couldn't be used with external player
|
||||
// Maybe someone brave will implement this once upon a time...
|
||||
static const auto &ExternalVideoPlayer = base::options::lookup<bool>(
|
||||
Data::kOptionExternalVideoPlayer);
|
||||
return storyMedia()
|
||||
|| !ExternalVideoPlayer.value()
|
||||
|| (item && !item->allowsForward());
|
||||
}
|
||||
|
||||
bool DocumentData::useStreamingLoader(HistoryItem *item) const {
|
||||
if (size <= 0) {
|
||||
return false;
|
||||
} else if (const auto info = sticker()) {
|
||||
return info->isWebm();
|
||||
}
|
||||
return isAnimation()
|
||||
|| isVideoFile()
|
||||
|| canVideoBeStreamed(item)
|
||||
|| isAudioFile()
|
||||
|| isVoiceMessage();
|
||||
}
|
||||
|
||||
bool DocumentData::canBeStreamed(HistoryItem *item) const {
|
||||
// Streaming couldn't be used with external player
|
||||
// Maybe someone brave will implement this once upon a time...
|
||||
static const auto &ExternalVideoPlayer = base::options::lookup<bool>(
|
||||
Data::kOptionExternalVideoPlayer);
|
||||
return hasRemoteLocation()
|
||||
&& supportsStreaming()
|
||||
&& (!isVideoFile()
|
||||
|| storyMedia()
|
||||
|| !ExternalVideoPlayer.value()
|
||||
|| (item && !item->allowsForward()));
|
||||
&& (!isVideoFile() || canVideoBeStreamed(item));
|
||||
}
|
||||
|
||||
void DocumentData::setInappPlaybackFailed() {
|
||||
@@ -1585,9 +1591,10 @@ StorageFileLocation DocumentData::videoPreloadLocation() const {
|
||||
|
||||
auto DocumentData::createStreamingLoader(
|
||||
Data::FileOrigin origin,
|
||||
bool forceRemoteLoader) const
|
||||
bool forceRemoteLoader,
|
||||
HistoryItem *item) const
|
||||
-> std::unique_ptr<Media::Streaming::Loader> {
|
||||
if (!useStreamingLoader()) {
|
||||
if (!useStreamingLoader(item)) {
|
||||
return nullptr;
|
||||
}
|
||||
if (!forceRemoteLoader) {
|
||||
|
||||
@@ -294,9 +294,10 @@ public:
|
||||
[[nodiscard]] bool canBeStreamed(HistoryItem *item) const;
|
||||
[[nodiscard]] auto createStreamingLoader(
|
||||
Data::FileOrigin origin,
|
||||
bool forceRemoteLoader) const
|
||||
bool forceRemoteLoader,
|
||||
HistoryItem *item) const
|
||||
-> std::unique_ptr<Media::Streaming::Loader>;
|
||||
[[nodiscard]] bool useStreamingLoader() const;
|
||||
[[nodiscard]] bool useStreamingLoader(HistoryItem *item) const;
|
||||
|
||||
void setInappPlaybackFailed();
|
||||
[[nodiscard]] bool inappPlaybackFailed() const;
|
||||
@@ -358,6 +359,7 @@ private:
|
||||
friend class Serialize::Document;
|
||||
|
||||
[[nodiscard]] LocationType locationType() const;
|
||||
[[nodiscard]] bool canVideoBeStreamed(HistoryItem *item) const;
|
||||
void validateLottieSticker();
|
||||
void setMaybeSupportsStreaming(bool supports);
|
||||
void setLoadedInMediaCacheLocation();
|
||||
|
||||
@@ -360,7 +360,7 @@ float64 DocumentMedia::progress() const {
|
||||
|
||||
bool DocumentMedia::canBePlayed(HistoryItem *item) const {
|
||||
return !_owner->inappPlaybackFailed()
|
||||
&& _owner->useStreamingLoader()
|
||||
&& _owner->useStreamingLoader(item)
|
||||
&& (loaded() || _owner->canBeStreamed(item));
|
||||
}
|
||||
|
||||
|
||||
@@ -565,7 +565,8 @@ bool PhotoData::videoCanBePlayed() const {
|
||||
|
||||
auto PhotoData::createStreamingLoader(
|
||||
Data::FileOrigin origin,
|
||||
bool forceRemoteLoader) const
|
||||
bool forceRemoteLoader,
|
||||
HistoryItem *item) const
|
||||
-> std::unique_ptr<Media::Streaming::Loader> {
|
||||
if (!hasVideo()) {
|
||||
return nullptr;
|
||||
|
||||
@@ -150,7 +150,8 @@ public:
|
||||
[[nodiscard]] bool videoCanBePlayed() const;
|
||||
[[nodiscard]] auto createStreamingLoader(
|
||||
Data::FileOrigin origin,
|
||||
bool forceRemoteLoader) const
|
||||
bool forceRemoteLoader,
|
||||
HistoryItem *item) const
|
||||
-> std::unique_ptr<Media::Streaming::Loader>;
|
||||
|
||||
[[nodiscard]] bool hasAttachedStickers() const;
|
||||
|
||||
@@ -78,6 +78,15 @@ bool PruneDestroyedAndSet(
|
||||
return {};
|
||||
}
|
||||
|
||||
[[nodiscard]] HistoryItem *LookupContext(
|
||||
not_null<Session*> owner,
|
||||
const FileOrigin &origin) {
|
||||
if (const auto message = std::get_if<FileOriginMessage>(&origin.data)) {
|
||||
return owner->message(*message);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Streaming::Streaming(not_null<Session*> owner)
|
||||
@@ -92,6 +101,7 @@ template <typename Data>
|
||||
base::flat_map<not_null<Data*>, std::weak_ptr<Reader>> &readers,
|
||||
not_null<Data*> data,
|
||||
FileOrigin origin,
|
||||
HistoryItem *context,
|
||||
bool forceRemoteLoader) {
|
||||
const auto i = readers.find(data);
|
||||
if (i != end(readers)) {
|
||||
@@ -101,7 +111,10 @@ template <typename Data>
|
||||
}
|
||||
}
|
||||
}
|
||||
auto loader = data->createStreamingLoader(origin, forceRemoteLoader);
|
||||
auto loader = data->createStreamingLoader(
|
||||
origin,
|
||||
forceRemoteLoader,
|
||||
context);
|
||||
if (!loader) {
|
||||
return nullptr;
|
||||
}
|
||||
@@ -133,7 +146,7 @@ template <typename Data>
|
||||
return result;
|
||||
}
|
||||
}
|
||||
auto reader = sharedReader(readers, data, origin);
|
||||
auto reader = sharedReader(readers, data, origin, context);
|
||||
if (!reader) {
|
||||
return nullptr;
|
||||
}
|
||||
@@ -175,18 +188,25 @@ std::shared_ptr<Streaming::Reader> Streaming::sharedReader(
|
||||
not_null<DocumentData*> document,
|
||||
FileOrigin origin,
|
||||
bool forceRemoteLoader) {
|
||||
return sharedReader(_fileReaders, document, origin, forceRemoteLoader);
|
||||
const auto context = LookupContext(_owner, origin);
|
||||
return sharedReader(
|
||||
_fileReaders,
|
||||
document,
|
||||
origin,
|
||||
context,
|
||||
forceRemoteLoader);
|
||||
}
|
||||
|
||||
std::shared_ptr<Streaming::Document> Streaming::sharedDocument(
|
||||
not_null<DocumentData*> document,
|
||||
FileOrigin origin) {
|
||||
const auto context = LookupContext(_owner, origin);
|
||||
return sharedDocument(
|
||||
_fileDocuments,
|
||||
_fileReaders,
|
||||
document,
|
||||
nullptr,
|
||||
nullptr,
|
||||
context,
|
||||
origin);
|
||||
}
|
||||
|
||||
@@ -208,18 +228,25 @@ std::shared_ptr<Streaming::Reader> Streaming::sharedReader(
|
||||
not_null<PhotoData*> photo,
|
||||
FileOrigin origin,
|
||||
bool forceRemoteLoader) {
|
||||
return sharedReader(_photoReaders, photo, origin, forceRemoteLoader);
|
||||
const auto context = LookupContext(_owner, origin);
|
||||
return sharedReader(
|
||||
_photoReaders,
|
||||
photo,
|
||||
origin,
|
||||
context,
|
||||
forceRemoteLoader);
|
||||
}
|
||||
|
||||
std::shared_ptr<Streaming::Document> Streaming::sharedDocument(
|
||||
not_null<PhotoData*> photo,
|
||||
FileOrigin origin) {
|
||||
const auto context = LookupContext(_owner, origin);
|
||||
return sharedDocument(
|
||||
_photoDocuments,
|
||||
_photoReaders,
|
||||
photo,
|
||||
nullptr,
|
||||
nullptr,
|
||||
context,
|
||||
origin);
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
|
||||
class PhotoData;
|
||||
class DocumentData;
|
||||
class HistoryItem;
|
||||
|
||||
namespace Media::Streaming {
|
||||
class Reader;
|
||||
@@ -64,6 +65,7 @@ private:
|
||||
base::flat_map<not_null<Data*>, std::weak_ptr<Reader>> &readers,
|
||||
not_null<Data*> data,
|
||||
FileOrigin origin,
|
||||
HistoryItem *context,
|
||||
bool forceRemoteLoader = false);
|
||||
|
||||
template <typename Data>
|
||||
|
||||
@@ -476,7 +476,10 @@ void Shown::streamFile(
|
||||
requestFail(std::move(request));
|
||||
return;
|
||||
}
|
||||
auto loader = document->createStreamingLoader(fileOrigin(page), false);
|
||||
auto loader = document->createStreamingLoader(
|
||||
fileOrigin(page),
|
||||
false,
|
||||
nullptr);
|
||||
if (!loader) {
|
||||
if (document->size >= Storage::kMaxFileInMemory) {
|
||||
requestFail(std::move(request));
|
||||
|
||||
Reference in New Issue
Block a user