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:
Ilya Fedin
2026-02-28 22:57:39 +00:00
committed by John Preston
parent f68db94c81
commit d9ddb12500
8 changed files with 68 additions and 25 deletions
+20 -13
View File
@@ -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) {
+4 -2
View File
@@ -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));
}
+2 -1
View File
@@ -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;
+2 -1
View File
@@ -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;
+33 -6
View File
@@ -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>
+4 -1
View File
@@ -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));