From c58dbe4d146fdfa46879d41fcb8953c2e74a50fb Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 11 Jan 2017 11:22:16 +0800 Subject: [PATCH] fix #588, kbps interface error. 2.0.228 --- README.md | 2 ++ trunk/src/core/srs_core.hpp | 2 +- trunk/src/protocol/srs_protocol_kbps.cpp | 32 +++++++++++++++++++++--- trunk/src/protocol/srs_protocol_kbps.hpp | 15 ++++++----- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 08d2b46685..48dfe8269a 100755 --- a/README.md +++ b/README.md @@ -345,6 +345,7 @@ Remark: ## History +* v2.0, 2017-01-11, fix [#588][bug #588], kbps interface error. 2.0.228 * v2.0, 2017-01-11, fix [#736][bug #736], recovery the hls dispose. 2.0.227 * v2.0, 2017-01-10, refine hls html5 video template. * v2.0, 2017-01-10, fix [#635][bug #635], hls support NonIDR(open gop). 2.0.226 @@ -1272,6 +1273,7 @@ Winlin [bug #513]: https://github.com/ossrs/srs/issues/513 [bug #730]: https://github.com/ossrs/srs/issues/730 [bug #635]: https://github.com/ossrs/srs/issues/635 +[bug #588]: https://github.com/ossrs/srs/issues/588 [bug #xxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxx [exo #828]: https://github.com/google/ExoPlayer/pull/828 diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 893f94c7ad..72561527a7 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR 2 #define VERSION_MINOR 0 -#define VERSION_REVISION 227 +#define VERSION_REVISION 228 // generated by configure, only macros. #include diff --git a/trunk/src/protocol/srs_protocol_kbps.cpp b/trunk/src/protocol/srs_protocol_kbps.cpp index 2722685f6b..554d6615e0 100644 --- a/trunk/src/protocol/srs_protocol_kbps.cpp +++ b/trunk/src/protocol/srs_protocol_kbps.cpp @@ -126,7 +126,7 @@ void SrsKbps::set_io(ISrsProtocolStatistic* in, ISrsProtocolStatistic* out) is.io.in = in; is.last_bytes = is.io_bytes_base = 0; if (in) { - is.last_bytes = is.io_bytes_base = in->get_recv_bytes(); + is.bytes += is.io.in->get_recv_bytes() - is.io_bytes_base; } // resample is.sample(); @@ -138,7 +138,7 @@ void SrsKbps::set_io(ISrsProtocolStatistic* in, ISrsProtocolStatistic* out) } // save the old in bytes. if (os.io.out) { - os.bytes += os.last_bytes - os.io_bytes_base; + os.bytes += os.io.out->get_send_bytes() - os.io_bytes_base; } // use new io. os.io.out = out; @@ -192,12 +192,36 @@ int SrsKbps::get_recv_kbps_5m() int64_t SrsKbps::get_send_bytes() { - return os.get_total_bytes(); + // we must calc the send bytes dynamically, + // to not depends on the sample(which used to calc the kbps). + // @read https://github.com/ossrs/srs/issues/588 + + // session start bytes. + int64_t bytes = os.bytes; + + // session delta. + if (os.io.out) { + bytes += os.io.out->get_send_bytes() - os.io_bytes_base; + } + + return bytes; } int64_t SrsKbps::get_recv_bytes() { - return is.get_total_bytes(); + // we must calc the send bytes dynamically, + // to not depends on the sample(which used to calc the kbps). + // @read https://github.com/ossrs/srs/issues/588 + + // session start bytes. + int64_t bytes = is.bytes; + + // session delta. + if (is.io.in) { + bytes += is.io.in->get_recv_bytes() - is.io_bytes_base; + } + + return bytes; } void SrsKbps::resample() diff --git a/trunk/src/protocol/srs_protocol_kbps.hpp b/trunk/src/protocol/srs_protocol_kbps.hpp index 75a928526e..5c54520153 100644 --- a/trunk/src/protocol/srs_protocol_kbps.hpp +++ b/trunk/src/protocol/srs_protocol_kbps.hpp @@ -95,13 +95,9 @@ class SrsKbpsSlice SrsKbpsSlice(); virtual ~SrsKbpsSlice(); public: - /** - * get current total bytes. - */ + // Get current total bytes, not depend on sample(). virtual int64_t get_total_bytes(); - /** - * resample all samples. - */ + // Resample the slice to calculate the kbps. virtual void sample(); }; @@ -162,6 +158,13 @@ class IKbpsDelta * printf("delta is %d/%d", delta->get_send_bytes_delta(), delta->get_recv_bytes_delta()); * delta->cleanup(); * the server never know how many bytes already send/recv, for the connection maybe closed. + * 4. kbps used as ISrsProtocolStatistic, to provides raw bytes: + * SrsKbps* kbps = ...; + * kbps->set_io(in, out); + * // both kbps->get_recv_bytes() and kbps->get_send_bytes() are available. + * // we can use the kbps as the data source of another kbps: + * SrsKbps* user = ...; + * user->set_io(kbps, kbps); */ class SrsKbps : public virtual ISrsProtocolStatistic, public virtual IKbpsDelta {