Set higher streaming priority in media overlay.

This commit is contained in:
John Preston 2019-12-23 13:27:20 +03:00
parent fa4d8f2fbd
commit 85545dba64
17 changed files with 95 additions and 14 deletions

View File

@ -85,6 +85,18 @@ void Document::registerInstance(not_null<Instance*> instance) {
void Document::unregisterInstance(not_null<Instance*> instance) { void Document::unregisterInstance(not_null<Instance*> instance) {
_instances.remove(instance); _instances.remove(instance);
_player.unregisterInstance(instance); _player.unregisterInstance(instance);
refreshPlayerPriority();
}
void Document::refreshPlayerPriority() {
if (_instances.empty()) {
return;
}
const auto max = ranges::max_element(
_instances,
ranges::less(),
&Instance::priority);
_player.setLoaderPriority((*max)->priority());
} }
bool Document::waitingShown() const { bool Document::waitingShown() const {

View File

@ -41,6 +41,7 @@ private:
void registerInstance(not_null<Instance*> instance); void registerInstance(not_null<Instance*> instance);
void unregisterInstance(not_null<Instance*> instance); void unregisterInstance(not_null<Instance*> instance);
void refreshPlayerPriority();
void waitingCallback(); void waitingCallback();

View File

@ -421,6 +421,10 @@ bool File::isRemoteLoader() const {
return _reader->isRemoteLoader(); return _reader->isRemoteLoader();
} }
void File::setLoaderPriority(int priority) {
_reader->setLoaderPriority(priority);
}
File::~File() { File::~File() {
stop(); stop();
} }

View File

@ -37,6 +37,7 @@ public:
void stop(bool stillActive = false); void stop(bool stillActive = false);
[[nodiscard]] bool isRemoteLoader() const; [[nodiscard]] bool isRemoteLoader() const;
void setLoaderPriority(int priority);
~File(); ~File();

View File

@ -187,6 +187,20 @@ bool Instance::playerLocked() const {
return _shared->player().locked(); return _shared->player().locked();
} }
void Instance::setPriority(int priority) {
Expects(_shared != nullptr);
if (_priority == priority) {
return;
}
_priority = priority;
_shared->refreshPlayerPriority();
}
int Instance::priority() const {
return _priority;
}
rpl::lifetime &Instance::lifetime() { rpl::lifetime &Instance::lifetime() {
return _lifetime; return _lifetime;
} }

View File

@ -70,11 +70,15 @@ public:
void unlockPlayer(); void unlockPlayer();
[[nodiscard]] bool playerLocked() const; [[nodiscard]] bool playerLocked() const;
void setPriority(int priority);
[[nodiscard]] int priority() const;
[[nodiscard]] rpl::lifetime &lifetime(); [[nodiscard]] rpl::lifetime &lifetime();
private: private:
const std::shared_ptr<Document> _shared; const std::shared_ptr<Document> _shared;
Fn<void()> _waitingCallback; Fn<void()> _waitingCallback;
int _priority = 1;
bool _playerLocked = false; bool _playerLocked = false;
rpl::lifetime _lifetime; rpl::lifetime _lifetime;

View File

@ -86,7 +86,7 @@ void PriorityQueue::clear() {
_data.clear(); _data.clear();
} }
void PriorityQueue::increasePriority() { void PriorityQueue::resetPriorities() {
++_priority; ++_priority;
} }

View File

