From 908f0d87e96c3bf6c60627009a0d27ca1dbab03d Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 22 Dec 2013 17:41:28 +0800 Subject: [PATCH] add bandwidth workflow --- README.md | 29 ++++ trunk/src/core/srs_core_bandwidth.hpp | 184 +++++++++++++------------- 2 files changed, 121 insertions(+), 92 deletions(-) mode change 100644 => 100755 trunk/src/core/srs_core_bandwidth.hpp diff --git a/README.md b/README.md index 511c0f0fd..2f4cae688 100755 --- a/README.md +++ b/README.md @@ -131,6 +131,35 @@ Stream Architecture: | ...) | +-> DVR --------------+-> FILE | +-----------+-------------------------+----------------+ +Bandwidth Test Workflow: +
+ +------------+             +----------+    
+ |  Client    |             |  Server  |    
+ +-----+------+             +-----+----+      
+       |                          |           
+       |  connect vhost------>    | if vhost enable bandwidth,
+       |  <-----result(success)   | do bandwidth check.
+       |                          |           
+       |  <----call(start play)   | onSrsBandCheckStartPlayBytes
+       |  result(playing)----->   | onSrsBandCheckStartingPlayBytes
+       |  <-------data(playing)   | onSrsBandCheckStartingPlayBytes
+       |  <-----call(stop play)   | onSrsBandCheckStopPlayBytes
+       |  result(stopped)----->   | onSrsBandCheckStoppedPlayBytes
+       |                          |           
+       |  <-call(start publish)   | onSrsBandCheckStartPublishBytes
+       |  result(publishing)-->   | onSrsBandCheckStartingPublishBytes
+       |  data(publishing)---->   | onSrsBandCheckStartingPublishBytes
+       |  <--call(stop publish)   | onSrsBandCheckStopPublishBytes
+       |  result(stopped)(1)-->   | onSrsBandCheckStoppedPublishBytes
+       |                          | 
+       |  <--------------report   |
+       |  final(2)------------>   | finalClientPacket
+       |                     |
+1. when flash client, server ignore the publish stopped result,
+  and directly send the report to flash client.
+2. flash client only. when got report, flash client should send out
+  a final packet and close the connection immediately.
+
### System Requirements Supported operating systems and hardware: diff --git a/trunk/src/core/srs_core_bandwidth.hpp b/trunk/src/core/srs_core_bandwidth.hpp old mode 100644 new mode 100755 index 472459157..2e7cd0b27 --- a/trunk/src/core/srs_core_bandwidth.hpp +++ b/trunk/src/core/srs_core_bandwidth.hpp @@ -1,93 +1,93 @@ -/* -The MIT License (MIT) - -Copyright (c) 2013 wenjiegit - -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 -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef SRS_CORE_BANDWIDTH_HPP -#define SRS_CORE_BANDWIDTH_HPP - -/* -#include -*/ -#include - -class SrsRequest; -class SrsRtmp; - -/** -* bandwidth test agent which provides the interfaces for bandwidth check. -* 1. if vhost disabled bandwidth check, ignore. -* 2. otherwise, check the key, error if verify failed. -* 3. check the interval limit, error if bandwidth in the interval window. -* 4. check the bandwidth under the max kbps. -* 5. send the bandwidth data to client. -* bandwidth workflow: -* +------------+ +----------+ -* | Client | | Server | -* +-----+------+ +-----+----+ -* | | -* | connect vhost------> | if vhost enable bandwidth, -* | <-----result(success) | do bandwidth check. -* | | -* | <----call(start play) | onSrsBandCheckStartPlayBytes -* | result(playing)-----> | onSrsBandCheckStartingPlayBytes -* | <-------data(playing) | onSrsBandCheckStartingPlayBytes -* | <-----call(stop play) | onSrsBandCheckStopPlayBytes -* | result(stopped)-----> | onSrsBandCheckStoppedPlayBytes -* | | -* | <-call(start publish) | onSrsBandCheckStartPublishBytes -* | result(publishing)--> | onSrsBandCheckStartingPublishBytes -* | data(publishing)----> | onSrsBandCheckStartingPublishBytes -* | <--call(stop publish) | onSrsBandCheckStopPublishBytes -* | result(stopped)-----> | onSrsBandCheckStoppedPublishBytes(1) -* | | -* | <--------------report | -* | final---------------> | finalClientPacket(2) -* | | -* 1. when flash client, server ignore the publish stopped result, -* and directly send the report to flash client. -* 2. flash client only. when got report, flash client should send out -* a final packet and close the connection immediately. -*/ -class SrsBandwidth -{ -private: - SrsRequest* req; - SrsRtmp* rtmp; -public: - SrsBandwidth(); - virtual ~SrsBandwidth(); -public: - /** - * do the bandwidth test. - */ - virtual int bandwidth_test(SrsRequest* _req, st_netfd_t stfd, SrsRtmp* _rtmp); -private: - virtual int get_local_ip(st_netfd_t stfd, char *&local_ip); - /** - * used to process band width check from client. - */ - virtual int do_bandwidth_check(); - virtual int check_play(int duration_ms, int interval_ms, int& actual_duration_ms, int& play_bytes, int max_play_kbps); - virtual int check_publish(int duration_ms, int interval_ms, int& actual_duration_ms, int& publish_bytes, int max_pub_kbps); -}; - +/* +The MIT License (MIT) + +Copyright (c) 2013 wenjiegit + +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 +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef SRS_CORE_BANDWIDTH_HPP +#define SRS_CORE_BANDWIDTH_HPP + +/* +#include +*/ +#include + +class SrsRequest; +class SrsRtmp; + +/** +* bandwidth test agent which provides the interfaces for bandwidth check. +* 1. if vhost disabled bandwidth check, ignore. +* 2. otherwise, check the key, error if verify failed. +* 3. check the interval limit, error if bandwidth in the interval window. +* 4. check the bandwidth under the max kbps. +* 5. send the bandwidth data to client. +* bandwidth workflow: +* +------------+ +----------+ +* | Client | | Server | +* +-----+------+ +-----+----+ +* | | +* | connect vhost------> | if vhost enable bandwidth, +* | <-----result(success) | do bandwidth check. +* | | +* | <----call(start play) | onSrsBandCheckStartPlayBytes +* | result(playing)-----> | onSrsBandCheckStartingPlayBytes +* | <-------data(playing) | onSrsBandCheckStartingPlayBytes +* | <-----call(stop play) | onSrsBandCheckStopPlayBytes +* | result(stopped)-----> | onSrsBandCheckStoppedPlayBytes +* | | +* | <-call(start publish) | onSrsBandCheckStartPublishBytes +* | result(publishing)--> | onSrsBandCheckStartingPublishBytes +* | data(publishing)----> | onSrsBandCheckStartingPublishBytes +* | <--call(stop publish) | onSrsBandCheckStopPublishBytes +* | result(stopped)(1)--> | onSrsBandCheckStoppedPublishBytes +* | | +* | <--------------report | +* | final(2)------------> | finalClientPacket +* | | +* 1. when flash client, server ignore the publish stopped result, +* and directly send the report to flash client. +* 2. flash client only. when got report, flash client should send out +* a final packet and close the connection immediately. +*/ +class SrsBandwidth +{ +private: + SrsRequest* req; + SrsRtmp* rtmp; +public: + SrsBandwidth(); + virtual ~SrsBandwidth(); +public: + /** + * do the bandwidth test. + */ + virtual int bandwidth_test(SrsRequest* _req, st_netfd_t stfd, SrsRtmp* _rtmp); +private: + virtual int get_local_ip(st_netfd_t stfd, char *&local_ip); + /** + * used to process band width check from client. + */ + virtual int do_bandwidth_check(); + virtual int check_play(int duration_ms, int interval_ms, int& actual_duration_ms, int& play_bytes, int max_play_kbps); + virtual int check_publish(int duration_ms, int interval_ms, int& actual_duration_ms, int& publish_bytes, int max_pub_kbps); +}; + #endif \ No newline at end of file