#ifndef ADECE10E_B193_46F7_B377_651677F4AD89 #define ADECE10E_B193_46F7_B377_651677F4AD89 /* ******************************************************************************* * INCLUDE ******************************************************************************* */ #include "Component.h" #include "util/FactoryManager.h" #include "util/SimpleFactory.h" #include "VideoEncoder.h" #include "AudioEncoder.h" #include "util/Task.h" #include "util/ClassAssistant.h" #include #include #include #include namespace Video { namespace Core { /* ******************************************************************************* * CLASS DECLARE ******************************************************************************* */ class DemuxHandlerSelector { public: static const std::string select(const std::string& uri) { return Poco::URI(uri).getScheme(); } }; class DemuxHandler : public ::Util::FactoryManager { public: using Ptr = Poco::SharedPtr; using Post = std::function; using ShouldWait = std::function; public: DemuxHandler(const std::string& name, const std::string& uri); virtual ~DemuxHandler(); public: virtual void run(VideoEncoder::Ptr pVideoEncoder, AudioEncoder::Ptr pAudioEncoder, const Post& post, std::atomic& isCancelled) = 0; const std::string& name() const; const std::string& uri() const; const std::string& scheme() const; virtual void seek(uint64_t ts) = 0; PROPERTY_DECLARE(UsingTCPTransport, bool, false, public, public) PROPERTY_DECLARE(Baseline, uint64_t, 0, public, public) PROPERTY_DECLARE(Timeline, uint64_t, 0, public, public) PROPERTY_DECLARE(Position, int64_t, 0, protected, public) protected: int64_t getTimeDrift(uint64_t ts); void resetTimeDrift(); private: const std::string _name; const std::string _uri; const std::string _scheme; int64_t _timeDrift; }; inline const std::string& DemuxHandler::name() const { return _name; } inline const std::string& DemuxHandler::uri() const { return _uri; } inline const std::string& DemuxHandler::scheme() const { return _scheme; } /* ******************************************************************************* * CLASS DECLARE ******************************************************************************* */ class Demuxer: public Component, public ::Util::SimpleFactory { public: using Ptr = Poco::AutoPtr; using URICollection = std::vector; public: Demuxer(const std::string& name); ~Demuxer(); public: CONFIGURABLE_DECLARE_PARAMETER(UsingTCPTransport, bool) CONFIGURABLE_DECLARE_PARAMETER(URICollection, URICollection&) Poco::BasicEvent PlayIndexChanged; Poco::BasicEvent PlayPositionChanged; const int playIndex() const; VideoEncoder::Ptr videoEncoder(); AudioEncoder::Ptr audioEncoder(); protected: void start() override; void stop() override; void onLink(Component::Ptr pPrevious) override; void onUnlink(Component::Ptr pPrevious) override; void onConfigChanged(ParameterNames& names) override; READONLY_PROPERTY_DECLARE(playIndex, int) READONLY_PROPERTY_DECLARE(playPosition, int64_t) private: Util::Task _task; VideoEncoder::Ptr _pVideoEncoder; AudioEncoder::Ptr _pAudioEncoder; }; inline const int Demuxer::playIndex() const { return _playIndex; } inline VideoEncoder::Ptr Demuxer::videoEncoder() { return _pVideoEncoder; } inline AudioEncoder::Ptr Demuxer::audioEncoder() { return _pAudioEncoder; } } } #endif