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 3 // found in the LICENSE file. 4 // 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 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 9 // frequently within the image. Visually this will create diagonally color bands 10 // that moves across the screen 11 12 #include <math.h> 13 #include <stdint.h> 14 15 #include <functional> 16 #include <list> 17 #include <map> 18 19 #include "base/bind.h" 20 #include "base/bind_helpers.h" 21 #include "base/strings/string_number_conversions.h" 22 #include "base/sys_byteorder.h" 23 #include "base/test/simple_test_tick_clock.h" 24 #include "base/time/tick_clock.h" 25 #include "media/base/audio_bus.h" 26 #include "media/base/video_frame.h" 27 #include "media/cast/cast_config.h" 28 #include "media/cast/cast_environment.h" 29 #include "media/cast/cast_receiver.h" 30 #include "media/cast/cast_sender.h" 31 #include "media/cast/logging/simple_event_subscriber.h" 32 #include "media/cast/net/cast_transport_config.h" 33 #include "media/cast/net/cast_transport_defines.h" 34 #include "media/cast/net/cast_transport_sender.h" 35 #include "media/cast/net/cast_transport_sender_impl.h" 36 #include "media/cast/test/fake_single_thread_task_runner.h" 37 #include "media/cast/test/skewed_single_thread_task_runner.h" 38 #include "media/cast/test/skewed_tick_clock.h" 39 #include "media/cast/test/utility/audio_utility.h" 40 #include "media/cast/test/utility/default_config.h" 41 #include "media/cast/test/utility/udp_proxy.h" 42 #include "media/cast/test/utility/video_utility.h" 43 #include "testing/gtest/include/gtest/gtest.h" 44 45 namespace media { 46 namespace cast { 47 48 namespace { 49 50 static const int64 kStartMillisecond = INT64_C(1245); 51 static const int kAudioChannels = 2; 52 static const double kSoundFrequency = 314.15926535897; // Freq of sine wave. 53 static const float kSoundVolume = 0.5f; 54 static const int kVideoHdWidth = 1280; 55 static const int kVideoHdHeight = 720; 56 static const int kVideoQcifWidth = 176; 57 static const int kVideoQcifHeight = 144; 58 59 // Since the video encoded and decoded an error will be introduced; when 60 // comparing individual pixels the error can be quite large; we allow a PSNR of 61 // at least |kVideoAcceptedPSNR|. 62 static const double kVideoAcceptedPSNR = 38.0; 63 64 // The tests are commonly implemented with |kFrameTimerMs| RunTask function; 65 // a normal video is 30 fps hence the 33 ms between frames. 66 // 67 // TODO(miu): The errors in timing will add up significantly. Find an 68 // alternative approach that eliminates use of this constant. 69 static const int kFrameTimerMs = 33; 70 71 // Start the video synthetic start value to medium range value, to avoid edge 72 // effects cause by encoding and quantization. 73 static const int kVideoStart = 100; 74 75 // The size of audio frames. The encoder joins/breaks all inserted audio into 76 // chunks of this size. 77 static const int kAudioFrameDurationMs = 10; 78 79 // The amount of time between frame capture on the sender and playout on the 80 // receiver. 81 static const int kTargetPlayoutDelayMs = 100; 82 83 // The maximum amount of deviation expected in the playout times emitted by the 84 // receiver. 85 static const int kMaxAllowedPlayoutErrorMs = 30; 86 87 std::string ConvertFromBase16String(const std::string base_16) { 88 std::string compressed; 89 DCHECK_EQ(base_16.size() % 2, 0u) << "Must be a multiple of 2"; 90 compressed.reserve(base_16.size() / 2); 91 92 std::vector<uint8> v; 93 if (!base::HexStringToBytes(base_16, &v)) { 94 NOTREACHED(); 95 } 96 compressed.assign(reinterpret_cast<const char*>(&v[0]), v.size()); 97 return compressed; 98 } 99 100 void UpdateCastTransportStatus(CastTransportStatus status) { 101 bool result = (status == TRANSPORT_AUDIO_INITIALIZED || 102 status == TRANSPORT_VIDEO_INITIALIZED); 103 EXPECT_TRUE(result); 104 } 105 106 void AudioInitializationStatus(CastInitializationStatus status) { 107 EXPECT_EQ(STATUS_AUDIO_INITIALIZED, status); 108 } 109 110 void VideoInitializationStatus(CastInitializationStatus status) { 111 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, status); 112 } 113 114 // This is wrapped in a struct because it needs to be put into a std::map. 115 typedef struct { 116 int counter[kNumOfLoggingEvents+1]; 117 } LoggingEventCounts; 118 119 // Constructs a map from each frame (RTP timestamp) to counts of each event 120 // type logged for that frame. 121 std::map<RtpTimestamp, LoggingEventCounts> GetEventCountForFrameEvents( 122 const std::vector<FrameEvent>& frame_events) { 123 std::map<RtpTimestamp, LoggingEventCounts> event_counter_for_frame; 124 for (std::vector<FrameEvent>::const_iterator it = frame_events.begin(); 125 it != frame_events.end(); 126 ++it) { 127 std::map<RtpTimestamp, LoggingEventCounts>::iterator map_it = 128 event_counter_for_frame.find(it->rtp_timestamp); 129 if (map_it == event_counter_for_frame.end()) { 130 LoggingEventCounts new_counter; 131 memset(&new_counter, 0, sizeof(new_counter)); 132 ++(new_counter.counter[it->type]); 133 event_counter_for_frame.insert( 134 std::make_pair(it->rtp_timestamp, new_counter)); 135 } else { 136 ++(map_it->second.counter[it->type]); 137 } 138 } 139 return event_counter_for_frame; 140 } 141 142 // Constructs a map from each packet (Packet ID) to counts of each event 143 // type logged for that packet. 144 std::map<uint16, LoggingEventCounts> GetEventCountForPacketEvents( 145 const std::vector<PacketEvent>& packet_events) { 146 std::map<uint16, LoggingEventCounts> event_counter_for_packet; 147 for (std::vector<PacketEvent>::const_iterator it = packet_events.begin(); 148 it != packet_events.end(); 149 ++it) { 150 std::map<uint16, LoggingEventCounts>::iterator map_it = 151 event_counter_for_packet.find(it->packet_id); 152 if (map_it == event_counter_for_packet.end()) { 153 LoggingEventCounts new_counter; 154 memset(&new_counter, 0, sizeof(new_counter)); 155 ++(new_counter.counter[it->type]); 156 event_counter_for_packet.insert( 157 std::make_pair(it->packet_id, new_counter)); 158 } else { 159 ++(map_it->second.counter[it->type]); 160 } 161 } 162 return event_counter_for_packet; 163 } 164 165 } // namespace 166 167 // Shim that turns forwards packets from a test::PacketPipe to a 168 // PacketReceiverCallback. 169 class LoopBackPacketPipe : public test::PacketPipe { 170 public: 171 LoopBackPacketPipe(const PacketReceiverCallback& packet_receiver) 172 : packet_receiver_(packet_receiver) {} 173 174 virtual ~LoopBackPacketPipe() {} 175 176 // PacketPipe implementations. 177 virtual void Send(scoped_ptr<Packet> packet) OVERRIDE { 178 packet_receiver_.Run(packet.Pass()); 179 } 180 181 private: 182 PacketReceiverCallback packet_receiver_; 183 }; 184 185 // Class that sends the packet direct from sender into the receiver with the 186 // ability to drop packets between the two. 187 class LoopBackTransport : public PacketSender { 188 public: 189 explicit LoopBackTransport(scoped_refptr<CastEnvironment> cast_environment) 190 : send_packets_(true), 191 drop_packets_belonging_to_odd_frames_(false), 192 cast_environment_(cast_environment), 193 bytes_sent_(0) {} 194 195 void SetPacketReceiver( 196 const PacketReceiverCallback& packet_receiver, 197 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 198 base::TickClock* clock) { 199 scoped_ptr<test::PacketPipe> loopback_pipe( 200 new LoopBackPacketPipe(packet_receiver)); 201 if (packet_pipe_) { 202 packet_pipe_->AppendToPipe(loopback_pipe.Pass()); 203 } else { 204 packet_pipe_ = loopback_pipe.Pass(); 205 } 206 packet_pipe_->InitOnIOThread(task_runner, clock); 207 } 208 209 virtual bool SendPacket(PacketRef packet, 210 const base::Closure& cb) OVERRIDE { 211 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 212 if (!send_packets_) 213 return true; 214 215 bytes_sent_ += packet->data.size(); 216 if (drop_packets_belonging_to_odd_frames_) { 217 uint32 frame_id = packet->data[13]; 218 if (frame_id % 2 == 1) 219 return true; 220 } 221 222 scoped_ptr<Packet> packet_copy(new Packet(packet->data)); 223 packet_pipe_->Send(packet_copy.Pass()); 224 return true; 225 } 226 227 virtual int64 GetBytesSent() OVERRIDE { 228 return bytes_sent_; 229 } 230 231 void SetSendPackets(bool send_packets) { send_packets_ = send_packets; } 232 233 void DropAllPacketsBelongingToOddFrames() { 234 drop_packets_belonging_to_odd_frames_ = true; 235 } 236 237 void SetPacketPipe(scoped_ptr<test::PacketPipe> pipe) { 238 // Append the loopback pipe to the end. 239 pipe->AppendToPipe(packet_pipe_.Pass()); 240 packet_pipe_ = pipe.Pass(); 241 } 242 243 private: 244 bool send_packets_; 245 bool drop_packets_belonging_to_odd_frames_; 246 scoped_refptr<CastEnvironment> cast_environment_; 247 scoped_ptr<test::PacketPipe> packet_pipe_; 248 int64 bytes_sent_; 249 }; 250 251 // Class that verifies the audio frames coming out of the receiver. 252 class TestReceiverAudioCallback 253 : public base::RefCountedThreadSafe<TestReceiverAudioCallback> { 254 public: 255 struct ExpectedAudioFrame { 256 scoped_ptr<AudioBus> audio_bus; 257 base::TimeTicks playout_time; 258 }; 259 260 TestReceiverAudioCallback() : num_called_(0) {} 261 262 void SetExpectedSamplingFrequency(int expected_sampling_frequency) { 263 expected_sampling_frequency_ = expected_sampling_frequency; 264 } 265 266 void AddExpectedResult(const AudioBus& audio_bus, 267 const base::TimeTicks& playout_time) { 268 scoped_ptr<ExpectedAudioFrame> expected_audio_frame( 269 new ExpectedAudioFrame()); 270 expected_audio_frame->audio_bus = 271 AudioBus::Create(audio_bus.channels(), audio_bus.frames()).Pass(); 272 audio_bus.CopyTo(expected_audio_frame->audio_bus.get()); 273 expected_audio_frame->playout_time = playout_time; 274 expected_frames_.push_back(expected_audio_frame.release()); 275 } 276 277 void IgnoreAudioFrame(scoped_ptr<AudioBus> audio_bus, 278 const base::TimeTicks& playout_time, 279 bool is_continuous) { 280 ++num_called_; 281 } 282 283 void CheckAudioFrame(scoped_ptr<AudioBus> audio_bus, 284 const base::TimeTicks& playout_time, 285 bool is_continuous) { 286 ++num_called_; 287 288 ASSERT_TRUE(!!audio_bus); 289 ASSERT_FALSE(expected_frames_.empty()); 290 const scoped_ptr<ExpectedAudioFrame> expected_audio_frame( 291 expected_frames_.front()); 292 expected_frames_.pop_front(); 293 294 EXPECT_EQ(audio_bus->channels(), kAudioChannels); 295 EXPECT_EQ(audio_bus->frames(), expected_audio_frame->audio_bus->frames()); 296 for (int ch = 0; ch < audio_bus->channels(); ++ch) { 297 EXPECT_NEAR(CountZeroCrossings( 298 expected_audio_frame->audio_bus->channel(ch), 299 expected_audio_frame->audio_bus->frames()), 300 CountZeroCrossings(audio_bus->channel(ch), 301 audio_bus->frames()), 302 1); 303 } 304 305 EXPECT_NEAR( 306 (playout_time - expected_audio_frame->playout_time).InMillisecondsF(), 307 0.0, 308 kMaxAllowedPlayoutErrorMs); 309 VLOG_IF(1, !last_playout_time_.is_null()) 310 << "Audio frame playout time delta (compared to last frame) is " 311 << (playout_time - last_playout_time_).InMicroseconds() << " usec."; 312 last_playout_time_ = playout_time; 313 314 EXPECT_TRUE(is_continuous); 315 } 316 317 void CheckCodedAudioFrame(scoped_ptr<EncodedFrame> audio_frame) { 318 ASSERT_TRUE(!!audio_frame); 319 ASSERT_FALSE(expected_frames_.empty()); 320 const ExpectedAudioFrame& expected_audio_frame = 321 *(expected_frames_.front()); 322 // Note: Just peeking here. Will delegate to CheckAudioFrame() to pop. 323 324 // We need to "decode" the encoded audio frame. The codec is simply to 325 // swizzle the bytes of each int16 from host-->network-->host order to get 326 // interleaved int16 PCM. Then, make an AudioBus out of that. 327 const int num_elements = audio_frame->data.size() / sizeof(int16); 328 ASSERT_EQ(expected_audio_frame.audio_bus->channels() * 329 expected_audio_frame.audio_bus->frames(), 330 num_elements); 331 int16* const pcm_data = 332 reinterpret_cast<int16*>(audio_frame->mutable_bytes()); 333 for (int i = 0; i < num_elements; ++i) 334 pcm_data[i] = static_cast<int16>(base::NetToHost16(pcm_data[i])); 335 scoped_ptr<AudioBus> audio_bus( 336 AudioBus::Create(expected_audio_frame.audio_bus->channels(), 337 expected_audio_frame.audio_bus->frames())); 338 audio_bus->FromInterleaved(pcm_data, audio_bus->frames(), sizeof(int16)); 339 340 // Delegate the checking from here... 341 CheckAudioFrame(audio_bus.Pass(), audio_frame->reference_time, true); 342 } 343 344 int number_times_called() const { return num_called_; } 345 346 protected: 347 virtual ~TestReceiverAudioCallback() { 348 STLDeleteElements(&expected_frames_); 349 } 350 351 private: 352 friend class base::RefCountedThreadSafe<TestReceiverAudioCallback>; 353 354 int num_called_; 355 int expected_sampling_frequency_; 356 std::list<ExpectedAudioFrame*> expected_frames_; 357 base::TimeTicks last_playout_time_; 358 }; 359 360 // Class that verifies the video frames coming out of the receiver. 361 class TestReceiverVideoCallback 362 : public base::RefCountedThreadSafe<TestReceiverVideoCallback> { 363 public: 364 struct ExpectedVideoFrame { 365 int start_value; 366 int width; 367 int height; 368 base::TimeTicks playout_time; 369 bool should_be_continuous; 370 }; 371 372 TestReceiverVideoCallback() : num_called_(0) {} 373 374 void AddExpectedResult(int start_value, 375 int width, 376 int height, 377 const base::TimeTicks& playout_time, 378 bool should_be_continuous) { 379 ExpectedVideoFrame expected_video_frame; 380 expected_video_frame.start_value = start_value; 381 expected_video_frame.width = width; 382 expected_video_frame.height = height; 383 expected_video_frame.playout_time = playout_time; 384 expected_video_frame.should_be_continuous = should_be_continuous; 385 expected_frame_.push_back(expected_video_frame); 386 } 387 388 void CheckVideoFrame(const scoped_refptr<media::VideoFrame>& video_frame, 389 const base::TimeTicks& playout_time, 390 bool is_continuous) { 391 ++num_called_; 392 393 ASSERT_TRUE(!!video_frame.get()); 394 ASSERT_FALSE(expected_frame_.empty()); 395 ExpectedVideoFrame expected_video_frame = expected_frame_.front(); 396 expected_frame_.pop_front(); 397 398 EXPECT_EQ(expected_video_frame.width, video_frame->visible_rect().width()); 399 EXPECT_EQ(expected_video_frame.height, 400 video_frame->visible_rect().height()); 401 402 gfx::Size size(expected_video_frame.width, expected_video_frame.height); 403 scoped_refptr<media::VideoFrame> expected_I420_frame = 404 media::VideoFrame::CreateFrame( 405 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta()); 406 PopulateVideoFrame(expected_I420_frame.get(), 407 expected_video_frame.start_value); 408 409 if (expected_video_frame.should_be_continuous) { 410 EXPECT_GE(I420PSNR(expected_I420_frame, video_frame), kVideoAcceptedPSNR); 411 } 412 413 EXPECT_NEAR( 414 (playout_time - expected_video_frame.playout_time).InMillisecondsF(), 415 0.0, 416 kMaxAllowedPlayoutErrorMs); 417 VLOG_IF(1, !last_playout_time_.is_null()) 418 << "Video frame playout time delta (compared to last frame) is " 419 << (playout_time - last_playout_time_).InMicroseconds() << " usec."; 420 last_playout_time_ = playout_time; 421 422 EXPECT_EQ(expected_video_frame.should_be_continuous, is_continuous); 423 } 424 425 int number_times_called() const { return num_called_; } 426 427 protected: 428 virtual ~TestReceiverVideoCallback() {} 429 430 private: 431 friend class base::RefCountedThreadSafe<TestReceiverVideoCallback>; 432 433 int num_called_; 434 std::list<ExpectedVideoFrame> expected_frame_; 435 base::TimeTicks last_playout_time_; 436 }; 437 438 // The actual test class, generate synthetic data for both audio and video and 439 // send those through the sender and receiver and analyzes the result. 440 class End2EndTest : public ::testing::Test { 441 protected: 442 End2EndTest() 443 : start_time_(), 444 task_runner_(new test::FakeSingleThreadTaskRunner(&testing_clock_)), 445 testing_clock_sender_(new test::SkewedTickClock(&testing_clock_)), 446 task_runner_sender_( 447 new test::SkewedSingleThreadTaskRunner(task_runner_)), 448 testing_clock_receiver_(new test::SkewedTickClock(&testing_clock_)), 449 task_runner_receiver_( 450 new test::SkewedSingleThreadTaskRunner(task_runner_)), 451 cast_environment_sender_(new CastEnvironment( 452 scoped_ptr<base::TickClock>(testing_clock_sender_).Pass(), 453 task_runner_sender_, 454 task_runner_sender_, 455 task_runner_sender_)), 456 cast_environment_receiver_(new CastEnvironment( 457 scoped_ptr<base::TickClock>(testing_clock_receiver_).Pass(), 458 task_runner_receiver_, 459 task_runner_receiver_, 460 task_runner_receiver_)), 461 receiver_to_sender_(cast_environment_receiver_), 462 sender_to_receiver_(cast_environment_sender_), 463 test_receiver_audio_callback_(new TestReceiverAudioCallback()), 464 test_receiver_video_callback_(new TestReceiverVideoCallback()) { 465 testing_clock_.Advance( 466 base::TimeDelta::FromMilliseconds(kStartMillisecond)); 467 cast_environment_sender_->Logging()->AddRawEventSubscriber( 468 &event_subscriber_sender_); 469 } 470 471 void Configure(Codec video_codec, 472 Codec audio_codec, 473 int audio_sampling_frequency, 474 int max_number_of_video_buffers_used) { 475 audio_sender_config_.ssrc = 1; 476 audio_sender_config_.incoming_feedback_ssrc = 2; 477 audio_sender_config_.max_playout_delay = 478 base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs); 479 audio_sender_config_.rtp_payload_type = 96; 480 audio_sender_config_.use_external_encoder = false; 481 audio_sender_config_.frequency = audio_sampling_frequency; 482 audio_sender_config_.channels = kAudioChannels; 483 audio_sender_config_.bitrate = kDefaultAudioEncoderBitrate; 484 audio_sender_config_.codec = audio_codec; 485 486 audio_receiver_config_.feedback_ssrc = 487 audio_sender_config_.incoming_feedback_ssrc; 488 audio_receiver_config_.incoming_ssrc = audio_sender_config_.ssrc; 489 audio_receiver_config_.rtp_max_delay_ms = kTargetPlayoutDelayMs; 490 audio_receiver_config_.rtp_payload_type = 491 audio_sender_config_.rtp_payload_type; 492 audio_receiver_config_.frequency = audio_sender_config_.frequency; 493 audio_receiver_config_.channels = kAudioChannels; 494 audio_receiver_config_.max_frame_rate = 100; 495 audio_receiver_config_.codec = audio_sender_config_.codec; 496 497 test_receiver_audio_callback_->SetExpectedSamplingFrequency( 498 audio_receiver_config_.frequency); 499 500 video_sender_config_.ssrc = 3; 501 video_sender_config_.incoming_feedback_ssrc = 4; 502 video_sender_config_.max_playout_delay = 503 base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs); 504 video_sender_config_.rtp_payload_type = 97; 505 video_sender_config_.use_external_encoder = false; 506 video_sender_config_.width = kVideoHdWidth; 507 video_sender_config_.height = kVideoHdHeight; 508 video_sender_config_.max_bitrate = 50000; 509 video_sender_config_.min_bitrate = 10000; 510 video_sender_config_.start_bitrate = 10000; 511 video_sender_config_.max_qp = 30; 512 video_sender_config_.min_qp = 4; 513 video_sender_config_.max_frame_rate = 30; 514 video_sender_config_.max_number_of_video_buffers_used = 515 max_number_of_video_buffers_used; 516 video_sender_config_.codec = video_codec; 517 518 video_receiver_config_.feedback_ssrc = 519 video_sender_config_.incoming_feedback_ssrc; 520 video_receiver_config_.incoming_ssrc = video_sender_config_.ssrc; 521 video_receiver_config_.rtp_max_delay_ms = kTargetPlayoutDelayMs; 522 video_receiver_config_.rtp_payload_type = 523 video_sender_config_.rtp_payload_type; 524 video_receiver_config_.frequency = kVideoFrequency; 525 video_receiver_config_.channels = 1; 526 video_receiver_config_.max_frame_rate = video_sender_config_.max_frame_rate; 527 video_receiver_config_.codec = video_sender_config_.codec; 528 } 529 530 void SetReceiverSkew(double skew, base::TimeDelta offset) { 531 testing_clock_receiver_->SetSkew(skew, offset); 532 task_runner_receiver_->SetSkew(1.0 / skew); 533 } 534 535 // Specify the minimum/maximum difference in playout times between two 536 // consecutive frames. Also, specify the maximum absolute rate of change over 537 // each three consecutive frames. 538 void SetExpectedVideoPlayoutSmoothness(base::TimeDelta min_delta, 539 base::TimeDelta max_delta, 540 base::TimeDelta max_curvature) { 541 min_video_playout_delta_ = min_delta; 542 max_video_playout_delta_ = max_delta; 543 max_video_playout_curvature_ = max_curvature; 544 } 545 546 void FeedAudioFrames(int count, bool will_be_checked) { 547 for (int i = 0; i < count; ++i) { 548 scoped_ptr<AudioBus> audio_bus(audio_bus_factory_->NextAudioBus( 549 base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs))); 550 const base::TimeTicks capture_time = 551 testing_clock_sender_->NowTicks() + 552 i * base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs); 553 if (will_be_checked) { 554 test_receiver_audio_callback_->AddExpectedResult( 555 *audio_bus, 556 capture_time + 557 base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs)); 558 } 559 audio_frame_input_->InsertAudio(audio_bus.Pass(), capture_time); 560 } 561 } 562 563 void FeedAudioFramesWithExpectedDelay(int count, 564 const base::TimeDelta& delay) { 565 for (int i = 0; i < count; ++i) { 566 scoped_ptr<AudioBus> audio_bus(audio_bus_factory_->NextAudioBus( 567 base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs))); 568 const base::TimeTicks capture_time = 569 testing_clock_sender_->NowTicks() + 570 i * base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs); 571 test_receiver_audio_callback_->AddExpectedResult( 572 *audio_bus, 573 capture_time + delay + 574 base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs)); 575 audio_frame_input_->InsertAudio(audio_bus.Pass(), capture_time); 576 } 577 } 578 579 void RequestAudioFrames(int count, bool with_check) { 580 for (int i = 0; i < count; ++i) { 581 cast_receiver_->RequestDecodedAudioFrame( 582 base::Bind(with_check ? &TestReceiverAudioCallback::CheckAudioFrame : 583 &TestReceiverAudioCallback::IgnoreAudioFrame, 584 test_receiver_audio_callback_)); 585 } 586 } 587 588 void Create() { 589 cast_receiver_ = CastReceiver::Create(cast_environment_receiver_, 590 audio_receiver_config_, 591 video_receiver_config_, 592 &receiver_to_sender_); 593 594 net::IPEndPoint dummy_endpoint; 595 transport_sender_.reset(new CastTransportSenderImpl( 596 NULL, 597 testing_clock_sender_, 598 dummy_endpoint, 599 make_scoped_ptr(new base::DictionaryValue), 600 base::Bind(&UpdateCastTransportStatus), 601 base::Bind(&End2EndTest::LogRawEvents, base::Unretained(this)), 602 base::TimeDelta::FromMilliseconds(1), 603 task_runner_sender_, 604 &sender_to_receiver_)); 605 606 cast_sender_ = 607 CastSender::Create(cast_environment_sender_, transport_sender_.get()); 608 609 // Initializing audio and video senders. 610 cast_sender_->InitializeAudio(audio_sender_config_, 611 base::Bind(&AudioInitializationStatus)); 612 cast_sender_->InitializeVideo(video_sender_config_, 613 base::Bind(&VideoInitializationStatus), 614 CreateDefaultVideoEncodeAcceleratorCallback(), 615 CreateDefaultVideoEncodeMemoryCallback()); 616 task_runner_->RunTasks(); 617 618 receiver_to_sender_.SetPacketReceiver( 619 transport_sender_->PacketReceiverForTesting(), 620 task_runner_, 621 &testing_clock_); 622 sender_to_receiver_.SetPacketReceiver(cast_receiver_->packet_receiver(), 623 task_runner_, 624 &testing_clock_); 625 626 audio_frame_input_ = cast_sender_->audio_frame_input(); 627 video_frame_input_ = cast_sender_->video_frame_input(); 628 629 audio_bus_factory_.reset( 630 new TestAudioBusFactory(audio_sender_config_.channels, 631 audio_sender_config_.frequency, 632 kSoundFrequency, 633 kSoundVolume)); 634 } 635 636 virtual ~End2EndTest() { 637 cast_environment_sender_->Logging()->RemoveRawEventSubscriber( 638 &event_subscriber_sender_); 639 } 640 641 virtual void TearDown() OVERRIDE { 642 cast_sender_.reset(); 643 cast_receiver_.reset(); 644 task_runner_->RunTasks(); 645 } 646 647 void SendVideoFrame(int start_value, const base::TimeTicks& capture_time) { 648 if (start_time_.is_null()) 649 start_time_ = capture_time; 650 base::TimeDelta time_diff = capture_time - start_time_; 651 gfx::Size size(video_sender_config_.width, video_sender_config_.height); 652 EXPECT_TRUE(VideoFrame::IsValidConfig( 653 VideoFrame::I420, size, gfx::Rect(size), size)); 654 scoped_refptr<media::VideoFrame> video_frame = 655 media::VideoFrame::CreateFrame( 656 VideoFrame::I420, size, gfx::Rect(size), size, time_diff); 657 PopulateVideoFrame(video_frame.get(), start_value); 658 video_frame_input_->InsertRawVideoFrame(video_frame, capture_time); 659 } 660 661 void SendFakeVideoFrame(const base::TimeTicks& capture_time) { 662 video_frame_input_->InsertRawVideoFrame( 663 media::VideoFrame::CreateBlackFrame(gfx::Size(2, 2)), capture_time); 664 } 665 666 void RunTasks(int ms) { 667 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(ms)); 668 } 669 670 void BasicPlayerGotVideoFrame( 671 const scoped_refptr<media::VideoFrame>& video_frame, 672 const base::TimeTicks& playout_time, bool continuous) { 673 // The following tests that the sender and receiver clocks can be 674 // out-of-sync, drift, and jitter with respect to one another; and depsite 675 // this, the receiver will produce smoothly-progressing playout times. 676 // Both first-order and second-order effects are tested. 677 if (!last_video_playout_time_.is_null() && 678 min_video_playout_delta_ > base::TimeDelta()) { 679 const base::TimeDelta delta = playout_time - last_video_playout_time_; 680 VLOG(1) << "Video frame playout time delta (compared to last frame) is " 681 << delta.InMicroseconds() << " usec."; 682 EXPECT_LE(min_video_playout_delta_.InMicroseconds(), 683 delta.InMicroseconds()); 684 EXPECT_GE(max_video_playout_delta_.InMicroseconds(), 685 delta.InMicroseconds()); 686 if (last_video_playout_delta_ > base::TimeDelta()) { 687 base::TimeDelta abs_curvature = delta - last_video_playout_delta_; 688 if (abs_curvature < base::TimeDelta()) 689 abs_curvature = -abs_curvature; 690 EXPECT_GE(max_video_playout_curvature_.InMicroseconds(), 691 abs_curvature.InMicroseconds()); 692 } 693 last_video_playout_delta_ = delta; 694 } 695 last_video_playout_time_ = playout_time; 696 697 video_ticks_.push_back(std::make_pair( 698 testing_clock_receiver_->NowTicks(), 699 playout_time)); 700 cast_receiver_->RequestDecodedVideoFrame( 701 base::Bind(&End2EndTest::BasicPlayerGotVideoFrame, 702 base::Unretained(this))); 703 } 704 705 void BasicPlayerGotAudioFrame(scoped_ptr<AudioBus> audio_bus, 706 const base::TimeTicks& playout_time, 707 bool is_continuous) { 708 VLOG_IF(1, !last_audio_playout_time_.is_null()) 709 << "Audio frame playout time delta (compared to last frame) is " 710 << (playout_time - last_audio_playout_time_).InMicroseconds() 711 << " usec."; 712 last_audio_playout_time_ = playout_time; 713 714 audio_ticks_.push_back(std::make_pair( 715 testing_clock_receiver_->NowTicks(), 716 playout_time)); 717 cast_receiver_->RequestDecodedAudioFrame( 718 base::Bind(&End2EndTest::BasicPlayerGotAudioFrame, 719 base::Unretained(this))); 720 } 721 722 void StartBasicPlayer() { 723 cast_receiver_->RequestDecodedVideoFrame( 724 base::Bind(&End2EndTest::BasicPlayerGotVideoFrame, 725 base::Unretained(this))); 726 cast_receiver_->RequestDecodedAudioFrame( 727 base::Bind(&End2EndTest::BasicPlayerGotAudioFrame, 728 base::Unretained(this))); 729 } 730 731 void LogRawEvents(const std::vector<PacketEvent>& packet_events, 732 const std::vector<FrameEvent>& frame_events) { 733 for (std::vector<media::cast::PacketEvent>::const_iterator it = 734 packet_events.begin(); 735 it != packet_events.end(); 736 ++it) { 737 cast_environment_sender_->Logging()->InsertPacketEvent(it->timestamp, 738 it->type, 739 it->media_type, 740 it->rtp_timestamp, 741 it->frame_id, 742 it->packet_id, 743 it->max_packet_id, 744 it->size); 745 } 746 for (std::vector<media::cast::FrameEvent>::const_iterator it = 747 frame_events.begin(); 748 it != frame_events.end(); 749 ++it) { 750 cast_environment_sender_->Logging()->InsertFrameEvent(it->timestamp, 751 it->type, 752 it->media_type, 753 it->rtp_timestamp, 754 it->frame_id); 755 } 756 } 757 758 FrameReceiverConfig audio_receiver_config_; 759 FrameReceiverConfig video_receiver_config_; 760 AudioSenderConfig audio_sender_config_; 761 VideoSenderConfig video_sender_config_; 762 763 base::TimeTicks start_time_; 764 765 // These run in "test time" 766 base::SimpleTestTickClock testing_clock_; 767 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; 768 769 // These run on the sender timeline. 770 test::SkewedTickClock* testing_clock_sender_; 771 scoped_refptr<test::SkewedSingleThreadTaskRunner> task_runner_sender_; 772 773 // These run on the receiver timeline. 774 test::SkewedTickClock* testing_clock_receiver_; 775 scoped_refptr<test::SkewedSingleThreadTaskRunner> task_runner_receiver_; 776 base::TimeDelta min_video_playout_delta_; 777 base::TimeDelta max_video_playout_delta_; 778 base::TimeDelta max_video_playout_curvature_; 779 base::TimeTicks last_video_playout_time_; 780 base::TimeDelta last_video_playout_delta_; 781 base::TimeTicks last_audio_playout_time_; 782 783 scoped_refptr<CastEnvironment> cast_environment_sender_; 784 scoped_refptr<CastEnvironment> cast_environment_receiver_; 785 786 LoopBackTransport receiver_to_sender_; 787 LoopBackTransport sender_to_receiver_; 788 scoped_ptr<CastTransportSenderImpl> transport_sender_; 789 790 scoped_ptr<CastReceiver> cast_receiver_; 791 scoped_ptr<CastSender> cast_sender_; 792 scoped_refptr<AudioFrameInput> audio_frame_input_; 793 scoped_refptr<VideoFrameInput> video_frame_input_; 794 795 scoped_refptr<TestReceiverAudioCallback> test_receiver_audio_callback_; 796 scoped_refptr<TestReceiverVideoCallback> test_receiver_video_callback_; 797 798 scoped_ptr<TestAudioBusFactory> audio_bus_factory_; 799 800 SimpleEventSubscriber event_subscriber_sender_; 801 std::vector<FrameEvent> frame_events_; 802 std::vector<PacketEvent> packet_events_; 803 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > audio_ticks_; 804 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > video_ticks_; 805 // |transport_sender_| has a RepeatingTimer which needs a MessageLoop. 806 base::MessageLoop message_loop_; 807 }; 808 809 TEST_F(End2EndTest, LoopNoLossPcm16) { 810 Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_PCM16, 32000, 1); 811 // Reduce video resolution to allow processing multiple frames within a 812 // reasonable time frame. 813 video_sender_config_.width = kVideoQcifWidth; 814 video_sender_config_.height = kVideoQcifHeight; 815 Create(); 816 817 const int kNumIterations = 50; 818 int video_start = kVideoStart; 819 int audio_diff = kFrameTimerMs; 820 int num_audio_frames_requested = 0; 821 for (int i = 0; i < kNumIterations; ++i) { 822 const int num_audio_frames = audio_diff / kAudioFrameDurationMs; 823 audio_diff -= num_audio_frames * kAudioFrameDurationMs; 824 825 if (num_audio_frames > 0) 826 FeedAudioFrames(1, true); 827 828 test_receiver_video_callback_->AddExpectedResult( 829 video_start, 830 video_sender_config_.width, 831 video_sender_config_.height, 832 testing_clock_sender_->NowTicks() + 833 base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs), 834 true); 835 SendVideoFrame(video_start, testing_clock_sender_->NowTicks()); 836 837 if (num_audio_frames > 0) 838 RunTasks(kAudioFrameDurationMs); // Advance clock forward. 839 if (num_audio_frames > 1) 840 FeedAudioFrames(num_audio_frames - 1, true); 841 842 RequestAudioFrames(num_audio_frames, true); 843 num_audio_frames_requested += num_audio_frames; 844 845 cast_receiver_->RequestDecodedVideoFrame( 846 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, 847 test_receiver_video_callback_)); 848 849 RunTasks(kFrameTimerMs - kAudioFrameDurationMs); 850 audio_diff += kFrameTimerMs; 851 video_start++; 852 } 853 854 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. 855 EXPECT_EQ(num_audio_frames_requested, 856 test_receiver_audio_callback_->number_times_called()); 857 EXPECT_EQ(kNumIterations, 858 test_receiver_video_callback_->number_times_called()); 859 } 860 861 // This tests our external decoder interface for Audio. 862 // Audio test without packet loss using raw PCM 16 audio "codec"; 863 TEST_F(End2EndTest, LoopNoLossPcm16ExternalDecoder) { 864 Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_PCM16, 32000, 1); 865 Create(); 866 867 const int kNumIterations = 10; 868 for (int i = 0; i < kNumIterations; ++i) { 869 FeedAudioFrames(1, true); 870 RunTasks(kAudioFrameDurationMs); 871 cast_receiver_->RequestEncodedAudioFrame( 872 base::Bind(&TestReceiverAudioCallback::CheckCodedAudioFrame, 873 test_receiver_audio_callback_)); 874 } 875 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. 876 EXPECT_EQ(kNumIterations, 877 test_receiver_audio_callback_->number_times_called()); 878 } 879 880 // This tests our Opus audio codec without video. 881 TEST_F(End2EndTest, LoopNoLossOpus) { 882 Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_OPUS, 883 kDefaultAudioSamplingRate, 1); 884 Create(); 885 886 const int kNumIterations = 300; 887 for (int i = 0; i < kNumIterations; ++i) { 888 // Opus introduces a tiny delay before the sinewave starts; so don't examine 889 // the first frame. 890 const bool examine_audio_data = i > 0; 891 FeedAudioFrames(1, examine_audio_data); 892 RunTasks(kAudioFrameDurationMs); 893 RequestAudioFrames(1, examine_audio_data); 894 } 895 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. 896 EXPECT_EQ(kNumIterations, 897 test_receiver_audio_callback_->number_times_called()); 898 } 899 900 // This tests start sending audio and video at start-up time before the receiver 901 // is ready; it sends 2 frames before the receiver comes online. 902 // 903 // Test disabled due to flakiness: It appears that the RTCP synchronization 904 // sometimes kicks in, and sometimes doesn't. When it does, there's a sharp 905 // discontinuity in the timeline, throwing off the test expectations. See TODOs 906 // in audio_receiver.cc for likely cause(s) of this bug. 907 // http://crbug.com/356942 908 TEST_F(End2EndTest, DISABLED_StartSenderBeforeReceiver) { 909 Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_PCM16, 910 kDefaultAudioSamplingRate, 1); 911 Create(); 912 913 int video_start = kVideoStart; 914 int audio_diff = kFrameTimerMs; 915 916 sender_to_receiver_.SetSendPackets(false); 917 918 const int test_delay_ms = 100; 919 920 const int kNumVideoFramesBeforeReceiverStarted = 2; 921 const base::TimeTicks initial_send_time = testing_clock_sender_->NowTicks(); 922 const base::TimeDelta expected_delay = 923 base::TimeDelta::FromMilliseconds(test_delay_ms + kFrameTimerMs); 924 for (int i = 0; i < kNumVideoFramesBeforeReceiverStarted; ++i) { 925 const int num_audio_frames = audio_diff / kAudioFrameDurationMs; 926 audio_diff -= num_audio_frames * kAudioFrameDurationMs; 927 928 if (num_audio_frames > 0) 929 FeedAudioFramesWithExpectedDelay(1, expected_delay); 930 931 // Frame will be rendered with 100mS delay, as the transmission is delayed. 932 // The receiver at this point cannot be synced to the sender's clock, as no 933 // packets, and specifically no RTCP packets were sent. 934 test_receiver_video_callback_->AddExpectedResult( 935 video_start, 936 video_sender_config_.width, 937 video_sender_config_.height, 938 initial_send_time + expected_delay + 939 base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs), 940 true); 941 SendVideoFrame(video_start, testing_clock_sender_->NowTicks()); 942 943 if (num_audio_frames > 0) 944 RunTasks(kAudioFrameDurationMs); // Advance clock forward. 945 if (num_audio_frames > 1) 946 FeedAudioFramesWithExpectedDelay(num_audio_frames - 1, expected_delay); 947 948 RunTasks(kFrameTimerMs - kAudioFrameDurationMs); 949 audio_diff += kFrameTimerMs; 950 video_start++; 951 } 952 953 RunTasks(test_delay_ms); 954 sender_to_receiver_.SetSendPackets(true); 955 956 int num_audio_frames_requested = 0; 957 for (int j = 0; j < 10; ++j) { 958 const int num_audio_frames = audio_diff / kAudioFrameDurationMs; 959 audio_diff -= num_audio_frames * kAudioFrameDurationMs; 960 961 if (num_audio_frames > 0) 962 FeedAudioFrames(1, true); 963 964 test_receiver_video_callback_->AddExpectedResult( 965 video_start, 966 video_sender_config_.width, 967 video_sender_config_.height, 968 testing_clock_sender_->NowTicks() + 969 base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs), 970 true); 971 SendVideoFrame(video_start, testing_clock_sender_->NowTicks()); 972 973 if (num_audio_frames > 0) 974 RunTasks(kAudioFrameDurationMs); // Advance clock forward. 975 if (num_audio_frames > 1) 976 FeedAudioFrames(num_audio_frames - 1, true); 977 978 RequestAudioFrames(num_audio_frames, true); 979 num_audio_frames_requested += num_audio_frames; 980 981 cast_receiver_->RequestDecodedVideoFrame( 982 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, 983 test_receiver_video_callback_)); 984 985 RunTasks(kFrameTimerMs - kAudioFrameDurationMs); 986 audio_diff += kFrameTimerMs; 987 video_start++; 988 } 989 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. 990 EXPECT_EQ(num_audio_frames_requested, 991 test_receiver_audio_callback_->number_times_called()); 992 EXPECT_EQ(10, test_receiver_video_callback_->number_times_called()); 993 } 994 995 TEST_F(End2EndTest, DropEveryOtherFrame3Buffers) { 996 Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_OPUS, kDefaultAudioSamplingRate, 3); 997 int target_delay = 300; 998 video_sender_config_.max_playout_delay = 999 base::TimeDelta::FromMilliseconds(target_delay); 1000 audio_sender_config_.max_playout_delay = 1001 base::TimeDelta::FromMilliseconds(target_delay); 1002 video_receiver_config_.rtp_max_delay_ms = target_delay; 1003 Create(); 1004 sender_to_receiver_.DropAllPacketsBelongingToOddFrames(); 1005 1006 int video_start = kVideoStart; 1007 base::TimeTicks capture_time; 1008 1009 int i = 0; 1010 for (; i < 20; ++i) { 1011 capture_time = testing_clock_sender_->NowTicks(); 1012 SendVideoFrame(video_start, capture_time); 1013 1014 if (i % 2 == 0) { 1015 test_receiver_video_callback_->AddExpectedResult( 1016 video_start, 1017 video_sender_config_.width, 1018 video_sender_config_.height, 1019 capture_time + 1020 base::TimeDelta::FromMilliseconds(target_delay), 1021 i == 0); 1022 1023 // GetRawVideoFrame will not return the frame until we are close in 1024 // time before we should render the frame. 1025 cast_receiver_->RequestDecodedVideoFrame( 1026 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, 1027 test_receiver_video_callback_)); 1028 } 1029 RunTasks(kFrameTimerMs); 1030 video_start++; 1031 } 1032 1033 RunTasks(2 * kFrameTimerMs + target_delay); // Empty the pipeline. 1034 EXPECT_EQ(i / 2, test_receiver_video_callback_->number_times_called()); 1035 } 1036 1037 TEST_F(End2EndTest, CryptoVideo) { 1038 Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_PCM16, 32000, 1); 1039 1040 video_sender_config_.aes_iv_mask = 1041 ConvertFromBase16String("1234567890abcdeffedcba0987654321"); 1042 video_sender_config_.aes_key = 1043 ConvertFromBase16String("deadbeefcafeb0b0b0b0cafedeadbeef"); 1044 1045 video_receiver_config_.aes_iv_mask = 1046 video_sender_config_.aes_iv_mask; 1047 video_receiver_config_.aes_key = 1048 video_sender_config_.aes_key; 1049 1050 Create(); 1051 1052 int frames_counter = 0; 1053 for (; frames_counter < 3; ++frames_counter) { 1054 const base::TimeTicks capture_time = testing_clock_sender_->NowTicks(); 1055 SendVideoFrame(frames_counter, capture_time); 1056 1057 test_receiver_video_callback_->AddExpectedResult( 1058 frames_counter, 1059 video_sender_config_.width, 1060 video_sender_config_.height, 1061 capture_time + base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs), 1062 true); 1063 1064 RunTasks(kFrameTimerMs); 1065 1066 cast_receiver_->RequestDecodedVideoFrame( 1067 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, 1068 test_receiver_video_callback_)); 1069 } 1070 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. 1071 EXPECT_EQ(frames_counter, 1072 test_receiver_video_callback_->number_times_called()); 1073 } 1074 1075 TEST_F(End2EndTest, CryptoAudio) { 1076 Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_PCM16, 32000, 1); 1077 1078 audio_sender_config_.aes_iv_mask = 1079 ConvertFromBase16String("abcdeffedcba12345678900987654321"); 1080 audio_sender_config_.aes_key = 1081 ConvertFromBase16String("deadbeefcafecafedeadbeefb0b0b0b0"); 1082 1083 audio_receiver_config_.aes_iv_mask = 1084 audio_sender_config_.aes_iv_mask; 1085 audio_receiver_config_.aes_key = 1086 audio_sender_config_.aes_key; 1087 1088 Create(); 1089 1090 const int kNumIterations = 3; 1091 const int kNumAudioFramesPerIteration = 2; 1092 for (int i = 0; i < kNumIterations; ++i) { 1093 FeedAudioFrames(kNumAudioFramesPerIteration, true); 1094 RunTasks(kNumAudioFramesPerIteration * kAudioFrameDurationMs); 1095 RequestAudioFrames(kNumAudioFramesPerIteration, true); 1096 } 1097 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. 1098 EXPECT_EQ(kNumIterations * kNumAudioFramesPerIteration, 1099 test_receiver_audio_callback_->number_times_called()); 1100 } 1101 1102 // Video test without packet loss - tests the logging aspects of the end2end, 1103 // but is basically equivalent to LoopNoLossPcm16. 1104 TEST_F(End2EndTest, VideoLogging) { 1105 Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_PCM16, 32000, 1); 1106 Create(); 1107 1108 int video_start = kVideoStart; 1109 const int num_frames = 5; 1110 for (int i = 0; i < num_frames; ++i) { 1111 base::TimeTicks capture_time = testing_clock_sender_->NowTicks(); 1112 test_receiver_video_callback_->AddExpectedResult( 1113 video_start, 1114 video_sender_config_.width, 1115 video_sender_config_.height, 1116 capture_time + base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs), 1117 true); 1118 1119 SendVideoFrame(video_start, capture_time); 1120 RunTasks(kFrameTimerMs); 1121 1122 cast_receiver_->RequestDecodedVideoFrame( 1123 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, 1124 test_receiver_video_callback_)); 1125 1126 video_start++; 1127 } 1128 1129 // Basic tests. 1130 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. 1131 int num_callbacks_called = 1132 test_receiver_video_callback_->number_times_called(); 1133 EXPECT_EQ(num_frames, num_callbacks_called); 1134 1135 RunTasks(750); // Make sure that we send a RTCP message with the log. 1136 1137 // Logging tests. 1138 // Frame logging. 1139 // Verify that all frames and all required events were logged. 1140 event_subscriber_sender_.GetFrameEventsAndReset(&frame_events_); 1141 1142 // For each frame, count the number of events that occurred for each event 1143 // for that frame. 1144 std::map<RtpTimestamp, LoggingEventCounts> event_counter_for_frame = 1145 GetEventCountForFrameEvents(frame_events_); 1146 1147 // Verify that there are logs for expected number of frames. 1148 EXPECT_EQ(num_frames, static_cast<int>(event_counter_for_frame.size())); 1149 1150 // Verify that each frame have the expected types of events logged. 1151 for (std::map<RtpTimestamp, LoggingEventCounts>::iterator map_it = 1152 event_counter_for_frame.begin(); 1153 map_it != event_counter_for_frame.end(); 1154 ++map_it) { 1155 int total_event_count_for_frame = 0; 1156 for (int i = 0; i <= kNumOfLoggingEvents; ++i) { 1157 total_event_count_for_frame += map_it->second.counter[i]; 1158 } 1159 1160 int expected_event_count_for_frame = 0; 1161 1162 EXPECT_EQ(1, map_it->second.counter[FRAME_CAPTURE_BEGIN]); 1163 expected_event_count_for_frame += 1164 map_it->second.counter[FRAME_CAPTURE_BEGIN]; 1165 1166 EXPECT_EQ(1, map_it->second.counter[FRAME_CAPTURE_END]); 1167 expected_event_count_for_frame += 1168 map_it->second.counter[FRAME_CAPTURE_END]; 1169 1170 EXPECT_EQ(1, map_it->second.counter[FRAME_ENCODED]); 1171 expected_event_count_for_frame += 1172 map_it->second.counter[FRAME_ENCODED]; 1173 1174 EXPECT_EQ(1, map_it->second.counter[FRAME_DECODED]); 1175 expected_event_count_for_frame += 1176 map_it->second.counter[FRAME_DECODED]; 1177 1178 EXPECT_EQ(1, map_it->second.counter[FRAME_PLAYOUT]); 1179 expected_event_count_for_frame += map_it->second.counter[FRAME_PLAYOUT]; 1180 1181 1182 // There is no guarantee that FRAME_ACK_SENT is loggeed exactly once per 1183 // frame. 1184 EXPECT_GT(map_it->second.counter[FRAME_ACK_SENT], 0); 1185 expected_event_count_for_frame += map_it->second.counter[FRAME_ACK_SENT]; 1186 1187 // There is no guarantee that FRAME_ACK_RECEIVED is loggeed exactly once per 1188 // frame. 1189 EXPECT_GT(map_it->second.counter[FRAME_ACK_RECEIVED], 0); 1190 expected_event_count_for_frame += 1191 map_it->second.counter[FRAME_ACK_RECEIVED]; 1192 1193 // Verify that there were no other events logged with respect to this 1194 // frame. 1195 // (i.e. Total event count = expected event count) 1196 EXPECT_EQ(total_event_count_for_frame, expected_event_count_for_frame); 1197 } 1198 1199 // Packet logging. 1200 // Verify that all packet related events were logged. 1201 event_subscriber_sender_.GetPacketEventsAndReset(&packet_events_); 1202 std::map<uint16, LoggingEventCounts> event_count_for_packet = 1203 GetEventCountForPacketEvents(packet_events_); 1204 1205 // Verify that each packet have the expected types of events logged. 1206 for (std::map<uint16, LoggingEventCounts>::iterator map_it = 1207 event_count_for_packet.begin(); 1208 map_it != event_count_for_packet.end(); 1209 ++map_it) { 1210 int total_event_count_for_packet = 0; 1211 for (int i = 0; i <= kNumOfLoggingEvents; ++i) { 1212 total_event_count_for_packet += map_it->second.counter[i]; 1213 } 1214 1215 EXPECT_GT(map_it->second.counter[PACKET_RECEIVED], 0); 1216 int packets_received = map_it->second.counter[PACKET_RECEIVED]; 1217 int packets_sent = map_it->second.counter[PACKET_SENT_TO_NETWORK]; 1218 EXPECT_EQ(packets_sent, packets_received); 1219 1220 // Verify that there were no other events logged with respect to this 1221 // packet. (i.e. Total event count = packets sent + packets received) 1222 EXPECT_EQ(packets_received + packets_sent, total_event_count_for_packet); 1223 } 1224 } 1225 1226 // Audio test without packet loss - tests the logging aspects of the end2end, 1227 // but is basically equivalent to LoopNoLossPcm16. 1228 TEST_F(End2EndTest, AudioLogging) { 1229 Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_PCM16, 32000, 1); 1230 Create(); 1231 1232 int audio_diff = kFrameTimerMs; 1233 const int kNumVideoFrames = 10; 1234 int num_audio_frames_requested = 0; 1235 for (int i = 0; i < kNumVideoFrames; ++i) { 1236 const int num_audio_frames = audio_diff / kAudioFrameDurationMs; 1237 audio_diff -= num_audio_frames * kAudioFrameDurationMs; 1238 1239 FeedAudioFrames(num_audio_frames, true); 1240 1241 RunTasks(kFrameTimerMs); 1242 audio_diff += kFrameTimerMs; 1243 1244 RequestAudioFrames(num_audio_frames, true); 1245 num_audio_frames_requested += num_audio_frames; 1246 } 1247 1248 // Basic tests. 1249 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. 1250 1251 EXPECT_EQ(num_audio_frames_requested, 1252 test_receiver_audio_callback_->number_times_called()); 1253 1254 // Logging tests. 1255 // Verify that all frames and all required events were logged. 1256 event_subscriber_sender_.GetFrameEventsAndReset(&frame_events_); 1257 1258 // Construct a map from each frame (RTP timestamp) to a count of each event 1259 // type logged for that frame. 1260 std::map<RtpTimestamp, LoggingEventCounts> event_counter_for_frame = 1261 GetEventCountForFrameEvents(frame_events_); 1262 1263 int encoded_count = 0; 1264 1265 // Verify the right number of events were logged for each event type. 1266 for (std::map<RtpTimestamp, LoggingEventCounts>::iterator it = 1267 event_counter_for_frame.begin(); 1268 it != event_counter_for_frame.end(); 1269 ++it) { 1270 encoded_count += it->second.counter[FRAME_ENCODED]; 1271 } 1272 1273 EXPECT_EQ(num_audio_frames_requested, encoded_count); 1274 1275 // Verify that each frame have the expected types of events logged. 1276 for (std::map<RtpTimestamp, LoggingEventCounts>::const_iterator map_it = 1277 event_counter_for_frame.begin(); 1278 map_it != event_counter_for_frame.end(); ++map_it) { 1279 int total_event_count_for_frame = 0; 1280 for (int j = 0; j <= kNumOfLoggingEvents; ++j) 1281 total_event_count_for_frame += map_it->second.counter[j]; 1282 1283 int expected_event_count_for_frame = 0; 1284 1285 EXPECT_EQ(1, map_it->second.counter[FRAME_ENCODED]); 1286 expected_event_count_for_frame += 1287 map_it->second.counter[FRAME_ENCODED]; 1288 1289 EXPECT_EQ(1, map_it->second.counter[FRAME_PLAYOUT]); 1290 expected_event_count_for_frame += 1291 map_it->second.counter[FRAME_PLAYOUT]; 1292 1293 EXPECT_EQ(1, map_it->second.counter[FRAME_DECODED]); 1294 expected_event_count_for_frame += 1295 map_it->second.counter[FRAME_DECODED]; 1296 1297 EXPECT_GT(map_it->second.counter[FRAME_ACK_SENT], 0); 1298 EXPECT_GT(map_it->second.counter[FRAME_ACK_RECEIVED], 0); 1299 expected_event_count_for_frame += map_it->second.counter[FRAME_ACK_SENT]; 1300 expected_event_count_for_frame += 1301 map_it->second.counter[FRAME_ACK_RECEIVED]; 1302 1303 // Verify that there were no other events logged with respect to this frame. 1304 // (i.e. Total event count = expected event count) 1305 EXPECT_EQ(total_event_count_for_frame, expected_event_count_for_frame); 1306 } 1307 } 1308 1309 TEST_F(End2EndTest, BasicFakeSoftwareVideo) { 1310 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, 1311 1); 1312 Create(); 1313 StartBasicPlayer(); 1314 SetReceiverSkew(1.0, base::TimeDelta::FromMilliseconds(1)); 1315 1316 // Expect very smooth playout when there is no clock skew. 1317 SetExpectedVideoPlayoutSmoothness( 1318 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 99 / 100, 1319 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 101 / 100, 1320 base::TimeDelta::FromMilliseconds(kFrameTimerMs) / 100); 1321 1322 int frames_counter = 0; 1323 for (; frames_counter < 1000; ++frames_counter) { 1324 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); 1325 RunTasks(kFrameTimerMs); 1326 } 1327 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. 1328 EXPECT_EQ(1000ul, video_ticks_.size()); 1329 } 1330 1331 TEST_F(End2EndTest, ReceiverClockFast) { 1332 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, 1333 1); 1334 Create(); 1335 StartBasicPlayer(); 1336 SetReceiverSkew(2.0, base::TimeDelta::FromMicroseconds(1234567)); 1337 1338 int frames_counter = 0; 1339 for (; frames_counter < 10000; ++frames_counter) { 1340 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); 1341 RunTasks(kFrameTimerMs); 1342 } 1343 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. 1344 EXPECT_EQ(10000ul, video_ticks_.size()); 1345 } 1346 1347 TEST_F(End2EndTest, ReceiverClockSlow) { 1348 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, 1349 1); 1350 Create(); 1351 StartBasicPlayer(); 1352 SetReceiverSkew(0.5, base::TimeDelta::FromMicroseconds(-765432)); 1353 1354 int frames_counter = 0; 1355 for (; frames_counter < 10000; ++frames_counter) { 1356 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); 1357 RunTasks(kFrameTimerMs); 1358 } 1359 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. 1360 EXPECT_EQ(10000ul, video_ticks_.size()); 1361 } 1362 1363 TEST_F(End2EndTest, SmoothPlayoutWithFivePercentClockRateSkew) { 1364 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, 1365 1); 1366 Create(); 1367 StartBasicPlayer(); 1368 SetReceiverSkew(1.05, base::TimeDelta::FromMilliseconds(-42)); 1369 1370 // Expect smooth playout when there is 5% skew. 1371 SetExpectedVideoPlayoutSmoothness( 1372 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 90 / 100, 1373 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 110 / 100, 1374 base::TimeDelta::FromMilliseconds(kFrameTimerMs) / 10); 1375 1376 int frames_counter = 0; 1377 for (; frames_counter < 10000; ++frames_counter) { 1378 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); 1379 RunTasks(kFrameTimerMs); 1380 } 1381 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. 1382 EXPECT_EQ(10000ul, video_ticks_.size()); 1383 } 1384 1385 TEST_F(End2EndTest, EvilNetwork) { 1386 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, 1387 1); 1388 receiver_to_sender_.SetPacketPipe(test::EvilNetwork().Pass()); 1389 sender_to_receiver_.SetPacketPipe(test::EvilNetwork().Pass()); 1390 Create(); 1391 StartBasicPlayer(); 1392 1393 int frames_counter = 0; 1394 for (; frames_counter < 10000; ++frames_counter) { 1395 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); 1396 RunTasks(kFrameTimerMs); 1397 } 1398 base::TimeTicks test_end = testing_clock_receiver_->NowTicks(); 1399 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. 1400 EXPECT_GT(video_ticks_.size(), 100ul); 1401 VLOG(1) << "Fully transmitted " << video_ticks_.size() 1402 << " out of 10000 frames."; 1403 EXPECT_LT((video_ticks_.back().second - test_end).InMilliseconds(), 1000); 1404 } 1405 1406 // Tests that a system configured for 30 FPS drops frames when input is provided 1407 // at a much higher frame rate. 1408 TEST_F(End2EndTest, ShoveHighFrameRateDownYerThroat) { 1409 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, 1410 1); 1411 receiver_to_sender_.SetPacketPipe(test::EvilNetwork().Pass()); 1412 sender_to_receiver_.SetPacketPipe(test::EvilNetwork().Pass()); 1413 Create(); 1414 StartBasicPlayer(); 1415 1416 int frames_counter = 0; 1417 for (; frames_counter < 10000; ++frames_counter) { 1418 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); 1419 RunTasks(10 /* 10 ms, but 33.3 expected by system */); 1420 } 1421 base::TimeTicks test_end = testing_clock_receiver_->NowTicks(); 1422 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. 1423 EXPECT_LT(100ul, video_ticks_.size()); 1424 EXPECT_GE(3334ul, video_ticks_.size()); 1425 VLOG(1) << "Fully transmitted " << video_ticks_.size() 1426 << " out of 10000 frames."; 1427 EXPECT_LT((video_ticks_.back().second - test_end).InMilliseconds(), 1000); 1428 } 1429 1430 TEST_F(End2EndTest, OldPacketNetwork) { 1431 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, 1); 1432 sender_to_receiver_.SetPacketPipe(test::NewRandomDrop(0.01)); 1433 scoped_ptr<test::PacketPipe> echo_chamber( 1434 test::NewDuplicateAndDelay(1, 10 * kFrameTimerMs)); 1435 echo_chamber->AppendToPipe( 1436 test::NewDuplicateAndDelay(1, 20 * kFrameTimerMs)); 1437 echo_chamber->AppendToPipe( 1438 test::NewDuplicateAndDelay(1, 40 * kFrameTimerMs)); 1439 echo_chamber->AppendToPipe( 1440 test::NewDuplicateAndDelay(1, 80 * kFrameTimerMs)); 1441 echo_chamber->AppendToPipe( 1442 test::NewDuplicateAndDelay(1, 160 * kFrameTimerMs)); 1443 1444 receiver_to_sender_.SetPacketPipe(echo_chamber.Pass()); 1445 Create(); 1446 StartBasicPlayer(); 1447 1448 SetExpectedVideoPlayoutSmoothness( 1449 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 90 / 100, 1450 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 110 / 100, 1451 base::TimeDelta::FromMilliseconds(kFrameTimerMs) / 10); 1452 1453 int frames_counter = 0; 1454 for (; frames_counter < 10000; ++frames_counter) { 1455 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); 1456 RunTasks(kFrameTimerMs); 1457 } 1458 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. 1459 1460 EXPECT_EQ(10000ul, video_ticks_.size()); 1461 } 1462 1463 TEST_F(End2EndTest, TestSetPlayoutDelay) { 1464 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, 1); 1465 video_sender_config_.min_playout_delay = 1466 video_sender_config_.max_playout_delay; 1467 audio_sender_config_.min_playout_delay = 1468 audio_sender_config_.max_playout_delay; 1469 video_sender_config_.max_playout_delay = base::TimeDelta::FromSeconds(1); 1470 audio_sender_config_.max_playout_delay = base::TimeDelta::FromSeconds(1); 1471 Create(); 1472 StartBasicPlayer(); 1473 const int kNewDelay = 600; 1474 1475 int frames_counter = 0; 1476 for (; frames_counter < 200; ++frames_counter) { 1477 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); 1478 RunTasks(kFrameTimerMs); 1479 } 1480 cast_sender_->SetTargetPlayoutDelay( 1481 base::TimeDelta::FromMilliseconds(kNewDelay)); 1482 for (; frames_counter < 400; ++frames_counter) { 1483 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); 1484 RunTasks(kFrameTimerMs); 1485 } 1486 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. 1487 size_t jump = 0; 1488 for (size_t i = 1; i < video_ticks_.size(); i++) { 1489 int64 delta = (video_ticks_[i].second - 1490 video_ticks_[i-1].second).InMilliseconds(); 1491 if (delta > 100) { 1492 EXPECT_EQ(delta, kNewDelay - kTargetPlayoutDelayMs + kFrameTimerMs); 1493 EXPECT_EQ(0u, jump); 1494 jump = i; 1495 } 1496 } 1497 EXPECT_GT(jump, 199u); 1498 EXPECT_LT(jump, 220u); 1499 } 1500 1501 // TODO(pwestin): Add repeatable packet loss test. 1502 // TODO(pwestin): Add test for misaligned send get calls. 1503 // TODO(pwestin): Add more tests that does not resample. 1504 // TODO(pwestin): Add test when we have starvation for our RunTask. 1505 1506 } // namespace cast 1507 } // namespace media 1508