Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(445)

Side by Side Diff: media/cast/test/cast_benchmarks.cc

Issue 362123005: Cast: Update simulator tool with more inputs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Diff Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 // This program benchmarks the theoretical throughput of the cast library. 5 // This program benchmarks the theoretical throughput of the cast library.
6 // It runs using a fake clock, simulated network and fake codecs. This allows 6 // It runs using a fake clock, simulated network and fake codecs. This allows
7 // tests to run much faster than real time. 7 // tests to run much faster than real time.
8 // To run the program, run: 8 // To run the program, run:
9 // $ ./out/Release/cast_benchmarks | tee benchmarkoutput.asc 9 // $ ./out/Release/cast_benchmarks | tee benchmarkoutput.asc
10 // This may take a while, when it is done, you can view the data with 10 // This may take a while, when it is done, you can view the data with
(...skipping 28 matching lines...) Expand all
39 #include "base/threading/thread.h" 39 #include "base/threading/thread.h"
40 #include "base/time/tick_clock.h" 40 #include "base/time/tick_clock.h"
41 #include "media/base/audio_bus.h" 41 #include "media/base/audio_bus.h"
42 #include "media/base/video_frame.h" 42 #include "media/base/video_frame.h"
43 #include "media/cast/cast_config.h" 43 #include "media/cast/cast_config.h"
44 #include "media/cast/cast_environment.h" 44 #include "media/cast/cast_environment.h"
45 #include "media/cast/cast_receiver.h" 45 #include "media/cast/cast_receiver.h"
46 #include "media/cast/cast_sender.h" 46 #include "media/cast/cast_sender.h"
47 #include "media/cast/logging/simple_event_subscriber.h" 47 #include "media/cast/logging/simple_event_subscriber.h"
48 #include "media/cast/test/fake_single_thread_task_runner.h" 48 #include "media/cast/test/fake_single_thread_task_runner.h"
49 #include "media/cast/test/loopback_transport.h"
49 #include "media/cast/test/skewed_single_thread_task_runner.h" 50 #include "media/cast/test/skewed_single_thread_task_runner.h"
50 #include "media/cast/test/skewed_tick_clock.h" 51 #include "media/cast/test/skewed_tick_clock.h"
51 #include "media/cast/test/utility/audio_utility.h" 52 #include "media/cast/test/utility/audio_utility.h"
52 #include "media/cast/test/utility/default_config.h" 53 #include "media/cast/test/utility/default_config.h"
53 #include "media/cast/test/utility/test_util.h" 54 #include "media/cast/test/utility/test_util.h"
54 #include "media/cast/test/utility/udp_proxy.h" 55 #include "media/cast/test/utility/udp_proxy.h"
55 #include "media/cast/test/utility/video_utility.h" 56 #include "media/cast/test/utility/video_utility.h"
56 #include "media/cast/transport/cast_transport_config.h" 57 #include "media/cast/transport/cast_transport_config.h"
57 #include "media/cast/transport/cast_transport_defines.h" 58 #include "media/cast/transport/cast_transport_defines.h"
58 #include "media/cast/transport/cast_transport_sender.h" 59 #include "media/cast/transport/cast_transport_sender.h"
(...skipping 27 matching lines...) Expand all
86 87
87 void VideoInitializationStatus(CastInitializationStatus status) { 88 void VideoInitializationStatus(CastInitializationStatus status) {
88 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, status); 89 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, status);
89 } 90 }
90 91
91 void IgnoreRawEvents(const std::vector<PacketEvent>& packet_events) { 92 void IgnoreRawEvents(const std::vector<PacketEvent>& packet_events) {
92 } 93 }
93 94
94 } // namespace 95 } // namespace
95 96
96 // Shim that turns forwards packets from a test::PacketPipe to a
97 // PacketReceiverCallback.
98 class LoopBackPacketPipe : public test::PacketPipe {
99 public:
100 LoopBackPacketPipe(const transport::PacketReceiverCallback& packet_receiver)
101 : packet_receiver_(packet_receiver) {}
102
103 virtual ~LoopBackPacketPipe() {}
104
105 // PacketPipe implementations.
106 virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE {
107 packet_receiver_.Run(packet.Pass());
108 }
109
110 private:
111 transport::PacketReceiverCallback packet_receiver_;
112 };
113
114 // Class that sends the packet direct from sender into the receiver with the
115 // ability to drop packets between the two.
116 // TODO(hubbe): Break this out and share code with end2end_unittest.cc
117 class LoopBackTransport : public transport::PacketSender {
118 public:
119 explicit LoopBackTransport(scoped_refptr<CastEnvironment> cast_environment)
120 : cast_environment_(cast_environment) {}
121
122 void SetPacketReceiver(
123 const transport::PacketReceiverCallback& packet_receiver,
124 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
125 base::TickClock* clock) {
126 scoped_ptr<test::PacketPipe> loopback_pipe(
127 new LoopBackPacketPipe(packet_receiver));
128 if (packet_pipe_) {
129 packet_pipe_->AppendToPipe(loopback_pipe.Pass());
130 } else {
131 packet_pipe_ = loopback_pipe.Pass();
132 }
133 packet_pipe_->InitOnIOThread(task_runner, clock);
134 }
135
136 virtual bool SendPacket(transport::PacketRef packet,
137 const base::Closure& cb) OVERRIDE {
138 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
139 scoped_ptr<Packet> packet_copy(new Packet(packet->data));
140 packet_pipe_->Send(packet_copy.Pass());
141 return true;
142 }
143
144 void SetPacketPipe(scoped_ptr<test::PacketPipe> pipe) {
145 // Append the loopback pipe to the end.
146 pipe->AppendToPipe(packet_pipe_.Pass());
147 packet_pipe_ = pipe.Pass();
148 }
149
150 private:
151 scoped_refptr<CastEnvironment> cast_environment_;
152 scoped_ptr<test::PacketPipe> packet_pipe_;
153 };
154
155 // Wraps a CastTransportSender and records some statistics about 97 // Wraps a CastTransportSender and records some statistics about
156 // the data that goes through it. 98 // the data that goes through it.
157 class CastTransportSenderWrapper : public transport::CastTransportSender { 99 class CastTransportSenderWrapper : public transport::CastTransportSender {
158 public: 100 public:
159 // Takes ownership of |transport|. 101 // Takes ownership of |transport|.
160 void Init(CastTransportSender* transport, 102 void Init(CastTransportSender* transport,
161 uint64* encoded_video_bytes, 103 uint64* encoded_video_bytes,
162 uint64* encoded_audio_bytes) { 104 uint64* encoded_audio_bytes) {
163 transport_.reset(transport); 105 transport_.reset(transport);
164 encoded_video_bytes_ = encoded_video_bytes; 106 encoded_video_bytes_ = encoded_video_bytes;
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 void SetSenderClockSkew(double skew, base::TimeDelta offset) { 285 void SetSenderClockSkew(double skew, base::TimeDelta offset) {
344 testing_clock_sender_->SetSkew(skew, offset); 286 testing_clock_sender_->SetSkew(skew, offset);
345 task_runner_sender_->SetSkew(1.0 / skew); 287 task_runner_sender_->SetSkew(1.0 / skew);
346 } 288 }
347 289
348 void SetReceiverClockSkew(double skew, base::TimeDelta offset) { 290 void SetReceiverClockSkew(double skew, base::TimeDelta offset) {
349 testing_clock_receiver_->SetSkew(skew, offset); 291 testing_clock_receiver_->SetSkew(skew, offset);
350 task_runner_receiver_->SetSkew(1.0 / skew); 292 task_runner_receiver_->SetSkew(1.0 / skew);
351 } 293 }
352 294
353 void Create() { 295 void Create(const MeasuringPoint& p) {
354 cast_receiver_ = CastReceiver::Create(cast_environment_receiver_, 296 cast_receiver_ = CastReceiver::Create(cast_environment_receiver_,
355 audio_receiver_config_, 297 audio_receiver_config_,
356 video_receiver_config_, 298 video_receiver_config_,
357 &receiver_to_sender_); 299 &receiver_to_sender_);
358 net::IPEndPoint dummy_endpoint; 300 net::IPEndPoint dummy_endpoint;
359 transport_sender_.Init(new transport::CastTransportSenderImpl( 301 transport_sender_.Init(new transport::CastTransportSenderImpl(
360 NULL, 302 NULL,
361 testing_clock_sender_, 303 testing_clock_sender_,
362 dummy_endpoint, 304 dummy_endpoint,
363 base::Bind(&UpdateCastTransportStatus), 305 base::Bind(&UpdateCastTransportStatus),
364 base::Bind(&IgnoreRawEvents), 306 base::Bind(&IgnoreRawEvents),
365 base::TimeDelta::FromSeconds(1), 307 base::TimeDelta::FromSeconds(1),
366 task_runner_sender_, 308 task_runner_sender_,
367 &sender_to_receiver_), 309 &sender_to_receiver_),
368 &video_bytes_encoded_, 310 &video_bytes_encoded_,
369 &audio_bytes_encoded_); 311 &audio_bytes_encoded_);
370 312
371 cast_sender_ = 313 cast_sender_ =
372 CastSender::Create(cast_environment_sender_, &transport_sender_); 314 CastSender::Create(cast_environment_sender_, &transport_sender_);
373 315
374 // Initializing audio and video senders. 316 // Initializing audio and video senders.
375 cast_sender_->InitializeAudio(audio_sender_config_, 317 cast_sender_->InitializeAudio(audio_sender_config_,
376 base::Bind(&AudioInitializationStatus)); 318 base::Bind(&AudioInitializationStatus));
377 cast_sender_->InitializeVideo(video_sender_config_, 319 cast_sender_->InitializeVideo(video_sender_config_,
378 base::Bind(&VideoInitializationStatus), 320 base::Bind(&VideoInitializationStatus),
379 CreateDefaultVideoEncodeAcceleratorCallback(), 321 CreateDefaultVideoEncodeAcceleratorCallback(),
380 CreateDefaultVideoEncodeMemoryCallback()); 322 CreateDefaultVideoEncodeMemoryCallback());
381 323
382 receiver_to_sender_.SetPacketReceiver( 324 receiver_to_sender_.Initialize(
383 cast_sender_->packet_receiver(), task_runner_, &testing_clock_); 325 CreateSimplePipe(p).Pass(), cast_sender_->packet_receiver(),
384 sender_to_receiver_.SetPacketReceiver( 326 task_runner_, &testing_clock_);
385 cast_receiver_->packet_receiver(), task_runner_, &testing_clock_); 327 sender_to_receiver_.Initialize(
328 CreateSimplePipe(p).Pass(), cast_receiver_->packet_receiver(),
329 task_runner_, &testing_clock_);
386 } 330 }
387 331
388 virtual ~RunOneBenchmark() { 332 virtual ~RunOneBenchmark() {
389 cast_sender_.reset(); 333 cast_sender_.reset();
390 cast_receiver_.reset(); 334 cast_receiver_.reset();
391 task_runner_->RunTasks(); 335 task_runner_->RunTasks();
392 } 336 }
393 337
394 void SendFakeVideoFrame() { 338 void SendFakeVideoFrame() {
395 frames_sent_++; 339 frames_sent_++;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 pipe->AppendToPipe( 377 pipe->AppendToPipe(
434 test::NewRandomDrop(p.percent_packet_drop / 100.0).Pass()); 378 test::NewRandomDrop(p.percent_packet_drop / 100.0).Pass());
435 pipe->AppendToPipe(test::NewConstantDelay(p.latency / 1000.0)); 379 pipe->AppendToPipe(test::NewConstantDelay(p.latency / 1000.0));
436 return pipe.Pass(); 380 return pipe.Pass();
437 } 381 }
438 382
439 void Run(const MeasuringPoint& p) { 383 void Run(const MeasuringPoint& p) {
440 available_bitrate_ = p.bitrate; 384 available_bitrate_ = p.bitrate;
441 Configure( 385 Configure(
442 transport::CODEC_VIDEO_FAKE, transport::CODEC_AUDIO_PCM16, 32000, 1); 386 transport::CODEC_VIDEO_FAKE, transport::CODEC_AUDIO_PCM16, 32000, 1);
443 receiver_to_sender_.SetPacketPipe(CreateSimplePipe(p).Pass()); 387 Create(p);
444 sender_to_receiver_.SetPacketPipe(CreateSimplePipe(p).Pass());
445 Create();
446 StartBasicPlayer(); 388 StartBasicPlayer();
447 389
448 for (int frame = 0; frame < 1000; frame++) { 390 for (int frame = 0; frame < 1000; frame++) {
449 SendFakeVideoFrame(); 391 SendFakeVideoFrame();
450 RunTasks(kFrameTimerMs); 392 RunTasks(kFrameTimerMs);
451 } 393 }
452 RunTasks(100 * kFrameTimerMs); // Empty the pipeline. 394 RunTasks(100 * kFrameTimerMs); // Empty the pipeline.
453 VLOG(1) << "=============INPUTS============"; 395 VLOG(1) << "=============INPUTS============";
454 VLOG(1) << "Bitrate: " << p.bitrate << " mbit/s"; 396 VLOG(1) << "Bitrate: " << p.bitrate << " mbit/s";
455 VLOG(1) << "Latency: " << p.latency << " ms"; 397 VLOG(1) << "Latency: " << p.latency << " ms";
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 media::cast::CastBenchmark benchmark; 707 media::cast::CastBenchmark benchmark;
766 if (getenv("PROFILE_FILE")) { 708 if (getenv("PROFILE_FILE")) {
767 std::string profile_file(getenv("PROFILE_FILE")); 709 std::string profile_file(getenv("PROFILE_FILE"));
768 base::debug::StartProfiling(profile_file); 710 base::debug::StartProfiling(profile_file);
769 benchmark.Run(); 711 benchmark.Run();
770 base::debug::StopProfiling(); 712 base::debug::StopProfiling();
771 } else { 713 } else {
772 benchmark.Run(); 714 benchmark.Run();
773 } 715 }
774 } 716 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698