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

Side by Side Diff: webrtc/video/full_stack.cc

Issue 1289933003: Full stack graphs (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fixing docstring Created 5 years, 3 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 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 #include <stdio.h> 10 #include <stdio.h>
11 11
12 #include <deque> 12 #include <deque>
13 #include <map> 13 #include <map>
14 14
15 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
16 16
17 #include "webrtc/base/format_macros.h"
17 #include "webrtc/base/scoped_ptr.h" 18 #include "webrtc/base/scoped_ptr.h"
18 #include "webrtc/base/thread_annotations.h" 19 #include "webrtc/base/thread_annotations.h"
19 #include "webrtc/call.h" 20 #include "webrtc/call.h"
20 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" 21 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
21 #include "webrtc/frame_callback.h" 22 #include "webrtc/frame_callback.h"
22 #include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h" 23 #include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h"
23 #include "webrtc/system_wrappers/interface/clock.h" 24 #include "webrtc/system_wrappers/interface/clock.h"
24 #include "webrtc/system_wrappers/interface/cpu_info.h" 25 #include "webrtc/system_wrappers/interface/cpu_info.h"
25 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 26 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
26 #include "webrtc/system_wrappers/interface/event_wrapper.h" 27 #include "webrtc/system_wrappers/interface/event_wrapper.h"
27 #include "webrtc/system_wrappers/interface/sleep.h" 28 #include "webrtc/system_wrappers/interface/sleep.h"
28 #include "webrtc/test/call_test.h"
29 #include "webrtc/test/direct_transport.h"
30 #include "webrtc/test/encoder_settings.h" 29 #include "webrtc/test/encoder_settings.h"
31 #include "webrtc/test/fake_encoder.h" 30 #include "webrtc/test/fake_encoder.h"
32 #include "webrtc/test/frame_generator.h" 31 #include "webrtc/test/frame_generator.h"
33 #include "webrtc/test/frame_generator_capturer.h" 32 #include "webrtc/test/frame_generator_capturer.h"
34 #include "webrtc/test/statistics.h" 33 #include "webrtc/test/statistics.h"
35 #include "webrtc/test/testsupport/fileutils.h" 34 #include "webrtc/test/testsupport/fileutils.h"
36 #include "webrtc/typedefs.h" 35 #include "webrtc/typedefs.h"
36 #include "webrtc/video/full_stack.h"
37 37
38 namespace webrtc { 38 namespace webrtc {
39 39
40 static const int kFullStackTestDurationSecs = 60; 40 static const int kFullStackTestDurationSecs = 60;
41 static const int kSendStatsPollingIntervalMs = 1000; 41 static const int kSendStatsPollingIntervalMs = 1000;
42 42
43 struct FullStackTestParams {
44 const char* test_label;
45 struct {
46 const char* name;
47 size_t width, height;
48 int fps;
49 } clip;
50 bool screenshare;
51 int min_bitrate_bps;
52 int target_bitrate_bps;
53 int max_bitrate_bps;
54 double avg_psnr_threshold;
55 double avg_ssim_threshold;
56 int test_durations_secs;
57 std::string codec;
58 FakeNetworkPipe::Config link;
59 };
60
61 class FullStackTest : public test::CallTest {
62 protected:
63 void RunTest(const FullStackTestParams& params);
64 };
65
66 class VideoAnalyzer : public PacketReceiver, 43 class VideoAnalyzer : public PacketReceiver,
67 public newapi::Transport, 44 public newapi::Transport,
68 public VideoRenderer, 45 public VideoRenderer,
69 public VideoCaptureInput, 46 public VideoCaptureInput,
70 public EncodedFrameObserver { 47 public EncodedFrameObserver {
71 public: 48 public:
72 VideoAnalyzer(VideoCaptureInput* input, 49 VideoAnalyzer(VideoCaptureInput* input,
73 Transport* transport, 50 Transport* transport,
74 const char* test_label, 51 const char* test_label,
75 double avg_psnr_threshold, 52 double avg_psnr_threshold,
76 double avg_ssim_threshold, 53 double avg_ssim_threshold,
77 int duration_frames) 54 int duration_frames,
55 const std::string& stats_output_filename)
78 : input_(input), 56 : input_(input),
79 transport_(transport), 57 transport_(transport),
80 receiver_(nullptr), 58 receiver_(nullptr),
81 send_stream_(nullptr), 59 send_stream_(nullptr),
82 test_label_(test_label), 60 test_label_(test_label),
61 stats_output_filename_(stats_output_filename),
83 frames_to_process_(duration_frames), 62 frames_to_process_(duration_frames),
84 frames_recorded_(0), 63 frames_recorded_(0),
85 frames_processed_(0), 64 frames_processed_(0),
86 dropped_frames_(0), 65 dropped_frames_(0),
87 last_render_time_(0), 66 last_render_time_(0),
88 rtp_timestamp_delta_(0), 67 rtp_timestamp_delta_(0),
89 avg_psnr_threshold_(avg_psnr_threshold), 68 avg_psnr_threshold_(avg_psnr_threshold),
90 avg_ssim_threshold_(avg_ssim_threshold), 69 avg_ssim_threshold_(avg_ssim_threshold),
91 comparison_available_event_(EventWrapper::Create()), 70 comparison_available_event_(EventWrapper::Create()),
92 done_(EventWrapper::Create()) { 71 done_(EventWrapper::Create()) {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 RTPHeader header; 143 RTPHeader header;
165 parser->Parse(packet, length, &header); 144 parser->Parse(packet, length, &header);
166 145
167 { 146 {
168 rtc::CritScope lock(&crit_); 147 rtc::CritScope lock(&crit_);
169 if (rtp_timestamp_delta_ == 0) { 148 if (rtp_timestamp_delta_ == 0) {
170 rtp_timestamp_delta_ = 149 rtp_timestamp_delta_ =
171 header.timestamp - first_send_frame_.timestamp(); 150 header.timestamp - first_send_frame_.timestamp();
172 first_send_frame_.Reset(); 151 first_send_frame_.Reset();
173 } 152 }
174 send_times_[header.timestamp - rtp_timestamp_delta_] = 153 uint32_t timestamp = header.timestamp - rtp_timestamp_delta_;
154 send_times_[timestamp] =
175 Clock::GetRealTimeClock()->CurrentNtpInMilliseconds(); 155 Clock::GetRealTimeClock()->CurrentNtpInMilliseconds();
156 encoded_frame_sizes_[timestamp] +=
157 length - (header.headerLength + header.paddingLength);
176 } 158 }
177 159
178 return transport_->SendRtp(packet, length); 160 return transport_->SendRtp(packet, length);
179 } 161 }
180 162
181 bool SendRtcp(const uint8_t* packet, size_t length) override { 163 bool SendRtcp(const uint8_t* packet, size_t length) override {
182 return transport_->SendRtcp(packet, length); 164 return transport_->SendRtcp(packet, length);
183 } 165 }
184 166
185 void EncodedFrameCallback(const EncodedFrame& frame) override { 167 void EncodedFrameCallback(const EncodedFrame& frame) override {
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 } 240 }
259 241
260 VideoCaptureInput* input_; 242 VideoCaptureInput* input_;
261 Transport* transport_; 243 Transport* transport_;
262 PacketReceiver* receiver_; 244 PacketReceiver* receiver_;
263 VideoSendStream* send_stream_; 245 VideoSendStream* send_stream_;
264 246
265 private: 247 private:
266 struct FrameComparison { 248 struct FrameComparison {
267 FrameComparison() 249 FrameComparison()
268 : dropped(false), send_time_ms(0), recv_time_ms(0), render_time_ms(0) {} 250 : dropped(false),
251 send_time_ms(0),
252 recv_time_ms(0),
253 render_time_ms(0),
254 encoded_frame_size(0) {}
269 255
270 FrameComparison(const VideoFrame& reference, 256 FrameComparison(const VideoFrame& reference,
271 const VideoFrame& render, 257 const VideoFrame& render,
272 bool dropped, 258 bool dropped,
273 int64_t send_time_ms, 259 int64_t send_time_ms,
274 int64_t recv_time_ms, 260 int64_t recv_time_ms,
275 int64_t render_time_ms) 261 int64_t render_time_ms,
262 size_t encoded_frame_size)
276 : reference(reference), 263 : reference(reference),
277 render(render), 264 render(render),
278 dropped(dropped), 265 dropped(dropped),
279 send_time_ms(send_time_ms), 266 send_time_ms(send_time_ms),
280 recv_time_ms(recv_time_ms), 267 recv_time_ms(recv_time_ms),
281 render_time_ms(render_time_ms) {} 268 render_time_ms(render_time_ms),
269 encoded_frame_size(encoded_frame_size) {}
282 270
283 VideoFrame reference; 271 VideoFrame reference;
284 VideoFrame render; 272 VideoFrame render;
285 bool dropped; 273 bool dropped;
286 int64_t send_time_ms; 274 int64_t send_time_ms;
287 int64_t recv_time_ms; 275 int64_t recv_time_ms;
288 int64_t render_time_ms; 276 int64_t render_time_ms;
277 size_t encoded_frame_size;
278 };
279
280 struct Sample {
281 Sample(double dropped,
282 double input_time_ms,
283 double send_time_ms,
284 double recv_time_ms,
285 double encoded_frame_size,
286 double psnr,
287 double ssim,
288 double render_time_ms)
289 : dropped(dropped),
290 input_time_ms(input_time_ms),
291 send_time_ms(send_time_ms),
292 recv_time_ms(recv_time_ms),
293 encoded_frame_size(encoded_frame_size),
294 psnr(psnr),
295 ssim(ssim),
296 render_time_ms(render_time_ms) {}
297
298 double dropped;
299 double input_time_ms;
300 double send_time_ms;
301 double recv_time_ms;
302 double encoded_frame_size;
303 double psnr;
304 double ssim;
305 double render_time_ms;
289 }; 306 };
290 307
291 void AddFrameComparison(const VideoFrame& reference, 308 void AddFrameComparison(const VideoFrame& reference,
292 const VideoFrame& render, 309 const VideoFrame& render,
293 bool dropped, 310 bool dropped,
294 int64_t render_time_ms) 311 int64_t render_time_ms)
295 EXCLUSIVE_LOCKS_REQUIRED(crit_) { 312 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
296 int64_t send_time_ms = send_times_[reference.timestamp()]; 313 int64_t send_time_ms = send_times_[reference.timestamp()];
297 send_times_.erase(reference.timestamp()); 314 send_times_.erase(reference.timestamp());
298 int64_t recv_time_ms = recv_times_[reference.timestamp()]; 315 int64_t recv_time_ms = recv_times_[reference.timestamp()];
299 recv_times_.erase(reference.timestamp()); 316 recv_times_.erase(reference.timestamp());
300 317
318 size_t encoded_size = encoded_frame_sizes_[reference.timestamp()];
319 encoded_frame_sizes_.erase(reference.timestamp());
320
321 VideoFrame reference_copy;
322 VideoFrame render_copy;
323 reference_copy.CopyFrame(reference);
324 render_copy.CopyFrame(render);
325
301 rtc::CritScope crit(&comparison_lock_); 326 rtc::CritScope crit(&comparison_lock_);
302 comparisons_.push_back(FrameComparison(reference, render, dropped, 327 comparisons_.push_back(FrameComparison(reference_copy, render_copy, dropped,
303 send_time_ms, recv_time_ms, 328 send_time_ms, recv_time_ms,
304 render_time_ms)); 329 render_time_ms, encoded_size));
305 comparison_available_event_->Set(); 330 comparison_available_event_->Set();
306 } 331 }
307 332
308 static bool PollStatsThread(void* obj) { 333 static bool PollStatsThread(void* obj) {
309 return static_cast<VideoAnalyzer*>(obj)->PollStats(); 334 return static_cast<VideoAnalyzer*>(obj)->PollStats();
310 } 335 }
311 336
312 bool PollStats() { 337 bool PollStats() {
313 switch (done_->Wait(kSendStatsPollingIntervalMs)) { 338 switch (done_->Wait(kSendStatsPollingIntervalMs)) {
314 case kEventSignaled: 339 case kEventSignaled:
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 comparison_available_event_->Set(); 377 comparison_available_event_->Set();
353 return false; 378 return false;
354 } 379 }
355 return true; // Try again. 380 return true; // Try again.
356 } 381 }
357 382
358 PerformFrameComparison(comparison); 383 PerformFrameComparison(comparison);
359 384
360 if (FrameProcessed()) { 385 if (FrameProcessed()) {
361 PrintResults(); 386 PrintResults();
387 if (!stats_output_filename_.empty())
388 PrintSamplesToFile();
362 done_->Set(); 389 done_->Set();
363 comparison_available_event_->Set(); 390 comparison_available_event_->Set();
364 return false; 391 return false;
365 } 392 }
366 393
367 return true; 394 return true;
368 } 395 }
369 396
370 bool PopComparison(FrameComparison* comparison) { 397 bool PopComparison(FrameComparison* comparison) {
371 rtc::CritScope crit(&comparison_lock_); 398 rtc::CritScope crit(&comparison_lock_);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 451
425 EXPECT_GT(psnr_.Mean(), avg_psnr_threshold_); 452 EXPECT_GT(psnr_.Mean(), avg_psnr_threshold_);
426 EXPECT_GT(ssim_.Mean(), avg_ssim_threshold_); 453 EXPECT_GT(ssim_.Mean(), avg_ssim_threshold_);
427 } 454 }
428 455
429 void PerformFrameComparison(const FrameComparison& comparison) { 456 void PerformFrameComparison(const FrameComparison& comparison) {
430 // Perform expensive psnr and ssim calculations while not holding lock. 457 // Perform expensive psnr and ssim calculations while not holding lock.
431 double psnr = I420PSNR(&comparison.reference, &comparison.render); 458 double psnr = I420PSNR(&comparison.reference, &comparison.render);
432 double ssim = I420SSIM(&comparison.reference, &comparison.render); 459 double ssim = I420SSIM(&comparison.reference, &comparison.render);
433 460
461 int64_t input_time_ms = comparison.reference.ntp_time_ms();
462
434 rtc::CritScope crit(&comparison_lock_); 463 rtc::CritScope crit(&comparison_lock_);
464 if (!stats_output_filename_.empty()) {
465 samples_.push_back(Sample(
466 comparison.dropped, input_time_ms, comparison.send_time_ms,
467 comparison.recv_time_ms, comparison.encoded_frame_size, psnr, ssim,
468 comparison.render_time_ms));
469 }
435 psnr_.AddSample(psnr); 470 psnr_.AddSample(psnr);
436 ssim_.AddSample(ssim); 471 ssim_.AddSample(ssim);
472
437 if (comparison.dropped) { 473 if (comparison.dropped) {
438 ++dropped_frames_; 474 ++dropped_frames_;
439 return; 475 return;
440 } 476 }
441 if (last_render_time_ != 0) 477 if (last_render_time_ != 0)
442 rendered_delta_.AddSample(comparison.render_time_ms - last_render_time_); 478 rendered_delta_.AddSample(comparison.render_time_ms - last_render_time_);
443 last_render_time_ = comparison.render_time_ms; 479 last_render_time_ = comparison.render_time_ms;
444 480
445 int64_t input_time_ms = comparison.reference.ntp_time_ms();
446 sender_time_.AddSample(comparison.send_time_ms - input_time_ms); 481 sender_time_.AddSample(comparison.send_time_ms - input_time_ms);
447 receiver_time_.AddSample(comparison.render_time_ms - 482 receiver_time_.AddSample(comparison.render_time_ms -
448 comparison.recv_time_ms); 483 comparison.recv_time_ms);
449 end_to_end_.AddSample(comparison.render_time_ms - input_time_ms); 484 end_to_end_.AddSample(comparison.render_time_ms - input_time_ms);
485 encoded_frame_size_.AddSample(comparison.encoded_frame_size);
450 } 486 }
451 487
452 void PrintResult(const char* result_type, 488 void PrintResult(const char* result_type,
453 test::Statistics stats, 489 test::Statistics stats,
454 const char* unit) { 490 const char* unit) {
455 printf("RESULT %s: %s = {%f, %f}%s\n", 491 printf("RESULT %s: %s = {%f, %f}%s\n",
456 result_type, 492 result_type,
457 test_label_, 493 test_label_,
458 stats.Mean(), 494 stats.Mean(),
459 stats.StandardDeviation(), 495 stats.StandardDeviation(),
460 unit); 496 unit);
461 } 497 }
462 498
499 void PrintSamplesToFile(void) {
500 FILE* f = fopen(stats_output_filename_.c_str(), "w");
pbos-webrtc 2015/09/03 14:59:27 s/f/out/ or s/f/file/, your choice. Pref first.
ivica 2015/09/03 16:24:23 Done.
501 if (f == NULL) {
502 fprintf(stderr, "Couldn't open file %s\n",
503 stats_output_filename_.c_str());
504 abort();
505 }
506
507 rtc::CritScope crit(&comparison_lock_);
508 std::sort(samples_.begin(), samples_.end(),
509 [](const Sample& A, const Sample& B)
510 -> bool { return A.input_time_ms < B.input_time_ms; });
511
512 fprintf(f, "%s\n", test_label_);
513 fprintf(f, "%" PRIuS "\n", samples_.size());
514 fprintf(f,
515 "dropped "
516 "input_time_ms "
517 "send_time_ms "
518 "recv_time_ms "
519 "encoded_frame_size "
520 "psnr "
521 "ssim "
522 "render_time_ms\n");
523 for (const Sample& sample : samples_) {
524 fprintf(f, "%lf %lf %lf %lf %lf %lf %lf %lf\n", sample.dropped,
525 sample.input_time_ms, sample.send_time_ms, sample.recv_time_ms,
526 sample.encoded_frame_size, sample.psnr, sample.ssim,
527 sample.render_time_ms);
528 }
529 fclose(f);
530 }
531
463 const char* const test_label_; 532 const char* const test_label_;
533 std::string stats_output_filename_;
534 std::vector<Sample> samples_ GUARDED_BY(comparison_lock_);
464 test::Statistics sender_time_ GUARDED_BY(comparison_lock_); 535 test::Statistics sender_time_ GUARDED_BY(comparison_lock_);
465 test::Statistics receiver_time_ GUARDED_BY(comparison_lock_); 536 test::Statistics receiver_time_ GUARDED_BY(comparison_lock_);
466 test::Statistics psnr_ GUARDED_BY(comparison_lock_); 537 test::Statistics psnr_ GUARDED_BY(comparison_lock_);
467 test::Statistics ssim_ GUARDED_BY(comparison_lock_); 538 test::Statistics ssim_ GUARDED_BY(comparison_lock_);
468 test::Statistics end_to_end_ GUARDED_BY(comparison_lock_); 539 test::Statistics end_to_end_ GUARDED_BY(comparison_lock_);
469 test::Statistics rendered_delta_ GUARDED_BY(comparison_lock_); 540 test::Statistics rendered_delta_ GUARDED_BY(comparison_lock_);
470 test::Statistics encoded_frame_size_ GUARDED_BY(comparison_lock_); 541 test::Statistics encoded_frame_size_ GUARDED_BY(comparison_lock_);
471 test::Statistics encode_frame_rate_ GUARDED_BY(comparison_lock_); 542 test::Statistics encode_frame_rate_ GUARDED_BY(comparison_lock_);
472 test::Statistics encode_time_ms GUARDED_BY(comparison_lock_); 543 test::Statistics encode_time_ms GUARDED_BY(comparison_lock_);
473 test::Statistics encode_usage_percent GUARDED_BY(comparison_lock_); 544 test::Statistics encode_usage_percent GUARDED_BY(comparison_lock_);
474 test::Statistics media_bitrate_bps GUARDED_BY(comparison_lock_); 545 test::Statistics media_bitrate_bps GUARDED_BY(comparison_lock_);
475 546
476 const int frames_to_process_; 547 const int frames_to_process_;
477 int frames_recorded_; 548 int frames_recorded_;
478 int frames_processed_; 549 int frames_processed_;
479 int dropped_frames_; 550 int dropped_frames_;
480 int64_t last_render_time_; 551 int64_t last_render_time_;
481 uint32_t rtp_timestamp_delta_; 552 uint32_t rtp_timestamp_delta_;
482 553
483 rtc::CriticalSection crit_; 554 rtc::CriticalSection crit_;
484 std::deque<VideoFrame> frames_ GUARDED_BY(crit_); 555 std::deque<VideoFrame> frames_ GUARDED_BY(crit_);
556 std::deque<VideoSendStream::Stats> send_stats_ GUARDED_BY(crit_);
485 VideoFrame last_rendered_frame_ GUARDED_BY(crit_); 557 VideoFrame last_rendered_frame_ GUARDED_BY(crit_);
486 std::map<uint32_t, int64_t> send_times_ GUARDED_BY(crit_); 558 std::map<uint32_t, int64_t> send_times_ GUARDED_BY(crit_);
487 std::map<uint32_t, int64_t> recv_times_ GUARDED_BY(crit_); 559 std::map<uint32_t, int64_t> recv_times_ GUARDED_BY(crit_);
560 std::map<uint32_t, size_t> encoded_frame_sizes_ GUARDED_BY(crit_);
488 VideoFrame first_send_frame_ GUARDED_BY(crit_); 561 VideoFrame first_send_frame_ GUARDED_BY(crit_);
489 const double avg_psnr_threshold_; 562 const double avg_psnr_threshold_;
490 const double avg_ssim_threshold_; 563 const double avg_ssim_threshold_;
491 564
492 rtc::CriticalSection comparison_lock_; 565 rtc::CriticalSection comparison_lock_;
493 std::vector<ThreadWrapper*> comparison_thread_pool_; 566 std::vector<ThreadWrapper*> comparison_thread_pool_;
494 rtc::scoped_ptr<ThreadWrapper> stats_polling_thread_; 567 rtc::scoped_ptr<ThreadWrapper> stats_polling_thread_;
495 const rtc::scoped_ptr<EventWrapper> comparison_available_event_; 568 const rtc::scoped_ptr<EventWrapper> comparison_available_event_;
496 std::deque<FrameComparison> comparisons_ GUARDED_BY(comparison_lock_); 569 std::deque<FrameComparison> comparisons_ GUARDED_BY(comparison_lock_);
497 const rtc::scoped_ptr<EventWrapper> done_; 570 const rtc::scoped_ptr<EventWrapper> done_;
498 }; 571 };
499 572
500 void FullStackTest::RunTest(const FullStackTestParams& params) { 573 void FullStackTest::RunTest(const FullStackTestParams& params) {
574 // TODO(ivica): Add num_temporal_layers as a param.
575 unsigned char num_temporal_layers =
576 params.stats_output_filename.empty() ? 2 : 1;
577
501 test::DirectTransport send_transport(params.link); 578 test::DirectTransport send_transport(params.link);
502 test::DirectTransport recv_transport(params.link); 579 test::DirectTransport recv_transport(params.link);
503 VideoAnalyzer analyzer(nullptr, &send_transport, params.test_label, 580 VideoAnalyzer analyzer(nullptr, &send_transport, params.test_label,
504 params.avg_psnr_threshold, params.avg_ssim_threshold, 581 params.avg_psnr_threshold, params.avg_ssim_threshold,
505 params.test_durations_secs * params.clip.fps); 582 params.test_durations_secs * params.clip.fps,
583 params.stats_output_filename);
506 584
507 CreateCalls(Call::Config(), Call::Config()); 585 CreateCalls(Call::Config(), Call::Config());
508 586
509 analyzer.SetReceiver(receiver_call_->Receiver()); 587 analyzer.SetReceiver(receiver_call_->Receiver());
510 send_transport.SetReceiver(&analyzer); 588 send_transport.SetReceiver(&analyzer);
511 recv_transport.SetReceiver(sender_call_->Receiver()); 589 recv_transport.SetReceiver(sender_call_->Receiver());
512 590
513 CreateSendConfig(1, &analyzer); 591 CreateSendConfig(1, &analyzer);
514 592
515 rtc::scoped_ptr<VideoEncoder> encoder; 593 rtc::scoped_ptr<VideoEncoder> encoder;
(...skipping 27 matching lines...) Expand all
543 621
544 VideoCodecVP8 vp8_settings; 622 VideoCodecVP8 vp8_settings;
545 VideoCodecVP9 vp9_settings; 623 VideoCodecVP9 vp9_settings;
546 if (params.screenshare) { 624 if (params.screenshare) {
547 encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen; 625 encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen;
548 encoder_config_.min_transmit_bitrate_bps = 400 * 1000; 626 encoder_config_.min_transmit_bitrate_bps = 400 * 1000;
549 if (params.codec == "VP8") { 627 if (params.codec == "VP8") {
550 vp8_settings = VideoEncoder::GetDefaultVp8Settings(); 628 vp8_settings = VideoEncoder::GetDefaultVp8Settings();
551 vp8_settings.denoisingOn = false; 629 vp8_settings.denoisingOn = false;
552 vp8_settings.frameDroppingOn = false; 630 vp8_settings.frameDroppingOn = false;
553 vp8_settings.numberOfTemporalLayers = 2; 631 vp8_settings.numberOfTemporalLayers = num_temporal_layers;
554 encoder_config_.encoder_specific_settings = &vp8_settings; 632 encoder_config_.encoder_specific_settings = &vp8_settings;
555 } else if (params.codec == "VP9") { 633 } else if (params.codec == "VP9") {
556 vp9_settings = VideoEncoder::GetDefaultVp9Settings(); 634 vp9_settings = VideoEncoder::GetDefaultVp9Settings();
557 vp9_settings.denoisingOn = false; 635 vp9_settings.denoisingOn = false;
558 vp9_settings.frameDroppingOn = false; 636 vp9_settings.frameDroppingOn = false;
559 vp9_settings.numberOfTemporalLayers = 2; 637 vp9_settings.numberOfTemporalLayers = num_temporal_layers;
560 encoder_config_.encoder_specific_settings = &vp9_settings; 638 encoder_config_.encoder_specific_settings = &vp9_settings;
561 } 639 }
562 640
563 stream->temporal_layer_thresholds_bps.clear(); 641 stream->temporal_layer_thresholds_bps.clear();
564 stream->temporal_layer_thresholds_bps.push_back(stream->target_bitrate_bps); 642 if (num_temporal_layers > 1) {
643 stream->temporal_layer_thresholds_bps.push_back(
644 stream->target_bitrate_bps);
645 }
565 } 646 }
566 647
567 CreateMatchingReceiveConfigs(&recv_transport); 648 CreateMatchingReceiveConfigs(&recv_transport);
568 receive_configs_[0].renderer = &analyzer; 649 receive_configs_[0].renderer = &analyzer;
569 receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 650 receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
570 receive_configs_[0].rtp.rtx[kSendRtxPayloadType].ssrc = kSendRtxSsrcs[0]; 651 receive_configs_[0].rtp.rtx[kSendRtxPayloadType].ssrc = kSendRtxSsrcs[0];
571 receive_configs_[0].rtp.rtx[kSendRtxPayloadType].payload_type = 652 receive_configs_[0].rtp.rtx[kSendRtxPayloadType].payload_type =
572 kSendRtxPayloadType; 653 kSendRtxPayloadType;
573 654
574 for (auto& config : receive_configs_) 655 for (auto& config : receive_configs_)
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
774 50000, 855 50000,
775 200000, 856 200000,
776 2000000, 857 2000000,
777 0.0, 858 0.0,
778 0.0, 859 0.0,
779 kFullStackTestDurationSecs, 860 kFullStackTestDurationSecs,
780 "VP9"}; 861 "VP9"};
781 RunTest(screenshare_params); 862 RunTest(screenshare_params);
782 } 863 }
783 } // namespace webrtc 864 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698