| 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 18 matching lines...) Expand all Loading... |
| 29 // File path to write YUV decoded frames in YUV4MPEG2 format. | 29 // File path to write YUV decoded frames in YUV4MPEG2 format. |
| 30 // --no-simulation | 30 // --no-simulation |
| 31 // Do not run network simulation. | 31 // Do not run network simulation. |
| 32 // | 32 // |
| 33 // Output: | 33 // Output: |
| 34 // - Raw event log of the simulation session tagged with the unique test ID, | 34 // - Raw event log of the simulation session tagged with the unique test ID, |
| 35 // written out to the specified file path. | 35 // written out to the specified file path. |
| 36 | 36 |
| 37 #include <stddef.h> | 37 #include <stddef.h> |
| 38 #include <stdint.h> | 38 #include <stdint.h> |
| 39 #include <utility> |
| 39 | 40 |
| 40 #include "base/at_exit.h" | 41 #include "base/at_exit.h" |
| 41 #include "base/base_paths.h" | 42 #include "base/base_paths.h" |
| 42 #include "base/command_line.h" | 43 #include "base/command_line.h" |
| 43 #include "base/files/file_path.h" | 44 #include "base/files/file_path.h" |
| 44 #include "base/files/file_util.h" | 45 #include "base/files/file_util.h" |
| 45 #include "base/files/memory_mapped_file.h" | 46 #include "base/files/memory_mapped_file.h" |
| 46 #include "base/files/scoped_file.h" | 47 #include "base/files/scoped_file.h" |
| 47 #include "base/json/json_writer.h" | 48 #include "base/json/json_writer.h" |
| 48 #include "base/logging.h" | 49 #include "base/logging.h" |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 // Fake clock. Make sure start time is non zero. | 295 // Fake clock. Make sure start time is non zero. |
| 295 base::SimpleTestTickClock testing_clock; | 296 base::SimpleTestTickClock testing_clock; |
| 296 testing_clock.Advance(base::TimeDelta::FromSeconds(1)); | 297 testing_clock.Advance(base::TimeDelta::FromSeconds(1)); |
| 297 | 298 |
| 298 // Task runner. | 299 // Task runner. |
| 299 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner = | 300 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner = |
| 300 new test::FakeSingleThreadTaskRunner(&testing_clock); | 301 new test::FakeSingleThreadTaskRunner(&testing_clock); |
| 301 base::ThreadTaskRunnerHandle task_runner_handle(task_runner); | 302 base::ThreadTaskRunnerHandle task_runner_handle(task_runner); |
| 302 | 303 |
| 303 // CastEnvironments. | 304 // CastEnvironments. |
| 304 scoped_refptr<CastEnvironment> sender_env = | 305 scoped_refptr<CastEnvironment> sender_env = new CastEnvironment( |
| 305 new CastEnvironment( | 306 scoped_ptr<base::TickClock>(new test::SkewedTickClock(&testing_clock)), |
| 306 scoped_ptr<base::TickClock>( | 307 task_runner, task_runner, task_runner); |
| 307 new test::SkewedTickClock(&testing_clock)).Pass(), | 308 scoped_refptr<CastEnvironment> receiver_env = new CastEnvironment( |
| 308 task_runner, | 309 scoped_ptr<base::TickClock>(new test::SkewedTickClock(&testing_clock)), |
| 309 task_runner, | 310 task_runner, task_runner, task_runner); |
| 310 task_runner); | |
| 311 scoped_refptr<CastEnvironment> receiver_env = | |
| 312 new CastEnvironment( | |
| 313 scoped_ptr<base::TickClock>( | |
| 314 new test::SkewedTickClock(&testing_clock)).Pass(), | |
| 315 task_runner, | |
| 316 task_runner, | |
| 317 task_runner); | |
| 318 | 311 |
| 319 // Event subscriber. Store at most 1 hour of events. | 312 // Event subscriber. Store at most 1 hour of events. |
| 320 EncodingEventSubscriber audio_event_subscriber(AUDIO_EVENT, | 313 EncodingEventSubscriber audio_event_subscriber(AUDIO_EVENT, |
| 321 100 * 60 * 60); | 314 100 * 60 * 60); |
| 322 EncodingEventSubscriber video_event_subscriber(VIDEO_EVENT, | 315 EncodingEventSubscriber video_event_subscriber(VIDEO_EVENT, |
| 323 30 * 60 * 60); | 316 30 * 60 * 60); |
| 324 sender_env->logger()->Subscribe(&audio_event_subscriber); | 317 sender_env->logger()->Subscribe(&audio_event_subscriber); |
| 325 sender_env->logger()->Subscribe(&video_event_subscriber); | 318 sender_env->logger()->Subscribe(&video_event_subscriber); |
| 326 | 319 |
| 327 // Audio sender config. | 320 // Audio sender config. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 353 video_sender_config.max_playout_delay.InMilliseconds(); | 346 video_sender_config.max_playout_delay.InMilliseconds(); |
| 354 | 347 |
| 355 // Loopback transport. | 348 // Loopback transport. |
| 356 LoopBackTransport receiver_to_sender(receiver_env); | 349 LoopBackTransport receiver_to_sender(receiver_env); |
| 357 LoopBackTransport sender_to_receiver(sender_env); | 350 LoopBackTransport sender_to_receiver(sender_env); |
| 358 | 351 |
| 359 struct PacketProxy { | 352 struct PacketProxy { |
| 360 PacketProxy() : receiver(NULL) {} | 353 PacketProxy() : receiver(NULL) {} |
| 361 void ReceivePacket(scoped_ptr<Packet> packet) { | 354 void ReceivePacket(scoped_ptr<Packet> packet) { |
| 362 if (receiver) | 355 if (receiver) |
| 363 receiver->ReceivePacket(packet.Pass()); | 356 receiver->ReceivePacket(std::move(packet)); |
| 364 } | 357 } |
| 365 CastReceiver* receiver; | 358 CastReceiver* receiver; |
| 366 }; | 359 }; |
| 367 | 360 |
| 368 PacketProxy packet_proxy; | 361 PacketProxy packet_proxy; |
| 369 | 362 |
| 370 // Cast receiver. | 363 // Cast receiver. |
| 371 scoped_ptr<CastTransportSender> transport_receiver( | 364 scoped_ptr<CastTransportSender> transport_receiver( |
| 372 new CastTransportSenderImpl( | 365 new CastTransportSenderImpl( |
| 373 nullptr, &testing_clock, net::IPEndPoint(), net::IPEndPoint(), | 366 nullptr, &testing_clock, net::IPEndPoint(), net::IPEndPoint(), |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 if (use_network_simulation) { | 399 if (use_network_simulation) { |
| 407 LOG(INFO) << "Running Poisson based network simulation."; | 400 LOG(INFO) << "Running Poisson based network simulation."; |
| 408 const IPPModel& ipp_model = model.ipp(); | 401 const IPPModel& ipp_model = model.ipp(); |
| 409 std::vector<double> average_rates(ipp_model.average_rate_size()); | 402 std::vector<double> average_rates(ipp_model.average_rate_size()); |
| 410 std::copy(ipp_model.average_rate().begin(), | 403 std::copy(ipp_model.average_rate().begin(), |
| 411 ipp_model.average_rate().end(), | 404 ipp_model.average_rate().end(), |
| 412 average_rates.begin()); | 405 average_rates.begin()); |
| 413 ipp.reset(new test::InterruptedPoissonProcess( | 406 ipp.reset(new test::InterruptedPoissonProcess( |
| 414 average_rates, | 407 average_rates, |
| 415 ipp_model.coef_burstiness(), ipp_model.coef_variance(), 0)); | 408 ipp_model.coef_burstiness(), ipp_model.coef_variance(), 0)); |
| 416 receiver_to_sender.Initialize( | 409 receiver_to_sender.Initialize(ipp->NewBuffer(128 * 1024), |
| 417 ipp->NewBuffer(128 * 1024).Pass(), | 410 transport_sender->PacketReceiverForTesting(), |
| 418 transport_sender->PacketReceiverForTesting(), | 411 task_runner, &testing_clock); |
| 419 task_runner, &testing_clock); | |
| 420 sender_to_receiver.Initialize( | 412 sender_to_receiver.Initialize( |
| 421 ipp->NewBuffer(128 * 1024).Pass(), | 413 ipp->NewBuffer(128 * 1024), |
| 422 transport_receiver->PacketReceiverForTesting(), task_runner, | 414 transport_receiver->PacketReceiverForTesting(), task_runner, |
| 423 &testing_clock); | 415 &testing_clock); |
| 424 } else { | 416 } else { |
| 425 LOG(INFO) << "No network simulation."; | 417 LOG(INFO) << "No network simulation."; |
| 426 receiver_to_sender.Initialize( | 418 receiver_to_sender.Initialize( |
| 427 scoped_ptr<test::PacketPipe>(), | 419 scoped_ptr<test::PacketPipe>(), |
| 428 transport_sender->PacketReceiverForTesting(), | 420 transport_sender->PacketReceiverForTesting(), |
| 429 task_runner, &testing_clock); | 421 task_runner, &testing_clock); |
| 430 sender_to_receiver.Initialize( | 422 sender_to_receiver.Initialize( |
| 431 scoped_ptr<test::PacketPipe>(), | 423 scoped_ptr<test::PacketPipe>(), |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 726 values.SetString("sim-id", sim_id); | 718 values.SetString("sim-id", sim_id); |
| 727 | 719 |
| 728 std::string extra_data; | 720 std::string extra_data; |
| 729 base::JSONWriter::Write(values, &extra_data); | 721 base::JSONWriter::Write(values, &extra_data); |
| 730 | 722 |
| 731 // Run. | 723 // Run. |
| 732 media::cast::RunSimulation(source_path, log_output_path, metrics_output_path, | 724 media::cast::RunSimulation(source_path, log_output_path, metrics_output_path, |
| 733 yuv_output_path, extra_data, model); | 725 yuv_output_path, extra_data, model); |
| 734 return 0; | 726 return 0; |
| 735 } | 727 } |
| OLD | NEW |