@ -33,7 +33,8 @@ public:
virtual void load(int offset) = 0; virtual void load(int offset) = 0;
virtual void cancel(int offset) = 0; virtual void cancel(int offset) = 0;
virtual void increasePriority() = 0; virtual void resetPriorities() = 0;
virtual void setPriority(int priority) = 0;
virtual void stop() = 0; virtual void stop() = 0;
// Parts will be sent from the main thread. // Parts will be sent from the main thread.
@ -51,7 +52,7 @@ class PriorityQueue {
public: public:
bool add(int value); bool add(int value);
bool remove(int value); bool remove(int value);
void increasePriority(); void resetPriorities();
[[nodiscard]] bool empty() const; [[nodiscard]] bool empty() const;
[[nodiscard]] std::optional<int> front() const; [[nodiscard]] std::optional<int> front() const;
[[nodiscard]] std::optional<int> take(); [[nodiscard]] std::optional<int> take();

View File

@ -68,7 +68,10 @@ void LoaderLocal::fail() {
void LoaderLocal::cancel(int offset) { void LoaderLocal::cancel(int offset) {
} }
void LoaderLocal::increasePriority() { void LoaderLocal::resetPriorities() {
}
void LoaderLocal::setPriority(int priority) {
} }
void LoaderLocal::stop() { void LoaderLocal::stop() {

View File

@ -26,7 +26,8 @@ public:
void load(int offset) override; void load(int offset) override;
void cancel(int offset) override; void cancel(int offset) override;
void increasePriority() override; void resetPriorities() override;
void setPriority(int priority) override;
void stop() override; void stop() override;
// Parts will be sent from the main thread. // Parts will be sent from the main thread.

View File

@ -57,9 +57,7 @@ void LoaderMtproto::load(int offset) {
} }
void LoaderMtproto::addToQueueWithPriority() { void LoaderMtproto::addToQueueWithPriority() {
addToQueue([&] { addToQueue(_priority);
return 1;
}());
} }
void LoaderMtproto::stop() { void LoaderMtproto::stop() {
@ -79,7 +77,9 @@ void LoaderMtproto::cancel(int offset) {
void LoaderMtproto::cancelForOffset(int offset) { void LoaderMtproto::cancelForOffset(int offset) {
if (haveSentRequestForOffset(offset)) { if (haveSentRequestForOffset(offset)) {
cancelRequestForOffset(offset); cancelRequestForOffset(offset);
addToQueueWithPriority(); if (!_requested.empty()) {
addToQueueWithPriority();
}
} else { } else {
_requested.remove(offset); _requested.remove(offset);
} }
@ -94,12 +94,22 @@ void LoaderMtproto::clearAttachedDownloader() {
_downloader = nullptr; _downloader = nullptr;
} }
void LoaderMtproto::increasePriority() { void LoaderMtproto::resetPriorities() {
crl::on_main(this, [=] { crl::on_main(this, [=] {
_requested.increasePriority(); _requested.resetPriorities();
}); });
} }
void LoaderMtproto::setPriority(int priority) {
if (_priority == priority) {
return;
}
_priority = priority;
if (haveSentRequests()) {
addToQueueWithPriority();
}
}
bool LoaderMtproto::readyToRequest() const { bool LoaderMtproto::readyToRequest() const {
return !_requested.empty(); return !_requested.empty();
} }

View File

@ -29,7 +29,8 @@ public:
void load(int offset) override; void load(int offset) override;
void cancel(int offset) override; void cancel(int offset) override;
void increasePriority() override; void resetPriorities() override;
void setPriority(int priority) override;
void stop() override; void stop() override;
// Parts will be sent from the main thread. // Parts will be sent from the main thread.
@ -49,6 +50,7 @@ private:
void addToQueueWithPriority(); void addToQueueWithPriority();
const int _size = 0; const int _size = 0;
int _priority = 0;
MTP::Sender _api; MTP::Sender _api;

View File

@ -143,6 +143,10 @@ bool Player::markFrameShown() {
return _video->markFrameShown(); return _video->markFrameShown();
} }
void Player::setLoaderPriority(int priority) {
_file->setLoaderPriority(priority);
}
template <typename Track> template <typename Track>
void Player::trackReceivedTill( void Player::trackReceivedTill(
const Track &track, const Track &track,

View File

@ -71,6 +71,8 @@ public:
void unregisterInstance(not_null<const Instance*> instance); void unregisterInstance(not_null<const Instance*> instance);
bool markFrameShown(); bool markFrameShown();
void setLoaderPriority(int priority);
[[nodiscard]] Media::Player::TrackState prepareLegacyState() const; [[nodiscard]] Media::Player::TrackState prepareLegacyState() const;
void lock(); void lock();

View File

@ -888,6 +888,7 @@ void Reader::stopSleep() {
void Reader::startStreaming() { void Reader::startStreaming() {
_streamingActive = true; _streamingActive = true;
refreshLoaderPriority();
} }
void Reader::stopStreaming(bool stillActive) { void Reader::stopStreaming(bool stillActive) {
@ -896,6 +897,7 @@ void Reader::stopStreaming(bool stillActive) {
_waiting.store(nullptr, std::memory_order_release); _waiting.store(nullptr, std::memory_order_release);
if (!stillActive) { if (!stillActive) {
_streamingActive = false; _streamingActive = false;
refreshLoaderPriority();
_loadingOffsets.clear(); _loadingOffsets.clear();
processDownloaderRequests(); processDownloaderRequests();
} }
@ -1080,6 +1082,18 @@ void Reader::checkCacheResultsForDownloader() {
processDownloaderRequests(); processDownloaderRequests();
} }
void Reader::setLoaderPriority(int priority) {
if (_realPriority == priority) {
return;
}
_realPriority = priority;
refreshLoaderPriority();
}
void Reader::refreshLoaderPriority() {
_loader->setPriority(_streamingActive ? _realPriority : 0);
}
bool Reader::isRemoteLoader() const { bool Reader::isRemoteLoader() const {
return _loader->baseCacheKey().has_value(); return _loader->baseCacheKey().has_value();
} }
@ -1269,8 +1283,8 @@ void Reader::cancelLoadInRange(int from, int till) {
void Reader::checkLoadWillBeFirst(int offset) { void Reader::checkLoadWillBeFirst(int offset) {
if (_loadingOffsets.front().value_or(offset) != offset) { if (_loadingOffsets.front().value_or(offset) != offset) {
_loadingOffsets.increasePriority(); _loadingOffsets.resetPriorities();
_loader->increasePriority(); _loader->resetPriorities();
} }
} }

View File

@ -37,6 +37,8 @@ public:
not_null<Storage::Cache::Database*> cache, not_null<Storage::Cache::Database*> cache,
std::unique_ptr<Loader> loader); std::unique_ptr<Loader> loader);
void setLoaderPriority(int priority);
// Any thread. // Any thread.
[[nodiscard]] int size() const; [[nodiscard]] int size() const;
[[nodiscard]] bool isRemoteLoader() const; [[nodiscard]] bool isRemoteLoader() const;
@ -219,6 +221,8 @@ private:
void checkForDownloaderChange(int checkItemsCount); void checkForDownloaderChange(int checkItemsCount);
void checkForDownloaderReadyOffsets(); void checkForDownloaderReadyOffsets();
void refreshLoaderPriority();
static std::shared_ptr<CacheHelper> InitCacheHelper( static std::shared_ptr<CacheHelper> InitCacheHelper(
std::optional<Storage::Cache::Key> baseKey); std::optional<Storage::Cache::Key> baseKey);
@ -242,6 +246,7 @@ private:
// Main thread. // Main thread.
Storage::StreamedFileDownloader *_attachedDownloader = nullptr; Storage::StreamedFileDownloader *_attachedDownloader = nullptr;
rpl::event_stream<LoadedPart> _partsForDownloader; rpl::event_stream<LoadedPart> _partsForDownloader;
int _realPriority = 1;
bool _streamingActive = false; bool _streamingActive = false;
// Streaming thread. // Streaming thread.

View File

@ -68,6 +68,8 @@ namespace {
constexpr auto kPreloadCount = 4; constexpr auto kPreloadCount = 4;
constexpr auto kOverlayLoaderPriority = 2;
// macOS OpenGL renderer fails to render larger texture // macOS OpenGL renderer fails to render larger texture
// even though it reports that max texture size is 16384. // even though it reports that max texture size is 16384.
constexpr auto kMaxDisplayImageSize = 4096; constexpr auto kMaxDisplayImageSize = 4096;
@ -2081,6 +2083,7 @@ bool OverlayWidget::createStreamingObjects() {
_streamed = nullptr; _streamed = nullptr;
return false; return false;
} }
_streamed->instance.setPriority(kOverlayLoaderPriority);
_streamed->instance.lockPlayer(); _streamed->instance.lockPlayer();
_streamed->withSound = _doc->isAudioFile() _streamed->withSound = _doc->isAudioFile()
|| _doc->isVideoFile() || _doc->isVideoFile()