1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

fixbug[play packet decode bug: srs only read bool type play reset value, actually this value can be bool or number]

This commit is contained in:
wenjiegit 2014-01-02 14:00:00 +08:00
commit bfef0eebfe
74 changed files with 1591 additions and 1050 deletions

4
AUTHORS.txt Normal file
View file

@ -0,0 +1,4 @@
Authors ordered by first contribution.
* winlin <winlin@vip.126.com>
* wenjie

View file

@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

188
README.md
View file

@ -1,68 +1,74 @@
simple-rtmp-server Simple-RTMP-Server
================== ==================
srs(simple rtmp origin live server) over state-threads.<br/> SRS(SIMPLE RTMP Server) over state-threads created in 2013.<br/>
srs is a simple, high-performance, running in single process, origin live server.<br/> SRS is a simple, high-performance, running in single process, origin live server.<br/>
srs supports vhost, rtmp, HLS, transcoding, forward, http hooks. <br/> SRS supports vhost, rtmp, HLS, transcoding, forward, http hooks. <br/>
blog: [http://blog.csdn.net/win_lin](http://blog.csdn.net/win_lin) <br/> Blog: [http://blog.csdn.net/win_lin](http://blog.csdn.net/win_lin) <br/>
see also: [https://github.com/winlinvip/simple-rtmp-server](https://github.com/winlinvip/simple-rtmp-server) <br/> See also: [https://github.com/winlinvip/simple-rtmp-server](https://github.com/winlinvip/simple-rtmp-server) <br/>
see also: [http://winlinvip.github.io/simple-rtmp-server](http://winlinvip.github.io/simple-rtmp-server) <br/> See also: [http://winlinvip.github.io/simple-rtmp-server](http://winlinvip.github.io/simple-rtmp-server) <br/>
TencentQQ: [http://url.cn/WAHICw](http://url.cn/WAHICw) (Group: 212189142) TencentQQ: [http://url.cn/WAHICw](http://url.cn/WAHICw) (Group: 212189142)
### Contributors ### AUTHORS
winlin([winterserver](#)): [http://blog.csdn.net/win_lin](http://blog.csdn.net/win_lin) <br/> The PRIMARY AUTHORS are (and/or have been)(Authors ordered by first contribution): <br/>
wenjie([wenjiegit](https://github.com/wenjiegit/simple-rtmp-server)): [http://blog.chinaunix.net/uid/25006789.html](http://blog.chinaunix.net/uid/25006789.html) <br/> * winlin([winterserver](#)): [http://blog.csdn.net/win_lin](http://blog.csdn.net/win_lin) <br/>
about the contributors: <br/> * wenjie([wenjiegit](https://github.com/wenjiegit/simple-rtmp-server)): [http://blog.chinaunix.net/uid/25006789.html](http://blog.chinaunix.net/uid/25006789.html) <br/>
1. contribute important features to srs. <br/>
2. the name of all contributors will send in the response of NetConnection.connect and metadata. About the primary AUTHORS: <br/>
* Contribute important features to SRS. <br/>
* Names of all PRIMARY AUTHORS response in NetConnection.connect and metadata. <br/>
And here is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS --<br/>
people who have submitted patches, reported bugs, added translations, helped<br/>
answer newbie questions, and generally made SRS that much better: [AUTHORS.txt](https://github.com/winlinvip/simple-rtmp-server/blob/master/AUTHORS.txt)
### Usage(simple) ### Usage(simple)
<strong>step -1:</strong> get srs<br/> <strong>Step -1:</strong> get SRS<br/>
<pre> <pre>
git clone https://github.com/winlinvip/simple-rtmp-server && git clone https://github.com/winlinvip/simple-rtmp-server &&
cd simple-rtmp-server/trunk cd simple-rtmp-server/trunk
</pre> </pre>
<strong>step 0:</strong> build srs system.<br/> <strong>Step 0:</strong> build SRS system.<br/>
<pre> <pre>
bash scripts/build.sh bash scripts/build.sh
</pre> </pre>
<strong>step 1:</strong> start srs all demo features.<br/> <strong>Step 1:</strong> start SRS all demo features.<br/>
<pre> <pre>
bash scripts/run.sh bash scripts/run.sh
</pre> </pre>
<strong>step 2:</strong> srs live show: [http://your-server-ip](http://your-server-ip) <br/> <strong>Step 2:</strong> SRS live show: [http://your-server-ip](http://your-server-ip) <br/>
<strong>step 3:</strong> stop srs demo<br/> <strong>Step 3:</strong> stop SRS demo<br/>
<pre> <pre>
bash scripts/stop.sh bash scripts/stop.sh
</pre> </pre>
### Usage(detail) ### Usage(detail)
<strong>step 0:</strong> get srs <br/> <strong>Step 0:</strong> get SRS <br/>
<pre> <pre>
git clone https://github.com/winlinvip/simple-rtmp-server && git clone https://github.com/winlinvip/simple-rtmp-server &&
cd simple-rtmp-server/trunk cd simple-rtmp-server/trunk
</pre> </pre>
<strong>step 1:</strong> build srs <br/> <strong>Step 1:</strong> build SRS <br/>
<pre> <pre>
./configure --with-ssl --with-hls --with-ffmpeg --with-http && make ./configure --with-ssl --with-hls --with-ffmpeg --with-http && make
</pre> </pre>
<strong>step 2:</strong> start srs <br/> <strong>Step 2:</strong> start SRS <br/>
<pre> <pre>
./objs/srs -c conf/srs.conf ./objs/srs -c conf/srs.conf
</pre> </pre>
<strong>step 3(optinal):</strong> start srs listen at 19350 to forward to<br/> <strong>Step 3(optinal):</strong> start SRS listen at 19350 to forward to<br/>
<pre> <pre>
./objs/srs -c conf/srs.19350.conf ./objs/srs -c conf/srs.19350.conf
</pre> </pre>
<strong>step 4(optinal):</strong> start nginx for HLS <br/> <strong>Step 4(optinal):</strong> start nginx for HLS <br/>
<pre> <pre>
sudo ./objs/nginx/sbin/nginx sudo ./objs/nginx/sbin/nginx
</pre> </pre>
<strong>step 5(optinal):</strong> start http hooks for srs callback <br/> <strong>Step 5(optinal):</strong> start http hooks for SRS callback <br/>
<pre> <pre>
python ./research/api-server/server.py 8085 python ./research/api-server/server.py 8085
</pre> </pre>
<strong>step 6:</strong> publish demo live stream <br/> <strong>Step 6:</strong> publish demo live stream <br/>
<pre> <pre>
FMS URL: rtmp://127.0.0.1/live?vhost=demo.srs.com FMS URL: rtmp://127.0.0.1/live?vhost=demo.srs.com
Stream: livestream Stream: livestream
@ -74,7 +80,7 @@ FFMPEG to publish the default demo stream:
sleep 1; \ sleep 1; \
done done
</pre> </pre>
<strong>step 7:</strong> publish players live stream <br/> <strong>Step 7:</strong> publish players live stream <br/>
<pre> <pre>
FMS URL: rtmp://127.0.0.1/live?vhost=players FMS URL: rtmp://127.0.0.1/live?vhost=players
Stream: livestream Stream: livestream
@ -86,7 +92,7 @@ FFMPEG to publish the players demo stream:
sleep 1; \ sleep 1; \
done done
</pre> </pre>
<strong>step 8:</strong> add server ip to client hosts as demo. <br/> <strong>Step 8:</strong> add server ip to client hosts as demo. <br/>
<pre> <pre>
# edit the folowing file: # edit the folowing file:
# linux: /etc/hosts # linux: /etc/hosts
@ -94,14 +100,14 @@ FFMPEG to publish the players demo stream:
# where server ip is 192.168.2.111 # where server ip is 192.168.2.111
192.168.2.111 demo.srs.com 192.168.2.111 demo.srs.com
</pre> </pre>
<strong>step 9:</strong> play live stream. <br/> <strong>Step 9:</strong> play live stream. <br/>
<pre> <pre>
players: http://demo.srs.com/players players: http://demo.srs.com/players
rtmp url: rtmp://demo.srs.com/live/livestream rtmp url: rtmp://demo.srs.com/live/livestream
m3u8 url: http://demo.srs.com/live/livestream.m3u8 m3u8 url: http://demo.srs.com/live/livestream.m3u8
for android: http://demo.srs.com/live/livestream.html for android: http://demo.srs.com/live/livestream.html
</pre> </pre>
<strong>step 10(optinal):</strong> play live stream auto transcoded<br/> <strong>Step 10(optinal):</strong> play live stream auto transcoded<br/>
<pre> <pre>
rtmp url: rtmp://demo.srs.com/live/livestream_ld rtmp url: rtmp://demo.srs.com/live/livestream_ld
m3u8 url: http://demo.srs.com/live/livestream_ld.m3u8 m3u8 url: http://demo.srs.com/live/livestream_ld.m3u8
@ -110,7 +116,7 @@ rtmp url: rtmp://demo.srs.com/live/livestream_sd
m3u8 url: http://demo.srs.com/live/livestream_sd.m3u8 m3u8 url: http://demo.srs.com/live/livestream_sd.m3u8
for android: http://demo.srs.com/live/livestream_sd.html for android: http://demo.srs.com/live/livestream_sd.html
</pre> </pre>
<strong>step 11(optinal):</strong> play live stream auto forwarded, the hls dir change to /forward<br/> <strong>Step 11(optinal):</strong> play live stream auto forwarded, the hls dir change to /forward<br/>
<pre> <pre>
rtmp url: rtmp://demo.srs.com:19350/live/livestream rtmp url: rtmp://demo.srs.com:19350/live/livestream
m3u8 url: http://demo.srs.com/forward/live/livestream.m3u8 m3u8 url: http://demo.srs.com/forward/live/livestream.m3u8
@ -122,7 +128,7 @@ rtmp url: rtmp://demo.srs.com:19350/live/livestream_sd
m3u8 url: http://demo.srs.com/forward/live/livestream_sd.m3u8 m3u8 url: http://demo.srs.com/forward/live/livestream_sd.m3u8
for android: http://demo.srs.com/forward/live/livestream_sd.html for android: http://demo.srs.com/forward/live/livestream_sd.html
</pre> </pre>
<strong>step 12(optinal):</strong> modify the config and reload it (all features support reload)<br/> <strong>Step 12(optinal):</strong> modify the config and reload it (all features support reload)<br/>
<pre> <pre>
killall -1 srs killall -1 srs
</pre> </pre>
@ -135,7 +141,7 @@ killall -s SIGHUP srs
System Architecture: System Architecture:
<pre> <pre>
+------------------------------------------------------+ +------------------------------------------------------+
| SRS(Simple Rtmp Server) | | SRS(Simple RTMP Server) |
+---------------+---------------+-----------+----------+ +---------------+---------------+-----------+----------+
| API/hook | Transcoder | HLS | RTMP | | API/hook | Transcoder | HLS | RTMP |
| http-parser | FFMPEG/x264 | NGINX/ts | protocol | | http-parser | FFMPEG/x264 | NGINX/ts | protocol |
@ -151,7 +157,7 @@ Stream Architecture:
+ Publish + + Deliver | + Publish + + Deliver |
+---|-----+ +----|-----+ +---|-----+ +----|-----+
+-----------+-------------------------+----------------+ +-----------+-------------------------+----------------+
| Encoder | SRS(Simple Rtmp Server) | Client | | Encoder | SRS(Simple RTMP Server) | Client |
+-----------+-------------------------+----------------+ +-----------+-------------------------+----------------+
| (FMLE, | +-> RTMP protocol ----+-> Flash Player | | (FMLE, | +-> RTMP protocol ----+-> Flash Player |
| FFMPEG, --+-> +-> HLS/NGINX --------+-> m3u8 player | | FFMPEG, --+-> +-> HLS/NGINX --------+-> m3u8 player |
@ -186,7 +192,7 @@ Bandwidth Test Workflow:
| final(2)-----------------> | | final(2)-----------------> |
| &lt;END> | | &lt;END> |
@see: class SrsBandwidth comments. @See: class SrsBandwidth comments.
</pre> </pre>
### System Requirements ### System Requirements
@ -195,37 +201,38 @@ Supported operating systems and hardware:
* All handware. * All handware.
### Summary ### Summary
1. simple: also stable enough.<br/> 1. Simple: also stable enough.<br/>
2. high-performance: single-thread, async socket, event/st-thread driven.<br/> 2. [High-performance](https://github.com/winlinvip/simple-rtmp-server/wiki/Performance): single-thread, async socket, event/st-thread driven.<br/>
3. no edge server, origin server only.<br/> 3. NO edge server, origin server only.<br/>
4. no vod streaming, live streaming only.<br/> 4. NO vod streaming, live streaming only.<br/>
5. no multiple processes, single process only.<br/> 5. NO multiple processes, single process only.<br/>
6. support vhost, support \_\_defaultVhost\_\_.<br/> 6. Support vhost, support \_\_defaultVhost\_\_.<br/>
7. support adobe rtmp live streaming.<br/> 7. Support adobe rtmp live streaming.<br/>
8. support apple hls(m3u8) live streaming.<br/> 8. Support apple hls(m3u8) live streaming.<br/>
9. support reload config to enable changes.<br/> 9. Support reload config to enable changes.<br/>
10. support cache last gop for flash player to fast startup.<br/> 10. Support cache last gop for flash player to fast startup.<br/>
11. support listen at multiple ports.<br/> 11. Support listen at multiple ports.<br/>
12. support long time(>4.6hours) publish/play.<br/> 12. Support long time(>4.6hours) publish/play.<br/>
13. high performace, 1800 connections(500kbps), 900Mbps, CPU 90.2%, 41MB<br/> 13. High performace, 1800 connections(500kbps), 900Mbps, CPU 90.2%, 41MB<br/>
14. support forward publish stream to build active-standby cluster.<br/> 14. Support forward publish stream to build active-standby [cluster](https://github.com/winlinvip/simple-rtmp-server/wiki/Cluster).<br/>
15. support broadcast by forward the stream to other servers(origin/edge).<br/> 15. Support broadcast by forward the stream to other servers(origin/edge).<br/>
16. support live stream transcoding by ffmpeg.<br/> 16. Support live stream transcoding by ffmpeg.<br/>
17. support live stream forward(acopy/vcopy) by ffmpeg.<br/> 17. Support live stream forward(acopy/vcopy) by ffmpeg.<br/>
18. support ffmpeg filters(logo/overlay/crop), x264 params.<br/> 18. Support ffmpeg filters(logo/overlay/crop), x264 params.<br/>
19. support audio transcode only, speex/mp3 to aac<br/> 19. Support audio transcode only, speex/mp3 to aac<br/>
20. support http callback api hooks(for authentication and injection).<br/> 20. Support http callback api hooks(for authentication and injection).<br/>
21. support bandwidth test api and flash client.<br/> 21. Support bandwidth test api and flash client.<br/>
22. player, publisher(encoder), and demo pages(jquery+bootstrap). <br/> 22. Player, publisher(encoder), and demo pages(jquery+bootstrap). <br/>
23. demo video meeting or chat(srs+cherrypy+jquery+bootstrap). <br/> 23. Demo video meeting or chat(SRS+cherrypy+jquery+bootstrap). <br/>
24. [plan] support network based cli and json result.<br/> 24. [dev] Full documents in wiki, in chineses. <br/>
25. [plan] support adobe flash refer/token/swf verification.<br/> 25. [plan] Support network based cli and json result.<br/>
26. [plan] support adobe amf3 codec.<br/> 26. [plan] Support adobe flash refer/token/swf verification.<br/>
27. [plan] support dvr(record live to vod file)<br/> 27. [plan] Support adobe amf3 codec.<br/>
28. [plan] support FMS edge protocol<br/> 28. [plan] Support dvr(record live to vod file)<br/>
29. [plan] support encryption: RTMPE/RTMPS, HLS DRM<br/> 29. [plan] Support FMS edge protocol<br/>
30. [plan] support RTMPT, http to tranverse firewalls<br/> 30. [plan] Support encryption: RTMPE/RTMPS, HLS DRM<br/>
31. [plan] support file source, transcoding file to live stream<br/> 31. [plan] Support RTMPT, http to tranverse firewalls<br/>
32. [plan] Support file source, transcoding file to live stream<br/>
### Performance ### Performance
1. 300 connections, 150Mbps, 500kbps, CPU 18.8%, 5956KB. 1. 300 connections, 150Mbps, 500kbps, CPU 18.8%, 5956KB.
@ -234,53 +241,54 @@ Supported operating systems and hardware:
4. 1200 connections, 600Mbps, 500kbps, CPU 72.4%, 15MB. 4. 1200 connections, 600Mbps, 500kbps, CPU 72.4%, 15MB.
5. 1500 connections, 750Mbps, 500kbps, CPU 81.9%, 28MB. 5. 1500 connections, 750Mbps, 500kbps, CPU 81.9%, 28MB.
6. 1800 connections, 900Mbps, 500kbps, CPU 90.2%, 41MB. 6. 1800 connections, 900Mbps, 500kbps, CPU 90.2%, 41MB.
<pre> <pre>
[winlin@dev6 srs]$ dstat
----total-cpu-usage---- -dsk/total- ---net/lo-- ---paging-- ---system-- ----total-cpu-usage---- -dsk/total- ---net/lo-- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw usr sys idl wai hiq siq| read writ| recv send| in out | int csw
58 9 32 0 0 1| 0 4168k| 277M 277M| 0 0 | 29k 25k 58 9 32 0 0 1| 0 4168k| 277M 277M| 0 0 | 29k 25k
61 8 30 0 0 1| 0 1168k| 336M 336M| 0 0 | 29k 24k 61 8 30 0 0 1| 0 1168k| 336M 336M| 0 0 | 29k 24k
63 8 27 0 0 1| 0 2240k| 124M 124M| 0 0 | 32k 33k 63 8 27 0 0 1| 0 2240k| 124M 124M| 0 0 | 32k 33k
62 8 28 0 0 1| 0 1632k| 110M 110M| 0 0 | 31k 33k 62 8 28 0 0 1| 0 1632k| 110M 110M| 0 0 | 31k 33k
67 9 23 0 0 2| 0 1604k| 130M 130M| 0 0 | 33k 32k
63 9 27 0 0 2| 0 1496k| 145M 145M| 0 0 | 32k 32k
61 9 29 0 0 1| 0 1112k| 132M 132M| 0 0 | 32k 33k
63 9 27 0 0 2| 0 1220k| 145M 145M| 0 0 | 32k 33k
53 7 40 0 0 1| 0 1360k| 115M 115M| 0 0 | 24k 26k 53 7 40 0 0 1| 0 1360k| 115M 115M| 0 0 | 24k 26k
51 7 41 0 0 1| 0 1184k| 146M 146M| 0 0 | 24k 27k 51 7 41 0 0 1| 0 1184k| 146M 146M| 0 0 | 24k 27k
39 6 54 0 0 1| 0 1284k| 105M 105M| 0 0 | 22k 28k 39 6 54 0 0 1| 0 1284k| 105M 105M| 0 0 | 22k 28k
41 6 52 0 0 1| 0 1264k| 116M 116M| 0 0 | 25k 28k 41 6 52 0 0 1| 0 1264k| 116M 116M| 0 0 | 25k 28k
48 6 45 0 0 1| 0 1272k| 143M 143M| 0 0 | 27k 27k 48 6 45 0 0 1| 0 1272k| 143M 143M| 0 0 | 27k 27k
</pre> </pre>
See also: [Performance Test Guide](https://github.com/winlinvip/simple-rtmp-server/wiki/Performance)
### Releases ### Releases
* 2013-12-25, [release v0.9](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.9), support bandwidth test, add player/encoder/chat demos. 20926 lines.<br/> * 2013-12-25, [Release v0.9](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.9), support bandwidth test, add player/encoder/chat demos. 20926 lines.<br/>
* 2013-12-08, [release v0.8](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.8), support http hooks callback, update [st_load](https://github.com/winlinvip/st-load). 19186 lines.<br/> * 2013-12-08, [Release v0.8](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.8), support http hooks callback, update [st_load](https://github.com/winlinvip/st-load). 19186 lines.<br/>
* 2013-12-03, [release v0.7](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.7), support live stream transcoding. 17605 lines.<br/> * 2013-12-03, [Release v0.7](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.7), support live stream transcoding. 17605 lines.<br/>
* 2013-11-29, [release v0.6](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.6), support forward stream to origin/edge. 16094 lines.<br/> * 2013-11-29, [Release v0.6](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.6), support forward stream to origin/edge. 16094 lines.<br/>
* 2013-11-26, [release v0.5](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.5), support HLS(m3u8), fragment and window. 14449 lines.<br/> * 2013-11-26, [Release v0.5](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.5), support HLS(m3u8), fragment and window. 14449 lines.<br/>
* 2013-11-10, [release v0.4](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.4), support reload config, pause, longtime publish/play. 12500 lines.<br/> * 2013-11-10, [Release v0.4](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.4), support reload config, pause, longtime publish/play. 12500 lines.<br/>
* 2013-11-04, [release v0.3](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.3), support vhost, refer, gop cache, listen multiple ports. 11773 lines.<br/> * 2013-11-04, [Release v0.3](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.3), support vhost, refer, gop cache, listen multiple ports. 11773 lines.<br/>
* 2013-10-25, [release v0.2](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.2), support rtmp flash publish, h264, time jitter correct. 10125 lines.<br/> * 2013-10-25, [Release v0.2](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.2), support rtmp flash publish, h264, time jitter correct. 10125 lines.<br/>
* 2013-10-23, [release v0.1](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.1), support rtmp FMLE/FFMPEG publish, vp6. 8287 lines.<br/> * 2013-10-23, [Release v0.1](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.1), support rtmp FMLE/FFMPEG publish, vp6. 8287 lines.<br/>
* 2013-10-17, created.<br/> * 2013-10-17, Created.<br/>
### Compare ### Compare
* srs v0.9: 20926 lines. player/encoder/chat demos. bandwidth test for encoder/CDN.<br/> * SRS v0.9: 20926 lines. player/encoder/chat demos. bandwidth test for encoder/CDN.<br/>
* srs v0.8: 19186 lines. implements http hooks refer to [nginx-rtmp](https://github.com/arut/nginx-rtmp-module). <br/> * SRS v0.8: 19186 lines. implements http hooks refer to [nginx-rtmp](https://github.com/arut/nginx-rtmp-module). <br/>
* srs v0.7: 17605 lines. implements transcoding(FFMPEG) feature refer to [wowza](http://www.wowza.com). <br/> * SRS v0.7: 17605 lines. implements transcoding(FFMPEG) feature refer to [wowza](http://www.wowza.com). <br/>
* srs v0.6: 16094 lines. important feature forward for CDN. <br/> * SRS v0.6: 16094 lines. important feature forward for CDN. <br/>
* srs v0.5: 14449 lines. implements HLS feature refer to [nginx-rtmp](https://github.com/arut/nginx-rtmp-module). <br/> * SRS v0.5: 14449 lines. implements HLS feature refer to [nginx-rtmp](https://github.com/arut/nginx-rtmp-module). <br/>
* srs v0.4: 12500 lines. important feature reload for CDN. <br/> * SRS v0.4: 12500 lines. important feature reload for CDN. <br/>
* srs v0.3: 11773 lines. implements vhost feature refer to [FMS](http://www.adobe.com/products/adobe-media-server-family.html). <br/> * SRS v0.3: 11773 lines. implements vhost feature refer to [FMS](http://www.adobe.com/products/adobe-media-server-family.html). <br/>
* srs v0.2: 10125 lines. implements rtmp protocol stack refer to [nginx-rtmp](https://github.com/arut/nginx-rtmp-module). <br/> * SRS v0.2: 10125 lines. implements rtmp protocol stack refer to [nginx-rtmp](https://github.com/arut/nginx-rtmp-module). <br/>
* srs v0.1: 8287 lines. base on state-threads. <br/> * SRS v0.1: 8287 lines. base on state-threads. <br/>
* nginx-rtmp v1.0.4: 26786 lines <br/> * nginx-rtmp v1.0.4: 26786 lines <br/>
* nginx v1.5.0: 139524 lines <br/> * nginx v1.5.0: 139524 lines <br/>
### History ### History
* v1.0, 2014-01-01, change listen(512), chunk-size(60000), to improve performance.
* v1.0, 2013-12-27, merge from wenjie, the bandwidth test feature.
* v0.9, 2013-12-25, [v0.9](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.9) released. 20926 lines. * v0.9, 2013-12-25, [v0.9](https://github.com/winlinvip/simple-rtmp-server/releases/tag/0.9) released. 20926 lines.
* v0.9, 2013-12-25, fix the bitrate bug(in Bps), use enhanced microphone. * v0.9, 2013-12-25, fix the bitrate bug(in Bps), use enhanced microphone.
* v0.9, 2013-12-22, demo video meeting or chat(srs+cherrypy+jquery+bootstrap). * v0.9, 2013-12-22, demo video meeting or chat(SRS+cherrypy+jquery+bootstrap).
* v0.9, 2013-12-22, merge from wenjie, support banwidth test. * v0.9, 2013-12-22, merge from wenjie, support banwidth test.
* v0.9, 2013-12-22, merge from wenjie: support set chunk size at vhost level * v0.9, 2013-12-22, merge from wenjie: support set chunk size at vhost level
* v0.9, 2013-12-21, add [players](http://demo.srs.com/players) for play and publish. * v0.9, 2013-12-21, add [players](http://demo.srs.com/players) for play and publish.
@ -297,7 +305,7 @@ usr sys idl wai hiq siq| read writ| recv send| in out | int csw
* v0.8, 2013-12-08, support multiple http hooks for a event. * v0.8, 2013-12-08, support multiple http hooks for a event.
* v0.8, 2013-12-07, support http callback hooks, on_connect. * v0.8, 2013-12-07, support http callback hooks, on_connect.
* v0.8, 2013-12-07, support network based cli and json result, add CherryPy 3.2.4. * v0.8, 2013-12-07, support network based cli and json result, add CherryPy 3.2.4.
* v0.8, 2013-12-07, update http/hls/rtmp load test tool [st_load](https://github.com/winlinvip/st-load), use srs rtmp sdk. * v0.8, 2013-12-07, update http/hls/rtmp load test tool [st_load](https://github.com/winlinvip/st-load), use SRS rtmp sdk.
* v0.8, 2013-12-06, support max_connections, drop if exceed. * v0.8, 2013-12-06, support max_connections, drop if exceed.
* v0.8, 2013-12-05, support log_dir, write ffmpeg log to file. * v0.8, 2013-12-05, support log_dir, write ffmpeg log to file.
* v0.8, 2013-12-05, fix the forward/hls/encoder bug. * v0.8, 2013-12-05, fix the forward/hls/encoder bug.

View file

@ -1,5 +1,14 @@
# the listen ports, split by space. # the listen ports, split by space.
listen 1935; listen 1935;
<<<<<<< HEAD
=======
# the default chunk size is 128, max is 65536,
# some client does not support chunk size change,
# however, most clients supports it and it can improve
# performance about 10%.
# default: 60000
chunk_size 60000;
>>>>>>> upstream/master
# the logs dir. # the logs dir.
# if enabled ffmpeg, each stracoding stream will create a log file. # if enabled ffmpeg, each stracoding stream will create a log file.
# default: ./objs/logs # default: ./objs/logs
@ -28,7 +37,7 @@ vhost __defaultVhost__ {
# for which cannot identify the required vhost. # for which cannot identify the required vhost.
# for default demo. # for default demo.
vhost demo.srs.com { vhost demo.srs.com {
chunk_size 4096; chunk_size 60000;
enabled on; enabled on;
gop_cache on; gop_cache on;
queue_length 30; queue_length 30;
@ -226,7 +235,7 @@ vhost bandcheck.srs.com {
enabled on; enabled on;
# the key for server to valid, # the key for server to valid,
# if invalid key, server disconnect and abort the bandwidth check. # if invalid key, server disconnect and abort the bandwidth check.
key 35c9b402c12a7246868752e2878f7e0e; key "35c9b402c12a7246868752e2878f7e0e";
# the interval in seconds for bandwidth check, # the interval in seconds for bandwidth check,
# server donot allow new test request. # server donot allow new test request.
# default: 30 # default: 30

20
trunk/configure vendored
View file

@ -47,22 +47,27 @@ echo "" >> $SRS_AUTO_HEADERS_H
echo "generate Makefile" echo "generate Makefile"
cat << END > ${SRS_MAKEFILE} cat << END > ${SRS_MAKEFILE}
.PHONY: default help clean server _prepare_dir .PHONY: default help clean server bandwidth _prepare_dir
default: server default: server bandwidth
help: help:
@echo "Usage: make <help>|<clean>|<server>" @echo "Usage: make <help>|<clean>|<server>|<bandwidth>"
@echo " help display this help menu" @echo " help display this help menu"
@echo " clean cleanup project" @echo " clean cleanup project"
@echo " server build the srs(simple rtmp server) over st(state-threads)" @echo " server build the srs(simple rtmp server) over st(state-threads)"
@echo " bandwidth build the bandwidth test client tool."
clean: clean:
(rm -f Makefile; cd ${SRS_OBJS}; rm -rf srs Makefile *.hpp src st_*_load) (rm -f Makefile; cd ${SRS_OBJS}; rm -rf srs bandwidth Makefile *.hpp src st_*_load)
server: _prepare_dir server: _prepare_dir
@echo "build the srs(simple rtmp server) over st(state-threads)" @echo "build the srs(simple rtmp server) over st(state-threads)"
\$(MAKE) -f ${SRS_OBJS}/${SRS_MAKEFILE} srs \$(MAKE) -f ${SRS_OBJS}/${SRS_MAKEFILE} srs
bandwidth: _prepare_dir
@echo "build the bandwidth test client tool"
\$(MAKE) -f ${SRS_OBJS}/${SRS_MAKEFILE} bandwidth
# the ./configure will generate it. # the ./configure will generate it.
_prepare_dir: _prepare_dir:
@mkdir -p ${SRS_OBJS} @mkdir -p ${SRS_OBJS}
@ -87,7 +92,7 @@ GCC = g++
LINK = \$(GCC) LINK = \$(GCC)
AR = ar AR = ar
.PHONY: default srs .PHONY: default srs bandwidth
default: default:
@ -124,12 +129,12 @@ CORE_OBJS="${MODULE_OBJS[@]}"
MODULE_ID="MAIN" MODULE_ID="MAIN"
MODULE_DEPENDS=("CORE") MODULE_DEPENDS=("CORE")
ModuleLibIncs=(${LibSTRoot} ${SRS_OBJS}) ModuleLibIncs=(${LibSTRoot} ${SRS_OBJS})
MODULE_FILES=("srs_main_server") MODULE_FILES=("srs_main_server" "srs_main_bandcheck")
MODULE_DIR="src/main" . auto/modules.sh MODULE_DIR="src/main" . auto/modules.sh
MAIN_OBJS="${MODULE_OBJS[@].o}" MAIN_OBJS="${MODULE_OBJS[@].o}"
# all main entrances # all main entrances
MAIN_ENTRANCES=("srs_main_server") MAIN_ENTRANCES=("srs_main_server" "srs_main_bandcheck")
# srs(simple rtmp server) over st(state-threads) # srs(simple rtmp server) over st(state-threads)
ModuleLibFiles=(${LibSTfile}) ModuleLibFiles=(${LibSTfile})
@ -143,6 +148,7 @@ else
LINK_OPTIONS="-ldl" LINK_OPTIONS="-ldl"
fi fi
BUILD_KEY="srs" APP_MAIN="srs_main_server" APP_NAME="srs" SO_PATH="" . auto/apps.sh BUILD_KEY="srs" APP_MAIN="srs_main_server" APP_NAME="srs" SO_PATH="" . auto/apps.sh
BUILD_KEY="bandwidth" APP_MAIN="srs_main_bandcheck" APP_NAME="bandwidth" SO_PATH="" . auto/apps.sh
echo 'configure ok! ' echo 'configure ok! '

View file

@ -2,7 +2,7 @@
''' '''
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -463,7 +463,7 @@ if __name__ != "__main__":
# check the user options # check the user options
if len(sys.argv) <= 1: if len(sys.argv) <= 1:
print "SRS api callback server, Copyright (c) 2013 winlin" print "SRS api callback server, Copyright (c) 2013-2014 winlin"
print "Usage: python %s <port>"%(sys.argv[0]) print "Usage: python %s <port>"%(sys.argv[0])
print " port: the port to listen at." print " port: the port to listen at."
print "For example:" print "For example:"

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -417,38 +417,38 @@ public:
*/ */
enum TSPESStreamId enum TSPESStreamId
{ {
PES_program_stream_map = 0b10111100, // 0xbc PES_program_stream_map = 0xbc, // 0b10111100
PES_private_stream_1 = 0b10111101, // 0xbd PES_private_stream_1 = 0xbd, // 0b10111101
PES_padding_stream = 0b10111110, // 0xbe PES_padding_stream = 0xbe, // 0b10111110
PES_private_stream_2 = 0b10111111, // 0xbf PES_private_stream_2 = 0xbf, // 0b10111111
// 110x xxxx // 110x xxxx
// ISO/IEC 13818-3 or ISO/IEC 11172-3 or ISO/IEC 13818-7 or ISO/IEC // ISO/IEC 13818-3 or ISO/IEC 11172-3 or ISO/IEC 13818-7 or ISO/IEC
// 14496-3 audio stream number x xxxx // 14496-3 audio stream number x xxxx
// (stream_id>>5)&0x07 == PES_audio_prefix // (stream_id>>5)&0x07 == PES_audio_prefix
PES_audio_prefix = 0b110, PES_audio_prefix = 0x06, // 0b110
// 1110 xxxx // 1110 xxxx
// ITU-T Rec. H.262 | ISO/IEC 13818-2 or ISO/IEC 11172-2 or ISO/IEC // ITU-T Rec. H.262 | ISO/IEC 13818-2 or ISO/IEC 11172-2 or ISO/IEC
// 14496-2 video stream number xxxx // 14496-2 video stream number xxxx
// (stream_id>>4)&0x0f == PES_audio_prefix // (stream_id>>4)&0x0f == PES_audio_prefix
PES_video_prefix = 0b1110, PES_video_prefix = 0x0e, // 0b1110
PES_ECM_stream = 0b11110000, // 0xf0 PES_ECM_stream = 0xf0, // 0b11110000
PES_EMM_stream = 0b11110001, // 0xf1 PES_EMM_stream = 0xf1, // 0b11110001
PES_DSMCC_stream = 0b11110010, // 0xf2 PES_DSMCC_stream = 0xf2, // 0b11110010
PES_13522_stream = 0b11110011, // 0xf3 PES_13522_stream = 0xf3, // 0b11110011
PES_H_222_1_type_A = 0b11110100, // 0xf4 PES_H_222_1_type_A = 0xf4, // 0b11110100
PES_H_222_1_type_B = 0b11110101, // 0xf5 PES_H_222_1_type_B = 0xf5, // 0b11110101
PES_H_222_1_type_C = 0b11110110, // 0xf6 PES_H_222_1_type_C = 0xf6, // 0b11110110
PES_H_222_1_type_D = 0b11110111, // 0xf7 PES_H_222_1_type_D = 0xf7, // 0b11110111
PES_H_222_1_type_E = 0b11111000, // 0xf8 PES_H_222_1_type_E = 0xf8, // 0b11111000
PES_ancillary_stream = 0b11111001, // 0xf9 PES_ancillary_stream = 0xf9, // 0b11111001
PES_SL_packetized_stream = 0b11111010, // 0xfa PES_SL_packetized_stream = 0xfa, // 0b11111010
PES_FlexMux_stream = 0b11111011, // 0xfb PES_FlexMux_stream = 0xfb, // 0b11111011
// reserved data stream // reserved data stream
// 1111 1100 … 1111 1110 // 1111 1100 … 1111 1110
PES_program_stream_directory= 0b11111111, // 0xff PES_program_stream_directory= 0xff, // 0b11111111
}; };

View file

@ -1,3 +1,4 @@
<<<<<<< HEAD
// for bw to init url // for bw to init url
// url: scheme://host:port/path?query#fragment // url: scheme://host:port/path?query#fragment
function srs_init_bwt(rtmp_url, hls_url) { function srs_init_bwt(rtmp_url, hls_url) {
@ -24,4 +25,141 @@ function srs_bwt_check_url(url) {
function srs_bwt_build_default_url() { function srs_bwt_build_default_url() {
var url_default = "rtmp://" + window.location.host + ":" + 1935 + "/app?key=35c9b402c12a7246868752e2878f7e0e&vhost=bandcheck.srs.com"; var url_default = "rtmp://" + window.location.host + ":" + 1935 + "/app?key=35c9b402c12a7246868752e2878f7e0e&vhost=bandcheck.srs.com";
return url_default; return url_default;
=======
/**
* the SrsBandwidth object.
* @param container the html container id.
* @param width a float value specifies the width of bandwidth.
* @param height a float value specifies the height of bandwidth.
* @param private_object [optional] an object that used as private object,
* for example, the logic chat object which owner this bandwidth.
*/
function SrsBandwidth(container, width, height, private_object) {
if (!SrsBandwidth.__id) {
SrsBandwidth.__id = 100;
}
if (!SrsBandwidth.__bandwidths) {
SrsBandwidth.__bandwidths = [];
}
SrsBandwidth.__bandwidths.push(this);
this.private_object = private_object;
this.container = container;
this.width = width;
this.height = height;
this.id = SrsBandwidth.__id++;
this.stream_url = null;
this.callbackObj = null;
// the callback set data.
this.percent = 0;
this.status = "";
}
/**
* user can set some callback, then start the bandwidth.
* @param url the bandwidth test url.
* callbacks:
* on_bandwidth_ready():void, when srs bandwidth ready, user can play.
* on_update_progress(percent:Number):void, when srs bandwidth update the progress.
* percent:Number 100 means 100%.
* on_update_status(status:String):void, when srs bandwidth update the status.
* status:String the human readable status text.
*/
SrsBandwidth.prototype.start = function(url) {
if (url) {
this.stream_url = url;
}
// embed the flash.
var flashvars = {};
flashvars.id = this.id;
flashvars.on_bandwidth_ready = "__srs_on_bandwidth_ready";
flashvars.on_update_progress = "__srs_on_update_progress";
flashvars.on_update_status = "__srs_on_update_status";
var params = {};
params.wmode = "opaque";
params.allowFullScreen = "true";
params.allowScriptAccess = "always";
var attributes = {};
var self = this;
swfobject.embedSWF(
"srs_bwt/release/srs_bwt.swf?_version="+srs_get_version_code(),
this.container,
this.width, this.height,
"11.1.0", "js/AdobeFlashbandwidthInstall.swf",
flashvars, params, attributes,
function(callbackObj){
self.callbackObj = callbackObj;
}
);
return this;
}
/**
* play the stream.
* @param stream_url the url of stream, rtmp or http.
* @param volume the volume, 0 is mute, 1 is 100%, 2 is 200%.
*/
SrsBandwidth.prototype.check_bandwidth = function(url) {
this.stop();
SrsBandwidth.__bandwidths.push(this);
if (url) {
this.stream_url = url;
}
this.callbackObj.ref.__check_bandwidth(this.stream_url);
}
SrsBandwidth.prototype.stop = function(url) {
for (var i = 0; i < SrsBandwidth.__bandwidths.length; i++) {
var bandwidth = SrsBandwidth.__bandwidths[i];
if (bandwidth.id != this.id) {
continue;
}
SrsBandwidth.__bandwidths.splice(i, 1);
break;
}
this.callbackObj.ref.__stop();
}
SrsBandwidth.prototype.on_bandwidth_ready = function() {
}
SrsBandwidth.prototype.on_update_progress = function(percent) {
}
SrsBandwidth.prototype.on_update_status = function(status) {
}
function __srs_find_bandwidth(id) {
for (var i = 0; i < SrsBandwidth.__bandwidths.length; i++) {
var bandwidth = SrsBandwidth.__bandwidths[i];
if (bandwidth.id != id) {
continue;
}
return bandwidth;
}
throw new Error("bandwidth not found. id=" + id);
}
function __srs_on_bandwidth_ready(id) {
var bandwidth = __srs_find_bandwidth(id);
bandwidth.on_bandwidth_ready();
}
function __srs_on_update_progress(id, percent) {
var bandwidth = __srs_find_bandwidth(id);
bandwidth.percent = percent;
bandwidth.on_update_progress(percent);
}
function __srs_on_update_status(id, status) {
var bandwidth = __srs_find_bandwidth(id);
bandwidth.status = status;
bandwidth.on_update_status(status);
>>>>>>> upstream/master
} }

View file

@ -10,7 +10,7 @@ function srs_get_player_width() { return srs_get_player_modal() - 30; }
function srs_get_player_height() { return srs_get_player_width() * 9 / 19; } function srs_get_player_height() { return srs_get_player_width() * 9 / 19; }
// to query the swf anti cache. // to query the swf anti cache.
function srs_get_version_code() { return "1.17"; } function srs_get_version_code() { return "1.19"; }
// get the default vhost for players. // get the default vhost for players.
function srs_get_player_vhost() { return "players"; } function srs_get_player_vhost() { return "players"; }
// the api server port, for chat room. // the api server port, for chat room.
@ -80,6 +80,18 @@ function build_default_publish_rtmp_url() {
return "rtmp://" + server + ":" + port + "/" + app + "...vhost..." + vhost + "/" + stream; return "rtmp://" + server + ":" + port + "/" + app + "...vhost..." + vhost + "/" + stream;
} }
} }
// for the bandwidth tool to init page
function build_default_bandwidth_rtmp_url() {
var query = parse_query_string();
var server = (query.server == undefined)? window.location.hostname:query.server;
var port = (query.port == undefined)? 1935:query.port;
var vhost = "bandcheck.srs.com";
var app = (query.app == undefined)? "app":query.app;
var key = (query.key == undefined)? "35c9b402c12a7246868752e2878f7e0e":query.key;
return "rtmp://" + server + ":" + port + "/" + app + "?key=" + key + "&vhost=" + vhost;
}
/** /**
@param server the ip of server. default to window.location.hostname @param server the ip of server. default to window.location.hostname
@ -139,6 +151,15 @@ function srs_init_publish(rtmp_url) {
$(rtmp_url).val(build_default_publish_rtmp_url()); $(rtmp_url).val(build_default_publish_rtmp_url());
} }
} }
// for bw to init url
// url: scheme://host:port/path?query#fragment
function srs_init_bwt(rtmp_url, hls_url) {
update_nav();
if (rtmp_url) {
$(rtmp_url).val(build_default_bandwidth_rtmp_url());
}
}
// check whether can republish // check whether can republish
function srs_can_republish() { function srs_can_republish() {

View file

@ -63,7 +63,7 @@ SrsPlayer.prototype.start = function(url) {
"srs_player/release/srs_player.swf?_version="+srs_get_version_code(), "srs_player/release/srs_player.swf?_version="+srs_get_version_code(),
this.container, this.container,
this.width, this.height, this.width, this.height,
"11.1", "js/AdobeFlashPlayerInstall.swf", "11.1.0", "js/AdobeFlashPlayerInstall.swf",
flashvars, params, attributes, flashvars, params, attributes,
function(callbackObj){ function(callbackObj){
self.callbackObj = callbackObj; self.callbackObj = callbackObj;

View file

@ -73,7 +73,7 @@ SrsPublisher.prototype.start = function() {
"srs_publisher/release/srs_publisher.swf?_version="+srs_get_version_code(), "srs_publisher/release/srs_publisher.swf?_version="+srs_get_version_code(),
this.container, this.container,
this.width, this.height, this.width, this.height,
"11.1", "js/AdobeFlashPlayerInstall.swf", "11.1.0", "js/AdobeFlashPlayerInstall.swf",
flashvars, params, attributes, flashvars, params, attributes,
function(callbackObj){ function(callbackObj){
self.callbackObj = callbackObj; self.callbackObj = callbackObj;

View file

@ -13,6 +13,21 @@ function padding(number, length, prefix) {
/** /**
* parse the query string to object. * parse the query string to object.
* parse the url location object as: host(hostname:http_port), pathname(dir/filename)
* for example, url http://192.168.1.168:1980/ui/players.html?vhost=player.vhost.com&app=test&stream=livestream
* parsed to object:
{
host : "192.168.1.168:1980",
hostname : "192.168.1.168",
http_port : 1980,
pathname : "/ui/players.html",
dir : "/ui",
filename : "/players.html",
vhost : "player.vhost.com",
app : "test",
stream : "livestream"
}
*/ */
function parse_query_string(){ function parse_query_string(){
var obj = {}; var obj = {};

View file

@ -12,13 +12,18 @@
<script type="text/javascript" src="js/srs.player.js"></script> <script type="text/javascript" src="js/srs.player.js"></script>
<script type="text/javascript" src="js/srs.publisher.js"></script> <script type="text/javascript" src="js/srs.publisher.js"></script>
<script type="text/javascript" src="js/srs.utility.js"></script> <script type="text/javascript" src="js/srs.utility.js"></script>
<<<<<<< HEAD
<script type="text/javascript" src="js/srs.utility.js"></script> <script type="text/javascript" src="js/srs.utility.js"></script>
<script type="text/javascript" src="js/srs.bandwidth.js"></script> <script type="text/javascript" src="js/srs.bandwidth.js"></script>
=======
<script type="text/javascript" src="js/srs.bandwidth.js"></script>
>>>>>>> upstream/master
<style> <style>
body{ body{
padding-top: 55px; padding-top: 55px;
} }
#main_modal { #main_modal {
<<<<<<< HEAD
width: 600px; width: 600px;
margin-left: -300px; margin-left: -300px;
} }
@ -119,6 +124,56 @@
} }
); );
}); });
=======
width: 700px;
margin-left: -350px;
}
</style>
<script type="text/javascript">
var bandwidth = null;
$(function(){
srs_init_bwt("#txt_url");
$("#btn_play").click(on_click_play);
$("#main_modal").on("show", on_start_bandwidth_test);
$("#main_modal").on("hide", on_stop_bandwidth_test);
});
function on_click_play() {
$("#check_status").text("");
$("#progress_bar").width("0%");
$("#main_modal").modal({show:true, keyboard:false});
}
function on_start_bandwidth_test() {
$("#div_container").remove();
var div_container = $("<div/>");
$(div_container).attr("id", "div_container");
$("#player").append(div_container);
var player = $("<div/>");
$(player).attr("id", "player_id");
$(div_container).append(player);
var url = $("#txt_url").val();
bandwidth = new SrsBandwidth("player_id", 100, 1);
bandwidth.on_bandwidth_ready = function() {
this.check_bandwidth(url);
}
bandwidth.on_update_progress = function(percent) {
$("#progress_bar").width(percent + "%");
}
bandwidth.on_update_status = function(status) {
$("#check_status").text(status);
}
bandwidth.start(url);
}
function on_stop_bandwidth_test() {
bandwidth.stop();
}
>>>>>>> upstream/master
</script> </script>
</head> </head>
<body> <body>
@ -141,6 +196,7 @@
</div> </div>
</div> </div>
<div class="container"> <div class="container">
<<<<<<< HEAD
<div class="form-inline"> <div class="form-inline">
URL: URL:
@ -164,15 +220,49 @@
</div> </div>
<span id="check_status1"><font ><strong id="check_status">status</strong></font> </span> <span id="check_status1"><font ><strong id="check_status">status</strong></font> </span>
=======
<div class="alert alert-info fade in">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong><span>Usage:</span></strong> <span>点击“开始测速”即可测带宽,最大可测试带宽由服务器限制</span>
</div>
<div class="form-inline">
URL:
<input type="text" id="txt_url" class="input-xxlarge" value=""></input>
<button class="btn btn-primary" id="btn_play">开始测速</button>
</div>
<div id="main_modal" class="modal hide fade">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3>SRS Bandwidth Check</h3>
</div>
<div class="modal-body">
<div class="row-fluid">
<div class="span1"></div>
<div class="span10">
<div class="progress progress-striped active" id="pb_buffer_bg">
<div class="bar" style="width: 0%;" id="progress_bar"></div>
</div>
</div>
<div class="span1"></div>
</div>
<span id="check_status">status</span>
</div>
>>>>>>> upstream/master
<div class="modal-footer"> <div class="modal-footer">
<button class="btn btn-primary" data-dismiss="modal" aria-hidden="true"> 关闭 </button> <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true"> 关闭 </button>
</div> </div>
</div> </div>
<<<<<<< HEAD
=======
>>>>>>> upstream/master
<hr> <hr>
<footer> <footer>
<p><a href="https://github.com/winlinvip/simple-rtmp-server">SRS Team &copy; 2013</a></p> <p><a href="https://github.com/winlinvip/simple-rtmp-server">SRS Team &copy; 2013</a></p>
</footer> </footer>
<div class="container">
<div id="player"></div>
</div>
</div> </div>
</body> </body>

View file

@ -1,6 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<actionScriptProperties analytics="false" mainApplicationPath="srs_bwt.as" projectUUID="00251213-e6a2-4dd5-a033-125cc78f843c" version="10"> <actionScriptProperties analytics="false" mainApplicationPath="srs_bwt.as" projectUUID="00251213-e6a2-4dd5-a033-125cc78f843c" version="10">
<<<<<<< HEAD
<compiler additionalCompilerArguments="-locale en_US" autoRSLOrdering="true" copyDependentFiles="true" fteInMXComponents="false" generateAccessible="true" htmlExpressInstall="true" htmlGenerate="true" htmlHistoryManagement="true" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="bin-debug" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" verifyDigests="true" warn="true"> <compiler additionalCompilerArguments="-locale en_US" autoRSLOrdering="true" copyDependentFiles="true" fteInMXComponents="false" generateAccessible="true" htmlExpressInstall="true" htmlGenerate="true" htmlHistoryManagement="true" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="bin-debug" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" verifyDigests="true" warn="true">
=======
<compiler additionalCompilerArguments="-locale en_US" autoRSLOrdering="true" copyDependentFiles="true" fteInMXComponents="false" generateAccessible="true" htmlExpressInstall="true" htmlGenerate="false" htmlHistoryManagement="true" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="release" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" verifyDigests="true" warn="true">
>>>>>>> upstream/master
<compilerSourcePath/> <compilerSourcePath/>
<libraryPath defaultLinkType="0"> <libraryPath defaultLinkType="0">
<libraryPathEntry kind="4" path=""> <libraryPathEntry kind="4" path="">
@ -17,6 +21,7 @@
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/spark.swc" useDefaultLinkType="false"/> <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/spark.swc" useDefaultLinkType="false"/>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/sparkskins.swc" useDefaultLinkType="false"/> <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/sparkskins.swc" useDefaultLinkType="false"/>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/rpc.swc" useDefaultLinkType="false"/> <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/rpc.swc" useDefaultLinkType="false"/>
<<<<<<< HEAD
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/videoPlayer.swc" useDefaultLinkType="false"/> <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/videoPlayer.swc" useDefaultLinkType="false"/>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/qtp_air.swc" useDefaultLinkType="false"/> <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/qtp_air.swc" useDefaultLinkType="false"/>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/datavisualization.swc" useDefaultLinkType="false"/> <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/datavisualization.swc" useDefaultLinkType="false"/>
@ -24,6 +29,15 @@
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation.swc" useDefaultLinkType="false"/> <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation.swc" useDefaultLinkType="false"/>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/flash-integration.swc" useDefaultLinkType="false"/> <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/flash-integration.swc" useDefaultLinkType="false"/>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_dmv.swc" useDefaultLinkType="false"/> <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_dmv.swc" useDefaultLinkType="false"/>
=======
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/datavisualization.swc" useDefaultLinkType="false"/>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/qtp_air.swc" useDefaultLinkType="false"/>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/videoPlayer.swc" useDefaultLinkType="false"/>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/spark_dmv.swc" useDefaultLinkType="false"/>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation.swc" useDefaultLinkType="false"/>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_dmv.swc" useDefaultLinkType="false"/>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/flash-integration.swc" useDefaultLinkType="false"/>
>>>>>>> upstream/master
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_flashflexkit.swc" useDefaultLinkType="false"/> <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_flashflexkit.swc" useDefaultLinkType="false"/>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_agent.swc" useDefaultLinkType="false"/> <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_agent.swc" useDefaultLinkType="false"/>
</excludedEntries> </excludedEntries>

View file

@ -20,10 +20,22 @@ package
public class srs_bwt extends Sprite public class srs_bwt extends Sprite
{ {
<<<<<<< HEAD
private var connection:NetConnection; private var connection:NetConnection;
private var updatePlayProgressTimer:Timer; private var updatePlayProgressTimer:Timer;
private var elapTimer:SrsElapsedTimer; private var elapTimer:SrsElapsedTimer;
=======
private var connection:NetConnection = null;
private var updatePlayProgressTimer:Timer = null;
private var elapTimer:SrsElapsedTimer = null;
// user set id.
private var js_id:String = null;
// play param url.
private var user_url:String = null;
>>>>>>> upstream/master
// server ip get from server // server ip get from server
private var server_ip:String; private var server_ip:String;
@ -32,8 +44,13 @@ package
private var stop_pub:Boolean = false; private var stop_pub:Boolean = false;
// js interface // js interface
<<<<<<< HEAD
private var js_update_progress:String; private var js_update_progress:String;
private var js_progress_reset:String; private var js_progress_reset:String;
=======
private var js_on_player_ready:String;
private var js_update_progress:String;
>>>>>>> upstream/master
private var js_update_status:String; private var js_update_status:String;
private var value_progressbar:Number = 0; private var value_progressbar:Number = 0;
@ -44,10 +61,26 @@ package
public function srs_bwt() public function srs_bwt()
{ {
<<<<<<< HEAD
=======
if (!this.stage) {
this.addEventListener(Event.ADDED_TO_STAGE, this.system_on_add_to_stage);
} else {
this.system_on_add_to_stage(null);
}
}
/**
* system event callback, when this control added to stage.
* the main function.
*/
private function system_on_add_to_stage(evt:Event):void {
>>>>>>> upstream/master
this.stage.scaleMode = StageScaleMode.NO_SCALE; this.stage.scaleMode = StageScaleMode.NO_SCALE;
this.stage.align = StageAlign.TOP_LEFT; this.stage.align = StageAlign.TOP_LEFT;
var flashvars:Object = this.root.loaderInfo.parameters; var flashvars:Object = this.root.loaderInfo.parameters;
<<<<<<< HEAD
this.js_update_progress = flashvars.update_progress; this.js_update_progress = flashvars.update_progress;
this.js_progress_reset = flashvars.progress_reset; this.js_progress_reset = flashvars.progress_reset;
this.js_update_status = flashvars.update_status; this.js_update_status = flashvars.update_status;
@ -58,11 +91,56 @@ package
myMenu.customItems.push(new ContextMenuItem("Srs 带宽测试工具 0.1", true)); myMenu.customItems.push(new ContextMenuItem("Srs 带宽测试工具 0.1", true));
this.contextMenu = myMenu; this.contextMenu = myMenu;
=======
if (!flashvars.hasOwnProperty("id")) {
throw new Error("must specifies the id");
}
this.js_id = flashvars.id;
this.js_on_player_ready = flashvars.on_bandwidth_ready;
this.js_update_progress = flashvars.on_update_progress;
this.js_update_status = flashvars.on_update_status;
// init context menu
var myMenu:ContextMenu = new ContextMenu();
myMenu.hideBuiltInItems();
myMenu.customItems.push(new ContextMenuItem("SRS 带宽测试工具", true));
this.contextMenu = myMenu;
flash.utils.setTimeout(this.system_on_js_ready, 0);
}
/**
* system callack event, when js ready, register callback for js.
* the actual main function.
*/
private function system_on_js_ready():void {
if (!flash.external.ExternalInterface.available) {
trace("js not ready, try later.");
flash.utils.setTimeout(this.system_on_js_ready, 100);
return;
}
flash.external.ExternalInterface.addCallback("__check_bandwidth", this.js_call_check_bandwidth);
flash.external.ExternalInterface.addCallback("__stop", this.js_call_stop);
flash.external.ExternalInterface.call(this.js_on_player_ready, this.js_id);
}
private function js_call_check_bandwidth(url:String):void {
js_call_stop();
>>>>>>> upstream/master
// init connection // init connection
connection = new NetConnection; connection = new NetConnection;
connection.client = this; connection.client = this;
connection.addEventListener(NetStatusEvent.NET_STATUS, onStatus); connection.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
<<<<<<< HEAD
connection.connect(flashvars.url); connection.connect(flashvars.url);
=======
connection.connect(url);
>>>>>>> upstream/master
//connection.connect("rtmp://192.168.8.234:1935/app?key=35c9b402c12a7246868752e2878f7e0e&vhost=bandcheck.srs.com"); //connection.connect("rtmp://192.168.8.234:1935/app?key=35c9b402c12a7246868752e2878f7e0e&vhost=bandcheck.srs.com");
// for play to update progress bar // for play to update progress bar
@ -73,10 +151,43 @@ package
updatePlayProgressTimer.addEventListener(TimerEvent.TIMER, onTimerTimeout); updatePlayProgressTimer.addEventListener(TimerEvent.TIMER, onTimerTimeout);
updatePlayProgressTimer.start(); updatePlayProgressTimer.start();
} }
<<<<<<< HEAD
// get NetConnection NetStatusEvent // get NetConnection NetStatusEvent
public function onStatus(evt:NetStatusEvent) : void{ public function onStatus(evt:NetStatusEvent) : void{
trace(evt.info.code); trace(evt.info.code);
=======
private function js_call_stop():void {
if (connection) {
connection.close();
connection = null;
}
if (updatePlayProgressTimer) {
updatePlayProgressTimer.stop();
updatePlayProgressTimer = null;
}
if (elapTimer) {
elapTimer.restart();
}
}
// get NetConnection NetStatusEvent
public function onStatus(evt:NetStatusEvent) : void{
trace(evt.info.code);
if (evt.info.hasOwnProperty("data") && evt.info.data) {
// for context menu
var customItems:Array = [new ContextMenuItem("SrsPlayer")];
if (evt.info.data.hasOwnProperty("srs_server")) {
customItems.push(new ContextMenuItem("Server: " + evt.info.data.srs_server));
}
if (evt.info.data.hasOwnProperty("srs_primary_authors")) {
customItems.push(new ContextMenuItem("PrimaryAuthors: " + evt.info.data.srs_primary_authors));
}
contextMenu.customItems = customItems;
}
>>>>>>> upstream/master
switch(evt.info.code){ switch(evt.info.code){
case "NetConnection.Connect.Failed": case "NetConnection.Connect.Failed":
updateState("连接服务器失败!"); updateState("连接服务器失败!");
@ -92,8 +203,18 @@ package
//updateState("连接已断开!"); //updateState("连接已断开!");
break; break;
} }
<<<<<<< HEAD
} }
=======
}
public function onTimerTimeout(evt:TimerEvent):void
{
value_progressbar = elapTimer.elapsed();
updateProgess(value_progressbar, max_progressbar);
}
>>>>>>> upstream/master
/** /**
* NetConnection callback this function, when recv server call "onSrsBandCheckStartPlayBytes" * NetConnection callback this function, when recv server call "onSrsBandCheckStartPlayBytes"
@ -104,13 +225,18 @@ package
var interval_ms:Number = evt.interval_ms; var interval_ms:Number = evt.interval_ms;
connection.call("onSrsBandCheckStartingPlayBytes", null); connection.call("onSrsBandCheckStartingPlayBytes", null);
<<<<<<< HEAD
updateState("测试下行带宽(" + server_ip + ")"); updateState("测试下行带宽(" + server_ip + ")");
=======
updateState("开始测试下行带宽服务器IP" + server_ip);
>>>>>>> upstream/master
// we suppose play duration_ms = pub duration_ms // we suppose play duration_ms = pub duration_ms
max_progressbar = duration_ms * 2; max_progressbar = duration_ms * 2;
} }
public function onSrsBandCheckPlaying(evt:Object):void{ public function onSrsBandCheckPlaying(evt:Object):void{
<<<<<<< HEAD
} }
@ -118,6 +244,8 @@ package
{ {
value_progressbar = elapTimer.elapsed(); value_progressbar = elapTimer.elapsed();
updateProgess(value_progressbar, max_progressbar); updateProgess(value_progressbar, max_progressbar);
=======
>>>>>>> upstream/master
} }
public function onSrsBandCheckStopPlayBytes(evt:Object):void{ public function onSrsBandCheckStopPlayBytes(evt:Object):void{
@ -133,6 +261,10 @@ package
kbps = (int(kbps * 10))/10.0; kbps = (int(kbps * 10))/10.0;
flash.utils.setTimeout(stopPlayTest, 0); flash.utils.setTimeout(stopPlayTest, 0);
<<<<<<< HEAD
=======
updateState("下行带宽测试完毕,服务器: " + server_ip + "" + kbps + "kbps开始测试上行带宽。");
>>>>>>> upstream/master
} }
private function stopPlayTest():void{ private function stopPlayTest():void{
@ -144,7 +276,10 @@ package
var interval_ms:Number = evt.interval_ms; var interval_ms:Number = evt.interval_ms;
connection.call("onSrsBandCheckStartingPublishBytes", null); connection.call("onSrsBandCheckStartingPublishBytes", null);
<<<<<<< HEAD
updateState("测试上行带宽(" + server_ip + ")"); updateState("测试上行带宽(" + server_ip + ")");
=======
>>>>>>> upstream/master
flash.utils.setTimeout(publisher, 0); flash.utils.setTimeout(publisher, 0);
} }
@ -208,6 +343,7 @@ package
connection.call("finalClientPacket", null); connection.call("finalClientPacket", null);
} }
<<<<<<< HEAD
public function onBWDone():void{ public function onBWDone():void{
// do nothing // do nothing
} }
@ -215,13 +351,27 @@ package
// update progressBar's value // update progressBar's value
private function updateProgess(value:Number, maxValue:Number):void{ private function updateProgess(value:Number, maxValue:Number):void{
flash.external.ExternalInterface.call(this.js_update_progress, value * 100 / maxValue + "%"); flash.external.ExternalInterface.call(this.js_update_progress, value * 100 / maxValue + "%");
=======
// update progressBar's value
private function updateProgess(value:Number, maxValue:Number):void{
flash.external.ExternalInterface.call(this.js_update_progress, this.js_id, value * 100 / maxValue);
>>>>>>> upstream/master
trace(value + "-" + maxValue + "-" + value * 100 / maxValue + "%"); trace(value + "-" + maxValue + "-" + value * 100 / maxValue + "%");
} }
// update checking status // update checking status
private function updateState(text:String):void{ private function updateState(text:String):void{
<<<<<<< HEAD
flash.external.ExternalInterface.call(this.js_update_status, text); flash.external.ExternalInterface.call(this.js_update_status, text);
trace(text); trace(text);
} }
=======
flash.external.ExternalInterface.call(this.js_update_status, this.js_id, text);
trace(text);
}
public function onBWDone():void{
}
>>>>>>> upstream/master
} }
} }

View file

@ -305,8 +305,8 @@ package
if (evt.info.data.hasOwnProperty("srs_server")) { if (evt.info.data.hasOwnProperty("srs_server")) {
customItems.push(new ContextMenuItem("Server: " + evt.info.data.srs_server)); customItems.push(new ContextMenuItem("Server: " + evt.info.data.srs_server));
} }
if (evt.info.data.hasOwnProperty("srs_contributor")) { if (evt.info.data.hasOwnProperty("srs_primary_authors")) {
customItems.push(new ContextMenuItem("Contributor: " + evt.info.data.srs_contributor)); customItems.push(new ContextMenuItem("PrimaryAuthors: " + evt.info.data.srs_primary_authors));
} }
contextMenu.customItems = customItems; contextMenu.customItems = customItems;
} }
@ -334,7 +334,7 @@ package
if (url.indexOf("http") == 0) { if (url.indexOf("http") == 0) {
media_stream.play(url); media_stream.play(url);
} else { } else {
var streamName:String = url.substr(url.lastIndexOf("/")); var streamName:String = url.substr(url.lastIndexOf("/") + 1);
media_stream.play(streamName); media_stream.play(streamName);
} }

View file

@ -192,8 +192,8 @@ package
if (evt.info.data.hasOwnProperty("srs_server")) { if (evt.info.data.hasOwnProperty("srs_server")) {
customItems.push(new ContextMenuItem("Server: " + evt.info.data.srs_server)); customItems.push(new ContextMenuItem("Server: " + evt.info.data.srs_server));
} }
if (evt.info.data.hasOwnProperty("srs_contributor")) { if (evt.info.data.hasOwnProperty("srs_primary_authors")) {
customItems.push(new ContextMenuItem("Contributor: " + evt.info.data.srs_contributor)); customItems.push(new ContextMenuItem("PrimaryAuthors: " + evt.info.data.srs_primary_authors));
} }
contextMenu.customItems = customItems; contextMenu.customItems = customItems;
} }

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -76,10 +76,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define RTMP_SIG_SRS_URL "https://"RTMP_SIG_SRS_URL_SHORT #define RTMP_SIG_SRS_URL "https://"RTMP_SIG_SRS_URL_SHORT
#define RTMP_SIG_SRS_URL_SHORT "github.com/winlinvip/simple-rtmp-server" #define RTMP_SIG_SRS_URL_SHORT "github.com/winlinvip/simple-rtmp-server"
#define RTMP_SIG_SRS_WEB "http://blog.csdn.net/win_lin" #define RTMP_SIG_SRS_WEB "http://blog.csdn.net/win_lin"
#define RTMP_SIG_SRS_EMAIL "winterserver@126.com" #define RTMP_SIG_SRS_EMAIL "winlin@vip.126.com"
#define RTMP_SIG_SRS_LICENSE "The MIT License (MIT)" #define RTMP_SIG_SRS_LICENSE "The MIT License (MIT)"
#define RTMP_SIG_SRS_COPYRIGHT "Copyright (c) 2013 winlin" #define RTMP_SIG_SRS_COPYRIGHT "Copyright (c) 2013-2014 winlin"
#define RTMP_SIG_SRS_CONTRIBUTOR "winlin,wenjiegit" #define RTMP_SIG_SRS_PRIMARY_AUTHROS "winlin,wenjiegit"
// compare // compare
#define srs_min(a, b) (((a) < (b))? (a) : (b)) #define srs_min(a, b) (((a) < (b))? (a) : (b))

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 wenjiegit Copyright (c) 2013-2014 wenjiegit
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 wenjiegit Copyright (c) 2013-2014 wenjiegit
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -42,11 +42,6 @@ using namespace std;
#include <srs_core_http.hpp> #include <srs_core_http.hpp>
#include <srs_core_bandwidth.hpp> #include <srs_core_bandwidth.hpp>
#define SRS_PULSE_TIMEOUT_MS 100
#define SRS_SEND_TIMEOUT_US 5000000L
#define SRS_RECV_TIMEOUT_US SRS_SEND_TIMEOUT_US
#define SRS_STREAM_BUSY_SLEEP_MS 2000
SrsClient::SrsClient(SrsServer* srs_server, st_netfd_t client_stfd) SrsClient::SrsClient(SrsServer* srs_server, st_netfd_t client_stfd)
: SrsConnection(srs_server, client_stfd) : SrsConnection(srs_server, client_stfd)
{ {
@ -198,7 +193,7 @@ int SrsClient::service_cycle()
srs_warn("stream %s is already publishing. ret=%d", srs_warn("stream %s is already publishing. ret=%d",
req->get_stream_url().c_str(), ret); req->get_stream_url().c_str(), ret);
// to delay request // to delay request
st_usleep(SRS_STREAM_BUSY_SLEEP_MS * 1000); st_usleep(SRS_STREAM_BUSY_SLEEP_US);
return ret; return ret;
} }
@ -324,12 +319,12 @@ int SrsClient::playing(SrsSource* source)
SrsAutoFree(SrsConsumer, consumer, false); SrsAutoFree(SrsConsumer, consumer, false);
srs_verbose("consumer created success."); srs_verbose("consumer created success.");
rtmp->set_recv_timeout(SRS_PULSE_TIMEOUT_MS * 1000); rtmp->set_recv_timeout(SRS_PULSE_TIMEOUT_US);
SrsPithyPrint pithy_print(SRS_STAGE_PLAY_USER); SrsPithyPrint pithy_print(SRS_STAGE_PLAY_USER);
while (true) { while (true) {
pithy_print.elapse(SRS_PULSE_TIMEOUT_MS); pithy_print.elapse(SRS_PULSE_TIMEOUT_US / 1000);
// switch to other st-threads. // switch to other st-threads.
st_usleep(0); st_usleep(0);

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -735,9 +735,9 @@ int SrsConfig::parse_argv(int& i, char** argv)
void SrsConfig::print_help(char** argv) void SrsConfig::print_help(char** argv)
{ {
printf(RTMP_SIG_SRS_NAME" "RTMP_SIG_SRS_VERSION printf(
" Copyright (c) 2013 winlin\n" RTMP_SIG_SRS_NAME" "RTMP_SIG_SRS_VERSION" "RTMP_SIG_SRS_COPYRIGHT"\n"
"Contributors: "RTMP_SIG_SRS_CONTRIBUTOR"\n" "Primary Authors: "RTMP_SIG_SRS_PRIMARY_AUTHROS"\n"
"Build: "SRS_BUILD_DATE" Configuration: "SRS_CONFIGURE"\n" "Build: "SRS_BUILD_DATE" Configuration: "SRS_CONFIGURE"\n"
"Usage: %s [-h?vV] [-c <filename>]\n" "Usage: %s [-h?vV] [-c <filename>]\n"
"\n" "\n"
@ -1664,4 +1664,3 @@ bool srs_directive_equals(SrsConfDirective* a, SrsConfDirective* b)
return true; return true;
} }

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -57,7 +57,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// the interval in seconds for bandwidth check // the interval in seconds for bandwidth check
#define SRS_CONF_DEFAULT_BANDWIDTH_LIMIT_KBPS 1000 #define SRS_CONF_DEFAULT_BANDWIDTH_LIMIT_KBPS 1000
#define SRS_CONF_DEFAULT_CHUNK_SIZE 4096 // the default chunk size for system.
#define SRS_CONF_DEFAULT_CHUNK_SIZE 60000
#define SRS_STAGE_PLAY_USER_INTERVAL_MS 1300 #define SRS_STAGE_PLAY_USER_INTERVAL_MS 1300
#define SRS_STAGE_PUBLISH_USER_INTERVAL_MS 1100 #define SRS_STAGE_PUBLISH_USER_INTERVAL_MS 1100

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -37,11 +37,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_core_config.hpp> #include <srs_core_config.hpp>
#include <srs_core_rtmp.hpp> #include <srs_core_rtmp.hpp>
#include <srs_core_pithy_print.hpp> #include <srs_core_pithy_print.hpp>
#include <srs_core_protocol.hpp>
#ifdef SRS_FFMPEG #ifdef SRS_FFMPEG
#define SRS_ENCODER_SLEEP_MS 2000
#define SRS_ENCODER_COPY "copy" #define SRS_ENCODER_COPY "copy"
#define SRS_ENCODER_VCODEC "libx264" #define SRS_ENCODER_VCODEC "libx264"
#define SRS_ENCODER_ACODEC "libaacplus" #define SRS_ENCODER_ACODEC "libaacplus"
@ -483,7 +482,7 @@ void SrsFFMPEG::stop()
SrsEncoder::SrsEncoder() SrsEncoder::SrsEncoder()
{ {
pthread = new SrsThread(this, SRS_ENCODER_SLEEP_MS); pthread = new SrsThread(this, SRS_ENCODER_SLEEP_US);
pithy_print = new SrsPithyPrint(SRS_STAGE_ENCODER); pithy_print = new SrsPithyPrint(SRS_STAGE_ENCODER);
} }
@ -549,7 +548,7 @@ int SrsEncoder::cycle()
// pithy print // pithy print
encoder(); encoder();
pithy_print->elapse(SRS_ENCODER_SLEEP_MS); pithy_print->elapse(SRS_ENCODER_SLEEP_US / 1000);
return ret; return ret;
} }

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -38,11 +38,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_core_source.hpp> #include <srs_core_source.hpp>
#include <srs_core_autofree.hpp> #include <srs_core_autofree.hpp>
#define SRS_PULSE_TIMEOUT_MS 100
#define SRS_FORWARDER_SLEEP_MS 2000
#define SRS_SEND_TIMEOUT_US 3000000L
#define SRS_RECV_TIMEOUT_US SRS_SEND_TIMEOUT_US
SrsForwarder::SrsForwarder(SrsSource* _source) SrsForwarder::SrsForwarder(SrsSource* _source)
{ {
source = _source; source = _source;
@ -51,7 +46,7 @@ SrsForwarder::SrsForwarder(SrsSource* _source)
stfd = NULL; stfd = NULL;
stream_id = 0; stream_id = 0;
pthread = new SrsThread(this, SRS_FORWARDER_SLEEP_MS); pthread = new SrsThread(this, SRS_FORWARDER_SLEEP_US);
queue = new SrsMessageQueue(); queue = new SrsMessageQueue();
jitter = new SrsRtmpJitter(); jitter = new SrsRtmpJitter();
} }
@ -286,11 +281,11 @@ int SrsForwarder::forward()
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
client->set_recv_timeout(SRS_PULSE_TIMEOUT_MS * 1000); client->set_recv_timeout(SRS_PULSE_TIMEOUT_US);
SrsPithyPrint pithy_print(SRS_STAGE_FORWARDER); SrsPithyPrint pithy_print(SRS_STAGE_FORWARDER);
while (true) { while (pthread->can_loop()) {
// switch to other st-threads. // switch to other st-threads.
st_usleep(0); st_usleep(0);
@ -322,7 +317,7 @@ int SrsForwarder::forward()
SrsAutoFree(SrsSharedPtrMessage*, msgs, true); SrsAutoFree(SrsSharedPtrMessage*, msgs, true);
// pithy print // pithy print
pithy_print.elapse(SRS_PULSE_TIMEOUT_MS); pithy_print.elapse(SRS_PULSE_TIMEOUT_US / 1000);
if (pithy_print.can_print()) { if (pithy_print.can_print()) {
srs_trace("-> time=%"PRId64", msgs=%d, obytes=%"PRId64", ibytes=%"PRId64", okbps=%d, ikbps=%d", srs_trace("-> time=%"PRId64", msgs=%d, obytes=%"PRId64", ibytes=%"PRId64", okbps=%d, ikbps=%d",
pithy_print.get_age(), count, client->get_send_bytes(), client->get_recv_bytes(), client->get_send_kbps(), client->get_recv_kbps()); pithy_print.get_age(), count, client->get_send_bytes(), client->get_recv_bytes(), client->get_send_kbps(), client->get_recv_kbps());

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -36,6 +36,37 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_core_log.hpp> #include <srs_core_log.hpp>
#include <srs_core_error.hpp> #include <srs_core_error.hpp>
// the following is the timeout for rtmp protocol,
// to avoid death connection.
// when got a messae header, there must be some data,
// increase recv timeout to got an entire message.
#define SRS_MIN_RECV_TIMEOUT_US 60*1000*1000L
// the timeout to wait for client control message,
// if timeout, we generally ignore and send the data to client,
// generally, it's the pulse time for data seding.
#define SRS_PULSE_TIMEOUT_US 200*1000L
// the timeout to wait client data,
// if timeout, close the connection.
#define SRS_SEND_TIMEOUT_US 30*1000*1000L
// the timeout to send data to client,
// if timeout, close the connection.
#define SRS_RECV_TIMEOUT_US 30*1000*1000L
// when stream is busy, for example, streaming is already
// publishing, when a new client to request to publish,
// sleep a while and close the connection.
#define SRS_STREAM_BUSY_SLEEP_US 3*1000*1000L
// when error, forwarder sleep for a while and retry.
#define SRS_FORWARDER_SLEEP_US 3*1000*1000L
// when error, encoder sleep for a while and retry.
#define SRS_ENCODER_SLEEP_US 3*1000*1000L
class SrsSocket; class SrsSocket;
class SrsBuffer; class SrsBuffer;
class SrsPacket; class SrsPacket;

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -391,6 +391,22 @@ int SrsRtmpClient::play(string stream, int stream_id)
} }
} }
// SetChunkSize
if (true) {
SrsCommonMessage* msg = new SrsCommonMessage();
SrsSetChunkSizePacket* pkt = new SrsSetChunkSizePacket();
pkt->chunk_size = SRS_CONF_DEFAULT_CHUNK_SIZE;
msg->set_packet(pkt, 0);
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
srs_error("send set chunk size failed. "
"stream=%s, chunk_size=%d, ret=%d",
stream.c_str(), SRS_CONF_DEFAULT_CHUNK_SIZE, ret);
return ret;
}
}
return ret; return ret;
} }
@ -398,6 +414,22 @@ int SrsRtmpClient::publish(string stream, int stream_id)
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
// SetChunkSize
if (true) {
SrsCommonMessage* msg = new SrsCommonMessage();
SrsSetChunkSizePacket* pkt = new SrsSetChunkSizePacket();
pkt->chunk_size = SRS_CONF_DEFAULT_CHUNK_SIZE;
msg->set_packet(pkt, 0);
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
srs_error("send set chunk size failed. "
"stream=%s, chunk_size=%d, ret=%d",
stream.c_str(), SRS_CONF_DEFAULT_CHUNK_SIZE, ret);
return ret;
}
}
// publish(stream) // publish(stream)
if (true) { if (true) {
SrsCommonMessage* msg = new SrsCommonMessage(); SrsCommonMessage* msg = new SrsCommonMessage();
@ -617,7 +649,7 @@ int SrsRtmp::response_connect_app(SrsRequest *req, const char* server_ip)
data->set("srs_site", new SrsAmf0String(RTMP_SIG_SRS_WEB)); data->set("srs_site", new SrsAmf0String(RTMP_SIG_SRS_WEB));
data->set("srs_email", new SrsAmf0String(RTMP_SIG_SRS_EMAIL)); data->set("srs_email", new SrsAmf0String(RTMP_SIG_SRS_EMAIL));
data->set("srs_copyright", new SrsAmf0String(RTMP_SIG_SRS_COPYRIGHT)); data->set("srs_copyright", new SrsAmf0String(RTMP_SIG_SRS_COPYRIGHT));
data->set("srs_contributor", new SrsAmf0String(RTMP_SIG_SRS_CONTRIBUTOR)); data->set("srs_primary_authors", new SrsAmf0String(RTMP_SIG_SRS_PRIMARY_AUTHROS));
if (server_ip) { if (server_ip) {
data->set("srs_server_ip", new SrsAmf0String(server_ip)); data->set("srs_server_ip", new SrsAmf0String(server_ip));
@ -1194,4 +1226,3 @@ int SrsRtmp::identify_flash_publish_client(SrsPublishPacket* req, SrsClientType&
return ret; return ret;
} }

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -110,7 +110,7 @@ enum SrsClientType
*/ */
class SrsRtmpClient class SrsRtmpClient
{ {
private: protected:
SrsProtocol* protocol; SrsProtocol* protocol;
st_netfd_t stfd; st_netfd_t stfd;
public: public:

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -35,7 +35,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_core_client.hpp> #include <srs_core_client.hpp>
#include <srs_core_config.hpp> #include <srs_core_config.hpp>
#define SERVER_LISTEN_BACKLOG 10 #define SERVER_LISTEN_BACKLOG 512
#define SRS_TIME_RESOLUTION_MS 500 #define SRS_TIME_RESOLUTION_MS 500
SrsListener::SrsListener(SrsServer* _server, SrsListenerType _type) SrsListener::SrsListener(SrsServer* _server, SrsListenerType _type)

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -642,7 +642,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
metadata->metadata->set("server", new SrsAmf0String( metadata->metadata->set("server", new SrsAmf0String(
RTMP_SIG_SRS_KEY" "RTMP_SIG_SRS_VERSION" ("RTMP_SIG_SRS_URL_SHORT")")); RTMP_SIG_SRS_KEY" "RTMP_SIG_SRS_VERSION" ("RTMP_SIG_SRS_URL_SHORT")"));
metadata->metadata->set("contributor", metadata->metadata->set("contributor",
new SrsAmf0String(RTMP_SIG_SRS_CONTRIBUTOR)); new SrsAmf0String(RTMP_SIG_SRS_PRIMARY_AUTHROS));
SrsAmf0Any* prop = NULL; SrsAmf0Any* prop = NULL;
if ((prop = metadata->metadata->get_property("audiosamplerate")) != NULL) { if ((prop = metadata->metadata->get_property("audiosamplerate")) != NULL) {

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -54,10 +54,10 @@ void ISrsThreadHandler::on_leave_loop()
{ {
} }
SrsThread::SrsThread(ISrsThreadHandler* thread_handler, int64_t interval_ms) SrsThread::SrsThread(ISrsThreadHandler* thread_handler, int64_t interval_us)
{ {
handler = thread_handler; handler = thread_handler;
cycle_interval_milliseconds = interval_ms; cycle_interval_us = interval_us;
tid = NULL; tid = NULL;
loop = false; loop = false;
@ -102,6 +102,11 @@ void SrsThread::stop()
} }
} }
bool SrsThread::can_loop()
{
return loop;
}
void SrsThread::thread_cycle() void SrsThread::thread_cycle()
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
@ -138,7 +143,7 @@ failed:
break; break;
} }
st_usleep(cycle_interval_milliseconds * 1000); st_usleep(cycle_interval_us);
} }
handler->on_leave_loop(); handler->on_leave_loop();

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -43,6 +43,23 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* when stop, the thread will interrupt the st_thread, * when stop, the thread will interrupt the st_thread,
* which will cause the socket to return error and * which will cause the socket to return error and
* terminate the cycle thread. * terminate the cycle thread.
*
* when thread interrupt, the socket maybe not got EINT,
* espectially on st_usleep(), so the cycle must check the loop,
* when handler->cycle() has loop itself, for example:
* handler->cycle() is:
* while (true):
* st_usleep(0);
* if (read_from_socket(skt) < 0) break;
* if thread stop when read_from_socket, it's ok, the loop will break,
* but when thread stop interrupt the s_usleep(0), then the loop is
* death loop.
* in a word, the handler->cycle() must:
* handler->cycle() is:
* while (pthread->can_loop()):
* st_usleep(0);
* if (read_from_socket(skt) < 0) break;
* check the loop, then it works.
*/ */
class ISrsThreadHandler class ISrsThreadHandler
{ {
@ -68,14 +85,14 @@ private:
bool loop; bool loop;
private: private:
ISrsThreadHandler* handler; ISrsThreadHandler* handler;
int64_t cycle_interval_milliseconds; int64_t cycle_interval_us;
public: public:
/** /**
* initialize the thread. * initialize the thread.
* @param thread_handler, the cycle handler for the thread. * @param thread_handler, the cycle handler for the thread.
* @param interval_ms, the sleep interval when cycle finished. * @param interval_us, the sleep interval when cycle finished.
*/ */
SrsThread(ISrsThreadHandler* thread_handler, int64_t interval_ms); SrsThread(ISrsThreadHandler* thread_handler, int64_t interval_us);
virtual ~SrsThread(); virtual ~SrsThread();
public: public:
/** /**
@ -90,6 +107,12 @@ public:
* @remark user can stop multiple times, ignore if already stopped. * @remark user can stop multiple times, ignore if already stopped.
*/ */
virtual void stop(); virtual void stop();
/**
* whether the thread should loop,
* used for handler->cycle() which has a loop method,
* to check this method, break if false.
*/
virtual bool can_loop();
private: private:
virtual void thread_cycle(); virtual void thread_cycle();
static void* thread_fun(void* arg); static void* thread_fun(void* arg);

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 wenjiegit Copyright (c) 2013-2014 wenjiegit
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
@ -155,7 +155,7 @@ private:
* @brief init st lib * @brief init st lib
*/ */
static int init_st(); static int init_st();
static void print_help(); static void print_help(char** argv);
static void print_version(); static void print_version();
/** /**
@ -193,18 +193,23 @@ int main(int argc ,char* argv[])
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
if (argc <= 1) {
print_help(argv);
exit(1);
}
if ((ret = get_opt(argc, argv)) != ERROR_SUCCESS) { if ((ret = get_opt(argc, argv)) != ERROR_SUCCESS) {
return -1; return -1;
} }
// check param // check param
if (g_ip.empty()) { if (g_ip.empty()) {
printf("ip address should not be empty."); printf("ip address should not be empty.\n");
return -1; return -1;
} }
if (g_key.empty()) { if (g_key.empty()) {
printf("test key should not be empty."); printf("test key should not be empty.\n");
return -1; return -1;
} }
@ -324,7 +329,7 @@ int SrsBandCheckClient::expect_start_play()
// expect connect _result // expect connect _result
SrsCommonMessage* msg = NULL; SrsCommonMessage* msg = NULL;
SrsBandwidthPacket* pkt = NULL; SrsBandwidthPacket* pkt = NULL;
if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(get_protocol(), &msg, &pkt)) != ERROR_SUCCESS) { if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
srs_error("expect bandcheck start play message failed. ret=%d", ret); srs_error("expect bandcheck start play message failed. ret=%d", ret);
return ret; return ret;
} }
@ -363,7 +368,7 @@ int SrsBandCheckClient::expect_stop_play()
while (true) { while (true) {
SrsCommonMessage* msg = NULL; SrsCommonMessage* msg = NULL;
SrsBandwidthPacket* pkt = NULL; SrsBandwidthPacket* pkt = NULL;
if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(get_protocol(), &msg, &pkt)) != ERROR_SUCCESS) { if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
srs_error("expect stop play message failed. ret=%d", ret); srs_error("expect stop play message failed. ret=%d", ret);
return ret; return ret;
} }
@ -402,7 +407,7 @@ int SrsBandCheckClient::expect_start_pub()
while (true) { while (true) {
SrsCommonMessage* msg = NULL; SrsCommonMessage* msg = NULL;
SrsBandwidthPacket* pkt = NULL; SrsBandwidthPacket* pkt = NULL;
if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(get_protocol(), &msg, &pkt)) != ERROR_SUCCESS) { if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
srs_error("expect start pub message failed. ret=%d", ret); srs_error("expect start pub message failed. ret=%d", ret);
return ret; return ret;
} }
@ -472,7 +477,7 @@ int SrsBandCheckClient::expect_stop_pub()
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
while (true) { while (true) {
if ((ret = st_netfd_poll(get_st_fd(), POLLIN, 1000)) == ERROR_SUCCESS) { if ((ret = st_netfd_poll(stfd, POLLIN, 1000)) == ERROR_SUCCESS) {
SrsCommonMessage* msg = 0; SrsCommonMessage* msg = 0;
if ((ret = recv_message(&msg)) != ERROR_SUCCESS) if ((ret = recv_message(&msg)) != ERROR_SUCCESS)
{ {
@ -480,7 +485,7 @@ int SrsBandCheckClient::expect_stop_pub()
return ret; return ret;
} }
if ((ret = msg->decode_packet(get_protocol())) != ERROR_SUCCESS) { if ((ret = msg->decode_packet(protocol)) != ERROR_SUCCESS) {
srs_error("decode packet error while expect stop pub. ret=%d", ret); srs_error("decode packet error while expect stop pub. ret=%d", ret);
return ret; return ret;
} }
@ -505,7 +510,7 @@ int SrsBandCheckClient::expect_finished()
while (true) { while (true) {
SrsCommonMessage* msg = NULL; SrsCommonMessage* msg = NULL;
SrsBandwidthPacket* pkt = NULL; SrsBandwidthPacket* pkt = NULL;
if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(get_protocol(), &msg, &pkt)) != ERROR_SUCCESS) { if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
srs_error("expect finished message failed. ret=%d", ret); srs_error("expect finished message failed. ret=%d", ret);
return ret; return ret;
} }
@ -744,11 +749,11 @@ int init_st()
return ret; return ret;
} }
void print_help() void print_help(char** argv)
{ {
const char *help = "Usage: srs-bandcheck [OPTION]...\n" printf(
"Usage: %s [OPTION]...\n"
"test band width from client to rtmp server.\n" "test band width from client to rtmp server.\n"
"Mandatory arguments to long options are mandatory for short options too.\n" "Mandatory arguments to long options are mandatory for short options too.\n"
" -i, --ip the ip or domain that to test\n" " -i, --ip the ip or domain that to test\n"
" -p, --port the port that server listen \n" " -p, --port the port that server listen \n"
@ -756,22 +761,23 @@ void print_help()
" -v, --vhost the vhost used to test \n" " -v, --vhost the vhost used to test \n"
" -V, --version output version information and exit \n" " -V, --version output version information and exit \n"
" -h, --help display this help and exit \n" " -h, --help display this help and exit \n"
"\n\n\n" "\n"
"For example:\n"
" %s -i 192.168.1.248 -p 1935 -v bandcheck.srs.com -k 35c9b402c12a7246868752e2878f7e0e"
"\n\n"
"Exit status:\n" "Exit status:\n"
"0 if OK,\n" "0 if OK,\n"
"other if error occured, and the detail should be printed.\n" "other if error occured, and the detail should be printed.\n"
"\n\n" "\n\n"
"srs home page: <winlin(winterserver): http://blog.csdn.net/win_lin>\n" "srs home page: <http://blog.chinaunix.net/uid/25006789.html>\n",
"srs home page: <http://blog.chinaunix.net/uid/25006789.html>\n"; argv[0], argv[0]);
printf("%s", help);
} }
void print_version() void print_version()
{ {
const char *version = "" const char *version = ""
"srs_bandcheck "BUILD_VERSION"\n" "srs_bandcheck "BUILD_VERSION"\n"
"Copyright (C) 2013 wenjiegit.\n" "Copyright (c) 2013-2014 wenjiegit.\n"
"License MIT\n" "License MIT\n"
"This is free software: you are free to change and redistribute it.\n" "This is free software: you are free to change and redistribute it.\n"
"There is NO WARRANTY, to the extent permitted by law.\n" "There is NO WARRANTY, to the extent permitted by law.\n"
@ -813,7 +819,7 @@ int get_opt(int argc, char *argv[])
exit(0); exit(0);
break; break;
case 'h': case 'h':
print_help(); print_help(argv);
exit(0); exit(0);
break; break;
default: default:

View file

@ -1,7 +1,7 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013-2014 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View file

@ -1,6 +1,7 @@
file file
main readonly separator, main readonly separator,
..\main\srs_main_server.cpp, ..\main\srs_main_server.cpp,
..\main\srs_main_bandcheck.cpp,
auto readonly separator, auto readonly separator,
..\..\objs\srs_auto_headers.hpp, ..\..\objs\srs_auto_headers.hpp,
core readonly separator, core readonly separator,
@ -57,7 +58,7 @@ file
..\core\srs_core_source.hpp, ..\core\srs_core_source.hpp,
..\core\srs_core_source.cpp, ..\core\srs_core_source.cpp,
research readonly separator, research readonly separator,
..\..\research\ts_info.cc; ..\..\research\hls\ts_info.cc;
mainconfig mainconfig
"" = "MAIN"; "" = "MAIN";