Skip to content

Commit

Permalink
for ossrs#133, create rtsp framework.
Browse files Browse the repository at this point in the history
  • Loading branch information
winlinvip committed Feb 16, 2015
1 parent e81e090 commit c0e5026
Show file tree
Hide file tree
Showing 11 changed files with 348 additions and 26 deletions.
6 changes: 3 additions & 3 deletions trunk/conf/full.conf
Original file line number Diff line number Diff line change
Expand Up @@ -157,8 +157,8 @@ stream_caster {
# rtmp://127.0.0.1/live/livestream
output rtmp://127.0.0.1/live/livestream;
# the listen port for stream caster.
# for mpegts_over_udp caster, listen at udp port.
# for rtsp caster, listen at tcp port.
# for mpegts_over_udp caster, listen at udp port. for example, 8935.
# for rtsp caster, listen at tcp port. for example, 554.
listen 8935;
}
stream_caster {
Expand All @@ -168,7 +168,7 @@ stream_caster {
listen 8935;
}
stream_caster {
enabled on;
enabled off;
caster rtsp;
output rtmp://127.0.0.1/[app]/[stream];
listen 554;
Expand Down
2 changes: 1 addition & 1 deletion trunk/configure
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,7 @@ MODULE_DEPENDS=("CORE" "KERNEL")
ModuleLibIncs=(${SRS_OBJS_DIR} ${LibSSLRoot})
MODULE_FILES=("srs_rtmp_amf0" "srs_rtmp_io" "srs_rtmp_stack" "srs_rtmp_sdk"
"srs_rtmp_handshake" "srs_rtmp_utility" "srs_rtmp_msg_array" "srs_rtmp_buffer"
"srs_raw_avc")
"srs_raw_avc" "srs_rtsp_stack")
RTMP_INCS="src/protocol"; MODULE_DIR=${RTMP_INCS} . auto/modules.sh
RTMP_OBJS="${MODULE_OBJS[@]}"
#
Expand Down
2 changes: 2 additions & 0 deletions trunk/ide/srs_upp/srs_upp.upp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ file
../../src/kernel/srs_kernel_log.cpp,
../../src/kernel/srs_kernel_mp3.hpp,
../../src/kernel/srs_kernel_mp3.cpp,
../../src/kernel/srs_rtsp_stack.hpp,
../../src/kernel/srs_rtsp_stack.cpp,
../../src/kernel/srs_kernel_stream.hpp,
../../src/kernel/srs_kernel_stream.cpp,
../../src/kernel/srs_kernel_ts.cpp,
Expand Down
4 changes: 4 additions & 0 deletions trunk/ide/srs_vs2010/srs.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@
<ClInclude Include="..\..\src\app\srs_app_refer.hpp" />
<ClInclude Include="..\..\src\app\srs_app_reload.hpp" />
<ClInclude Include="..\..\src\app\srs_app_rtmp_conn.hpp" />
<ClInclude Include="..\..\src\app\srs_app_rtsp.hpp" />
<ClInclude Include="..\..\src\app\srs_app_security.hpp" />
<ClInclude Include="..\..\src\app\srs_app_server.hpp" />
<ClInclude Include="..\..\src\app\srs_app_source.hpp" />
Expand Down Expand Up @@ -125,6 +126,7 @@
<ClInclude Include="..\..\src\protocol\srs_rtmp_sdk.hpp" />
<ClInclude Include="..\..\src\protocol\srs_rtmp_stack.hpp" />
<ClInclude Include="..\..\src\protocol\srs_rtmp_utility.hpp" />
<ClInclude Include="..\..\src\protocol\srs_rtsp_stack.hpp" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\research\hls\ts_info.cc" />
Expand Down Expand Up @@ -166,6 +168,7 @@
<ClCompile Include="..\..\src\app\srs_app_refer.cpp" />
<ClCompile Include="..\..\src\app\srs_app_reload.cpp" />
<ClCompile Include="..\..\src\app\srs_app_rtmp_conn.cpp" />
<ClCompile Include="..\..\src\app\srs_app_rtsp.cpp" />
<ClCompile Include="..\..\src\app\srs_app_security.cpp" />
<ClCompile Include="..\..\src\app\srs_app_server.cpp" />
<ClCompile Include="..\..\src\app\srs_app_source.cpp" />
Expand Down Expand Up @@ -203,6 +206,7 @@
<ClCompile Include="..\..\src\protocol\srs_rtmp_sdk.cpp" />
<ClCompile Include="..\..\src\protocol\srs_rtmp_stack.cpp" />
<ClCompile Include="..\..\src\protocol\srs_rtmp_utility.cpp" />
<ClCompile Include="..\..\src\protocol\srs_rtsp_stack.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
Expand Down
12 changes: 12 additions & 0 deletions trunk/ide/srs_vs2010/srs.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,12 @@
<ClCompile Include="..\..\src\protocol\srs_raw_avc.cpp">
<Filter>srs</Filter>
</ClCompile>
<ClCompile Include="..\..\src\app\srs_app_rtsp.cpp">
<Filter>srs</Filter>
</ClCompile>
<ClCompile Include="..\..\src\protocol\srs_rtsp_stack.cpp">
<Filter>srs</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\app\srs_app_bandwidth.hpp">
Expand Down Expand Up @@ -420,6 +426,12 @@
<ClInclude Include="..\..\src\protocol\srs_raw_avc.hpp">
<Filter>srs</Filter>
</ClInclude>
<ClInclude Include="..\..\src\app\srs_app_rtsp.hpp">
<Filter>srs</Filter>
</ClInclude>
<ClInclude Include="..\..\src\protocol\srs_rtsp_stack.hpp">
<Filter>srs</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="research">
Expand Down
114 changes: 112 additions & 2 deletions trunk/src/app/srs_app_rtsp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,15 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

#include <srs_app_rtsp.hpp>

#include <algorithm>
using namespace std;

#include <srs_app_config.hpp>
#include <srs_kernel_error.hpp>
#include <srs_rtsp_stack.hpp>
#include <srs_app_st_socket.hpp>
#include <srs_kernel_log.hpp>
#include <srs_app_utility.hpp>

#ifdef SRS_AUTO_STREAM_CASTER

Expand All @@ -35,13 +43,115 @@ ISrsRtspHandler::~ISrsRtspHandler()
{
}

SrsRtspConn::SrsRtspConn(SrsConfDirective* c)
SrsRtspConn::SrsRtspConn(SrsRtspCaster* c, st_netfd_t fd, std::string o)
{
output = _srs_config->get_stream_caster_output(c);
output = o;
caster = c;
stfd = fd;
skt = new SrsStSocket(fd);
rtsp = new SrsRtspStack(skt);
trd = new SrsThread("rtsp", this, 0, false);
}

SrsRtspConn::~SrsRtspConn()
{
srs_close_stfd(stfd);
trd->stop();

srs_freep(trd);
srs_freep(skt);
srs_freep(rtsp);
}

int SrsRtspConn::serve()
{
return trd->start();
}

int SrsRtspConn::do_cycle()
{
int ret = ERROR_SUCCESS;

// retrieve ip of client.
std::string ip = srs_get_peer_ip(st_netfd_fileno(stfd));
srs_trace("rtsp: serve %s", ip.c_str());

return ret;
}

int SrsRtspConn::cycle()
{
// serve the rtsp client.
int ret = do_cycle();

// if socket io error, set to closed.
if (srs_is_client_gracefully_close(ret)) {
ret = ERROR_SOCKET_CLOSED;
}

// success.
if (ret == ERROR_SUCCESS) {
srs_trace("client finished.");
}

// client close peer.
if (ret == ERROR_SOCKET_CLOSED) {
srs_warn("client disconnect peer. ret=%d", ret);
}

// terminate thread in the thread cycle itself.
trd->stop_loop();

return ERROR_SUCCESS;
}

void SrsRtspConn::on_thread_stop()
{
caster->remove(this);
}

SrsRtspCaster::SrsRtspCaster(SrsConfDirective* c)
{
// TODO: FIXME: support reload.
output = _srs_config->get_stream_caster_output(c);
}

SrsRtspCaster::~SrsRtspCaster()
{
std::vector<SrsRtspConn*>::iterator it;
for (it = clients.begin(); it != clients.end(); ++it) {
SrsRtspConn* conn = *it;
srs_freep(conn);
}
clients.clear();
}

int SrsRtspCaster::serve_client(st_netfd_t stfd)
{
int ret = ERROR_SUCCESS;

SrsRtspConn* conn = new SrsRtspConn(this, stfd, output);
if ((ret = conn->serve()) != ERROR_SUCCESS) {
srs_error("rtsp: serve client failed. ret=%d", ret);
srs_freep(conn);
return ret;
}

clients.push_back(conn);
srs_info("rtsp: start thread to serve client.");

return ret;
}

void SrsRtspCaster::remove(SrsRtspConn* conn)
{
std::vector<SrsRtspConn*>::iterator it = find(clients.begin(), clients.end(), conn);
if (it != clients.end()) {
clients.erase(it);
}
srs_info("rtsp: remove connection from caster.");

srs_freep(conn);
}

#endif
Expand Down
49 changes: 46 additions & 3 deletions trunk/src/app/srs_app_rtsp.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,17 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_core.hpp>

#include <string>
#include <vector>

#include <srs_app_st.hpp>
#include <srs_app_thread.hpp>

#ifdef SRS_AUTO_STREAM_CASTER

class SrsConfDirective;
class SrsStSocket;
class SrsRtspStack;
class SrsRtspCaster;

/**
* the handler for rtsp handler.
Expand All @@ -44,18 +51,54 @@ class ISrsRtspHandler
public:
ISrsRtspHandler();
virtual ~ISrsRtspHandler();
public:
/**
* serve the rtsp connection.
*/
virtual int serve_client(st_netfd_t stfd) = 0;
};

