| Index: media/cast/test/simulator.cc
|
| diff --git a/media/cast/test/simulator.cc b/media/cast/test/simulator.cc
|
| index 2c5e264a409f298a1130ce74d0ef4de3d198c926..e3872a98d98ce952d9b264318704a66073e7ba2d 100644
|
| --- a/media/cast/test/simulator.cc
|
| +++ b/media/cast/test/simulator.cc
|
| @@ -11,6 +11,9 @@
|
| // File path to writing out the raw event log of the simulation session.
|
| // --sim-id=
|
| // Unique simulation ID.
|
| +// --target-delay-ms=
|
| +// Target playout delay to configure (integer number of milliseconds).
|
| +// Optional; default is 400.
|
| //
|
| // Output:
|
| // - Raw event log of the simulation session tagged with the unique test ID,
|
| @@ -26,6 +29,7 @@
|
| #include "base/json/json_writer.h"
|
| #include "base/logging.h"
|
| #include "base/path_service.h"
|
| +#include "base/strings/string_number_conversions.h"
|
| #include "base/test/simple_test_tick_clock.h"
|
| #include "base/thread_task_runner_handle.h"
|
| #include "base/time/tick_clock.h"
|
| @@ -65,12 +69,23 @@ using media::cast::proto::NetworkSimulationModelType;
|
| namespace media {
|
| namespace cast {
|
| namespace {
|
| -const int kTargetDelay = 400;
|
| const char kSourcePath[] = "source";
|
| const char kModelPath[] = "model";
|
| const char kOutputPath[] = "output";
|
| const char kSimulationId[] = "sim-id";
|
| const char kLibDir[] = "lib-dir";
|
| +const char kTargetDelay[] = "target-delay-ms";
|
| +
|
| +base::TimeDelta GetTargetPlayoutDelay() {
|
| + const std::string delay_str =
|
| + CommandLine::ForCurrentProcess()->GetSwitchValueASCII(kTargetDelay);
|
| + if (delay_str.empty())
|
| + return base::TimeDelta::FromMilliseconds(400);
|
| + int delay_ms;
|
| + CHECK(base::StringToInt(delay_str, &delay_ms));
|
| + CHECK_GT(delay_ms, 0);
|
| + return base::TimeDelta::FromMilliseconds(delay_ms);
|
| +}
|
|
|
| void UpdateCastTransportStatus(CastTransportStatus status) {
|
| LOG(INFO) << "Cast transport status: " << status;
|
| @@ -219,8 +234,7 @@ void RunSimulation(const base::FilePath& source_path,
|
|
|
| // Audio sender config.
|
| AudioSenderConfig audio_sender_config = GetDefaultAudioSenderConfig();
|
| - audio_sender_config.max_playout_delay =
|
| - base::TimeDelta::FromMilliseconds(kTargetDelay);
|
| + audio_sender_config.max_playout_delay = GetTargetPlayoutDelay();
|
|
|
| // Audio receiver config.
|
| FrameReceiverConfig audio_receiver_config =
|
| @@ -233,8 +247,7 @@ void RunSimulation(const base::FilePath& source_path,
|
| video_sender_config.max_bitrate = 2500000;
|
| video_sender_config.min_bitrate = 2000000;
|
| video_sender_config.start_bitrate = 2000000;
|
| - video_sender_config.max_playout_delay =
|
| - base::TimeDelta::FromMilliseconds(kTargetDelay);
|
| + video_sender_config.max_playout_delay = GetTargetPlayoutDelay();
|
|
|
| // Video receiver config.
|
| FrameReceiverConfig video_receiver_config =
|
| @@ -355,6 +368,7 @@ void RunSimulation(const base::FilePath& source_path,
|
| int encoded_video_frames = 0;
|
| int dropped_video_frames = 0;
|
| int late_video_frames = 0;
|
| + int64 total_delay_of_late_frames_ms = 0;
|
| int64 encoded_size = 0;
|
| int64 target_bitrate = 0;
|
| for (size_t i = 0; i < video_frame_events.size(); ++i) {
|
| @@ -368,8 +382,10 @@ void RunSimulation(const base::FilePath& source_path,
|
| } else {
|
| ++dropped_video_frames;
|
| }
|
| - if (event.has_delay_millis() && event.delay_millis() < 0)
|
| + if (event.has_delay_millis() && event.delay_millis() < 0) {
|
| ++late_video_frames;
|
| + total_delay_of_late_frames_ms += -event.delay_millis();
|
| + }
|
| }
|
|
|
| double avg_encoded_bitrate =
|
| @@ -379,10 +395,18 @@ void RunSimulation(const base::FilePath& source_path,
|
| double avg_target_bitrate =
|
| !encoded_video_frames ? 0 : target_bitrate / encoded_video_frames / 1000;
|
|
|
| + LOG(INFO) << "Configured target playout delay (ms): "
|
| + << video_receiver_config.rtp_max_delay_ms;
|
| LOG(INFO) << "Audio frame count: " << audio_frame_count;
|
| LOG(INFO) << "Total video frames: " << total_video_frames;
|
| LOG(INFO) << "Dropped video frames " << dropped_video_frames;
|
| - LOG(INFO) << "Late video frames: " << late_video_frames;
|
| + LOG(INFO) << "Late video frames: " << late_video_frames
|
| + << " (average lateness: "
|
| + << (late_video_frames > 0 ?
|
| + static_cast<double>(total_delay_of_late_frames_ms) /
|
| + late_video_frames :
|
| + 0)
|
| + << " ms)";
|
| LOG(INFO) << "Average encoded bitrate (kbps): " << avg_encoded_bitrate;
|
| LOG(INFO) << "Average target bitrate (kbps): " << avg_target_bitrate;
|
| LOG(INFO) << "Writing log: " << output_path.value();
|
|
|