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

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

Issue 1878883003: Refactor: simplify interface of SenderRtcpSession and CastTransport. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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 15 matching lines...) Expand all
26 #include <stdint.h> 26 #include <stdint.h>
27 #include <map> 27 #include <map>
28 #include <utility> 28 #include <utility>
29 #include <vector> 29 #include <vector>
30 30
31 #include "base/at_exit.h" 31 #include "base/at_exit.h"
32 #include "base/bind.h" 32 #include "base/bind.h"
33 #include "base/bind_helpers.h" 33 #include "base/bind_helpers.h"
34 #include "base/command_line.h" 34 #include "base/command_line.h"
35 #include "base/debug/profiler.h" 35 #include "base/debug/profiler.h"
36 #include "base/memory/ptr_util.h"
36 #include "base/memory/weak_ptr.h" 37 #include "base/memory/weak_ptr.h"
37 #include "base/run_loop.h" 38 #include "base/run_loop.h"
38 #include "base/stl_util.h" 39 #include "base/stl_util.h"
39 #include "base/strings/string_number_conversions.h" 40 #include "base/strings/string_number_conversions.h"
40 #include "base/strings/stringprintf.h" 41 #include "base/strings/stringprintf.h"
41 #include "base/test/simple_test_tick_clock.h" 42 #include "base/test/simple_test_tick_clock.h"
42 #include "base/threading/thread.h" 43 #include "base/threading/thread.h"
43 #include "base/time/tick_clock.h" 44 #include "base/time/tick_clock.h"
44 #include "media/base/audio_bus.h" 45 #include "media/base/audio_bus.h"
45 #include "media/base/fake_single_thread_task_runner.h" 46 #include "media/base/fake_single_thread_task_runner.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 // Takes ownership of |transport|. 89 // Takes ownership of |transport|.
89 void Init(CastTransport* transport, 90 void Init(CastTransport* transport,
90 uint64_t* encoded_video_bytes, 91 uint64_t* encoded_video_bytes,
91 uint64_t* encoded_audio_bytes) { 92 uint64_t* encoded_audio_bytes) {
92 transport_.reset(transport); 93 transport_.reset(transport);
93 encoded_video_bytes_ = encoded_video_bytes; 94 encoded_video_bytes_ = encoded_video_bytes;
94 encoded_audio_bytes_ = encoded_audio_bytes; 95 encoded_audio_bytes_ = encoded_audio_bytes;
95 } 96 }
96 97
97 void InitializeAudio(const CastTransportRtpConfig& config, 98 void InitializeAudio(const CastTransportRtpConfig& config,
98 const RtcpCastMessageCallback& cast_message_cb, 99 std::unique_ptr<RtpSenderRtcpClient> rtcp_client) final {
99 const RtcpRttCallback& rtt_cb,
100 const RtcpPliCallback& key_frame_cb) final {
101 audio_ssrc_ = config.ssrc; 100 audio_ssrc_ = config.ssrc;
102 transport_->InitializeAudio(config, cast_message_cb, rtt_cb, key_frame_cb); 101 transport_->InitializeAudio(config, std::move(rtcp_client));
103 } 102 }
104 103
105 void InitializeVideo(const CastTransportRtpConfig& config, 104 void InitializeVideo(const CastTransportRtpConfig& config,
106 const RtcpCastMessageCallback& cast_message_cb, 105 std::unique_ptr<RtpSenderRtcpClient> rtcp_client) final {
107 const RtcpRttCallback& rtt_cb,
108 const RtcpPliCallback& key_frame_cb) final {
109 video_ssrc_ = config.ssrc; 106 video_ssrc_ = config.ssrc;
110 transport_->InitializeVideo(config, cast_message_cb, rtt_cb, key_frame_cb); 107 transport_->InitializeVideo(config, std::move(rtcp_client));
111 } 108 }
112 109
113 void InsertFrame(uint32_t ssrc, const EncodedFrame& frame) final { 110 void InsertFrame(uint32_t ssrc, const EncodedFrame& frame) final {
114 if (ssrc == audio_ssrc_) { 111 if (ssrc == audio_ssrc_) {
115 *encoded_audio_bytes_ += frame.data.size(); 112 *encoded_audio_bytes_ += frame.data.size();
116 } else if (ssrc == video_ssrc_) { 113 } else if (ssrc == video_ssrc_) {
117 *encoded_video_bytes_ += frame.data.size(); 114 *encoded_video_bytes_ += frame.data.size();
118 } 115 }
119 transport_->InsertFrame(ssrc, frame); 116 transport_->InsertFrame(ssrc, frame);
120 } 117 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 transport_->AddPli(pli_message); 165 transport_->AddPli(pli_message);
169 } 166 }
170 167
171 void SendRtcpFromRtpReceiver() final { 168 void SendRtcpFromRtpReceiver() final {
172 transport_->SendRtcpFromRtpReceiver(); 169 transport_->SendRtcpFromRtpReceiver();
173 } 170 }
174 171
175 void SetOptions(const base::DictionaryValue& options) final {} 172 void SetOptions(const base::DictionaryValue& options) final {}
176 173
177 private: 174 private:
178 scoped_ptr<CastTransport> transport_; 175 std::unique_ptr<CastTransport> transport_;
179 uint32_t audio_ssrc_, video_ssrc_; 176 uint32_t audio_ssrc_, video_ssrc_;
180 uint64_t* encoded_video_bytes_; 177 uint64_t* encoded_video_bytes_;
181 uint64_t* encoded_audio_bytes_; 178 uint64_t* encoded_audio_bytes_;
182 }; 179 };
183 180
184 struct MeasuringPoint { 181 struct MeasuringPoint {
185 MeasuringPoint(double bitrate_, double latency_, double percent_packet_drop_) 182 MeasuringPoint(double bitrate_, double latency_, double percent_packet_drop_)
186 : bitrate(bitrate_), 183 : bitrate(bitrate_),
187 latency(latency_), 184 latency(latency_),
188 percent_packet_drop(percent_packet_drop_) {} 185 percent_packet_drop(percent_packet_drop_) {}
(...skipping 21 matching lines...) Expand all
210 RunOneBenchmark() 207 RunOneBenchmark()
211 : start_time_(), 208 : start_time_(),
212 task_runner_(new FakeSingleThreadTaskRunner(&testing_clock_)), 209 task_runner_(new FakeSingleThreadTaskRunner(&testing_clock_)),
213 testing_clock_sender_(new test::SkewedTickClock(&testing_clock_)), 210 testing_clock_sender_(new test::SkewedTickClock(&testing_clock_)),
214 task_runner_sender_( 211 task_runner_sender_(
215 new test::SkewedSingleThreadTaskRunner(task_runner_)), 212 new test::SkewedSingleThreadTaskRunner(task_runner_)),
216 testing_clock_receiver_(new test::SkewedTickClock(&testing_clock_)), 213 testing_clock_receiver_(new test::SkewedTickClock(&testing_clock_)),
217 task_runner_receiver_( 214 task_runner_receiver_(
218 new test::SkewedSingleThreadTaskRunner(task_runner_)), 215 new test::SkewedSingleThreadTaskRunner(task_runner_)),
219 cast_environment_sender_(new CastEnvironment( 216 cast_environment_sender_(new CastEnvironment(
220 scoped_ptr<base::TickClock>(testing_clock_sender_), 217 std::unique_ptr<base::TickClock>(testing_clock_sender_),
221 task_runner_sender_, 218 task_runner_sender_,
222 task_runner_sender_, 219 task_runner_sender_,
223 task_runner_sender_)), 220 task_runner_sender_)),
224 cast_environment_receiver_(new CastEnvironment( 221 cast_environment_receiver_(new CastEnvironment(
225 scoped_ptr<base::TickClock>(testing_clock_receiver_), 222 std::unique_ptr<base::TickClock>(testing_clock_receiver_),
226 task_runner_receiver_, 223 task_runner_receiver_,
227 task_runner_receiver_, 224 task_runner_receiver_,
228 task_runner_receiver_)), 225 task_runner_receiver_)),
229 video_bytes_encoded_(0), 226 video_bytes_encoded_(0),
230 audio_bytes_encoded_(0), 227 audio_bytes_encoded_(0),
231 frames_sent_(0) { 228 frames_sent_(0) {
232 testing_clock_.Advance( 229 testing_clock_.Advance(
233 base::TimeDelta::FromMilliseconds(kStartMillisecond)); 230 base::TimeDelta::FromMilliseconds(kStartMillisecond));
234 } 231 }
235 232
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 task_runner_sender_->SetSkew(1.0 / skew); 265 task_runner_sender_->SetSkew(1.0 / skew);
269 } 266 }
270 267
271 void SetReceiverClockSkew(double skew, base::TimeDelta offset) { 268 void SetReceiverClockSkew(double skew, base::TimeDelta offset) {
272 testing_clock_receiver_->SetSkew(skew, offset); 269 testing_clock_receiver_->SetSkew(skew, offset);
273 task_runner_receiver_->SetSkew(1.0 / skew); 270 task_runner_receiver_->SetSkew(1.0 / skew);
274 } 271 }
275 272
276 void Create(const MeasuringPoint& p); 273 void Create(const MeasuringPoint& p);
277 274
278 void ReceivePacket(scoped_ptr<Packet> packet) { 275 void ReceivePacket(std::unique_ptr<Packet> packet) {
279 cast_receiver_->ReceivePacket(std::move(packet)); 276 cast_receiver_->ReceivePacket(std::move(packet));
280 } 277 }
281 278
282 virtual ~RunOneBenchmark() { 279 virtual ~RunOneBenchmark() {
283 cast_sender_.reset(); 280 cast_sender_.reset();
284 cast_receiver_.reset(); 281 cast_receiver_.reset();
285 task_runner_->RunTasks(); 282 task_runner_->RunTasks();
286 } 283 }
287 284
288 base::TimeDelta VideoTimestamp(int frame_number) { 285 base::TimeDelta VideoTimestamp(int frame_number) {
(...skipping 17 matching lines...) Expand all
306 void BasicPlayerGotVideoFrame( 303 void BasicPlayerGotVideoFrame(
307 const scoped_refptr<media::VideoFrame>& video_frame, 304 const scoped_refptr<media::VideoFrame>& video_frame,
308 const base::TimeTicks& render_time, 305 const base::TimeTicks& render_time,
309 bool continuous) { 306 bool continuous) {
310 video_ticks_.push_back( 307 video_ticks_.push_back(
311 std::make_pair(testing_clock_receiver_->NowTicks(), render_time)); 308 std::make_pair(testing_clock_receiver_->NowTicks(), render_time));
312 cast_receiver_->RequestDecodedVideoFrame(base::Bind( 309 cast_receiver_->RequestDecodedVideoFrame(base::Bind(
313 &RunOneBenchmark::BasicPlayerGotVideoFrame, base::Unretained(this))); 310 &RunOneBenchmark::BasicPlayerGotVideoFrame, base::Unretained(this)));
314 } 311 }
315 312
316 void BasicPlayerGotAudioFrame(scoped_ptr<AudioBus> audio_bus, 313 void BasicPlayerGotAudioFrame(std::unique_ptr<AudioBus> audio_bus,
317 const base::TimeTicks& playout_time, 314 const base::TimeTicks& playout_time,
318 bool is_continuous) { 315 bool is_continuous) {
319 audio_ticks_.push_back( 316 audio_ticks_.push_back(
320 std::make_pair(testing_clock_receiver_->NowTicks(), playout_time)); 317 std::make_pair(testing_clock_receiver_->NowTicks(), playout_time));
321 cast_receiver_->RequestDecodedAudioFrame(base::Bind( 318 cast_receiver_->RequestDecodedAudioFrame(base::Bind(
322 &RunOneBenchmark::BasicPlayerGotAudioFrame, base::Unretained(this))); 319 &RunOneBenchmark::BasicPlayerGotAudioFrame, base::Unretained(this)));
323 } 320 }
324 321
325 void StartBasicPlayer() { 322 void StartBasicPlayer() {
326 cast_receiver_->RequestDecodedVideoFrame(base::Bind( 323 cast_receiver_->RequestDecodedVideoFrame(base::Bind(
327 &RunOneBenchmark::BasicPlayerGotVideoFrame, base::Unretained(this))); 324 &RunOneBenchmark::BasicPlayerGotVideoFrame, base::Unretained(this)));
328 cast_receiver_->RequestDecodedAudioFrame(base::Bind( 325 cast_receiver_->RequestDecodedAudioFrame(base::Bind(
329 &RunOneBenchmark::BasicPlayerGotAudioFrame, base::Unretained(this))); 326 &RunOneBenchmark::BasicPlayerGotAudioFrame, base::Unretained(this)));
330 } 327 }
331 328
332 scoped_ptr<test::PacketPipe> CreateSimplePipe(const MeasuringPoint& p) { 329 std::unique_ptr<test::PacketPipe> CreateSimplePipe(const MeasuringPoint& p) {
333 scoped_ptr<test::PacketPipe> pipe = test::NewBuffer(65536, p.bitrate); 330 std::unique_ptr<test::PacketPipe> pipe = test::NewBuffer(65536, p.bitrate);
334 pipe->AppendToPipe(test::NewRandomDrop(p.percent_packet_drop / 100.0)); 331 pipe->AppendToPipe(test::NewRandomDrop(p.percent_packet_drop / 100.0));
335 pipe->AppendToPipe(test::NewConstantDelay(p.latency / 1000.0)); 332 pipe->AppendToPipe(test::NewConstantDelay(p.latency / 1000.0));
336 return pipe; 333 return pipe;
337 } 334 }
338 335
339 void Run(const MeasuringPoint& p) { 336 void Run(const MeasuringPoint& p) {
340 available_bitrate_ = p.bitrate; 337 available_bitrate_ = p.bitrate;
341 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16); 338 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16);
342 Create(p); 339 Create(p);
343 StartBasicPlayer(); 340 StartBasicPlayer();
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 // These run on the receiver timeline. 424 // These run on the receiver timeline.
428 test::SkewedTickClock* testing_clock_receiver_; 425 test::SkewedTickClock* testing_clock_receiver_;
429 scoped_refptr<test::SkewedSingleThreadTaskRunner> task_runner_receiver_; 426 scoped_refptr<test::SkewedSingleThreadTaskRunner> task_runner_receiver_;
430 427
431 scoped_refptr<CastEnvironment> cast_environment_sender_; 428 scoped_refptr<CastEnvironment> cast_environment_sender_;
432 scoped_refptr<CastEnvironment> cast_environment_receiver_; 429 scoped_refptr<CastEnvironment> cast_environment_receiver_;
433 430
434 LoopBackTransport* receiver_to_sender_; // Owned by CastTransportImpl. 431 LoopBackTransport* receiver_to_sender_; // Owned by CastTransportImpl.
435 LoopBackTransport* sender_to_receiver_; // Owned by CastTransportImpl. 432 LoopBackTransport* sender_to_receiver_; // Owned by CastTransportImpl.
436 CastTransportWrapper transport_sender_; 433 CastTransportWrapper transport_sender_;
437 scoped_ptr<CastTransport> transport_receiver_; 434 std::unique_ptr<CastTransport> transport_receiver_;
438 uint64_t video_bytes_encoded_; 435 uint64_t video_bytes_encoded_;
439 uint64_t audio_bytes_encoded_; 436 uint64_t audio_bytes_encoded_;
440 437
441 scoped_ptr<CastReceiver> cast_receiver_; 438 std::unique_ptr<CastReceiver> cast_receiver_;
442 scoped_ptr<CastSender> cast_sender_; 439 std::unique_ptr<CastSender> cast_sender_;
443 440
444 int frames_sent_; 441 int frames_sent_;
445 base::TimeDelta frame_duration_; 442 base::TimeDelta frame_duration_;
446 double available_bitrate_; 443 double available_bitrate_;
447 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > audio_ticks_; 444 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > audio_ticks_;
448 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > video_ticks_; 445 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > video_ticks_;
449 }; 446 };
450 447
451 namespace { 448 namespace {
452 449
453 class TransportClient : public CastTransport::Client { 450 class TransportClient : public CastTransport::Client {
454 public: 451 public:
455 explicit TransportClient(RunOneBenchmark* run_one_benchmark) 452 explicit TransportClient(RunOneBenchmark* run_one_benchmark)
456 : run_one_benchmark_(run_one_benchmark) {} 453 : run_one_benchmark_(run_one_benchmark) {}
457 454
458 void OnStatusChanged(CastTransportStatus status) final { 455 void OnStatusChanged(CastTransportStatus status) final {
459 bool result = (status == TRANSPORT_AUDIO_INITIALIZED || 456 bool result = (status == TRANSPORT_AUDIO_INITIALIZED ||
460 status == TRANSPORT_VIDEO_INITIALIZED); 457 status == TRANSPORT_VIDEO_INITIALIZED);
461 EXPECT_TRUE(result); 458 EXPECT_TRUE(result);
462 }; 459 };
463 void OnLoggingEventsReceived( 460 void OnLoggingEventsReceived(
464 scoped_ptr<std::vector<FrameEvent>> frame_events, 461 std::unique_ptr<std::vector<FrameEvent>> frame_events,
465 scoped_ptr<std::vector<PacketEvent>> packet_events) final{}; 462 std::unique_ptr<std::vector<PacketEvent>> packet_events) final{};
466 void ProcessRtpPacket(scoped_ptr<Packet> packet) final { 463 void ProcessRtpPacket(std::unique_ptr<Packet> packet) final {
467 if (run_one_benchmark_) 464 if (run_one_benchmark_)
468 run_one_benchmark_->ReceivePacket(std::move(packet)); 465 run_one_benchmark_->ReceivePacket(std::move(packet));
469 }; 466 };
470 467
471 private: 468 private:
472 RunOneBenchmark* const run_one_benchmark_; 469 RunOneBenchmark* const run_one_benchmark_;
473 470
474 DISALLOW_COPY_AND_ASSIGN(TransportClient); 471 DISALLOW_COPY_AND_ASSIGN(TransportClient);
475 }; 472 };
476 473
477 } // namepspace 474 } // namepspace
478 475
479 void RunOneBenchmark::Create(const MeasuringPoint& p) { 476 void RunOneBenchmark::Create(const MeasuringPoint& p) {
480 sender_to_receiver_ = new LoopBackTransport(cast_environment_sender_); 477 sender_to_receiver_ = new LoopBackTransport(cast_environment_sender_);
481 transport_sender_.Init( 478 transport_sender_.Init(
482 new CastTransportImpl( 479 new CastTransportImpl(
483 testing_clock_sender_, base::TimeDelta::FromSeconds(1), 480 testing_clock_sender_, base::TimeDelta::FromSeconds(1),
484 make_scoped_ptr(new TransportClient(nullptr)), 481 base::WrapUnique(new TransportClient(nullptr)),
485 make_scoped_ptr(sender_to_receiver_), task_runner_sender_), 482 base::WrapUnique(sender_to_receiver_), task_runner_sender_),
486 &video_bytes_encoded_, &audio_bytes_encoded_); 483 &video_bytes_encoded_, &audio_bytes_encoded_);
487 484
488 receiver_to_sender_ = new LoopBackTransport(cast_environment_receiver_); 485 receiver_to_sender_ = new LoopBackTransport(cast_environment_receiver_);
489 transport_receiver_.reset(new CastTransportImpl( 486 transport_receiver_.reset(new CastTransportImpl(
490 testing_clock_receiver_, base::TimeDelta::FromSeconds(1), 487 testing_clock_receiver_, base::TimeDelta::FromSeconds(1),
491 make_scoped_ptr(new TransportClient(this)), 488 base::WrapUnique(new TransportClient(this)),
492 make_scoped_ptr(receiver_to_sender_), task_runner_receiver_)); 489 base::WrapUnique(receiver_to_sender_), task_runner_receiver_));
493 490
494 cast_receiver_ = 491 cast_receiver_ =
495 CastReceiver::Create(cast_environment_receiver_, audio_receiver_config_, 492 CastReceiver::Create(cast_environment_receiver_, audio_receiver_config_,
496 video_receiver_config_, transport_receiver_.get()); 493 video_receiver_config_, transport_receiver_.get());
497 494
498 cast_sender_ = 495 cast_sender_ =
499 CastSender::Create(cast_environment_sender_, &transport_sender_); 496 CastSender::Create(cast_environment_sender_, &transport_sender_);
500 497
501 cast_sender_->InitializeAudio(audio_sender_config_, 498 cast_sender_->InitializeAudio(audio_sender_config_,
502 base::Bind(&ExpectAudioSuccess)); 499 base::Bind(&ExpectAudioSuccess));
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 media::cast::CastBenchmark benchmark; 728 media::cast::CastBenchmark benchmark;
732 if (getenv("PROFILE_FILE")) { 729 if (getenv("PROFILE_FILE")) {
733 std::string profile_file(getenv("PROFILE_FILE")); 730 std::string profile_file(getenv("PROFILE_FILE"));
734 base::debug::StartProfiling(profile_file); 731 base::debug::StartProfiling(profile_file);
735 benchmark.Run(); 732 benchmark.Run();
736 base::debug::StopProfiling(); 733 base::debug::StopProfiling();
737 } else { 734 } else {
738 benchmark.Run(); 735 benchmark.Run();
739 } 736 }
740 } 737 }
OLDNEW
« media/cast/sender/frame_sender.h ('K') | « media/cast/sender/video_sender_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698