/**
* the connection for rtsp.
* the rtsp connection serve the fd.
*/
class SrsRtspConn : public ISrsRtspHandler
class SrsRtspConn : public ISrsThreadHandler
{
private:
std::string output;
st_netfd_t stfd;
SrsStSocket* skt;
SrsRtspStack* rtsp;
SrsRtspCaster* caster;
SrsThread* trd;
public:
SrsRtspConn(SrsConfDirective* c);
SrsRtspConn(SrsRtspCaster* c, st_netfd_t fd, std::string o);
virtual ~SrsRtspConn();
public:
virtual int serve();
private:
virtual int do_cycle();
// interface ISrsThreadHandler
public:
virtual int cycle();
virtual void on_thread_stop();
};

/**
* the caster for rtsp.
*/
class SrsRtspCaster : public ISrsRtspHandler
{
private:
std::string output;
std::vector<SrsRtspConn*> clients;
public:
SrsRtspCaster(SrsConfDirective* c);
virtual ~SrsRtspCaster();
public:
virtual int serve_client(st_netfd_t stfd);
// internal methods.
public:
virtual void remove(SrsRtspConn* conn);
};

#endif
Expand Down
4 changes: 2 additions & 2 deletions trunk/src/app/srs_app_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ SrsRtspListener::SrsRtspListener(SrsServer* server, SrsListenerType type, SrsCon
// we just assert here for unknown stream caster.
srs_assert(_type == SrsListenerRtsp);
if (_type == SrsListenerRtsp) {
caster = new SrsRtspConn(c);
caster = new SrsRtspCaster(c);
}
}

Expand All @@ -262,7 +262,7 @@ int SrsRtspListener::cycle()
}
srs_verbose("get a client. fd=%d", st_netfd_fileno(client_stfd));

if ((ret = _server->accept_client(_type, client_stfd)) != ERROR_SUCCESS) {
if ((ret = caster->serve_client(client_stfd)) != ERROR_SUCCESS) {
srs_warn("accept client error. ret=%d", ret);
return ret;
}
Expand Down
Loading

0 comments on commit c0e5026

Please sign in to comment.