/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include "lottie/lottie_player.h" #include "base/timer.h" #include "base/algorithm.h" #include "base/flat_set.h" #include "base/flat_map.h" #include namespace Lottie { class Animation; class FrameRenderer; struct MultiUpdate { //base::variant< // std::pair, // DisplayMultiFrameRequest, // std::pair> data; }; class MultiPlayer final : public Player { public: MultiPlayer( Quality quality = Quality::Default, std::shared_ptr renderer = nullptr); ~MultiPlayer(); void start( not_null animation, std::unique_ptr state) override; void failed(not_null animation, Error error) override; void updateFrameRequest( not_null animation, const FrameRequest &request) override; bool markFrameShown() override; void checkStep() override; not_null append( FnMut)> get, // Main thread. FnMut put, // Unknown thread. const QByteArray &content, const FrameRequest &request); not_null append( const QByteArray &content, const FrameRequest &request); rpl::producer updates() const; void remove(not_null animation); void pause(not_null animation); void unpause(not_null animation); private: struct PausedInfo { not_null state; crl::time pauseTime = kTimeUnknown; crl::time pauseDelay = kTimeUnknown; }; struct StartingInfo { std::unique_ptr state; bool paused = false; }; void addNewToActive( not_null animation, StartingInfo &&info); [[nodiscard]] int countFrameIndex( not_null state, crl::time time, crl::time delay) const; void startAtRightTime(std::unique_ptr state); void processPending(); void markFrameDisplayed(crl::time now); void addTimelineDelay(crl::time delayed); void checkNextFrameAvailability(); void checkNextFrameRender(); void unpauseFirst( not_null animation, not_null state); void pauseAndSaveState(not_null animation); void unpauseAndKeepUp(not_null animation); void removeNow(not_null animation); Quality _quality = Quality::Default; base::Timer _timer; const std::shared_ptr _renderer; std::vector> _animations; base::flat_map, not_null> _active; base::flat_map, PausedInfo> _paused; base::flat_set> _pendingPause; base::flat_set> _pendingUnpause; base::flat_set> _pausedBeforeStart; base::flat_set> _pendingRemove; base::flat_map, StartingInfo> _pendingToStart; crl::time _started = kTimeUnknown; crl::time _lastSyncTime = kTimeUnknown; crl::time _delay = 0; crl::time _nextFrameTime = kTimeUnknown; rpl::event_stream _updates; rpl::lifetime _lifetime; }; } // namespace Lottie