OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Simulate end to end streaming. | 5 // Simulate end to end streaming. |
6 // | 6 // |
7 // Input: | 7 // Input: |
8 // --source= | 8 // --source= |
9 // WebM used as the source of video and audio frames. | 9 // WebM used as the source of video and audio frames. |
10 // --output= | 10 // --output= |
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 // Video receiver config. | 380 // Video receiver config. |
381 FrameReceiverConfig video_receiver_config = | 381 FrameReceiverConfig video_receiver_config = |
382 GetDefaultVideoReceiverConfig(); | 382 GetDefaultVideoReceiverConfig(); |
383 video_receiver_config.rtp_max_delay_ms = | 383 video_receiver_config.rtp_max_delay_ms = |
384 video_sender_config.max_playout_delay.InMilliseconds(); | 384 video_sender_config.max_playout_delay.InMilliseconds(); |
385 | 385 |
386 // Loopback transport. | 386 // Loopback transport. |
387 LoopBackTransport receiver_to_sender(receiver_env); | 387 LoopBackTransport receiver_to_sender(receiver_env); |
388 LoopBackTransport sender_to_receiver(sender_env); | 388 LoopBackTransport sender_to_receiver(sender_env); |
389 | 389 |
| 390 struct PacketProxy { |
| 391 PacketProxy() : receiver(NULL) {} |
| 392 void ReceivePacket(scoped_ptr<Packet> packet) { |
| 393 if (receiver) |
| 394 receiver->ReceivePacket(packet.Pass()); |
| 395 } |
| 396 CastReceiver* receiver; |
| 397 }; |
| 398 |
| 399 PacketProxy packet_proxy; |
| 400 |
390 // Cast receiver. | 401 // Cast receiver. |
| 402 scoped_ptr<CastTransportSender> transport_receiver( |
| 403 new CastTransportSenderImpl( |
| 404 NULL, |
| 405 &testing_clock, |
| 406 net::IPEndPoint(), |
| 407 net::IPEndPoint(), |
| 408 make_scoped_ptr(new base::DictionaryValue), |
| 409 base::Bind(&UpdateCastTransportStatus), |
| 410 base::Bind(&LogTransportEvents, receiver_env), |
| 411 base::TimeDelta::FromSeconds(1), |
| 412 task_runner, |
| 413 base::Bind(&PacketProxy::ReceivePacket, |
| 414 base::Unretained(&packet_proxy)), |
| 415 &receiver_to_sender)); |
391 scoped_ptr<CastReceiver> cast_receiver( | 416 scoped_ptr<CastReceiver> cast_receiver( |
392 CastReceiver::Create(receiver_env, | 417 CastReceiver::Create(receiver_env, |
393 audio_receiver_config, | 418 audio_receiver_config, |
394 video_receiver_config, | 419 video_receiver_config, |
395 &receiver_to_sender)); | 420 transport_receiver.get())); |
| 421 |
| 422 packet_proxy.receiver = cast_receiver.get(); |
396 | 423 |
397 // Cast sender and transport sender. | 424 // Cast sender and transport sender. |
398 scoped_ptr<CastTransportSender> transport_sender( | 425 scoped_ptr<CastTransportSender> transport_sender( |
399 new CastTransportSenderImpl( | 426 new CastTransportSenderImpl( |
400 NULL, | 427 NULL, |
401 &testing_clock, | 428 &testing_clock, |
402 net::IPEndPoint(), | 429 net::IPEndPoint(), |
| 430 net::IPEndPoint(), |
403 make_scoped_ptr(new base::DictionaryValue), | 431 make_scoped_ptr(new base::DictionaryValue), |
404 base::Bind(&UpdateCastTransportStatus), | 432 base::Bind(&UpdateCastTransportStatus), |
405 base::Bind(&LogTransportEvents, sender_env), | 433 base::Bind(&LogTransportEvents, sender_env), |
406 base::TimeDelta::FromSeconds(1), | 434 base::TimeDelta::FromSeconds(1), |
407 task_runner, | 435 task_runner, |
| 436 PacketReceiverCallback(), |
408 &sender_to_receiver)); | 437 &sender_to_receiver)); |
409 scoped_ptr<CastSender> cast_sender( | 438 scoped_ptr<CastSender> cast_sender( |
410 CastSender::Create(sender_env, transport_sender.get())); | 439 CastSender::Create(sender_env, transport_sender.get())); |
411 | 440 |
412 // Initialize network simulation model. | 441 // Initialize network simulation model. |
413 const bool use_network_simulation = | 442 const bool use_network_simulation = |
414 model.type() == media::cast::proto::INTERRUPTED_POISSON_PROCESS; | 443 model.type() == media::cast::proto::INTERRUPTED_POISSON_PROCESS; |
415 scoped_ptr<test::InterruptedPoissonProcess> ipp; | 444 scoped_ptr<test::InterruptedPoissonProcess> ipp; |
416 if (use_network_simulation) { | 445 if (use_network_simulation) { |
417 LOG(INFO) << "Running Poisson based network simulation."; | 446 LOG(INFO) << "Running Poisson based network simulation."; |
418 const IPPModel& ipp_model = model.ipp(); | 447 const IPPModel& ipp_model = model.ipp(); |
419 std::vector<double> average_rates(ipp_model.average_rate_size()); | 448 std::vector<double> average_rates(ipp_model.average_rate_size()); |
420 std::copy(ipp_model.average_rate().begin(), | 449 std::copy(ipp_model.average_rate().begin(), |
421 ipp_model.average_rate().end(), | 450 ipp_model.average_rate().end(), |
422 average_rates.begin()); | 451 average_rates.begin()); |
423 ipp.reset(new test::InterruptedPoissonProcess( | 452 ipp.reset(new test::InterruptedPoissonProcess( |
424 average_rates, | 453 average_rates, |
425 ipp_model.coef_burstiness(), ipp_model.coef_variance(), 0)); | 454 ipp_model.coef_burstiness(), ipp_model.coef_variance(), 0)); |
426 receiver_to_sender.Initialize( | 455 receiver_to_sender.Initialize( |
427 ipp->NewBuffer(128 * 1024).Pass(), | 456 ipp->NewBuffer(128 * 1024).Pass(), |
428 transport_sender->PacketReceiverForTesting(), | 457 transport_sender->PacketReceiverForTesting(), |
429 task_runner, &testing_clock); | 458 task_runner, &testing_clock); |
430 sender_to_receiver.Initialize( | 459 sender_to_receiver.Initialize( |
431 ipp->NewBuffer(128 * 1024).Pass(), | 460 ipp->NewBuffer(128 * 1024).Pass(), |
432 cast_receiver->packet_receiver(), task_runner, | 461 transport_receiver->PacketReceiverForTesting(), task_runner, |
433 &testing_clock); | 462 &testing_clock); |
434 } else { | 463 } else { |
435 LOG(INFO) << "No network simulation."; | 464 LOG(INFO) << "No network simulation."; |
436 receiver_to_sender.Initialize( | 465 receiver_to_sender.Initialize( |
437 scoped_ptr<test::PacketPipe>(), | 466 scoped_ptr<test::PacketPipe>(), |
438 transport_sender->PacketReceiverForTesting(), | 467 transport_sender->PacketReceiverForTesting(), |
439 task_runner, &testing_clock); | 468 task_runner, &testing_clock); |
440 sender_to_receiver.Initialize( | 469 sender_to_receiver.Initialize( |
441 scoped_ptr<test::PacketPipe>(), | 470 scoped_ptr<test::PacketPipe>(), |
442 cast_receiver->packet_receiver(), task_runner, | 471 transport_receiver->PacketReceiverForTesting(), task_runner, |
443 &testing_clock); | 472 &testing_clock); |
444 } | 473 } |
445 | 474 |
446 // Initialize a fake media source and a tracker to encoded video frames. | 475 // Initialize a fake media source and a tracker to encoded video frames. |
447 const bool quality_test = !metrics_output_path.empty(); | 476 const bool quality_test = !metrics_output_path.empty(); |
448 FakeMediaSource media_source(task_runner, | 477 FakeMediaSource media_source(task_runner, |
449 &testing_clock, | 478 &testing_clock, |
450 video_sender_config, | 479 video_sender_config, |
451 quality_test); | 480 quality_test); |
452 scoped_ptr<EncodedVideoFrameTracker> video_frame_tracker; | 481 scoped_ptr<EncodedVideoFrameTracker> video_frame_tracker; |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
736 values.SetString("sim-id", sim_id); | 765 values.SetString("sim-id", sim_id); |
737 | 766 |
738 std::string extra_data; | 767 std::string extra_data; |
739 base::JSONWriter::Write(&values, &extra_data); | 768 base::JSONWriter::Write(&values, &extra_data); |
740 | 769 |
741 // Run. | 770 // Run. |
742 media::cast::RunSimulation(source_path, log_output_path, metrics_output_path, | 771 media::cast::RunSimulation(source_path, log_output_path, metrics_output_path, |
743 yuv_output_path, extra_data, model); | 772 yuv_output_path, extra_data, model); |
744 return 0; | 773 return 0; |
745 } | 774 } |
OLD | NEW |