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 |