Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
胡斌
/
srs
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
winlin
2015-05-19 18:06:20 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
44bc7976ac60970d24d13bae657db07dfee28b46
44bc7976
1 parent
0f7cafe5
merge from bravo system, add the rtmfp to bms(commercial srs). 2.0.163.
隐藏空白字符变更
内嵌
并排对比
正在显示
17 个修改的文件
包含
316 行增加
和
269 行删除
README.md
trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj
trunk/src/app/srs_app_config.cpp
trunk/src/app/srs_app_reload.cpp
trunk/src/app/srs_app_reload.hpp
trunk/src/app/srs_app_rtmp_conn.cpp
trunk/src/app/srs_app_server.cpp
trunk/src/app/srs_app_server.hpp
trunk/src/core/srs_core.hpp
trunk/src/main/srs_main_ingest_hls.cpp
trunk/src/main/srs_main_server.cpp
trunk/src/protocol/srs_rtmp_sdk.cpp
trunk/src/protocol/srs_rtmp_sdk.hpp
trunk/src/protocol/srs_rtmp_stack.cpp
trunk/src/protocol/srs_rtmp_stack.hpp
trunk/src/protocol/srs_rtmp_utility.cpp
trunk/src/protocol/srs_rtmp_utility.hpp
README.md
查看文件 @
44bc797
...
...
@@ -562,6 +562,7 @@ Supported operating systems and hardware:
### SRS 2.0 history
*
v2.0, 2015-05-19, merge from bravo system, add the rtmfp to bms(commercial srs). 2.0.163.
*
v2.0, 2015-05-10, support push flv stream over HTTP POST to SRS.
*
v2.0, 2015-04-20, support ingest hls live stream to RTMP.
*
v2.0, 2015-04-15, for
[
#383
](
https://github.com/simple-rtmp-server/srs/issues/383
)
, support mix_correct algorithm. 2.0.161.
...
...
trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj
查看文件 @
44bc797
...
...
@@ -514,12 +514,12 @@
3C12324B1AAE81CE00CE8F6C /* app */ = {
isa = PBXGroup;
children = (
3C28EDDD1AF5C43F00A3AEAC /* srs_app_caster_flv.cpp */,
3C28EDDE1AF5C43F00A3AEAC /* srs_app_caster_flv.hpp */,
3CD88B3D1ACA9C58000359E0 /* srs_app_async_call.cpp */,
3CD88B3E1ACA9C58000359E0 /* srs_app_async_call.hpp */,
3C12324C1AAE81D900CE8F6C /* srs_app_bandwidth.cpp */,
3C12324D1AAE81D900CE8F6C /* srs_app_bandwidth.hpp */,
3C28EDDD1AF5C43F00A3AEAC /* srs_app_caster_flv.cpp */,
3C28EDDE1AF5C43F00A3AEAC /* srs_app_caster_flv.hpp */,
3C12324E1AAE81D900CE8F6C /* srs_app_config.cpp */,
3C12324F1AAE81D900CE8F6C /* srs_app_config.hpp */,
3C1232501AAE81D900CE8F6C /* srs_app_conn.cpp */,
...
...
@@ -536,10 +536,10 @@
3C12325B1AAE81D900CE8F6C /* srs_app_ffmpeg.hpp */,
3C12325C1AAE81D900CE8F6C /* srs_app_forward.cpp */,
3C12325D1AAE81D900CE8F6C /* srs_app_forward.hpp */,
3C12325E1AAE81D900CE8F6C /* srs_app_heartbeat.cpp */,
3C12325F1AAE81D900CE8F6C /* srs_app_heartbeat.hpp */,
3C1EE6AC1AB1055800576EE9 /* srs_app_hds.cpp */,
3C1EE6AD1AB1055800576EE9 /* srs_app_hds.hpp */,
3C12325E1AAE81D900CE8F6C /* srs_app_heartbeat.cpp */,
3C12325F1AAE81D900CE8F6C /* srs_app_heartbeat.hpp */,
3C1232601AAE81D900CE8F6C /* srs_app_hls.cpp */,
3C1232611AAE81D900CE8F6C /* srs_app_hls.hpp */,
3C1232621AAE81D900CE8F6C /* srs_app_http_api.cpp */,
...
...
trunk/src/app/srs_app_config.cpp
查看文件 @
44bc797
...
...
@@ -441,10 +441,22 @@ int SrsConfig::reload_conf(SrsConfig* conf)
// daemon
//
// always support reload without additional code:
// chunk_size, ff_log_dir,
max_connections,
// chunk_size, ff_log_dir,
// bandcheck, http_hooks, heartbeat,
// token_traverse, debug_srs_upnode,
// security
// merge config: max_connections
if
(
!
srs_directive_equals
(
root
->
get
(
"max_connections"
),
old_root
->
get
(
"max_connections"
)))
{
for
(
it
=
subscribes
.
begin
();
it
!=
subscribes
.
end
();
++
it
)
{
ISrsReloadHandler
*
subscribe
=
*
it
;
if
((
ret
=
subscribe
->
on_reload_max_conns
())
!=
ERROR_SUCCESS
)
{
srs_error
(
"notify subscribes reload max_connections failed. ret=%d"
,
ret
);
return
ret
;
}
}
srs_trace
(
"reload max_connections success."
);
}
// merge config: listen
if
(
!
srs_directive_equals
(
root
->
get
(
"listen"
),
old_root
->
get
(
"listen"
)))
{
...
...
trunk/src/app/srs_app_reload.cpp
查看文件 @
44bc797
...
...
@@ -40,6 +40,11 @@ int ISrsReloadHandler::on_reload_listen()
return
ERROR_SUCCESS
;
}
int
ISrsReloadHandler
::
on_reload_max_conns
()
{
return
ERROR_SUCCESS
;
}
int
ISrsReloadHandler
::
on_reload_pid
()
{
return
ERROR_SUCCESS
;
...
...
trunk/src/app/srs_app_reload.hpp
查看文件 @
44bc797
...
...
@@ -44,6 +44,7 @@ public:
ISrsReloadHandler
();
virtual
~
ISrsReloadHandler
();
public
:
virtual
int
on_reload_max_conns
();
virtual
int
on_reload_listen
();
virtual
int
on_reload_pid
();
virtual
int
on_reload_log_tank
();
...
...
@@ -55,6 +56,7 @@ public:
virtual
int
on_reload_http_stream_enabled
();
virtual
int
on_reload_http_stream_disabled
();
virtual
int
on_reload_http_stream_updated
();
public
:
virtual
int
on_reload_vhost_http_updated
();
virtual
int
on_reload_vhost_http_remux_updated
();
virtual
int
on_reload_vhost_added
(
std
::
string
vhost
);
...
...
trunk/src/app/srs_app_rtmp_conn.cpp
查看文件 @
44bc797
...
...
@@ -1068,24 +1068,24 @@ int SrsRtmpConn::process_play_control_msg(SrsConsumer* consumer, SrsCommonMessag
return
ret
;
}
// pause
or other msg.
// pause
SrsPausePacket
*
pause
=
dynamic_cast
<
SrsPausePacket
*>
(
pkt
);
if
(
!
pause
)
{
srs_info
(
"ignore all amf0/amf3 command except pause."
);
return
ret
;
}
if
((
ret
=
rtmp
->
on_play_client_pause
(
res
->
stream_id
,
pause
->
is_pause
))
!=
ERROR_SUCCESS
)
{
srs_error
(
"rtmp process play client pause failed. ret=%d"
,
ret
);
return
ret
;
}
if
((
ret
=
consumer
->
on_play_client_pause
(
pause
->
is_pause
))
!=
ERROR_SUCCESS
)
{
srs_error
(
"consumer process play client pause failed. ret=%d"
,
ret
);
if
(
pause
)
{
if
((
ret
=
rtmp
->
on_play_client_pause
(
res
->
stream_id
,
pause
->
is_pause
))
!=
ERROR_SUCCESS
)
{
srs_error
(
"rtmp process play client pause failed. ret=%d"
,
ret
);
return
ret
;
}
if
((
ret
=
consumer
->
on_play_client_pause
(
pause
->
is_pause
))
!=
ERROR_SUCCESS
)
{
srs_error
(
"consumer process play client pause failed. ret=%d"
,
ret
);
return
ret
;
}
srs_info
(
"process pause success, is_pause=%d, time=%d."
,
pause
->
is_pause
,
pause
->
time_ms
);
return
ret
;
}
srs_info
(
"process pause success, is_pause=%d, time=%d."
,
pause
->
is_pause
,
pause
->
time_ms
);
// other msg.
srs_info
(
"ignore all amf0/amf3 command except pause and video control."
);
return
ret
;
}
...
...
trunk/src/app/srs_app_server.cpp
查看文件 @
44bc797
...
...
@@ -113,23 +113,23 @@ std::string srs_listener_type2string(SrsListenerType type)
}
}
SrsListener
::
SrsListener
(
SrsServer
*
s
erver
,
SrsListenerType
type
)
SrsListener
::
SrsListener
(
SrsServer
*
s
vr
,
SrsListenerType
t
)
{
_port
=
0
;
_server
=
server
;
_type
=
type
;
port
=
0
;
server
=
svr
;
type
=
t
;
}
SrsListener
::~
SrsListener
()
{
}
SrsListenerType
SrsListener
::
type
()
SrsListenerType
SrsListener
::
listen_
type
()
{
return
_
type
;
return
type
;
}
SrsStreamListener
::
SrsStreamListener
(
SrsServer
*
s
erver
,
SrsListenerType
type
)
:
SrsListener
(
server
,
type
)
SrsStreamListener
::
SrsStreamListener
(
SrsServer
*
s
vr
,
SrsListenerType
t
)
:
SrsListener
(
svr
,
t
)
{
listener
=
NULL
;
}
...
...
@@ -139,12 +139,12 @@ SrsStreamListener::~SrsStreamListener()
srs_freep
(
listener
);
}
int
SrsStreamListener
::
listen
(
string
i
p
,
int
port
)
int
SrsStreamListener
::
listen
(
string
i
,
int
p
)
{
int
ret
=
ERROR_SUCCESS
;
_ip
=
ip
;
_port
=
port
;
ip
=
i
;
port
=
p
;
srs_freep
(
listener
);
listener
=
new
SrsTcpListener
(
this
,
ip
,
port
);
...
...
@@ -158,7 +158,7 @@ int SrsStreamListener::listen(string ip, int port)
"listen at port=%d, type=%d, fd=%d started success, ep=%s:%d"
,
pthread
->
cid
(),
_srs_context
->
get_id
(),
_port
,
_type
,
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
());
srs_trace
(
"%s listen at tcp://%s:%d, fd=%d"
,
srs_listener_type2string
(
type
).
c_str
(),
ip
.
c_str
(),
port
,
listener
->
fd
());
return
ret
;
}
...
...
@@ -167,7 +167,7 @@ int SrsStreamListener::on_tcp_client(st_netfd_t stfd)
{
int
ret
=
ERROR_SUCCESS
;
if
((
ret
=
_server
->
accept_client
(
_
type
,
stfd
))
!=
ERROR_SUCCESS
)
{
if
((
ret
=
server
->
accept_client
(
type
,
stfd
))
!=
ERROR_SUCCESS
)
{
srs_warn
(
"accept client error. ret=%d"
,
ret
);
return
ret
;
}
...
...
@@ -176,14 +176,14 @@ int SrsStreamListener::on_tcp_client(st_netfd_t stfd)
}
#ifdef SRS_AUTO_STREAM_CASTER
SrsRtspListener
::
SrsRtspListener
(
SrsServer
*
s
erver
,
SrsListenerType
type
,
SrsConfDirective
*
c
)
:
SrsListener
(
server
,
type
)
SrsRtspListener
::
SrsRtspListener
(
SrsServer
*
s
vr
,
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
==
SrsListenerRtsp
);
if
(
_type
==
SrsListenerRtsp
)
{
srs_assert
(
type
==
SrsListenerRtsp
);
if
(
type
==
SrsListenerRtsp
)
{
caster
=
new
SrsRtspCaster
(
c
);
}
}
...
...
@@ -194,16 +194,16 @@ SrsRtspListener::~SrsRtspListener()
srs_freep
(
listener
);
}
int
SrsRtspListener
::
listen
(
string
i
p
,
int
port
)
int
SrsRtspListener
::
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
==
SrsListenerRtsp
);
srs_assert
(
type
==
SrsListenerRtsp
);
_ip
=
ip
;
_port
=
port
;
ip
=
i
;
port
=
p
;
srs_freep
(
listener
);
listener
=
new
SrsTcpListener
(
this
,
ip
,
port
);
...
...
@@ -215,9 +215,9 @@ int SrsRtspListener::listen(string ip, int port)
srs_info
(
"listen thread cid=%d, current_cid=%d, "
"listen at port=%d, type=%d, fd=%d started success, ep=%s:%d"
,
pthread
->
cid
(),
_srs_context
->
get_id
(),
_port
,
_
type
,
fd
,
ip
.
c_str
(),
port
);
pthread
->
cid
(),
_srs_context
->
get_id
(),
port
,
type
,
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
());
srs_trace
(
"%s listen at tcp://%s:%d, fd=%d"
,
srs_listener_type2string
(
type
).
c_str
(),
ip
.
c_str
(),
port
,
listener
->
fd
());
return
ret
;
}
...
...
@@ -234,14 +234,14 @@ int SrsRtspListener::on_tcp_client(st_netfd_t stfd)
return
ret
;
}
SrsHttpFlvListener
::
SrsHttpFlvListener
(
SrsServer
*
s
erver
,
SrsListenerType
type
,
SrsConfDirective
*
c
)
:
SrsListener
(
server
,
type
)
SrsHttpFlvListener
::
SrsHttpFlvListener
(
SrsServer
*
s
vr
,
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
)
{
srs_assert
(
type
==
SrsListenerFlv
);
if
(
type
==
SrsListenerFlv
)
{
caster
=
new
SrsAppCasterFlv
(
c
);
}
}
...
...
@@ -252,16 +252,16 @@ SrsHttpFlvListener::~SrsHttpFlvListener()
srs_freep
(
listener
);
}
int
SrsHttpFlvListener
::
listen
(
string
i
p
,
int
port
)
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
);
srs_assert
(
type
==
SrsListenerFlv
);
_ip
=
ip
;
_port
=
port
;
ip
=
i
;
port
=
p
;
if
((
ret
=
caster
->
initialize
())
!=
ERROR_SUCCESS
)
{
return
ret
;
...
...
@@ -277,9 +277,9 @@ int SrsHttpFlvListener::listen(string ip, int port)
srs_info
(
"listen thread cid=%d, current_cid=%d, "
"listen at port=%d, type=%d, fd=%d started success, ep=%s:%d"
,
pthread
->
cid
(),
_srs_context
->
get_id
(),
_port
,
_
type
,
fd
,
ip
.
c_str
(),
port
);
pthread
->
cid
(),
_srs_context
->
get_id
(),
port
,
type
,
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
());
srs_trace
(
"%s listen at tcp://%s:%d, fd=%d"
,
srs_listener_type2string
(
type
).
c_str
(),
ip
.
c_str
(),
port
,
listener
->
fd
());
return
ret
;
}
...
...
@@ -295,36 +295,29 @@ int SrsHttpFlvListener::on_tcp_client(st_netfd_t stfd)
return
ret
;
}
#endif
SrsUdp
CasterListener
::
SrsUdpCasterListener
(
SrsServer
*
server
,
SrsListenerType
type
,
SrsConfDirective
*
c
)
:
SrsListener
(
server
,
type
)
SrsUdp
StreamListener
::
SrsUdpStreamListener
(
SrsServer
*
svr
,
SrsListenerType
t
,
ISrsUdpHandler
*
c
)
:
SrsListener
(
svr
,
t
)
{
_type
=
type
;
listener
=
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
);
}
caster
=
c
;
}
SrsUdp
CasterListener
::~
SrsUdpCaster
Listener
()
SrsUdp
StreamListener
::~
SrsUdpStream
Listener
()
{
srs_freep
(
caster
);
srs_freep
(
listener
);
}
int
SrsUdp
CasterListener
::
listen
(
string
ip
,
int
port
)
int
SrsUdp
StreamListener
::
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
==
SrsListenerMpegTsOverUdp
);
srs_assert
(
type
==
SrsListenerMpegTsOverUdp
);
_ip
=
ip
;
_port
=
port
;
ip
=
i
;
port
=
p
;
srs_freep
(
listener
);
listener
=
new
SrsUdpListener
(
caster
,
ip
,
port
);
...
...
@@ -336,12 +329,28 @@ int SrsUdpCasterListener::listen(string ip, int port)
srs_info
(
"listen thread cid=%d, current_cid=%d, "
"listen at port=%d, type=%d, fd=%d started success, ep=%s:%d"
,
pthread
->
cid
(),
_srs_context
->
get_id
(),
_port
,
_
type
,
fd
,
ip
.
c_str
(),
port
);
pthread
->
cid
(),
_srs_context
->
get_id
(),
port
,
type
,
fd
,
ip
.
c_str
(),
port
);
srs_trace
(
"%s listen at udp://%s:%d, fd=%d"
,
srs_listener_type2string
(
_type
).
c_str
(),
ip
.
c_str
(),
_
port
,
listener
->
fd
());
srs_trace
(
"%s listen at udp://%s:%d, fd=%d"
,
srs_listener_type2string
(
type
).
c_str
(),
ip
.
c_str
(),
port
,
listener
->
fd
());
return
ret
;
}
#ifdef SRS_AUTO_STREAM_CASTER
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
);
}
}
SrsUdpCasterListener
::~
SrsUdpCasterListener
()
{
srs_freep
(
caster
);
}
#endif
SrsSignalManager
*
SrsSignalManager
::
instance
=
NULL
;
...
...
@@ -588,6 +597,34 @@ int SrsServer::initialize(ISrsServerCycle* cycle_handler)
return
ret
;
}
int
SrsServer
::
initialize_st
()
{
int
ret
=
ERROR_SUCCESS
;
// init st
if
((
ret
=
srs_init_st
())
!=
ERROR_SUCCESS
)
{
srs_error
(
"init st failed. ret=%d"
,
ret
);
return
ret
;
}
// @remark, st alloc segment use mmap, which only support 32757 threads,
// if need to support more, for instance, 100k threads, define the macro MALLOC_STACK.
// TODO: FIXME: maybe can use "sysctl vm.max_map_count" to refine.
if
(
_srs_config
->
get_max_connections
()
>
32756
)
{
ret
=
ERROR_ST_EXCEED_THREADS
;
srs_error
(
"st mmap for stack allocation must <= %d threads, "
"@see Makefile of st for MALLOC_STACK, please build st manually by "
"
\"
make EXTRA_CFLAGS=-DMALLOC_STACK linux-debug
\"
, ret=%d"
,
ret
);
return
ret
;
}
// set current log id.
_srs_context
->
generate_id
();
srs_trace
(
"server main cid=%d"
,
_srs_context
->
get_id
());
return
ret
;
}
int
SrsServer
::
initialize_signal
()
{
return
signal_manager
->
initialize
();
...
...
@@ -669,34 +706,6 @@ int SrsServer::acquire_pid_file()
return
ret
;
}
int
SrsServer
::
initialize_st
()
{
int
ret
=
ERROR_SUCCESS
;
// init st
if
((
ret
=
srs_init_st
())
!=
ERROR_SUCCESS
)
{
srs_error
(
"init st failed. ret=%d"
,
ret
);
return
ret
;
}
// @remark, st alloc segment use mmap, which only support 32757 threads,
// if need to support more, for instance, 100k threads, define the macro MALLOC_STACK.
// TODO: FIXME: maybe can use "sysctl vm.max_map_count" to refine.
if
(
_srs_config
->
get_max_connections
()
>
32756
)
{
ret
=
ERROR_ST_EXCEED_THREADS
;
srs_error
(
"st mmap for stack allocation must <= %d threads, "
"@see Makefile of st for MALLOC_STACK, please build st manually by "
"
\"
make EXTRA_CFLAGS=-DMALLOC_STACK linux-debug
\"
, ret=%d"
,
ret
);
return
ret
;
}
// set current log id.
_srs_context
->
generate_id
();
srs_trace
(
"server main cid=%d"
,
_srs_context
->
get_id
());
return
ret
;
}
int
SrsServer
::
listen
()
{
int
ret
=
ERROR_SUCCESS
;
...
...
@@ -959,6 +968,7 @@ int SrsServer::do_cycle()
}
#endif
#endif
srs_info
(
"server main thread loop"
);
}
}
...
...
@@ -1103,7 +1113,7 @@ void SrsServer::close_listeners(SrsListenerType type)
for
(
it
=
listeners
.
begin
();
it
!=
listeners
.
end
();)
{
SrsListener
*
listener
=
*
it
;
if
(
listener
->
type
()
!=
type
)
{
if
(
listener
->
listen_
type
()
!=
type
)
{
++
it
;
continue
;
}
...
...
@@ -1264,7 +1274,7 @@ int SrsServer::on_reload_http_stream_enabled()
#ifdef SRS_AUTO_HTTP_SERVER
ret
=
listen_http_stream
();
#endif
return
ret
;
}
...
...
trunk/src/app/srs_app_server.hpp
查看文件 @
44bc797
...
...
@@ -80,17 +80,17 @@ enum SrsListenerType
class
SrsListener
{
protected
:
SrsListenerType
_
type
;
SrsListenerType
type
;
protected
:
std
::
string
_ip
;
int
_port
;
SrsServer
*
_server
;
std
::
string
ip
;
int
port
;
SrsServer
*
server
;
public
:
SrsListener
(
SrsServer
*
s
erver
,
SrsListenerType
type
);
SrsListener
(
SrsServer
*
s
vr
,
SrsListenerType
t
);
virtual
~
SrsListener
();
public
:
virtual
SrsListenerType
type
();
virtual
int
listen
(
std
::
string
ip
,
int
port
)
=
0
;
virtual
SrsListenerType
listen_type
();
virtual
int
listen
(
std
::
string
i
,
int
p
)
=
0
;
};
/**
...
...
@@ -120,10 +120,10 @@ private:
SrsTcpListener
*
listener
;
ISrsTcpHandler
*
caster
;
public
:
SrsRtspListener
(
SrsServer
*
s
erver
,
SrsListenerType
type
,
SrsConfDirective
*
c
);
SrsRtspListener
(
SrsServer
*
s
vr
,
SrsListenerType
t
,
SrsConfDirective
*
c
);
virtual
~
SrsRtspListener
();
public
:
virtual
int
listen
(
std
::
string
i
p
,
int
port
);
virtual
int
listen
(
std
::
string
i
,
int
p
);
// ISrsTcpHandler
public:
virtual
int
on_tcp_client
(
st_netfd_t
stfd
);
...
...
@@ -138,28 +138,40 @@ private:
SrsTcpListener
*
listener
;
SrsAppCasterFlv
*
caster
;
public
:
SrsHttpFlvListener
(
SrsServer
*
s
erver
,
SrsListenerType
type
,
SrsConfDirective
*
c
);
SrsHttpFlvListener
(
SrsServer
*
s
vr
,
SrsListenerType
t
,
SrsConfDirective
*
c
);
virtual
~
SrsHttpFlvListener
();
public
:
virtual
int
listen
(
std
::
string
i
p
,
int
port
);
virtual
int
listen
(
std
::
string
i
,
int
p
);
// ISrsTcpHandler
public:
virtual
int
on_tcp_client
(
st_netfd_t
stfd
);
};
#endif
/**
* the udp listener, for udp server.
*/
class
SrsUdpCasterListener
:
public
SrsListener
* the udp listener, for udp server.
*/
class
SrsUdpStreamListener
:
public
SrsListener
{
pr
ivate
:
pr
otected
:
SrsUdpListener
*
listener
;
ISrsUdpHandler
*
caster
;
public
:
SrsUdpCasterListener
(
SrsServer
*
server
,
SrsListenerType
type
,
SrsConfDirective
*
c
);
virtual
~
SrsUdpCasterListener
();
SrsUdpStreamListener
(
SrsServer
*
svr
,
SrsListenerType
t
,
ISrsUdpHandler
*
c
);
virtual
~
SrsUdpStreamListener
();
public
:
virtual
int
listen
(
std
::
string
ip
,
int
port
);
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
...
...
@@ -337,7 +349,7 @@ public:
* @param client_stfd, the client fd in st boxed, the underlayer fd.
*/
virtual
int
accept_client
(
SrsListenerType
type
,
st_netfd_t
client_stfd
);
// interface ISrs
Thre
adHandler.
// interface ISrs
Relo
adHandler.
public:
virtual
int
on_reload_listen
();
virtual
int
on_reload_pid
();
...
...
trunk/src/core/srs_core.hpp
查看文件 @
44bc797
...
...
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// current release version
#define VERSION_MAJOR 2
#define VERSION_MINOR 0
#define VERSION_REVISION 16
2
#define VERSION_REVISION 16
3
// server info.
#define RTMP_SIG_SRS_KEY "SRS"
...
...
trunk/src/main/srs_main_ingest_hls.cpp
查看文件 @
44bc797
...
...
@@ -723,8 +723,8 @@ int SrsIngestSrsOutput::on_ts_message(SrsTsMessage* msg)
// because when audio stream_number is 0, the elementary is ADTS(aac-mp4a-format-ISO_IEC_14496-3+2001.pdf, page 75, 1.A.2.2 ADTS).
// about the bytes of PES_packet_data_byte, defined in hls-mpeg-ts-iso13818-1.pdf, page 58
// PES_packet_data_byte "C PES_packet_data_bytes shall be contiguous bytes of data from the elementary stream
// indicated by the packets stream_id or PID. When the elementary stream data conforms to ITU-T
// PES_packet_data_byte ¨C PES_packet_data_bytes shall be contiguous bytes of data from the elementary stream
// indicated by the packet¡¯s stream_id or PID. When the elementary stream data conforms to ITU-T
// Rec. H.262 | ISO/IEC 13818-2 or ISO/IEC 13818-3, the PES_packet_data_bytes shall be byte aligned to the bytes of this
// Recommendation | International Standard. The byte-order of the elementary stream shall be preserved. The number of
// PES_packet_data_bytes, N, is specified by the PES_packet_length field. N shall be equal to the value indicated in the
...
...
@@ -735,12 +735,12 @@ int SrsIngestSrsOutput::on_ts_message(SrsTsMessage* msg)
// PES_packet_data_byte field are user definable and will not be specified by ITU-T | ISO/IEC in the future.
// about the bytes of stream_id, define in hls-mpeg-ts-iso13818-1.pdf, page 49
// stream_id
"
C In Program Streams, the stream_id specifies the type and number of the elementary stream as defined by the
// stream_id
¨
C In Program Streams, the stream_id specifies the type and number of the elementary stream as defined by the
// stream_id Table 2-18. In Transport Streams, the stream_id may be set to any valid value which correctly describes the
// elementary stream type as defined in Table 2-18. In Transport Streams, the elementary stream type is specified in the
// Program Specific Information as specified in 2.4.4.
// about the stream_id table, define in Table 2-18
"
C Stream_id assignments, hls-mpeg-ts-iso13818-1.pdf, page 52.
// about the stream_id table, define in Table 2-18
¨
C Stream_id assignments, hls-mpeg-ts-iso13818-1.pdf, page 52.
//
// 110x xxxx
// ISO/IEC 13818-3 or ISO/IEC 11172-3 or ISO/IEC 13818-7 or ISO/IEC
...
...
trunk/src/main/srs_main_server.cpp
查看文件 @
44bc797
...
...
@@ -344,15 +344,15 @@ int run_master()
{
int
ret
=
ERROR_SUCCESS
;
if
((
ret
=
_srs_server
->
initialize_s
ignal
())
!=
ERROR_SUCCESS
)
{
if
((
ret
=
_srs_server
->
initialize_s
t
())
!=
ERROR_SUCCESS
)
{
return
ret
;
}
if
((
ret
=
_srs_server
->
acquire_pid_file
())
!=
ERROR_SUCCESS
)
{
if
((
ret
=
_srs_server
->
initialize_signal
())
!=
ERROR_SUCCESS
)
{
return
ret
;
}
if
((
ret
=
_srs_server
->
initialize_st
())
!=
ERROR_SUCCESS
)
{
if
((
ret
=
_srs_server
->
acquire_pid_file
())
!=
ERROR_SUCCESS
)
{
return
ret
;
}
...
...
trunk/src/protocol/srs_rtmp_sdk.cpp
查看文件 @
44bc797
...
...
@@ -38,36 +38,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
using
namespace
std
;
/**
* the signature for packets to client.
*/
#define RTMP_SIG_FMS_VER "3,5,3,888"
#define RTMP_SIG_AMF0_VER 0
#define RTMP_SIG_CLIENT_ID "ASAICiss"
/**
* onStatus consts.
*/
#define StatusLevel "level"
#define StatusCode "code"
#define StatusDescription "description"
#define StatusDetails "details"
#define StatusClientId "clientid"
// status value
#define StatusLevelStatus "status"
// status error
#define StatusLevelError "error"
// code value
#define StatusCodeConnectSuccess "NetConnection.Connect.Success"
#define StatusCodeConnectRejected "NetConnection.Connect.Rejected"
#define StatusCodeStreamReset "NetStream.Play.Reset"
#define StatusCodeStreamStart "NetStream.Play.Start"
#define StatusCodeStreamPause "NetStream.Pause.Notify"
#define StatusCodeStreamUnpause "NetStream.Unpause.Notify"
#define StatusCodePublishStart "NetStream.Publish.Start"
#define StatusCodeDataStart "NetStream.Data.Start"
#define StatusCodeUnpublishSuccess "NetStream.Unpublish.Success"
// FMLE
#define RTMP_AMF0_COMMAND_ON_FC_PUBLISH "onFCPublish"
#define RTMP_AMF0_COMMAND_ON_FC_UNPUBLISH "onFCUnpublish"
...
...
trunk/src/protocol/srs_rtmp_sdk.hpp
查看文件 @
44bc797
...
...
@@ -49,6 +49,36 @@ class SrsAmf0Object;
class
IMergeReadHandler
;
/**
* the signature for packets to client.
*/
#define RTMP_SIG_FMS_VER "3,5,3,888"
#define RTMP_SIG_AMF0_VER 0
#define RTMP_SIG_CLIENT_ID "ASAICiss"
/**
* onStatus consts.
*/
#define StatusLevel "level"
#define StatusCode "code"
#define StatusDescription "description"
#define StatusDetails "details"
#define StatusClientId "clientid"
// status value
#define StatusLevelStatus "status"
// status error
#define StatusLevelError "error"
// code value
#define StatusCodeConnectSuccess "NetConnection.Connect.Success"
#define StatusCodeConnectRejected "NetConnection.Connect.Rejected"
#define StatusCodeStreamReset "NetStream.Play.Reset"
#define StatusCodeStreamStart "NetStream.Play.Start"
#define StatusCodeStreamPause "NetStream.Pause.Notify"
#define StatusCodeStreamUnpause "NetStream.Unpause.Notify"
#define StatusCodePublishStart "NetStream.Publish.Start"
#define StatusCodeDataStart "NetStream.Data.Start"
#define StatusCodeUnpublishSuccess "NetStream.Unpublish.Success"
/**
* the original request from client.
*/
class
SrsRequest
...
...
trunk/src/protocol/srs_rtmp_stack.cpp
查看文件 @
44bc797
...
...
@@ -47,89 +47,6 @@ using namespace std;
*****************************************************************************
****************************************************************************/
/**
5. Protocol Control Messages
RTMP reserves message type IDs 1-7 for protocol control messages.
These messages contain information needed by the RTM Chunk Stream
protocol or RTMP itself. Protocol messages with IDs 1 & 2 are
reserved for usage with RTM Chunk Stream protocol. Protocol messages
with IDs 3-6 are reserved for usage of RTMP. Protocol message with ID
7 is used between edge server and origin server.
*/
#define RTMP_MSG_SetChunkSize 0x01
#define RTMP_MSG_AbortMessage 0x02
#define RTMP_MSG_Acknowledgement 0x03
#define RTMP_MSG_UserControlMessage 0x04
#define RTMP_MSG_WindowAcknowledgementSize 0x05
#define RTMP_MSG_SetPeerBandwidth 0x06
#define RTMP_MSG_EdgeAndOriginServerCommand 0x07
/**
3. Types of messages
The server and the client send messages over the network to
communicate with each other. The messages can be of any type which
includes audio messages, video messages, command messages, shared
object messages, data messages, and user control messages.
3.1. Command message
Command messages carry the AMF-encoded commands between the client
and the server. These messages have been assigned message type value
of 20 for AMF0 encoding and message type value of 17 for AMF3
encoding. These messages are sent to perform some operations like
connect, createStream, publish, play, pause on the peer. Command
messages like onstatus, result etc. are used to inform the sender
about the status of the requested commands. A command message
consists of command name, transaction ID, and command object that
contains related parameters. A client or a server can request Remote
Procedure Calls (RPC) over streams that are communicated using the
command messages to the peer.
*/
#define RTMP_MSG_AMF3CommandMessage 17 // 0x11
#define RTMP_MSG_AMF0CommandMessage 20 // 0x14
/**
3.2. Data message
The client or the server sends this message to send Metadata or any
user data to the peer. Metadata includes details about the
data(audio, video etc.) like creation time, duration, theme and so
on. These messages have been assigned message type value of 18 for
AMF0 and message type value of 15 for AMF3.
*/
#define RTMP_MSG_AMF0DataMessage 18 // 0x12
#define RTMP_MSG_AMF3DataMessage 15 // 0x0F
/**
3.3. Shared object message
A shared object is a Flash object (a collection of name value pairs)
that are in synchronization across multiple clients, instances, and
so on. The message types kMsgContainer=19 for AMF0 and
kMsgContainerEx=16 for AMF3 are reserved for shared object events.
Each message can contain multiple events.
*/
#define RTMP_MSG_AMF3SharedObject 16 // 0x10
#define RTMP_MSG_AMF0SharedObject 19 // 0x13
/**
3.4. Audio message
The client or the server sends this message to send audio data to the
peer. The message type value of 8 is reserved for audio messages.
*/
#define RTMP_MSG_AudioMessage 8 // 0x08
/* *
3.5. Video message
The client or the server sends this message to send video data to the
peer. The message type value of 9 is reserved for video messages.
These messages are large and can delay the sending of other type of
messages. To avoid such a situation, the video message is assigned
the lowest priority.
*/
#define RTMP_MSG_VideoMessage 9 // 0x09
/**
3.6. Aggregate message
An aggregate message is a single message that contains a list of submessages.
The message type value of 22 is reserved for aggregate
messages.
*/
#define RTMP_MSG_AggregateMessage 22 // 0x16
/****************************************************************************
*****************************************************************************
****************************************************************************/
/**
* 6.1.2. Chunk Message Header
* There are four different formats for the chunk message header,
* selected by the "fmt" field in the chunk basic header.
...
...
@@ -173,24 +90,6 @@ messages.
*****************************************************************************
****************************************************************************/
/**
* amf0 command message, command name macros
*/
#define RTMP_AMF0_COMMAND_CONNECT "connect"
#define RTMP_AMF0_COMMAND_CREATE_STREAM "createStream"
#define RTMP_AMF0_COMMAND_CLOSE_STREAM "closeStream"
#define RTMP_AMF0_COMMAND_PLAY "play"
#define RTMP_AMF0_COMMAND_PAUSE "pause"
#define RTMP_AMF0_COMMAND_ON_BW_DONE "onBWDone"
#define RTMP_AMF0_COMMAND_ON_STATUS "onStatus"
#define RTMP_AMF0_COMMAND_RESULT "_result"
#define RTMP_AMF0_COMMAND_ERROR "_error"
#define RTMP_AMF0_COMMAND_RELEASE_STREAM "releaseStream"
#define RTMP_AMF0_COMMAND_FC_PUBLISH "FCPublish"
#define RTMP_AMF0_COMMAND_UNPUBLISH "FCUnpublish"
#define RTMP_AMF0_COMMAND_PUBLISH "publish"
#define RTMP_AMF0_DATA_SAMPLE_ACCESS "|RtmpSampleAccess"
/**
* band width check method name, which will be invoked by client.
* band width check mothods use SrsBandwidthPacket as its internal packet type,
* so ensure you set command name when you use it.
...
...
trunk/src/protocol/srs_rtmp_stack.hpp
查看文件 @
44bc797
...
...
@@ -57,6 +57,110 @@ class SrsSharedPtrMessage;
class
IMergeReadHandler
;
/****************************************************************************
*****************************************************************************
****************************************************************************/
/**
5. Protocol Control Messages
RTMP reserves message type IDs 1-7 for protocol control messages.
These messages contain information needed by the RTM Chunk Stream
protocol or RTMP itself. Protocol messages with IDs 1 & 2 are
reserved for usage with RTM Chunk Stream protocol. Protocol messages
with IDs 3-6 are reserved for usage of RTMP. Protocol message with ID
7 is used between edge server and origin server.
*/
#define RTMP_MSG_SetChunkSize 0x01
#define RTMP_MSG_AbortMessage 0x02
#define RTMP_MSG_Acknowledgement 0x03
#define RTMP_MSG_UserControlMessage 0x04
#define RTMP_MSG_WindowAcknowledgementSize 0x05
#define RTMP_MSG_SetPeerBandwidth 0x06
#define RTMP_MSG_EdgeAndOriginServerCommand 0x07
/**
3. Types of messages
The server and the client send messages over the network to
communicate with each other. The messages can be of any type which
includes audio messages, video messages, command messages, shared
object messages, data messages, and user control messages.
3.1. Command message
Command messages carry the AMF-encoded commands between the client
and the server. These messages have been assigned message type value
of 20 for AMF0 encoding and message type value of 17 for AMF3
encoding. These messages are sent to perform some operations like
connect, createStream, publish, play, pause on the peer. Command
messages like onstatus, result etc. are used to inform the sender
about the status of the requested commands. A command message
consists of command name, transaction ID, and command object that
contains related parameters. A client or a server can request Remote
Procedure Calls (RPC) over streams that are communicated using the
command messages to the peer.
*/
#define RTMP_MSG_AMF3CommandMessage 17 // 0x11
#define RTMP_MSG_AMF0CommandMessage 20 // 0x14
/**
3.2. Data message
The client or the server sends this message to send Metadata or any
user data to the peer. Metadata includes details about the
data(audio, video etc.) like creation time, duration, theme and so
on. These messages have been assigned message type value of 18 for
AMF0 and message type value of 15 for AMF3.
*/
#define RTMP_MSG_AMF0DataMessage 18 // 0x12
#define RTMP_MSG_AMF3DataMessage 15 // 0x0F
/**
3.3. Shared object message
A shared object is a Flash object (a collection of name value pairs)
that are in synchronization across multiple clients, instances, and
so on. The message types kMsgContainer=19 for AMF0 and
kMsgContainerEx=16 for AMF3 are reserved for shared object events.
Each message can contain multiple events.
*/
#define RTMP_MSG_AMF3SharedObject 16 // 0x10
#define RTMP_MSG_AMF0SharedObject 19 // 0x13
/**
3.4. Audio message
The client or the server sends this message to send audio data to the
peer. The message type value of 8 is reserved for audio messages.
*/
#define RTMP_MSG_AudioMessage 8 // 0x08
/* *
3.5. Video message
The client or the server sends this message to send video data to the
peer. The message type value of 9 is reserved for video messages.
These messages are large and can delay the sending of other type of
messages. To avoid such a situation, the video message is assigned
the lowest priority.
*/
#define RTMP_MSG_VideoMessage 9 // 0x09
/**
3.6. Aggregate message
An aggregate message is a single message that contains a list of submessages.
The message type value of 22 is reserved for aggregate
messages.
*/
#define RTMP_MSG_AggregateMessage 22 // 0x16
/****************************************************************************
*****************************************************************************
****************************************************************************/
/**
* amf0 command message, command name macros
*/
#define RTMP_AMF0_COMMAND_CONNECT "connect"
#define RTMP_AMF0_COMMAND_CREATE_STREAM "createStream"
#define RTMP_AMF0_COMMAND_CLOSE_STREAM "closeStream"
#define RTMP_AMF0_COMMAND_PLAY "play"
#define RTMP_AMF0_COMMAND_PAUSE "pause"
#define RTMP_AMF0_COMMAND_ON_BW_DONE "onBWDone"
#define RTMP_AMF0_COMMAND_ON_STATUS "onStatus"
#define RTMP_AMF0_COMMAND_RESULT "_result"
#define RTMP_AMF0_COMMAND_ERROR "_error"
#define RTMP_AMF0_COMMAND_RELEASE_STREAM "releaseStream"
#define RTMP_AMF0_COMMAND_FC_PUBLISH "FCPublish"
#define RTMP_AMF0_COMMAND_UNPUBLISH "FCUnpublish"
#define RTMP_AMF0_COMMAND_PUBLISH "publish"
#define RTMP_AMF0_DATA_SAMPLE_ACCESS "|RtmpSampleAccess"
/****************************************************************************
*****************************************************************************
****************************************************************************/
/**
...
...
trunk/src/protocol/srs_rtmp_utility.cpp
查看文件 @
44bc797
...
...
@@ -78,22 +78,22 @@ void srs_vhost_resolve(string& vhost, string& app, string& param)
app
=
srs_string_replace
(
app
,
"&&"
,
"?"
);
app
=
srs_string_replace
(
app
,
"="
,
"?"
);
if
((
pos
=
app
.
find
(
"?"
))
==
std
::
string
::
npos
)
{
return
;
}
std
::
string
query
=
app
.
substr
(
pos
+
1
);
app
=
app
.
substr
(
0
,
pos
);
if
((
pos
=
query
.
find
(
"vhost?"
))
!=
std
::
string
::
npos
)
{
query
=
query
.
substr
(
pos
+
6
);
if
(
!
query
.
empty
())
{
vhost
=
query
;
}
if
((
pos
=
vhost
.
find
(
"?"
))
!=
std
::
string
::
npos
)
{
vhost
=
vhost
.
substr
(
0
,
pos
);
if
((
pos
=
app
.
find
(
"?"
))
!=
std
::
string
::
npos
)
{
std
::
string
query
=
app
.
substr
(
pos
+
1
);
app
=
app
.
substr
(
0
,
pos
);
if
((
pos
=
query
.
find
(
"vhost?"
))
!=
std
::
string
::
npos
)
{
query
=
query
.
substr
(
pos
+
6
);
if
(
!
query
.
empty
())
{
vhost
=
query
;
}
if
((
pos
=
vhost
.
find
(
"?"
))
!=
std
::
string
::
npos
)
{
vhost
=
vhost
.
substr
(
0
,
pos
);
}
}
}
/* others */
}
void
srs_random_generate
(
char
*
bytes
,
int
size
)
...
...
trunk/src/protocol/srs_rtmp_utility.hpp
查看文件 @
44bc797
...
...
@@ -63,7 +63,9 @@ extern void srs_discovery_tc_url(
* app...vhost...request_vhost
* @param param, the query, for example, ?vhost=xxx
*/
extern
void
srs_vhost_resolve
(
std
::
string
&
vhost
,
std
::
string
&
app
,
std
::
string
&
param
);
extern
void
srs_vhost_resolve
(
std
::
string
&
vhost
,
std
::
string
&
app
,
std
::
string
&
param
);
/**
* generate ramdom data for handshake.
...
...
请
注册
或
登录
后发表评论