/** * the tcp listener, for flv stream server. */ class SrsHttpFlvListener : virtual public SrsListener, virtual public ISrsTcpHandler { private: SrsTcpListener* listener; SrsAppCasterFlv* caster; public: SrsHttpFlvListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c); virtual ~SrsHttpFlvListener(); public: virtual int listen(std::string i, int p); // ISrsTcpHandler public: virtual int on_tcp_client(st_netfd_t stfd); }; #endif
SrsHttpFlvListener::SrsHttpFlvListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c) : SrsListener(svr, t) { listener = NULL; // the caller already ensure the type is ok, // we just assert here for unknown stream caster. srs_assert(type == SrsListenerFlv); if (type == SrsListenerFlv) { caster = new SrsAppCasterFlv(c); } } SrsHttpFlvListener::~SrsHttpFlvListener() { srs_freep(caster); srs_freep(listener); } int SrsHttpFlvListener::listen(string i, int p) { int ret = ERROR_SUCCESS; // the caller already ensure the type is ok, // we just assert here for unknown stream caster. srs_assert(type == SrsListenerFlv); ip = i; port = p; if ((ret = caster->initialize()) != ERROR_SUCCESS) { return ret; } srs_freep(listener); listener = new SrsTcpListener(this, ip, port); if ((ret = listener->listen()) != ERROR_SUCCESS) { srs_error("flv caster listen failed. ret=%d", ret); return ret; } srs_info("listen thread listen at port=%d, type=%d, fd=%d started success, ep=%s:%d", port, type, listener->fd(), ip.c_str(), port); srs_trace("%s listen at tcp://%s:%d, fd=%d", srs_listener_type2string(type).c_str(), ip.c_str(), port, listener->fd()); return ret; } int SrsHttpFlvListener::on_tcp_client(st_netfd_t stfd) { int ret = ERROR_SUCCESS; if ((ret = caster->on_tcp_client(stfd)) != ERROR_SUCCESS) { srs_warn("accept client error. ret=%d", ret); return ret; } return ret; }
SrsHttpFlvListener 类接收 http flv流后,由
SrsAppCasterFlv类处理这类连接
/** * the udp listener, for udp server. */ class SrsUdpStreamListener : public SrsListener { protected: SrsUdpListener* listener; ISrsUdpHandler* caster; public: SrsUdpStreamListener(SrsServer* svr, SrsListenerType t, ISrsUdpHandler* c); virtual ~SrsUdpStreamListener(); public: virtual int listen(std::string i, int p); }; /** * the udp listener, for udp stream caster server. */ #ifdef SRS_AUTO_STREAM_CASTER class SrsUdpCasterListener : public SrsUdpStreamListener { public: SrsUdpCasterListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c); virtual ~SrsUdpCasterListener(); }; #endif
SrsUdpCasterListener
通过 udp协议变换mpegts流
有类 SrsMpegtsOverUdp实现
SrsUdpCasterListener::SrsUdpCasterListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c) : SrsUdpStreamListener(svr, t, NULL) { // the caller already ensure the type is ok, // we just assert here for unknown stream caster. srs_assert(type == SrsListenerMpegTsOverUdp); if (type == SrsListenerMpegTsOverUdp) { caster = new SrsMpegtsOverUdp(c); } }