diff --git a/trunk/src/app/srs_app_rtsp.cpp b/trunk/src/app/srs_app_rtsp.cpp index ed684d4b9..3dcf20213 100644 --- a/trunk/src/app/srs_app_rtsp.cpp +++ b/trunk/src/app/srs_app_rtsp.cpp @@ -240,6 +240,11 @@ srs_error_t SrsRtspConn::serve() return err; } +std::string SrsRtspConn::remote_ip() +{ + return ""; +} + srs_error_t SrsRtspConn::do_cycle() { srs_error_t err = srs_success; @@ -684,6 +689,7 @@ SrsRtspCaster::SrsRtspCaster(SrsConfDirective* c) output = _srs_config->get_stream_caster_output(c); local_port_min = _srs_config->get_stream_caster_rtp_port_min(c); local_port_max = _srs_config->get_stream_caster_rtp_port_max(c); + manager = new SrsCoroutineManager(); } SrsRtspCaster::~SrsRtspCaster() @@ -691,10 +697,20 @@ SrsRtspCaster::~SrsRtspCaster() std::vector::iterator it; for (it = clients.begin(); it != clients.end(); ++it) { SrsRtspConn* conn = *it; - srs_freep(conn); + manager->remove(conn); } clients.clear(); used_ports.clear(); + + srs_freep(manager); +} + +srs_error_t SrsRtspCaster::initialize() +{ + srs_error_t err = srs_success; + if ((err = manager->start()) != srs_success) { + return srs_error_wrap(err, "start manager"); + } } srs_error_t SrsRtspCaster::alloc_port(int* pport) @@ -747,6 +763,6 @@ void SrsRtspCaster::remove(SrsRtspConn* conn) } srs_info("rtsp: remove connection from caster."); - srs_freep(conn); + manager->remove(conn); } diff --git a/trunk/src/app/srs_app_rtsp.hpp b/trunk/src/app/srs_app_rtsp.hpp index 7bbd52651..0ca748535 100644 --- a/trunk/src/app/srs_app_rtsp.hpp +++ b/trunk/src/app/srs_app_rtsp.hpp @@ -100,7 +100,7 @@ public: }; // The rtsp connection serve the fd. -class SrsRtspConn : public ISrsCoroutineHandler +class SrsRtspConn : public ISrsCoroutineHandler, public ISrsConnection { private: std::string output_template; @@ -143,6 +143,7 @@ public: virtual ~SrsRtspConn(); public: virtual srs_error_t serve(); + virtual std::string remote_ip(); private: virtual srs_error_t do_cycle(); // internal methods @@ -179,6 +180,7 @@ private: std::map used_ports; private: std::vector clients; + SrsCoroutineManager* manager; public: SrsRtspCaster(SrsConfDirective* c); virtual ~SrsRtspCaster(); @@ -188,6 +190,7 @@ public: virtual srs_error_t alloc_port(int* pport); // Free the alloced rtp port. virtual void free_port(int lpmin, int lpmax); + virtual srs_error_t initialize(); // Interface ISrsTcpHandler public: virtual srs_error_t on_tcp_client(srs_netfd_t stfd); diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index d50569684..0a904d514 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -179,6 +179,7 @@ SrsRtspListener::SrsRtspListener(SrsServer* svr, SrsListenerType t, SrsConfDirec srs_assert(type == SrsListenerRtsp); if (type == SrsListenerRtsp) { caster = new SrsRtspCaster(c); + caster->initialize(); } } diff --git a/trunk/src/app/srs_app_server.hpp b/trunk/src/app/srs_app_server.hpp index 28154600e..87407bb9f 100644 --- a/trunk/src/app/srs_app_server.hpp +++ b/trunk/src/app/srs_app_server.hpp @@ -50,6 +50,7 @@ class ISrsUdpHandler; class SrsUdpListener; class SrsTcpListener; class SrsAppCasterFlv; +class SrsRtspCaster; class SrsCoroutineManager; // The listener type for server to identify the connection, @@ -107,7 +108,7 @@ class SrsRtspListener : virtual public SrsListener, virtual public ISrsTcpHandle { private: SrsTcpListener* listener; - ISrsTcpHandler* caster; + SrsRtspCaster* caster; public: SrsRtspListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c); virtual ~SrsRtspListener();