winlin

finish refine bandwidth check/test server-side.

@@ -188,8 +188,16 @@ int SrsBandwidth::do_bandwidth_check(SrsKbpsLimit* limit) @@ -188,8 +188,16 @@ int SrsBandwidth::do_bandwidth_check(SrsKbpsLimit* limit)
188 // sample play 188 // sample play
189 srs_info("start play test."); 189 srs_info("start play test.");
190 190
191 - if ((ret = check_play(&play_sample, limit)) != ERROR_SUCCESS) {  
192 - srs_error("band width play check failed. ret=%d", ret); 191 + if ((ret = play_start(&play_sample, limit)) != ERROR_SUCCESS) {
  192 + srs_error("bandwidth play check failed. ret=%d", ret);
  193 + return ret;
  194 + }
  195 + if ((ret = play_checking(&play_sample, limit)) != ERROR_SUCCESS) {
  196 + srs_error("bandwidth play check failed. ret=%d", ret);
  197 + return ret;
  198 + }
  199 + if ((ret = play_stop(&play_sample, limit)) != ERROR_SUCCESS) {
  200 + srs_error("bandwidth play check failed. ret=%d", ret);
193 return ret; 201 return ret;
194 } 202 }
195 203
@@ -198,8 +206,16 @@ int SrsBandwidth::do_bandwidth_check(SrsKbpsLimit* limit) @@ -198,8 +206,16 @@ int SrsBandwidth::do_bandwidth_check(SrsKbpsLimit* limit)
198 // sample publish 206 // sample publish
199 srs_info("start publish test."); 207 srs_info("start publish test.");
200 208
201 - if ((ret = check_publish(&publish_sample, limit)) != ERROR_SUCCESS) {  
202 - srs_error("band width publish check failed. ret=%d", ret); 209 + if ((ret = publish_start(&publish_sample, limit)) != ERROR_SUCCESS) {
  210 + srs_error("bandwidth publish check failed. ret=%d", ret);
  211 + return ret;
  212 + }
  213 + if ((ret = publish_checking(&publish_sample, limit)) != ERROR_SUCCESS) {
  214 + srs_error("bandwidth publish check failed. ret=%d", ret);
  215 + return ret;
  216 + }
  217 + if ((ret = publish_stop(&publish_sample, limit)) != ERROR_SUCCESS) {
  218 + srs_error("bandwidth publish check failed. ret=%d", ret);
203 return ret; 219 return ret;
204 } 220 }
205 221
@@ -213,41 +229,15 @@ int SrsBandwidth::do_bandwidth_check(SrsKbpsLimit* limit) @@ -213,41 +229,15 @@ int SrsBandwidth::do_bandwidth_check(SrsKbpsLimit* limit)
213 publish_sample.actual_duration_ms, play_sample.kbps, 229 publish_sample.actual_duration_ms, play_sample.kbps,
214 publish_sample.kbps); 230 publish_sample.kbps);
215 231
216 - // send finished msg,  
217 - // flash client will close connection when got this packet,  
218 - // for the publish queue may contains packets.  
219 - SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_finish();  
220 - pkt->data->set("code", SrsAmf0Any::number(ERROR_SUCCESS));  
221 - pkt->data->set("start_time", SrsAmf0Any::number(start_time));  
222 - pkt->data->set("end_time", SrsAmf0Any::number(end_time));  
223 - pkt->data->set("play_kbps", SrsAmf0Any::number(play_sample.kbps));  
224 - pkt->data->set("publish_kbps", SrsAmf0Any::number(publish_sample.kbps));  
225 - pkt->data->set("play_bytes", SrsAmf0Any::number(play_sample.bytes));  
226 - pkt->data->set("publish_bytes", SrsAmf0Any::number(publish_sample.bytes));  
227 - pkt->data->set("play_time", SrsAmf0Any::number(play_sample.actual_duration_ms));  
228 - pkt->data->set("publish_time", SrsAmf0Any::number(publish_sample.actual_duration_ms));  
229 -  
230 - if ((ret = _rtmp->send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {  
231 - srs_error("send bandwidth check finish message failed. ret=%d", ret); 232 + if ((ret = finial(play_sample, publish_sample, start_time, end_time)) != ERROR_SUCCESS) {
232 return ret; 233 return ret;
233 } 234 }
234 - srs_info("send finish packet.");  
235 -  
236 - // we notice the result, and expect a final packet if not flash.  
237 - // if flash client, client will disconnect when got finish packet.  
238 - bool is_flash = (_req->swfUrl != "");  
239 - if (!is_flash) {  
240 - // ignore any error.  
241 - _srs_expect_bandwidth_packet(_rtmp, _bandwidth_is_flash_final);  
242 - srs_info("BW check recv flash final response.");  
243 - }  
244 -  
245 srs_info("BW check finished."); 235 srs_info("BW check finished.");
246 236
247 return ret; 237 return ret;
248 } 238 }
249 239
250 -int SrsBandwidth::check_play(SrsBandwidthSample* sample, SrsKbpsLimit* limit) 240 +int SrsBandwidth::play_start(SrsBandwidthSample* sample, SrsKbpsLimit* limit)
251 { 241 {
252 int ret = ERROR_SUCCESS; 242 int ret = ERROR_SUCCESS;
253 243
@@ -270,6 +260,13 @@ int SrsBandwidth::check_play(SrsBandwidthSample* sample, SrsKbpsLimit* limit) @@ -270,6 +260,13 @@ int SrsBandwidth::check_play(SrsBandwidthSample* sample, SrsKbpsLimit* limit)
270 } 260 }
271 srs_info("BW check recv play begin response."); 261 srs_info("BW check recv play begin response.");
272 262
  263 + return ret;
  264 +}
  265 +
  266 +int SrsBandwidth::play_checking(SrsBandwidthSample* sample, SrsKbpsLimit* limit)
  267 +{
  268 + int ret = ERROR_SUCCESS;
  269 +
273 // send play data to client 270 // send play data to client
274 int size = 1024; // TODO: FIXME: magic number 271 int size = 1024; // TODO: FIXME: magic number
275 char random_data[size]; 272 char random_data[size];
@@ -302,6 +299,13 @@ int SrsBandwidth::check_play(SrsBandwidthSample* sample, SrsKbpsLimit* limit) @@ -302,6 +299,13 @@ int SrsBandwidth::check_play(SrsBandwidthSample* sample, SrsKbpsLimit* limit)
302 sample->calc_kbps(_rtmp->get_send_bytes(), srs_get_system_time_ms() - starttime); 299 sample->calc_kbps(_rtmp->get_send_bytes(), srs_get_system_time_ms() - starttime);
303 srs_info("BW check send play bytes over."); 300 srs_info("BW check send play bytes over.");
304 301
  302 + return ret;
  303 +}
  304 +
  305 +int SrsBandwidth::play_stop(SrsBandwidthSample* sample, SrsKbpsLimit* limit)
  306 +{
  307 + int ret = ERROR_SUCCESS;
  308 +
305 if (true) { 309 if (true) {
306 // notify client to stop play 310 // notify client to stop play
307 SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_play(); 311 SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_play();
@@ -326,7 +330,7 @@ int SrsBandwidth::check_play(SrsBandwidthSample* sample, SrsKbpsLimit* limit) @@ -326,7 +330,7 @@ int SrsBandwidth::check_play(SrsBandwidthSample* sample, SrsKbpsLimit* limit)
326 return ret; 330 return ret;
327 } 331 }
328 332
329 -int SrsBandwidth::check_publish(SrsBandwidthSample* sample, SrsKbpsLimit* limit) 333 +int SrsBandwidth::publish_start(SrsBandwidthSample* sample, SrsKbpsLimit* limit)
330 { 334 {
331 int ret = ERROR_SUCCESS; 335 int ret = ERROR_SUCCESS;
332 336
@@ -349,6 +353,13 @@ int SrsBandwidth::check_publish(SrsBandwidthSample* sample, SrsKbpsLimit* limit) @@ -349,6 +353,13 @@ int SrsBandwidth::check_publish(SrsBandwidthSample* sample, SrsKbpsLimit* limit)
349 } 353 }
350 srs_info("BW check recv publish begin response."); 354 srs_info("BW check recv publish begin response.");
351 355
  356 + return ret;
  357 +}
  358 +
  359 +int SrsBandwidth::publish_checking(SrsBandwidthSample* sample, SrsKbpsLimit* limit)
  360 +{
  361 + int ret = ERROR_SUCCESS;
  362 +
352 // recv publish msgs until @duration_ms ms 363 // recv publish msgs until @duration_ms ms
353 int64_t starttime = srs_get_system_time_ms(); 364 int64_t starttime = srs_get_system_time_ms();
354 while ((srs_get_system_time_ms() - starttime) < sample->duration_ms) { 365 while ((srs_get_system_time_ms() - starttime) < sample->duration_ms) {
@@ -366,6 +377,13 @@ int SrsBandwidth::check_publish(SrsBandwidthSample* sample, SrsKbpsLimit* limit) @@ -366,6 +377,13 @@ int SrsBandwidth::check_publish(SrsBandwidthSample* sample, SrsKbpsLimit* limit)
366 sample->calc_kbps(_rtmp->get_recv_bytes(), srs_get_system_time_ms() - starttime); 377 sample->calc_kbps(_rtmp->get_recv_bytes(), srs_get_system_time_ms() - starttime);
367 srs_info("BW check recv publish data over."); 378 srs_info("BW check recv publish data over.");
368 379
  380 + return ret;
  381 +}
  382 +
  383 +int SrsBandwidth::publish_stop(SrsBandwidthSample* sample, SrsKbpsLimit* limit)
  384 +{
  385 + int ret = ERROR_SUCCESS;
  386 +
369 if (true) { 387 if (true) {
370 // notify client to stop publish 388 // notify client to stop publish
371 SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_publish(); 389 SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_publish();
@@ -396,3 +414,41 @@ int SrsBandwidth::check_publish(SrsBandwidthSample* sample, SrsKbpsLimit* limit) @@ -396,3 +414,41 @@ int SrsBandwidth::check_publish(SrsBandwidthSample* sample, SrsKbpsLimit* limit)
396 414
397 return ret; 415 return ret;
398 } 416 }
  417 +
  418 +int SrsBandwidth::finial(SrsBandwidthSample& play_sample, SrsBandwidthSample& publish_sample, int64_t start_time, int64_t& end_time)
  419 +{
  420 + int ret = ERROR_SUCCESS;
  421 +
  422 + // send finished msg,
  423 + // flash client will close connection when got this packet,
  424 + // for the publish queue may contains packets.
  425 + SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_finish();
  426 + pkt->data->set("code", SrsAmf0Any::number(ERROR_SUCCESS));
  427 + pkt->data->set("start_time", SrsAmf0Any::number(start_time));
  428 + pkt->data->set("end_time", SrsAmf0Any::number(end_time));
  429 + pkt->data->set("play_kbps", SrsAmf0Any::number(play_sample.kbps));
  430 + pkt->data->set("publish_kbps", SrsAmf0Any::number(publish_sample.kbps));
  431 + pkt->data->set("play_bytes", SrsAmf0Any::number(play_sample.bytes));
  432 + pkt->data->set("publish_bytes", SrsAmf0Any::number(publish_sample.bytes));
  433 + pkt->data->set("play_time", SrsAmf0Any::number(play_sample.actual_duration_ms));
  434 + pkt->data->set("publish_time", SrsAmf0Any::number(publish_sample.actual_duration_ms));
  435 +
  436 + if ((ret = _rtmp->send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
  437 + srs_error("send bandwidth check finish message failed. ret=%d", ret);
  438 + return ret;
  439 + }
  440 + srs_info("send finish packet.");
  441 +
  442 + // we notice the result, and expect a final packet if not flash.
  443 + // if flash client, client will disconnect when got finish packet.
  444 + bool is_flash = (_req->swfUrl != "");
  445 + if (!is_flash) {
  446 + // ignore any error.
  447 + _srs_expect_bandwidth_packet(_rtmp, _bandwidth_is_flash_final);
  448 + srs_info("BW check recv flash final response.");
  449 + }
  450 +
  451 + srs_info("BW check finished.");
  452 +
  453 + return ret;
  454 +}
@@ -138,13 +138,21 @@ private: @@ -138,13 +138,21 @@ private:
138 */ 138 */
139 virtual int do_bandwidth_check(SrsKbpsLimit* limit); 139 virtual int do_bandwidth_check(SrsKbpsLimit* limit);
140 /** 140 /**
141 - * play sample under specified kbps limit. 141 + * play check/test, downloading bandwidth kbps.
142 */ 142 */
143 - virtual int check_play(SrsBandwidthSample* sample, SrsKbpsLimit* limit); 143 + virtual int play_start(SrsBandwidthSample* sample, SrsKbpsLimit* limit);
  144 + virtual int play_checking(SrsBandwidthSample* sample, SrsKbpsLimit* limit);
  145 + virtual int play_stop(SrsBandwidthSample* sample, SrsKbpsLimit* limit);
144 /** 146 /**
145 - * publish sample under specified kbps limit. 147 + * publish check/test, publishing bandwidth kbps.
146 */ 148 */
147 - virtual int check_publish(SrsBandwidthSample* sample, SrsKbpsLimit* limit); 149 + virtual int publish_start(SrsBandwidthSample* sample, SrsKbpsLimit* limit);
  150 + virtual int publish_checking(SrsBandwidthSample* sample, SrsKbpsLimit* limit);
  151 + virtual int publish_stop(SrsBandwidthSample* sample, SrsKbpsLimit* limit);
  152 + /**
  153 + * report and final packet
  154 + */
  155 + virtual int finial(SrsBandwidthSample& play_sample, SrsBandwidthSample& publish_sample, int64_t start_time, int64_t& end_time);
148 }; 156 };
149 157
150 #endif 158 #endif