diff --git a/README.md b/README.md index 2b324878b..dd89c5705 100755 --- a/README.md +++ b/README.md @@ -205,6 +205,7 @@ Please select your language: ### V2 changes +* 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 @@ -1368,6 +1369,9 @@ 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 #736]: https://github.com/ossrs/srs/issues/736 +[bug #588]: https://github.com/ossrs/srs/issues/588 +[bug #xxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxx [bug #735]: https://github.com/ossrs/srs/issues/735 [bug #xxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxx diff --git a/trunk/src/protocol/srs_protocol_kbps.cpp b/trunk/src/protocol/srs_protocol_kbps.cpp index 01671f699..4693430de 100644 --- a/trunk/src/protocol/srs_protocol_kbps.cpp +++ b/trunk/src/protocol/srs_protocol_kbps.cpp @@ -120,7 +120,7 @@ void SrsKbps::set_io(ISrsProtocolStatistic* in, ISrsProtocolStatistic* out) } // save the old in bytes. if (is.io.in) { - is.bytes += is.last_bytes - is.io_bytes_base; + is.bytes += is.io.in->get_recv_bytes() - is.io_bytes_base; } // use new io. is.io.in = in; @@ -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,46 @@ 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; + + // When exists active session, use it to get the last bytes. + if (os.io.out) { + bytes += os.io.out->get_send_bytes() - os.io_bytes_base; + return bytes; + } + + // When no active session, the last_bytes record the last valid bytes. + // TODO: Maybe the bellow bytes is zero, because the ios.io.out is NULL. + bytes += os.last_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; + + // When exists active session, use it to get the last bytes. + if (is.io.in) { + bytes += is.io.in->get_recv_bytes() - is.io_bytes_base; + return bytes; + } + + // When no active session, the last_bytes record the last valid bytes. + // TODO: Maybe the bellow bytes is zero, because the ios.io.out is NULL. + bytes += is.last_bytes - is.io_bytes_base; + + return bytes; } void SrsKbps::resample() @@ -250,3 +284,8 @@ void SrsKbps::sample() os.sample(); } +int SrsKbps::size_memory() +{ + return sizeof(SrsKbps); +} + diff --git a/trunk/src/protocol/srs_protocol_kbps.hpp b/trunk/src/protocol/srs_protocol_kbps.hpp index c4b2b88e2..ff6f0cec0 100644 --- a/trunk/src/protocol/srs_protocol_kbps.hpp +++ b/trunk/src/protocol/srs_protocol_kbps.hpp @@ -95,13 +95,9 @@ public: 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(); }; @@ -161,6 +157,13 @@ public: * delta->resample(); * printf("delta is %d/%d", delta->get_send_bytes_delta(), delta->get_recv_bytes_delta()); * delta->cleanup(); + * 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); * the server never know how many bytes already send/recv, for the connection maybe closed. */ class SrsKbps : public virtual ISrsProtocolStatistic, public virtual IKbpsDelta @@ -195,26 +198,15 @@ public: // 5m virtual int get_send_kbps_5m(); virtual int get_recv_kbps_5m(); +// interface ISrsProtocolStatistic public: - /** - * get the total send/recv bytes, from the startup of the oldest io. - * @remark, use sample() to update data. - */ virtual int64_t get_send_bytes(); virtual int64_t get_recv_bytes(); +// interface IKbpsDelta public: - /** - * resample to get the delta. - */ virtual void resample(); - /** - * get the delta of send/recv bytes. - */ virtual int64_t get_send_bytes_delta(); virtual int64_t get_recv_bytes_delta(); - /** - * cleanup the delta. - */ virtual void cleanup(); public: /** @@ -232,6 +224,9 @@ public: * use the add_delta() is better solutions. */ virtual void sample(); +// interface ISrsMemorySizer +public: + virtual int size_memory(); }; #endif