winlin

fix #588, kbps interface error. 2.0.228

@@ -345,6 +345,7 @@ Remark: @@ -345,6 +345,7 @@ Remark:
345 345
346 ## History 346 ## History
347 347
  348 +* v2.0, 2017-01-11, fix [#588][bug #588], kbps interface error. 2.0.228
348 * v2.0, 2017-01-11, fix [#736][bug #736], recovery the hls dispose. 2.0.227 349 * v2.0, 2017-01-11, fix [#736][bug #736], recovery the hls dispose. 2.0.227
349 * v2.0, 2017-01-10, refine hls html5 video template. 350 * v2.0, 2017-01-10, refine hls html5 video template.
350 * v2.0, 2017-01-10, fix [#635][bug #635], hls support NonIDR(open gop). 2.0.226 351 * v2.0, 2017-01-10, fix [#635][bug #635], hls support NonIDR(open gop). 2.0.226
@@ -1272,6 +1273,7 @@ Winlin @@ -1272,6 +1273,7 @@ Winlin
1272 [bug #513]: https://github.com/ossrs/srs/issues/513 1273 [bug #513]: https://github.com/ossrs/srs/issues/513
1273 [bug #730]: https://github.com/ossrs/srs/issues/730 1274 [bug #730]: https://github.com/ossrs/srs/issues/730
1274 [bug #635]: https://github.com/ossrs/srs/issues/635 1275 [bug #635]: https://github.com/ossrs/srs/issues/635
  1276 +[bug #588]: https://github.com/ossrs/srs/issues/588
1275 [bug #xxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxx 1277 [bug #xxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxx
1276 1278
1277 [exo #828]: https://github.com/google/ExoPlayer/pull/828 1279 [exo #828]: https://github.com/google/ExoPlayer/pull/828
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR 2 32 #define VERSION_MAJOR 2
33 #define VERSION_MINOR 0 33 #define VERSION_MINOR 0
34 -#define VERSION_REVISION 227 34 +#define VERSION_REVISION 228
35 35
36 // generated by configure, only macros. 36 // generated by configure, only macros.
37 #include <srs_auto_headers.hpp> 37 #include <srs_auto_headers.hpp>
@@ -126,7 +126,7 @@ void SrsKbps::set_io(ISrsProtocolStatistic* in, ISrsProtocolStatistic* out) @@ -126,7 +126,7 @@ void SrsKbps::set_io(ISrsProtocolStatistic* in, ISrsProtocolStatistic* out)
126 is.io.in = in; 126 is.io.in = in;
127 is.last_bytes = is.io_bytes_base = 0; 127 is.last_bytes = is.io_bytes_base = 0;
128 if (in) { 128 if (in) {
129 - is.last_bytes = is.io_bytes_base = in->get_recv_bytes(); 129 + is.bytes += is.io.in->get_recv_bytes() - is.io_bytes_base;
130 } 130 }
131 // resample 131 // resample
132 is.sample(); 132 is.sample();
@@ -138,7 +138,7 @@ void SrsKbps::set_io(ISrsProtocolStatistic* in, ISrsProtocolStatistic* out) @@ -138,7 +138,7 @@ void SrsKbps::set_io(ISrsProtocolStatistic* in, ISrsProtocolStatistic* out)
138 } 138 }
139 // save the old in bytes. 139 // save the old in bytes.
140 if (os.io.out) { 140 if (os.io.out) {
141 - os.bytes += os.last_bytes - os.io_bytes_base; 141 + os.bytes += os.io.out->get_send_bytes() - os.io_bytes_base;
142 } 142 }
143 // use new io. 143 // use new io.
144 os.io.out = out; 144 os.io.out = out;
@@ -192,12 +192,36 @@ int SrsKbps::get_recv_kbps_5m() @@ -192,12 +192,36 @@ int SrsKbps::get_recv_kbps_5m()
192 192
193 int64_t SrsKbps::get_send_bytes() 193 int64_t SrsKbps::get_send_bytes()
194 { 194 {
195 - return os.get_total_bytes(); 195 + // we must calc the send bytes dynamically,
  196 + // to not depends on the sample(which used to calc the kbps).
  197 + // @read https://github.com/ossrs/srs/issues/588
  198 +
  199 + // session start bytes.
  200 + int64_t bytes = os.bytes;
  201 +
  202 + // session delta.
  203 + if (os.io.out) {
  204 + bytes += os.io.out->get_send_bytes() - os.io_bytes_base;
  205 + }
  206 +
  207 + return bytes;
196 } 208 }
197 209
198 int64_t SrsKbps::get_recv_bytes() 210 int64_t SrsKbps::get_recv_bytes()
199 { 211 {
200 - return is.get_total_bytes(); 212 + // we must calc the send bytes dynamically,
  213 + // to not depends on the sample(which used to calc the kbps).
  214 + // @read https://github.com/ossrs/srs/issues/588
  215 +
  216 + // session start bytes.
  217 + int64_t bytes = is.bytes;
  218 +
  219 + // session delta.
  220 + if (is.io.in) {
  221 + bytes += is.io.in->get_recv_bytes() - is.io_bytes_base;
  222 + }
  223 +
  224 + return bytes;
201 } 225 }
202 226
203 void SrsKbps::resample() 227 void SrsKbps::resample()
@@ -95,13 +95,9 @@ public: @@ -95,13 +95,9 @@ public:
95 SrsKbpsSlice(); 95 SrsKbpsSlice();
96 virtual ~SrsKbpsSlice(); 96 virtual ~SrsKbpsSlice();
97 public: 97 public:
98 - /**  
99 - * get current total bytes.  
100 - */ 98 + // Get current total bytes, not depend on sample().
101 virtual int64_t get_total_bytes(); 99 virtual int64_t get_total_bytes();
102 - /**  
103 - * resample all samples.  
104 - */ 100 + // Resample the slice to calculate the kbps.
105 virtual void sample(); 101 virtual void sample();
106 }; 102 };
107 103
@@ -162,6 +158,13 @@ public: @@ -162,6 +158,13 @@ public:
162 * printf("delta is %d/%d", delta->get_send_bytes_delta(), delta->get_recv_bytes_delta()); 158 * printf("delta is %d/%d", delta->get_send_bytes_delta(), delta->get_recv_bytes_delta());
163 * delta->cleanup(); 159 * delta->cleanup();
164 * the server never know how many bytes already send/recv, for the connection maybe closed. 160 * the server never know how many bytes already send/recv, for the connection maybe closed.
  161 + * 4. kbps used as ISrsProtocolStatistic, to provides raw bytes:
  162 + * SrsKbps* kbps = ...;
  163 + * kbps->set_io(in, out);
  164 + * // both kbps->get_recv_bytes() and kbps->get_send_bytes() are available.
  165 + * // we can use the kbps as the data source of another kbps:
  166 + * SrsKbps* user = ...;
  167 + * user->set_io(kbps, kbps);
165 */ 168 */
166 class SrsKbps : public virtual ISrsProtocolStatistic, public virtual IKbpsDelta 169 class SrsKbps : public virtual ISrsProtocolStatistic, public virtual IKbpsDelta
167 { 170 {