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

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

Issue 280993002: [Cast] Repair receiver playout time calculations and frame skip logic. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed hubbe's comments. Created 6 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 test generate synthetic data. For audio it's a sinusoid waveform with 5 // This test generate synthetic data. For audio it's a sinusoid waveform with
6 // frequency kSoundFrequency and different amplitudes. For video it's a pattern 6 // frequency kSoundFrequency and different amplitudes. For video it's a pattern
7 // that is shifting by one pixel per frame, each pixels neighbors right and down 7 // that is shifting by one pixel per frame, each pixels neighbors right and down
8 // is this pixels value +1, since the pixel value is 8 bit it will wrap 8 // is this pixels value +1, since the pixel value is 8 bit it will wrap
9 // frequently within the image. Visually this will create diagonally color bands 9 // frequently within the image. Visually this will create diagonally color bands
10 // that moves across the screen 10 // that moves across the screen
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 static const int kVideoQcifWidth = 176; 55 static const int kVideoQcifWidth = 176;
56 static const int kVideoQcifHeight = 144; 56 static const int kVideoQcifHeight = 144;
57 57
58 // Since the video encoded and decoded an error will be introduced; when 58 // Since the video encoded and decoded an error will be introduced; when
59 // comparing individual pixels the error can be quite large; we allow a PSNR of 59 // comparing individual pixels the error can be quite large; we allow a PSNR of
60 // at least |kVideoAcceptedPSNR|. 60 // at least |kVideoAcceptedPSNR|.
61 static const double kVideoAcceptedPSNR = 38.0; 61 static const double kVideoAcceptedPSNR = 38.0;
62 62
63 // The tests are commonly implemented with |kFrameTimerMs| RunTask function; 63 // The tests are commonly implemented with |kFrameTimerMs| RunTask function;
64 // a normal video is 30 fps hence the 33 ms between frames. 64 // a normal video is 30 fps hence the 33 ms between frames.
65 //
66 // TODO(miu): The errors in timing will add up significantly. Find an
67 // alternative approaches that eliminate use of this constant.
65 static const int kFrameTimerMs = 33; 68 static const int kFrameTimerMs = 33;
66 69
67 // The packets pass through the pacer which can delay the beginning of the
68 // frame by 10 ms if there is packets belonging to the previous frame being
69 // retransmitted.
70 // In addition, audio packets are sent in 10mS intervals in audio_encoder.cc,
71 // although we send an audio frame every 33mS, which adds an extra delay.
72 // A TODO was added in the code to resolve this.
73 static const int kTimerErrorMs = 20;
74
75 // Start the video synthetic start value to medium range value, to avoid edge 70 // Start the video synthetic start value to medium range value, to avoid edge
76 // effects cause by encoding and quantization. 71 // effects cause by encoding and quantization.
77 static const int kVideoStart = 100; 72 static const int kVideoStart = 100;
78 73
79 // The size of audio frames. The encoder joins/breaks all inserted audio into 74 // The size of audio frames. The encoder joins/breaks all inserted audio into
80 // chunks of this size. 75 // chunks of this size.
81 static const int kAudioFrameDurationMs = 10; 76 static const int kAudioFrameDurationMs = 10;
82 77
78 // The amount of time between frame capture on the sender and playout on the
79 // receiver.
80 static const int kTargetPlayoutDelayMs = 100;
81
82 // The maximum amount of deviation expected in the playout times emitted by the
83 // receiver.
84 //
85 // TODO(miu): This is a "fuzzy" way to check the timestamps. We should be able
86 // to compute exact offsets with "omnipotent" knowledge of the system.
87 static const int kMaxAllowedPlayoutErrorMs = 30;
88
83 std::string ConvertFromBase16String(const std::string base_16) { 89 std::string ConvertFromBase16String(const std::string base_16) {
84 std::string compressed; 90 std::string compressed;
85 DCHECK_EQ(base_16.size() % 2, 0u) << "Must be a multiple of 2"; 91 DCHECK_EQ(base_16.size() % 2, 0u) << "Must be a multiple of 2";
86 compressed.reserve(base_16.size() / 2); 92 compressed.reserve(base_16.size() / 2);
87 93
88 std::vector<uint8> v; 94 std::vector<uint8> v;
89 if (!base::HexStringToBytes(base_16, &v)) { 95 if (!base::HexStringToBytes(base_16, &v)) {
90 NOTREACHED(); 96 NOTREACHED();
91 } 97 }
92 compressed.assign(reinterpret_cast<const char*>(&v[0]), v.size()); 98 compressed.assign(reinterpret_cast<const char*>(&v[0]), v.size());
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 scoped_refptr<CastEnvironment> cast_environment_; 243 scoped_refptr<CastEnvironment> cast_environment_;
238 scoped_ptr<test::PacketPipe> packet_pipe_; 244 scoped_ptr<test::PacketPipe> packet_pipe_;
239 }; 245 };
240 246
241 // Class that verifies the audio frames coming out of the receiver. 247 // Class that verifies the audio frames coming out of the receiver.
242 class TestReceiverAudioCallback 248 class TestReceiverAudioCallback
243 : public base::RefCountedThreadSafe<TestReceiverAudioCallback> { 249 : public base::RefCountedThreadSafe<TestReceiverAudioCallback> {
244 public: 250 public:
245 struct ExpectedAudioFrame { 251 struct ExpectedAudioFrame {
246 scoped_ptr<AudioBus> audio_bus; 252 scoped_ptr<AudioBus> audio_bus;
247 base::TimeTicks record_time; 253 base::TimeTicks playout_time;
248 }; 254 };
249 255
250 TestReceiverAudioCallback() : num_called_(0) {} 256 TestReceiverAudioCallback() : num_called_(0) {}
251 257
252 void SetExpectedSamplingFrequency(int expected_sampling_frequency) { 258 void SetExpectedSamplingFrequency(int expected_sampling_frequency) {
253 expected_sampling_frequency_ = expected_sampling_frequency; 259 expected_sampling_frequency_ = expected_sampling_frequency;
254 } 260 }
255 261
256 void AddExpectedResult(const AudioBus& audio_bus, 262 void AddExpectedResult(const AudioBus& audio_bus,
257 const base::TimeTicks& record_time) { 263 const base::TimeTicks& playout_time) {
258 scoped_ptr<ExpectedAudioFrame> expected_audio_frame( 264 scoped_ptr<ExpectedAudioFrame> expected_audio_frame(
259 new ExpectedAudioFrame()); 265 new ExpectedAudioFrame());
260 expected_audio_frame->audio_bus = 266 expected_audio_frame->audio_bus =
261 AudioBus::Create(audio_bus.channels(), audio_bus.frames()).Pass(); 267 AudioBus::Create(audio_bus.channels(), audio_bus.frames()).Pass();
262 audio_bus.CopyTo(expected_audio_frame->audio_bus.get()); 268 audio_bus.CopyTo(expected_audio_frame->audio_bus.get());
263 expected_audio_frame->record_time = record_time; 269 expected_audio_frame->playout_time = playout_time;
264 expected_frames_.push_back(expected_audio_frame.release()); 270 expected_frames_.push_back(expected_audio_frame.release());
265 } 271 }
266 272
267 void IgnoreAudioFrame(scoped_ptr<AudioBus> audio_bus, 273 void IgnoreAudioFrame(scoped_ptr<AudioBus> audio_bus,
268 const base::TimeTicks& playout_time, 274 const base::TimeTicks& playout_time,
269 bool is_continuous) { 275 bool is_continuous) {
270 ++num_called_; 276 ++num_called_;
271 } 277 }
272 278
273 void CheckAudioFrame(scoped_ptr<AudioBus> audio_bus, 279 void CheckAudioFrame(scoped_ptr<AudioBus> audio_bus,
(...skipping 11 matching lines...) Expand all
285 EXPECT_EQ(audio_bus->frames(), expected_audio_frame->audio_bus->frames()); 291 EXPECT_EQ(audio_bus->frames(), expected_audio_frame->audio_bus->frames());
286 for (int ch = 0; ch < audio_bus->channels(); ++ch) { 292 for (int ch = 0; ch < audio_bus->channels(); ++ch) {
287 EXPECT_NEAR(CountZeroCrossings( 293 EXPECT_NEAR(CountZeroCrossings(
288 expected_audio_frame->audio_bus->channel(ch), 294 expected_audio_frame->audio_bus->channel(ch),
289 expected_audio_frame->audio_bus->frames()), 295 expected_audio_frame->audio_bus->frames()),
290 CountZeroCrossings(audio_bus->channel(ch), 296 CountZeroCrossings(audio_bus->channel(ch),
291 audio_bus->frames()), 297 audio_bus->frames()),
292 1); 298 1);
293 } 299 }
294 300
295 // TODO(miu): This is a "fuzzy" way to check the timestamps. We should be 301 EXPECT_NEAR(
296 // able to compute exact offsets with "omnipotent" knowledge of the system. 302 (playout_time - expected_audio_frame->playout_time).InMillisecondsF(),
297 const base::TimeTicks upper_bound = 303 0.0,
298 expected_audio_frame->record_time + 304 kMaxAllowedPlayoutErrorMs);
299 base::TimeDelta::FromMilliseconds(kDefaultRtpMaxDelayMs +
300 kTimerErrorMs);
301 EXPECT_GE(upper_bound, playout_time)
302 << "playout_time - upper_bound == "
303 << (playout_time - upper_bound).InMicroseconds() << " usec";
304
305 EXPECT_TRUE(is_continuous); 305 EXPECT_TRUE(is_continuous);
306 } 306 }
307 307
308 void CheckCodedAudioFrame( 308 void CheckCodedAudioFrame(
309 scoped_ptr<transport::EncodedAudioFrame> audio_frame, 309 scoped_ptr<transport::EncodedAudioFrame> audio_frame,
310 const base::TimeTicks& playout_time) { 310 const base::TimeTicks& playout_time) {
311 ASSERT_TRUE(!!audio_frame); 311 ASSERT_TRUE(!!audio_frame);
312 ASSERT_FALSE(expected_frames_.empty()); 312 ASSERT_FALSE(expected_frames_.empty());
313 const ExpectedAudioFrame& expected_audio_frame = 313 const ExpectedAudioFrame& expected_audio_frame =
314 *(expected_frames_.front()); 314 *(expected_frames_.front());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 }; 350 };
351 351
352 // Class that verifies the video frames coming out of the receiver. 352 // Class that verifies the video frames coming out of the receiver.
353 class TestReceiverVideoCallback 353 class TestReceiverVideoCallback
354 : public base::RefCountedThreadSafe<TestReceiverVideoCallback> { 354 : public base::RefCountedThreadSafe<TestReceiverVideoCallback> {
355 public: 355 public:
356 struct ExpectedVideoFrame { 356 struct ExpectedVideoFrame {
357 int start_value; 357 int start_value;
358 int width; 358 int width;
359 int height; 359 int height;
360 base::TimeTicks capture_time; 360 base::TimeTicks playout_time;
361 bool should_be_continuous; 361 bool should_be_continuous;
362 }; 362 };
363 363
364 TestReceiverVideoCallback() : num_called_(0) {} 364 TestReceiverVideoCallback() : num_called_(0) {}
365 365
366 void AddExpectedResult(int start_value, 366 void AddExpectedResult(int start_value,
367 int width, 367 int width,
368 int height, 368 int height,
369 const base::TimeTicks& capture_time, 369 const base::TimeTicks& playout_time,
370 bool should_be_continuous) { 370 bool should_be_continuous) {
371 ExpectedVideoFrame expected_video_frame; 371 ExpectedVideoFrame expected_video_frame;
372 expected_video_frame.start_value = start_value; 372 expected_video_frame.start_value = start_value;
373 expected_video_frame.width = width; 373 expected_video_frame.width = width;
374 expected_video_frame.height = height; 374 expected_video_frame.height = height;
375 expected_video_frame.capture_time = capture_time; 375 expected_video_frame.playout_time = playout_time;
376 expected_video_frame.should_be_continuous = should_be_continuous; 376 expected_video_frame.should_be_continuous = should_be_continuous;
377 expected_frame_.push_back(expected_video_frame); 377 expected_frame_.push_back(expected_video_frame);
378 } 378 }
379 379
380 void CheckVideoFrame(const scoped_refptr<media::VideoFrame>& video_frame, 380 void CheckVideoFrame(const scoped_refptr<media::VideoFrame>& video_frame,
381 const base::TimeTicks& render_time, 381 const base::TimeTicks& playout_time,
382 bool is_continuous) { 382 bool is_continuous) {
383 ++num_called_; 383 ++num_called_;
384 384
385 ASSERT_TRUE(!!video_frame); 385 ASSERT_TRUE(!!video_frame);
386 ASSERT_FALSE(expected_frame_.empty()); 386 ASSERT_FALSE(expected_frame_.empty());
387 ExpectedVideoFrame expected_video_frame = expected_frame_.front(); 387 ExpectedVideoFrame expected_video_frame = expected_frame_.front();
388 expected_frame_.pop_front(); 388 expected_frame_.pop_front();
389 389
390 base::TimeDelta time_since_capture =
391 render_time - expected_video_frame.capture_time;
392 const base::TimeDelta upper_bound = base::TimeDelta::FromMilliseconds(
393 kDefaultRtpMaxDelayMs + kTimerErrorMs);
394
395 // TODO(miu): This is a "fuzzy" way to check the timestamps. We should be
396 // able to compute exact offsets with "omnipotent" knowledge of the system.
397 EXPECT_GE(upper_bound, time_since_capture)
398 << "time_since_capture - upper_bound == "
399 << (time_since_capture - upper_bound).InMicroseconds() << " usec";
400 // TODO(miu): I broke the concept of 100 ms target delay timing on the
401 // receiver side, but the logic for computing playout time really isn't any
402 // more broken than it was. This only affects the receiver, and is to be
403 // rectified in an soon-upcoming change. http://crbug.com/356942
404 // EXPECT_LE(expected_video_frame.capture_time, render_time);
405 EXPECT_EQ(expected_video_frame.width, video_frame->visible_rect().width()); 390 EXPECT_EQ(expected_video_frame.width, video_frame->visible_rect().width());
406 EXPECT_EQ(expected_video_frame.height, 391 EXPECT_EQ(expected_video_frame.height,
407 video_frame->visible_rect().height()); 392 video_frame->visible_rect().height());
408 393
409 gfx::Size size(expected_video_frame.width, expected_video_frame.height); 394 gfx::Size size(expected_video_frame.width, expected_video_frame.height);
410 scoped_refptr<media::VideoFrame> expected_I420_frame = 395 scoped_refptr<media::VideoFrame> expected_I420_frame =
411 media::VideoFrame::CreateFrame( 396 media::VideoFrame::CreateFrame(
412 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta()); 397 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta());
413 PopulateVideoFrame(expected_I420_frame, expected_video_frame.start_value); 398 PopulateVideoFrame(expected_I420_frame, expected_video_frame.start_value);
414 399
415 EXPECT_GE(I420PSNR(expected_I420_frame, video_frame), kVideoAcceptedPSNR); 400 EXPECT_GE(I420PSNR(expected_I420_frame, video_frame), kVideoAcceptedPSNR);
416 401
402 EXPECT_NEAR(
403 (playout_time - expected_video_frame.playout_time).InMillisecondsF(),
404 0.0,
405 kMaxAllowedPlayoutErrorMs);
406
417 EXPECT_EQ(expected_video_frame.should_be_continuous, is_continuous); 407 EXPECT_EQ(expected_video_frame.should_be_continuous, is_continuous);
418 } 408 }
419 409
420 int number_times_called() const { return num_called_; } 410 int number_times_called() const { return num_called_; }
421 411
422 protected: 412 protected:
423 virtual ~TestReceiverVideoCallback() {} 413 virtual ~TestReceiverVideoCallback() {}
424 414
425 private: 415 private:
426 friend class base::RefCountedThreadSafe<TestReceiverVideoCallback>; 416 friend class base::RefCountedThreadSafe<TestReceiverVideoCallback>;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 cast_environment_sender_->Logging()->AddRawEventSubscriber( 450 cast_environment_sender_->Logging()->AddRawEventSubscriber(
461 &event_subscriber_sender_); 451 &event_subscriber_sender_);
462 } 452 }
463 453
464 void Configure(transport::VideoCodec video_codec, 454 void Configure(transport::VideoCodec video_codec,
465 transport::AudioCodec audio_codec, 455 transport::AudioCodec audio_codec,
466 int audio_sampling_frequency, 456 int audio_sampling_frequency,
467 bool external_audio_decoder, 457 bool external_audio_decoder,
468 int max_number_of_video_buffers_used) { 458 int max_number_of_video_buffers_used) {
469 audio_sender_config_.rtp_config.ssrc = 1; 459 audio_sender_config_.rtp_config.ssrc = 1;
460 audio_sender_config_.rtp_config.max_delay_ms = kTargetPlayoutDelayMs;
470 audio_sender_config_.incoming_feedback_ssrc = 2; 461 audio_sender_config_.incoming_feedback_ssrc = 2;
471 audio_sender_config_.rtp_config.payload_type = 96; 462 audio_sender_config_.rtp_config.payload_type = 96;
472 audio_sender_config_.use_external_encoder = false; 463 audio_sender_config_.use_external_encoder = false;
473 audio_sender_config_.frequency = audio_sampling_frequency; 464 audio_sender_config_.frequency = audio_sampling_frequency;
474 audio_sender_config_.channels = kAudioChannels; 465 audio_sender_config_.channels = kAudioChannels;
475 audio_sender_config_.bitrate = kDefaultAudioEncoderBitrate; 466 audio_sender_config_.bitrate = kDefaultAudioEncoderBitrate;
476 audio_sender_config_.codec = audio_codec; 467 audio_sender_config_.codec = audio_codec;
477 468
478 audio_receiver_config_.feedback_ssrc = 469 audio_receiver_config_.feedback_ssrc =
479 audio_sender_config_.incoming_feedback_ssrc; 470 audio_sender_config_.incoming_feedback_ssrc;
480 audio_receiver_config_.incoming_ssrc = audio_sender_config_.rtp_config.ssrc; 471 audio_receiver_config_.incoming_ssrc = audio_sender_config_.rtp_config.ssrc;
472 audio_receiver_config_.rtp_max_delay_ms = kTargetPlayoutDelayMs;
481 audio_receiver_config_.rtp_payload_type = 473 audio_receiver_config_.rtp_payload_type =
482 audio_sender_config_.rtp_config.payload_type; 474 audio_sender_config_.rtp_config.payload_type;
483 audio_receiver_config_.use_external_decoder = external_audio_decoder; 475 audio_receiver_config_.use_external_decoder = external_audio_decoder;
484 audio_receiver_config_.frequency = audio_sender_config_.frequency; 476 audio_receiver_config_.frequency = audio_sender_config_.frequency;
485 audio_receiver_config_.channels = kAudioChannels; 477 audio_receiver_config_.channels = kAudioChannels;
486 audio_receiver_config_.codec = audio_sender_config_.codec; 478 audio_receiver_config_.codec = audio_sender_config_.codec;
487 479
488 test_receiver_audio_callback_->SetExpectedSamplingFrequency( 480 test_receiver_audio_callback_->SetExpectedSamplingFrequency(
489 audio_receiver_config_.frequency); 481 audio_receiver_config_.frequency);
490 482
491 video_sender_config_.rtp_config.ssrc = 3; 483 video_sender_config_.rtp_config.ssrc = 3;
484 video_sender_config_.rtp_config.max_delay_ms = kTargetPlayoutDelayMs;
492 video_sender_config_.incoming_feedback_ssrc = 4; 485 video_sender_config_.incoming_feedback_ssrc = 4;
493 video_sender_config_.rtp_config.payload_type = 97; 486 video_sender_config_.rtp_config.payload_type = 97;
494 video_sender_config_.use_external_encoder = false; 487 video_sender_config_.use_external_encoder = false;
495 video_sender_config_.width = kVideoHdWidth; 488 video_sender_config_.width = kVideoHdWidth;
496 video_sender_config_.height = kVideoHdHeight; 489 video_sender_config_.height = kVideoHdHeight;
497 video_sender_config_.max_bitrate = 5000000; 490 video_sender_config_.max_bitrate = 5000000;
498 video_sender_config_.min_bitrate = 1000000; 491 video_sender_config_.min_bitrate = 1000000;
499 video_sender_config_.start_bitrate = 5000000; 492 video_sender_config_.start_bitrate = 5000000;
500 video_sender_config_.max_qp = 30; 493 video_sender_config_.max_qp = 30;
501 video_sender_config_.min_qp = 4; 494 video_sender_config_.min_qp = 4;
502 video_sender_config_.max_frame_rate = 30; 495 video_sender_config_.max_frame_rate = 30;
503 video_sender_config_.max_number_of_video_buffers_used = 496 video_sender_config_.max_number_of_video_buffers_used =
504 max_number_of_video_buffers_used; 497 max_number_of_video_buffers_used;
505 video_sender_config_.codec = video_codec; 498 video_sender_config_.codec = video_codec;
506 499
507 video_receiver_config_.feedback_ssrc = 500 video_receiver_config_.feedback_ssrc =
508 video_sender_config_.incoming_feedback_ssrc; 501 video_sender_config_.incoming_feedback_ssrc;
509 video_receiver_config_.incoming_ssrc = video_sender_config_.rtp_config.ssrc; 502 video_receiver_config_.incoming_ssrc = video_sender_config_.rtp_config.ssrc;
503 video_receiver_config_.rtp_max_delay_ms = kTargetPlayoutDelayMs;
510 video_receiver_config_.rtp_payload_type = 504 video_receiver_config_.rtp_payload_type =
511 video_sender_config_.rtp_config.payload_type; 505 video_sender_config_.rtp_config.payload_type;
512 video_receiver_config_.use_external_decoder = false; 506 video_receiver_config_.use_external_decoder = false;
513 video_receiver_config_.codec = video_sender_config_.codec; 507 video_receiver_config_.codec = video_sender_config_.codec;
514 } 508 }
515 509
516 void FeedAudioFrames(int count, bool will_be_checked) { 510 void FeedAudioFrames(int count, bool will_be_checked) {
517 for (int i = 0; i < count; ++i) { 511 for (int i = 0; i < count; ++i) {
518 scoped_ptr<AudioBus> audio_bus(audio_bus_factory_->NextAudioBus( 512 scoped_ptr<AudioBus> audio_bus(audio_bus_factory_->NextAudioBus(
519 base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs))); 513 base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs)));
520 const base::TimeTicks send_time = 514 const base::TimeTicks capture_time =
521 testing_clock_sender_->NowTicks() + 515 testing_clock_sender_->NowTicks() +
522 i * base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs); 516 i * base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs);
523 if (will_be_checked) 517 if (will_be_checked) {
524 test_receiver_audio_callback_->AddExpectedResult(*audio_bus, send_time); 518 test_receiver_audio_callback_->AddExpectedResult(
525 audio_frame_input_->InsertAudio(audio_bus.Pass(), send_time); 519 *audio_bus,
520 capture_time +
521 base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs));
522 }
523 audio_frame_input_->InsertAudio(audio_bus.Pass(), capture_time);
526 } 524 }
527 } 525 }
528 526
529 void FeedAudioFramesWithExpectedDelay(int count, 527 void FeedAudioFramesWithExpectedDelay(int count,
530 const base::TimeDelta& delay) { 528 const base::TimeDelta& delay) {
531 for (int i = 0; i < count; ++i) { 529 for (int i = 0; i < count; ++i) {
532 scoped_ptr<AudioBus> audio_bus(audio_bus_factory_->NextAudioBus( 530 scoped_ptr<AudioBus> audio_bus(audio_bus_factory_->NextAudioBus(
533 base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs))); 531 base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs)));
534 const base::TimeTicks send_time = 532 const base::TimeTicks capture_time =
535 testing_clock_sender_->NowTicks() + 533 testing_clock_sender_->NowTicks() +
536 i * base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs); 534 i * base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs);
537 test_receiver_audio_callback_->AddExpectedResult(*audio_bus, 535 test_receiver_audio_callback_->AddExpectedResult(
538 send_time + delay); 536 *audio_bus,
539 audio_frame_input_->InsertAudio(audio_bus.Pass(), send_time); 537 capture_time + delay +
538 base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs));
539 audio_frame_input_->InsertAudio(audio_bus.Pass(), capture_time);
540 } 540 }
541 } 541 }
542 542
543 void RequestAudioFrames(int count, bool with_check) { 543 void RequestAudioFrames(int count, bool with_check) {
544 for (int i = 0; i < count; ++i) { 544 for (int i = 0; i < count; ++i) {
545 frame_receiver_->GetRawAudioFrame( 545 frame_receiver_->GetRawAudioFrame(
546 base::Bind(with_check ? &TestReceiverAudioCallback::CheckAudioFrame : 546 base::Bind(with_check ? &TestReceiverAudioCallback::CheckAudioFrame :
547 &TestReceiverAudioCallback::IgnoreAudioFrame, 547 &TestReceiverAudioCallback::IgnoreAudioFrame,
548 test_receiver_audio_callback_)); 548 test_receiver_audio_callback_));
549 } 549 }
550 } 550 }
551 551
552 void Create() { 552 void Create() {
553 cast_receiver_ = CastReceiver::Create(cast_environment_receiver_, 553 cast_receiver_ = CastReceiver::Create(cast_environment_receiver_,
554 audio_receiver_config_, 554 audio_receiver_config_,
555 video_receiver_config_, 555 video_receiver_config_,
556 &receiver_to_sender_); 556 &receiver_to_sender_);
557
557 net::IPEndPoint dummy_endpoint; 558 net::IPEndPoint dummy_endpoint;
558 transport_sender_.reset(new transport::CastTransportSenderImpl( 559 transport_sender_.reset(new transport::CastTransportSenderImpl(
559 NULL, 560 NULL,
560 testing_clock_sender_, 561 testing_clock_sender_,
561 dummy_endpoint, 562 dummy_endpoint,
562 base::Bind(&UpdateCastTransportStatus), 563 base::Bind(&UpdateCastTransportStatus),
563 base::Bind(&End2EndTest::LogRawEvents, base::Unretained(this)), 564 base::Bind(&End2EndTest::LogRawEvents, base::Unretained(this)),
564 base::TimeDelta::FromSeconds(1), 565 base::TimeDelta::FromSeconds(1),
565 task_runner_, 566 task_runner_,
566 &sender_to_receiver_)); 567 &sender_to_receiver_));
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 const int num_audio_frames = audio_diff / kAudioFrameDurationMs; 698 const int num_audio_frames = audio_diff / kAudioFrameDurationMs;
698 audio_diff -= num_audio_frames * kAudioFrameDurationMs; 699 audio_diff -= num_audio_frames * kAudioFrameDurationMs;
699 700
700 if (num_audio_frames > 0) 701 if (num_audio_frames > 0)
701 FeedAudioFrames(1, true); 702 FeedAudioFrames(1, true);
702 703
703 test_receiver_video_callback_->AddExpectedResult( 704 test_receiver_video_callback_->AddExpectedResult(
704 video_start, 705 video_start,
705 video_sender_config_.width, 706 video_sender_config_.width,
706 video_sender_config_.height, 707 video_sender_config_.height,
707 testing_clock_sender_->NowTicks(), 708 testing_clock_sender_->NowTicks() +
709 base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs),
708 true); 710 true);
709 SendVideoFrame(video_start, testing_clock_sender_->NowTicks()); 711 SendVideoFrame(video_start, testing_clock_sender_->NowTicks());
710 712
711 if (num_audio_frames > 0) 713 if (num_audio_frames > 0)
712 RunTasks(kAudioFrameDurationMs); // Advance clock forward. 714 RunTasks(kAudioFrameDurationMs); // Advance clock forward.
713 if (num_audio_frames > 1) 715 if (num_audio_frames > 1)
714 FeedAudioFrames(num_audio_frames - 1, true); 716 FeedAudioFrames(num_audio_frames - 1, true);
715 717
716 RequestAudioFrames(num_audio_frames, true); 718 RequestAudioFrames(num_audio_frames, true);
717 num_audio_frames_requested += num_audio_frames; 719 num_audio_frames_requested += num_audio_frames;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
802 if (num_audio_frames > 0) 804 if (num_audio_frames > 0)
803 FeedAudioFramesWithExpectedDelay(1, expected_delay); 805 FeedAudioFramesWithExpectedDelay(1, expected_delay);
804 806
805 // Frame will be rendered with 100mS delay, as the transmission is delayed. 807 // Frame will be rendered with 100mS delay, as the transmission is delayed.
806 // The receiver at this point cannot be synced to the sender's clock, as no 808 // The receiver at this point cannot be synced to the sender's clock, as no
807 // packets, and specifically no RTCP packets were sent. 809 // packets, and specifically no RTCP packets were sent.
808 test_receiver_video_callback_->AddExpectedResult( 810 test_receiver_video_callback_->AddExpectedResult(
809 video_start, 811 video_start,
810 video_sender_config_.width, 812 video_sender_config_.width,
811 video_sender_config_.height, 813 video_sender_config_.height,
812 initial_send_time + expected_delay, 814 initial_send_time + expected_delay +
815 base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs),
813 true); 816 true);
814 SendVideoFrame(video_start, testing_clock_sender_->NowTicks()); 817 SendVideoFrame(video_start, testing_clock_sender_->NowTicks());
815 818
816 if (num_audio_frames > 0) 819 if (num_audio_frames > 0)
817 RunTasks(kAudioFrameDurationMs); // Advance clock forward. 820 RunTasks(kAudioFrameDurationMs); // Advance clock forward.
818 if (num_audio_frames > 1) 821 if (num_audio_frames > 1)
819 FeedAudioFramesWithExpectedDelay(num_audio_frames - 1, expected_delay); 822 FeedAudioFramesWithExpectedDelay(num_audio_frames - 1, expected_delay);
820 823
821 RunTasks(kFrameTimerMs - kAudioFrameDurationMs); 824 RunTasks(kFrameTimerMs - kAudioFrameDurationMs);
822 audio_diff += kFrameTimerMs; 825 audio_diff += kFrameTimerMs;
823 video_start++; 826 video_start++;
824 } 827 }
825 828
826 RunTasks(test_delay_ms); 829 RunTasks(test_delay_ms);
827 sender_to_receiver_.SetSendPackets(true); 830 sender_to_receiver_.SetSendPackets(true);
828 831
829 int num_audio_frames_requested = 0; 832 int num_audio_frames_requested = 0;
830 for (int j = 0; j < 10; ++j) { 833 for (int j = 0; j < 10; ++j) {
831 const int num_audio_frames = audio_diff / kAudioFrameDurationMs; 834 const int num_audio_frames = audio_diff / kAudioFrameDurationMs;
832 audio_diff -= num_audio_frames * kAudioFrameDurationMs; 835 audio_diff -= num_audio_frames * kAudioFrameDurationMs;
833 836
834 if (num_audio_frames > 0) 837 if (num_audio_frames > 0)
835 FeedAudioFrames(1, true); 838 FeedAudioFrames(1, true);
836 839
837 test_receiver_video_callback_->AddExpectedResult( 840 test_receiver_video_callback_->AddExpectedResult(
838 video_start, 841 video_start,
839 video_sender_config_.width, 842 video_sender_config_.width,
840 video_sender_config_.height, 843 video_sender_config_.height,
841 testing_clock_sender_->NowTicks(), 844 testing_clock_sender_->NowTicks() +
845 base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs),
842 true); 846 true);
843 SendVideoFrame(video_start, testing_clock_sender_->NowTicks()); 847 SendVideoFrame(video_start, testing_clock_sender_->NowTicks());
844 848
845 if (num_audio_frames > 0) 849 if (num_audio_frames > 0)
846 RunTasks(kAudioFrameDurationMs); // Advance clock forward. 850 RunTasks(kAudioFrameDurationMs); // Advance clock forward.
847 if (num_audio_frames > 1) 851 if (num_audio_frames > 1)
848 FeedAudioFrames(num_audio_frames - 1, true); 852 FeedAudioFrames(num_audio_frames - 1, true);
849 853
850 RequestAudioFrames(num_audio_frames, true); 854 RequestAudioFrames(num_audio_frames, true);
851 num_audio_frames_requested += num_audio_frames; 855 num_audio_frames_requested += num_audio_frames;
(...skipping 15 matching lines...) Expand all
867 // This tests a network glitch lasting for 10 video frames. 871 // This tests a network glitch lasting for 10 video frames.
868 // Flaky. See crbug.com/351596. 872 // Flaky. See crbug.com/351596.
869 TEST_F(End2EndTest, DISABLED_GlitchWith3Buffers) { 873 TEST_F(End2EndTest, DISABLED_GlitchWith3Buffers) {
870 Configure(transport::kVp8, transport::kOpus, kDefaultAudioSamplingRate, 874 Configure(transport::kVp8, transport::kOpus, kDefaultAudioSamplingRate,
871 false, 3); 875 false, 3);
872 video_sender_config_.rtp_config.max_delay_ms = 67; 876 video_sender_config_.rtp_config.max_delay_ms = 67;
873 video_receiver_config_.rtp_max_delay_ms = 67; 877 video_receiver_config_.rtp_max_delay_ms = 67;
874 Create(); 878 Create();
875 879
876 int video_start = kVideoStart; 880 int video_start = kVideoStart;
877 base::TimeTicks send_time; 881 base::TimeTicks capture_time;
878 // Frames will rendered on completion until the render time stabilizes, i.e. 882 // Frames will rendered on completion until the render time stabilizes, i.e.
879 // we got enough data. 883 // we got enough data.
880 const int frames_before_glitch = 20; 884 const int frames_before_glitch = 20;
881 for (int i = 0; i < frames_before_glitch; ++i) { 885 for (int i = 0; i < frames_before_glitch; ++i) {
882 send_time = testing_clock_sender_->NowTicks(); 886 capture_time = testing_clock_sender_->NowTicks();
883 SendVideoFrame(video_start, send_time); 887 SendVideoFrame(video_start, capture_time);
884 test_receiver_video_callback_->AddExpectedResult( 888 test_receiver_video_callback_->AddExpectedResult(
885 video_start, 889 video_start,
886 video_sender_config_.width, 890 video_sender_config_.width,
887 video_sender_config_.height, 891 video_sender_config_.height,
888 send_time, 892 capture_time + base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs),
889 true); 893 true);
890 frame_receiver_->GetRawVideoFrame( 894 frame_receiver_->GetRawVideoFrame(
891 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, 895 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame,
892 test_receiver_video_callback_)); 896 test_receiver_video_callback_));
893 RunTasks(kFrameTimerMs); 897 RunTasks(kFrameTimerMs);
894 video_start++; 898 video_start++;
895 } 899 }
896 900
897 // Introduce a glitch lasting for 10 frames. 901 // Introduce a glitch lasting for 10 frames.
898 sender_to_receiver_.SetSendPackets(false); 902 sender_to_receiver_.SetSendPackets(false);
899 for (int i = 0; i < 10; ++i) { 903 for (int i = 0; i < 10; ++i) {
900 send_time = testing_clock_sender_->NowTicks(); 904 capture_time = testing_clock_sender_->NowTicks();
901 // First 3 will be sent and lost. 905 // First 3 will be sent and lost.
902 SendVideoFrame(video_start, send_time); 906 SendVideoFrame(video_start, capture_time);
903 RunTasks(kFrameTimerMs); 907 RunTasks(kFrameTimerMs);
904 video_start++; 908 video_start++;
905 } 909 }
906 sender_to_receiver_.SetSendPackets(true); 910 sender_to_receiver_.SetSendPackets(true);
907 RunTasks(100); 911 RunTasks(100);
908 send_time = testing_clock_sender_->NowTicks(); 912 capture_time = testing_clock_sender_->NowTicks();
909 913
910 // Frame 1 should be acked by now and we should have an opening to send 4. 914 // Frame 1 should be acked by now and we should have an opening to send 4.
911 SendVideoFrame(video_start, send_time); 915 SendVideoFrame(video_start, capture_time);
912 RunTasks(kFrameTimerMs); 916 RunTasks(kFrameTimerMs);
913 917
914 // Frames 1-3 are old frames by now, and therefore should be decoded, but 918 // Frames 1-3 are old frames by now, and therefore should be decoded, but
915 // not rendered. The next frame we expect to render is frame #4. 919 // not rendered. The next frame we expect to render is frame #4.
916 test_receiver_video_callback_->AddExpectedResult(video_start, 920 test_receiver_video_callback_->AddExpectedResult(
917 video_sender_config_.width, 921 video_start,
918 video_sender_config_.height, 922 video_sender_config_.width,
919 send_time, 923 video_sender_config_.height,
920 true); 924 capture_time + base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs),
925 true);
921 926
922 frame_receiver_->GetRawVideoFrame( 927 frame_receiver_->GetRawVideoFrame(
923 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, 928 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame,
924 test_receiver_video_callback_)); 929 test_receiver_video_callback_));
925 930
926 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. 931 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline.
927 EXPECT_EQ(frames_before_glitch + 1, 932 EXPECT_EQ(frames_before_glitch + 1,
928 test_receiver_video_callback_->number_times_called()); 933 test_receiver_video_callback_->number_times_called());
929 } 934 }
930 935
931 // Disabled due to flakiness and crashiness. http://crbug.com/360951 936 // Disabled due to flakiness and crashiness. http://crbug.com/360951
932 TEST_F(End2EndTest, DISABLED_DropEveryOtherFrame3Buffers) { 937 TEST_F(End2EndTest, DISABLED_DropEveryOtherFrame3Buffers) {
933 Configure(transport::kVp8, transport::kOpus, kDefaultAudioSamplingRate, false, 938 Configure(transport::kVp8, transport::kOpus, kDefaultAudioSamplingRate, false,
934 3); 939 3);
935 video_sender_config_.rtp_config.max_delay_ms = 67; 940 video_sender_config_.rtp_config.max_delay_ms = 67;
936 video_receiver_config_.rtp_max_delay_ms = 67; 941 video_receiver_config_.rtp_max_delay_ms = 67;
937 Create(); 942 Create();
938 sender_to_receiver_.DropAllPacketsBelongingToOddFrames(); 943 sender_to_receiver_.DropAllPacketsBelongingToOddFrames();
939 944
940 int video_start = kVideoStart; 945 int video_start = kVideoStart;
941 base::TimeTicks send_time; 946 base::TimeTicks capture_time;
942 947
943 int i = 0; 948 int i = 0;
944 for (; i < 20; ++i) { 949 for (; i < 20; ++i) {
945 send_time = testing_clock_sender_->NowTicks(); 950 capture_time = testing_clock_sender_->NowTicks();
946 SendVideoFrame(video_start, send_time); 951 SendVideoFrame(video_start, capture_time);
947 952
948 if (i % 2 == 0) { 953 if (i % 2 == 0) {
949 test_receiver_video_callback_->AddExpectedResult( 954 test_receiver_video_callback_->AddExpectedResult(
950 video_start, 955 video_start,
951 video_sender_config_.width, 956 video_sender_config_.width,
952 video_sender_config_.height, 957 video_sender_config_.height,
953 send_time, 958 capture_time +
959 base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs),
954 i == 0); 960 i == 0);
955 961
956 // GetRawVideoFrame will not return the frame until we are close in 962 // GetRawVideoFrame will not return the frame until we are close in
957 // time before we should render the frame. 963 // time before we should render the frame.
958 frame_receiver_->GetRawVideoFrame( 964 frame_receiver_->GetRawVideoFrame(
959 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, 965 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame,
960 test_receiver_video_callback_)); 966 test_receiver_video_callback_));
961 } 967 }
962 RunTasks(kFrameTimerMs); 968 RunTasks(kFrameTimerMs);
963 video_start++; 969 video_start++;
(...skipping 13 matching lines...) Expand all
977 983
978 video_receiver_config_.aes_iv_mask = 984 video_receiver_config_.aes_iv_mask =
979 video_sender_config_.rtp_config.aes_iv_mask; 985 video_sender_config_.rtp_config.aes_iv_mask;
980 video_receiver_config_.aes_key = 986 video_receiver_config_.aes_key =
981 video_sender_config_.rtp_config.aes_key; 987 video_sender_config_.rtp_config.aes_key;
982 988
983 Create(); 989 Create();
984 990
985 int frames_counter = 0; 991 int frames_counter = 0;
986 for (; frames_counter < 3; ++frames_counter) { 992 for (; frames_counter < 3; ++frames_counter) {
987 const base::TimeTicks send_time = testing_clock_sender_->NowTicks(); 993 const base::TimeTicks capture_time = testing_clock_sender_->NowTicks();
988 SendVideoFrame(frames_counter, send_time); 994 SendVideoFrame(frames_counter, capture_time);
989 995
990 test_receiver_video_callback_->AddExpectedResult( 996 test_receiver_video_callback_->AddExpectedResult(
991 frames_counter, 997 frames_counter,
992 video_sender_config_.width, 998 video_sender_config_.width,
993 video_sender_config_.height, 999 video_sender_config_.height,
994 send_time, 1000 capture_time + base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs),
995 true); 1001 true);
996 1002
997 RunTasks(kFrameTimerMs); 1003 RunTasks(kFrameTimerMs);
998 1004
999 frame_receiver_->GetRawVideoFrame( 1005 frame_receiver_->GetRawVideoFrame(
1000 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, 1006 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame,
1001 test_receiver_video_callback_)); 1007 test_receiver_video_callback_));
1002 } 1008 }
1003 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. 1009 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline.
1004 EXPECT_EQ(frames_counter, 1010 EXPECT_EQ(frames_counter,
(...skipping 29 matching lines...) Expand all
1034 1040
1035 // Video test without packet loss - tests the logging aspects of the end2end, 1041 // Video test without packet loss - tests the logging aspects of the end2end,
1036 // but is basically equivalent to LoopNoLossPcm16. 1042 // but is basically equivalent to LoopNoLossPcm16.
1037 TEST_F(End2EndTest, VideoLogging) { 1043 TEST_F(End2EndTest, VideoLogging) {
1038 Configure(transport::kVp8, transport::kPcm16, 32000, false, 1); 1044 Configure(transport::kVp8, transport::kPcm16, 32000, false, 1);
1039 Create(); 1045 Create();
1040 1046
1041 int video_start = kVideoStart; 1047 int video_start = kVideoStart;
1042 const int num_frames = 5; 1048 const int num_frames = 5;
1043 for (int i = 0; i < num_frames; ++i) { 1049 for (int i = 0; i < num_frames; ++i) {
1044 base::TimeTicks send_time = testing_clock_sender_->NowTicks(); 1050 base::TimeTicks capture_time = testing_clock_sender_->NowTicks();
1045 test_receiver_video_callback_->AddExpectedResult( 1051 test_receiver_video_callback_->AddExpectedResult(
1046 video_start, 1052 video_start,
1047 video_sender_config_.width, 1053 video_sender_config_.width,
1048 video_sender_config_.height, 1054 video_sender_config_.height,
1049 send_time, 1055 capture_time + base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs),
1050 true); 1056 true);
1051 1057
1052 SendVideoFrame(video_start, send_time); 1058 SendVideoFrame(video_start, capture_time);
1053 RunTasks(kFrameTimerMs); 1059 RunTasks(kFrameTimerMs);
1054 1060
1055 frame_receiver_->GetRawVideoFrame( 1061 frame_receiver_->GetRawVideoFrame(
1056 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, 1062 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame,
1057 test_receiver_video_callback_)); 1063 test_receiver_video_callback_));
1058 1064
1059 video_start++; 1065 video_start++;
1060 } 1066 }
1061 1067
1062 // Basic tests. 1068 // Basic tests.
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1252 EXPECT_EQ(1000, received_counter); 1258 EXPECT_EQ(1000, received_counter);
1253 } 1259 }
1254 1260
1255 // TODO(pwestin): Add repeatable packet loss test. 1261 // TODO(pwestin): Add repeatable packet loss test.
1256 // TODO(pwestin): Add test for misaligned send get calls. 1262 // TODO(pwestin): Add test for misaligned send get calls.
1257 // TODO(pwestin): Add more tests that does not resample. 1263 // TODO(pwestin): Add more tests that does not resample.
1258 // TODO(pwestin): Add test when we have starvation for our RunTask. 1264 // TODO(pwestin): Add test when we have starvation for our RunTask.
1259 1265
1260 } // namespace cast 1266 } // namespace cast
1261 } // namespace media 1267 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698