#ifndef E3F40CBC_D6F1_4B8F_B90E_6765659CF90F #define E3F40CBC_D6F1_4B8F_B90E_6765659CF90F /* ******************************************************************************* * INCLUDE ******************************************************************************* */ #include "../core/Demuxer.h" extern "C" { #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include } namespace Video { namespace MediaServer { /* ******************************************************************************* * CLASS DECLARE ******************************************************************************* */ class RTMPDemuxHandler: public Core::DemuxHandler { public: RTMPDemuxHandler(const std::string& url); ~RTMPDemuxHandler(); public: void run(Core::VideoEncoder::Ptr pVideoEncoder, Core::AudioEncoder::Ptr pAudioEncoder, const Post& post, std::atomic& isCancelled) override; protected: int parseFLVMetaData(const uint8_t* pData, size_t length); int processH264Data(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags); int processH265Data(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags); int processASCData(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags); int processAACData(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags); int processOpusHeadData(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags); int processOpusData(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags); int processG711AData(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags); int processG711UData(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags); void enqueueVideoPacket(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags); void enqueueAudioPacket(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags); inline const uint8_t* annexBStartcode(const uint8_t* data, size_t bytes); bool isH264BFrame(const void* h264, size_t bytes); void adjustTimestamp(uint64_t& pts, uint64_t& dts); void updateTimeline(uint64_t ts); void seek(uint64_t) override; private: socket_t _socket; rtmp_client_t* _pCient; flv_demuxer_t* _pDemuxer; bool _audioInfoParsed; bool _videoInfoParsed; uint32_t _iFrameLength; Core::VideoEncoder::Ptr _pVideoEncoder; Core::AudioEncoder::Ptr _pAudioEncoder; Post _post; union { struct mpeg4_avc_t avc; struct mpeg4_hevc_t hevc; } _v; protected: static int clientSend(void* param, const void* header, size_t len, const void* data, size_t bytes); static int clientOnAudio(void* param, const void* data, size_t bytes, uint32_t timestamp); static int clientOnVideo(void* param, const void* data, size_t bytes, uint32_t timestamp); static int clientOnScript(void* param, const void* data, size_t bytes, uint32_t timestamp); static int flvDemuxerHandler(void* param, int codec, const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags); static void h264NALhandler(void* param, const uint8_t* nalu, size_t bytes); static void h265NALhandler(void* param, const uint8_t* nalu, size_t bytes); }; } } #endif