| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 // frame. | 70 // frame. |
| 71 if (number_of_rtp_packets_ == 0) | 71 if (number_of_rtp_packets_ == 0) |
| 72 EXPECT_LE(1, number_of_rtcp_packets_); | 72 EXPECT_LE(1, number_of_rtcp_packets_); |
| 73 ++number_of_rtp_packets_; | 73 ++number_of_rtp_packets_; |
| 74 } | 74 } |
| 75 return true; | 75 return true; |
| 76 } | 76 } |
| 77 | 77 |
| 78 int64_t GetBytesSent() final { return 0; } | 78 int64_t GetBytesSent() final { return 0; } |
| 79 | 79 |
| 80 void StartReceiving( |
| 81 const PacketReceiverCallbackWithStatus& packet_receiver) final {} |
| 82 |
| 83 void StopReceiving() final {} |
| 84 |
| 80 int number_of_rtp_packets() const { return number_of_rtp_packets_; } | 85 int number_of_rtp_packets() const { return number_of_rtp_packets_; } |
| 81 | 86 |
| 82 int number_of_rtcp_packets() const { return number_of_rtcp_packets_; } | 87 int number_of_rtcp_packets() const { return number_of_rtcp_packets_; } |
| 83 | 88 |
| 84 void SetPause(bool paused) { | 89 void SetPause(bool paused) { |
| 85 paused_ = paused; | 90 paused_ = paused; |
| 86 if (!paused && stored_packet_.get()) { | 91 if (!paused && stored_packet_.get()) { |
| 87 SendPacket(stored_packet_, callback_); | 92 SendPacket(stored_packet_, callback_); |
| 88 callback_.Run(); | 93 callback_.Run(); |
| 89 } | 94 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 114 : VideoSender(cast_environment, | 119 : VideoSender(cast_environment, |
| 115 video_config, | 120 video_config, |
| 116 status_change_cb, | 121 status_change_cb, |
| 117 create_vea_cb, | 122 create_vea_cb, |
| 118 create_video_encode_mem_cb, | 123 create_video_encode_mem_cb, |
| 119 transport_sender, | 124 transport_sender, |
| 120 base::Bind(&IgnorePlayoutDelayChanges)) {} | 125 base::Bind(&IgnorePlayoutDelayChanges)) {} |
| 121 using VideoSender::OnReceivedCastFeedback; | 126 using VideoSender::OnReceivedCastFeedback; |
| 122 }; | 127 }; |
| 123 | 128 |
| 129 class TransportClient : public CastTransportSender::Client { |
| 130 public: |
| 131 TransportClient() {} |
| 132 |
| 133 void OnStatusChanged(CastTransportStatus status) final { |
| 134 EXPECT_EQ(TRANSPORT_VIDEO_INITIALIZED, status); |
| 135 }; |
| 136 void OnLoggingEventsReceived( |
| 137 scoped_ptr<std::vector<FrameEvent>> frame_events, |
| 138 scoped_ptr<std::vector<PacketEvent>> packet_events) final{}; |
| 139 void ProcessRtpPacket(scoped_ptr<Packet> packet) final{}; |
| 140 |
| 141 DISALLOW_COPY_AND_ASSIGN(TransportClient); |
| 142 }; |
| 143 |
| 124 } // namespace | 144 } // namespace |
| 125 | 145 |
| 126 class VideoSenderTest : public ::testing::Test { | 146 class VideoSenderTest : public ::testing::Test { |
| 127 protected: | 147 protected: |
| 128 VideoSenderTest() | 148 VideoSenderTest() |
| 129 : testing_clock_(new base::SimpleTestTickClock()), | 149 : testing_clock_(new base::SimpleTestTickClock()), |
| 130 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), | 150 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), |
| 131 cast_environment_( | 151 cast_environment_( |
| 132 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_), | 152 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_), |
| 133 task_runner_, | 153 task_runner_, |
| 134 task_runner_, | 154 task_runner_, |
| 135 task_runner_)), | 155 task_runner_)), |
| 136 operational_status_(STATUS_UNINITIALIZED), | 156 operational_status_(STATUS_UNINITIALIZED), |
| 137 vea_factory_(task_runner_) { | 157 vea_factory_(task_runner_) { |
| 138 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); | 158 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); |
| 139 vea_factory_.SetAutoRespond(true); | 159 vea_factory_.SetAutoRespond(true); |
| 140 last_pixel_value_ = kPixelValue; | 160 last_pixel_value_ = kPixelValue; |
| 141 net::IPEndPoint dummy_endpoint; | 161 transport_ = new TestPacketSender(); |
| 142 transport_sender_.reset(new CastTransportSenderImpl( | 162 transport_sender_.reset( |
| 143 NULL, | 163 new CastTransportSenderImpl(testing_clock_, base::TimeDelta(), |
| 144 testing_clock_, | 164 make_scoped_ptr(new TransportClient()), |
| 145 dummy_endpoint, | 165 make_scoped_ptr(transport_), task_runner_)); |
| 146 dummy_endpoint, | |
| 147 make_scoped_ptr(new base::DictionaryValue), | |
| 148 base::Bind(&UpdateCastTransportStatus), | |
| 149 BulkRawEventsCallback(), | |
| 150 base::TimeDelta(), | |
| 151 task_runner_, | |
| 152 PacketReceiverCallback(), | |
| 153 &transport_)); | |
| 154 } | 166 } |
| 155 | 167 |
| 156 ~VideoSenderTest() override {} | 168 ~VideoSenderTest() override {} |
| 157 | 169 |
| 158 void TearDown() final { | 170 void TearDown() final { |
| 159 video_sender_.reset(); | 171 video_sender_.reset(); |
| 160 task_runner_->RunTasks(); | 172 task_runner_->RunTasks(); |
| 161 } | 173 } |
| 162 | 174 |
| 163 static void UpdateCastTransportStatus(CastTransportStatus status) { | |
| 164 EXPECT_EQ(TRANSPORT_VIDEO_INITIALIZED, status); | |
| 165 } | |
| 166 | |
| 167 // If |external| is true then external video encoder (VEA) is used. | 175 // If |external| is true then external video encoder (VEA) is used. |
| 168 // |expect_init_success| is true if initialization is expected to succeed. | 176 // |expect_init_success| is true if initialization is expected to succeed. |
| 169 void InitEncoder(bool external, bool expect_init_success) { | 177 void InitEncoder(bool external, bool expect_init_success) { |
| 170 VideoSenderConfig video_config = GetDefaultVideoSenderConfig(); | 178 VideoSenderConfig video_config = GetDefaultVideoSenderConfig(); |
| 171 video_config.use_external_encoder = external; | 179 video_config.use_external_encoder = external; |
| 172 | 180 |
| 173 ASSERT_EQ(operational_status_, STATUS_UNINITIALIZED); | 181 ASSERT_EQ(operational_status_, STATUS_UNINITIALIZED); |
| 174 | 182 |
| 175 if (external) { | 183 if (external) { |
| 176 vea_factory_.SetInitializationWillSucceed(expect_init_success); | 184 vea_factory_.SetInitializationWillSucceed(expect_init_success); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 | 230 |
| 223 void RunTasks(int during_ms) { | 231 void RunTasks(int during_ms) { |
| 224 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(during_ms)); | 232 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(during_ms)); |
| 225 } | 233 } |
| 226 | 234 |
| 227 base::SimpleTestTickClock* const testing_clock_; // Owned by CastEnvironment. | 235 base::SimpleTestTickClock* const testing_clock_; // Owned by CastEnvironment. |
| 228 const scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 236 const scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
| 229 const scoped_refptr<CastEnvironment> cast_environment_; | 237 const scoped_refptr<CastEnvironment> cast_environment_; |
| 230 OperationalStatus operational_status_; | 238 OperationalStatus operational_status_; |
| 231 FakeVideoEncodeAcceleratorFactory vea_factory_; | 239 FakeVideoEncodeAcceleratorFactory vea_factory_; |
| 232 TestPacketSender transport_; | 240 TestPacketSender* transport_; // Owned by CastTransportSender. |
| 233 scoped_ptr<CastTransportSenderImpl> transport_sender_; | 241 scoped_ptr<CastTransportSenderImpl> transport_sender_; |
| 234 scoped_ptr<PeerVideoSender> video_sender_; | 242 scoped_ptr<PeerVideoSender> video_sender_; |
| 235 int last_pixel_value_; | 243 int last_pixel_value_; |
| 236 base::TimeTicks first_frame_timestamp_; | 244 base::TimeTicks first_frame_timestamp_; |
| 237 | 245 |
| 238 private: | 246 private: |
| 239 DISALLOW_COPY_AND_ASSIGN(VideoSenderTest); | 247 DISALLOW_COPY_AND_ASSIGN(VideoSenderTest); |
| 240 }; | 248 }; |
| 241 | 249 |
| 242 TEST_F(VideoSenderTest, BuiltInEncoder) { | 250 TEST_F(VideoSenderTest, BuiltInEncoder) { |
| 243 InitEncoder(false, true); | 251 InitEncoder(false, true); |
| 244 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); | 252 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 245 | 253 |
| 246 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 254 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 247 | 255 |
| 248 const base::TimeTicks reference_time = testing_clock_->NowTicks(); | 256 const base::TimeTicks reference_time = testing_clock_->NowTicks(); |
| 249 video_sender_->InsertRawVideoFrame(video_frame, reference_time); | 257 video_sender_->InsertRawVideoFrame(video_frame, reference_time); |
| 250 | 258 |
| 251 task_runner_->RunTasks(); | 259 task_runner_->RunTasks(); |
| 252 EXPECT_LE(1, transport_.number_of_rtp_packets()); | 260 EXPECT_LE(1, transport_->number_of_rtp_packets()); |
| 253 EXPECT_LE(1, transport_.number_of_rtcp_packets()); | 261 EXPECT_LE(1, transport_->number_of_rtcp_packets()); |
| 254 } | 262 } |
| 255 | 263 |
| 256 TEST_F(VideoSenderTest, ExternalEncoder) { | 264 TEST_F(VideoSenderTest, ExternalEncoder) { |
| 257 InitEncoder(true, true); | 265 InitEncoder(true, true); |
| 258 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); | 266 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 259 | 267 |
| 260 // The SizeAdaptableExternalVideoEncoder initally reports STATUS_INITIALIZED | 268 // The SizeAdaptableExternalVideoEncoder initally reports STATUS_INITIALIZED |
| 261 // so that frames will be sent to it. Therefore, no encoder activity should | 269 // so that frames will be sent to it. Therefore, no encoder activity should |
| 262 // have occurred at this point. Send a frame to spurn creation of the | 270 // have occurred at this point. Send a frame to spurn creation of the |
| 263 // underlying ExternalVideoEncoder instance. | 271 // underlying ExternalVideoEncoder instance. |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 325 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 318 | 326 |
| 319 const base::TimeTicks reference_time = testing_clock_->NowTicks(); | 327 const base::TimeTicks reference_time = testing_clock_->NowTicks(); |
| 320 video_sender_->InsertRawVideoFrame(video_frame, reference_time); | 328 video_sender_->InsertRawVideoFrame(video_frame, reference_time); |
| 321 | 329 |
| 322 // Make sure that we send at least one RTCP packet. | 330 // Make sure that we send at least one RTCP packet. |
| 323 base::TimeDelta max_rtcp_timeout = | 331 base::TimeDelta max_rtcp_timeout = |
| 324 base::TimeDelta::FromMilliseconds(1 + kRtcpReportIntervalMs * 3 / 2); | 332 base::TimeDelta::FromMilliseconds(1 + kRtcpReportIntervalMs * 3 / 2); |
| 325 | 333 |
| 326 RunTasks(max_rtcp_timeout.InMilliseconds()); | 334 RunTasks(max_rtcp_timeout.InMilliseconds()); |
| 327 EXPECT_LE(1, transport_.number_of_rtp_packets()); | 335 EXPECT_LE(1, transport_->number_of_rtp_packets()); |
| 328 EXPECT_LE(1, transport_.number_of_rtcp_packets()); | 336 EXPECT_LE(1, transport_->number_of_rtcp_packets()); |
| 329 // Build Cast msg and expect RTCP packet. | 337 // Build Cast msg and expect RTCP packet. |
| 330 RtcpCastMessage cast_feedback(1); | 338 RtcpCastMessage cast_feedback(1); |
| 331 cast_feedback.media_ssrc = 2; | 339 cast_feedback.media_ssrc = 2; |
| 332 cast_feedback.ack_frame_id = 0; | 340 cast_feedback.ack_frame_id = 0; |
| 333 video_sender_->OnReceivedCastFeedback(cast_feedback); | 341 video_sender_->OnReceivedCastFeedback(cast_feedback); |
| 334 RunTasks(max_rtcp_timeout.InMilliseconds()); | 342 RunTasks(max_rtcp_timeout.InMilliseconds()); |
| 335 EXPECT_LE(1, transport_.number_of_rtcp_packets()); | 343 EXPECT_LE(1, transport_->number_of_rtcp_packets()); |
| 336 } | 344 } |
| 337 | 345 |
| 338 TEST_F(VideoSenderTest, ResendTimer) { | 346 TEST_F(VideoSenderTest, ResendTimer) { |
| 339 InitEncoder(false, true); | 347 InitEncoder(false, true); |
| 340 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); | 348 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 341 | 349 |
| 342 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 350 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 343 | 351 |
| 344 const base::TimeTicks reference_time = testing_clock_->NowTicks(); | 352 const base::TimeTicks reference_time = testing_clock_->NowTicks(); |
| 345 video_sender_->InsertRawVideoFrame(video_frame, reference_time); | 353 video_sender_->InsertRawVideoFrame(video_frame, reference_time); |
| 346 | 354 |
| 347 // ACK the key frame. | 355 // ACK the key frame. |
| 348 RtcpCastMessage cast_feedback(1); | 356 RtcpCastMessage cast_feedback(1); |
| 349 cast_feedback.media_ssrc = 2; | 357 cast_feedback.media_ssrc = 2; |
| 350 cast_feedback.ack_frame_id = 0; | 358 cast_feedback.ack_frame_id = 0; |
| 351 video_sender_->OnReceivedCastFeedback(cast_feedback); | 359 video_sender_->OnReceivedCastFeedback(cast_feedback); |
| 352 | 360 |
| 353 video_frame = GetNewVideoFrame(); | 361 video_frame = GetNewVideoFrame(); |
| 354 video_sender_->InsertRawVideoFrame(video_frame, reference_time); | 362 video_sender_->InsertRawVideoFrame(video_frame, reference_time); |
| 355 | 363 |
| 356 base::TimeDelta max_resend_timeout = | 364 base::TimeDelta max_resend_timeout = |
| 357 base::TimeDelta::FromMilliseconds(1 + kDefaultRtpMaxDelayMs); | 365 base::TimeDelta::FromMilliseconds(1 + kDefaultRtpMaxDelayMs); |
| 358 | 366 |
| 359 // Make sure that we do a re-send. | 367 // Make sure that we do a re-send. |
| 360 RunTasks(max_resend_timeout.InMilliseconds()); | 368 RunTasks(max_resend_timeout.InMilliseconds()); |
| 361 // Should have sent at least 3 packets. | 369 // Should have sent at least 3 packets. |
| 362 EXPECT_LE( | 370 EXPECT_LE(3, transport_->number_of_rtp_packets() + |
| 363 3, | 371 transport_->number_of_rtcp_packets()); |
| 364 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); | |
| 365 } | 372 } |
| 366 | 373 |
| 367 TEST_F(VideoSenderTest, LogAckReceivedEvent) { | 374 TEST_F(VideoSenderTest, LogAckReceivedEvent) { |
| 368 InitEncoder(false, true); | 375 InitEncoder(false, true); |
| 369 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); | 376 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 370 | 377 |
| 371 SimpleEventSubscriber event_subscriber; | 378 SimpleEventSubscriber event_subscriber; |
| 372 cast_environment_->logger()->Subscribe(&event_subscriber); | 379 cast_environment_->logger()->Subscribe(&event_subscriber); |
| 373 | 380 |
| 374 int num_frames = 10; | 381 int num_frames = 10; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 407 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 414 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 408 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 415 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 409 RunTasks(33); | 416 RunTasks(33); |
| 410 | 417 |
| 411 // Send 3 more frames and record the number of packets sent. | 418 // Send 3 more frames and record the number of packets sent. |
| 412 for (int i = 0; i < 3; ++i) { | 419 for (int i = 0; i < 3; ++i) { |
| 413 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 420 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 414 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 421 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 415 RunTasks(33); | 422 RunTasks(33); |
| 416 } | 423 } |
| 417 const int number_of_packets_sent = transport_.number_of_rtp_packets(); | 424 const int number_of_packets_sent = transport_->number_of_rtp_packets(); |
| 418 | 425 |
| 419 // Send 3 more frames - they should not be encoded, as we have not received | 426 // Send 3 more frames - they should not be encoded, as we have not received |
| 420 // any acks. | 427 // any acks. |
| 421 for (int i = 0; i < 3; ++i) { | 428 for (int i = 0; i < 3; ++i) { |
| 422 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 429 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 423 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 430 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 424 RunTasks(33); | 431 RunTasks(33); |
| 425 } | 432 } |
| 426 | 433 |
| 427 // We expect a frame to be retransmitted because of duplicated ACKs. | 434 // We expect a frame to be retransmitted because of duplicated ACKs. |
| 428 // Only one packet of the frame is re-transmitted. | 435 // Only one packet of the frame is re-transmitted. |
| 429 EXPECT_EQ(number_of_packets_sent + 1, | 436 EXPECT_EQ(number_of_packets_sent + 1, transport_->number_of_rtp_packets()); |
| 430 transport_.number_of_rtp_packets()); | |
| 431 | 437 |
| 432 // Start acking and make sure we're back to steady-state. | 438 // Start acking and make sure we're back to steady-state. |
| 433 RtcpCastMessage cast_feedback(1); | 439 RtcpCastMessage cast_feedback(1); |
| 434 cast_feedback.media_ssrc = 2; | 440 cast_feedback.media_ssrc = 2; |
| 435 cast_feedback.ack_frame_id = 0; | 441 cast_feedback.ack_frame_id = 0; |
| 436 video_sender_->OnReceivedCastFeedback(cast_feedback); | 442 video_sender_->OnReceivedCastFeedback(cast_feedback); |
| 437 EXPECT_LE( | 443 EXPECT_LE(4, transport_->number_of_rtp_packets() + |
| 438 4, | 444 transport_->number_of_rtcp_packets()); |
| 439 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); | |
| 440 | 445 |
| 441 // Empty the pipeline. | 446 // Empty the pipeline. |
| 442 RunTasks(100); | 447 RunTasks(100); |
| 443 // Should have sent at least 7 packets. | 448 // Should have sent at least 7 packets. |
| 444 EXPECT_LE( | 449 EXPECT_LE(7, transport_->number_of_rtp_packets() + |
| 445 7, | 450 transport_->number_of_rtcp_packets()); |
| 446 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); | |
| 447 } | 451 } |
| 448 | 452 |
| 449 TEST_F(VideoSenderTest, DuplicateAckRetransmit) { | 453 TEST_F(VideoSenderTest, DuplicateAckRetransmit) { |
| 450 InitEncoder(false, true); | 454 InitEncoder(false, true); |
| 451 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); | 455 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 452 | 456 |
| 453 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 457 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 454 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 458 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 455 RunTasks(33); | 459 RunTasks(33); |
| 456 RtcpCastMessage cast_feedback(1); | 460 RtcpCastMessage cast_feedback(1); |
| 457 cast_feedback.media_ssrc = 2; | 461 cast_feedback.media_ssrc = 2; |
| 458 cast_feedback.ack_frame_id = 0; | 462 cast_feedback.ack_frame_id = 0; |
| 459 | 463 |
| 460 // Send 3 more frames but don't ACK. | 464 // Send 3 more frames but don't ACK. |
| 461 for (int i = 0; i < 3; ++i) { | 465 for (int i = 0; i < 3; ++i) { |
| 462 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 466 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 463 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 467 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 464 RunTasks(33); | 468 RunTasks(33); |
| 465 } | 469 } |
| 466 const int number_of_packets_sent = transport_.number_of_rtp_packets(); | 470 const int number_of_packets_sent = transport_->number_of_rtp_packets(); |
| 467 | 471 |
| 468 // Send duplicated ACKs and mix some invalid NACKs. | 472 // Send duplicated ACKs and mix some invalid NACKs. |
| 469 for (int i = 0; i < 10; ++i) { | 473 for (int i = 0; i < 10; ++i) { |
| 470 RtcpCastMessage ack_feedback(1); | 474 RtcpCastMessage ack_feedback(1); |
| 471 ack_feedback.media_ssrc = 2; | 475 ack_feedback.media_ssrc = 2; |
| 472 ack_feedback.ack_frame_id = 0; | 476 ack_feedback.ack_frame_id = 0; |
| 473 RtcpCastMessage nack_feedback(1); | 477 RtcpCastMessage nack_feedback(1); |
| 474 nack_feedback.media_ssrc = 2; | 478 nack_feedback.media_ssrc = 2; |
| 475 nack_feedback.missing_frames_and_packets[255] = PacketIdSet(); | 479 nack_feedback.missing_frames_and_packets[255] = PacketIdSet(); |
| 476 video_sender_->OnReceivedCastFeedback(ack_feedback); | 480 video_sender_->OnReceivedCastFeedback(ack_feedback); |
| 477 video_sender_->OnReceivedCastFeedback(nack_feedback); | 481 video_sender_->OnReceivedCastFeedback(nack_feedback); |
| 478 } | 482 } |
| 479 EXPECT_EQ(number_of_packets_sent, transport_.number_of_rtp_packets()); | 483 EXPECT_EQ(number_of_packets_sent, transport_->number_of_rtp_packets()); |
| 480 | 484 |
| 481 // Re-transmit one packet because of duplicated ACKs. | 485 // Re-transmit one packet because of duplicated ACKs. |
| 482 for (int i = 0; i < 3; ++i) { | 486 for (int i = 0; i < 3; ++i) { |
| 483 RtcpCastMessage ack_feedback(1); | 487 RtcpCastMessage ack_feedback(1); |
| 484 ack_feedback.media_ssrc = 2; | 488 ack_feedback.media_ssrc = 2; |
| 485 ack_feedback.ack_frame_id = 0; | 489 ack_feedback.ack_frame_id = 0; |
| 486 video_sender_->OnReceivedCastFeedback(ack_feedback); | 490 video_sender_->OnReceivedCastFeedback(ack_feedback); |
| 487 } | 491 } |
| 488 EXPECT_EQ(number_of_packets_sent + 1, transport_.number_of_rtp_packets()); | 492 EXPECT_EQ(number_of_packets_sent + 1, transport_->number_of_rtp_packets()); |
| 489 } | 493 } |
| 490 | 494 |
| 491 TEST_F(VideoSenderTest, DuplicateAckRetransmitDoesNotCancelRetransmits) { | 495 TEST_F(VideoSenderTest, DuplicateAckRetransmitDoesNotCancelRetransmits) { |
| 492 InitEncoder(false, true); | 496 InitEncoder(false, true); |
| 493 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); | 497 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 494 | 498 |
| 495 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 499 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 496 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 500 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 497 RunTasks(33); | 501 RunTasks(33); |
| 498 RtcpCastMessage cast_feedback(1); | 502 RtcpCastMessage cast_feedback(1); |
| 499 cast_feedback.media_ssrc = 2; | 503 cast_feedback.media_ssrc = 2; |
| 500 cast_feedback.ack_frame_id = 0; | 504 cast_feedback.ack_frame_id = 0; |
| 501 | 505 |
| 502 // Send 2 more frames but don't ACK. | 506 // Send 2 more frames but don't ACK. |
| 503 for (int i = 0; i < 2; ++i) { | 507 for (int i = 0; i < 2; ++i) { |
| 504 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 508 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 505 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 509 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 506 RunTasks(33); | 510 RunTasks(33); |
| 507 } | 511 } |
| 508 // Pause the transport | 512 // Pause the transport |
| 509 transport_.SetPause(true); | 513 transport_->SetPause(true); |
| 510 | 514 |
| 511 // Insert one more video frame. | 515 // Insert one more video frame. |
| 512 video_frame = GetLargeNewVideoFrame(); | 516 video_frame = GetLargeNewVideoFrame(); |
| 513 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 517 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 514 RunTasks(33); | 518 RunTasks(33); |
| 515 | 519 |
| 516 const int number_of_packets_sent = transport_.number_of_rtp_packets(); | 520 const int number_of_packets_sent = transport_->number_of_rtp_packets(); |
| 517 | 521 |
| 518 // Send duplicated ACKs and mix some invalid NACKs. | 522 // Send duplicated ACKs and mix some invalid NACKs. |
| 519 for (int i = 0; i < 10; ++i) { | 523 for (int i = 0; i < 10; ++i) { |
| 520 RtcpCastMessage ack_feedback(1); | 524 RtcpCastMessage ack_feedback(1); |
| 521 ack_feedback.media_ssrc = 2; | 525 ack_feedback.media_ssrc = 2; |
| 522 ack_feedback.ack_frame_id = 0; | 526 ack_feedback.ack_frame_id = 0; |
| 523 RtcpCastMessage nack_feedback(1); | 527 RtcpCastMessage nack_feedback(1); |
| 524 nack_feedback.media_ssrc = 2; | 528 nack_feedback.media_ssrc = 2; |
| 525 nack_feedback.missing_frames_and_packets[255] = PacketIdSet(); | 529 nack_feedback.missing_frames_and_packets[255] = PacketIdSet(); |
| 526 video_sender_->OnReceivedCastFeedback(ack_feedback); | 530 video_sender_->OnReceivedCastFeedback(ack_feedback); |
| 527 video_sender_->OnReceivedCastFeedback(nack_feedback); | 531 video_sender_->OnReceivedCastFeedback(nack_feedback); |
| 528 } | 532 } |
| 529 EXPECT_EQ(number_of_packets_sent, transport_.number_of_rtp_packets()); | 533 EXPECT_EQ(number_of_packets_sent, transport_->number_of_rtp_packets()); |
| 530 | 534 |
| 531 // Re-transmit one packet because of duplicated ACKs. | 535 // Re-transmit one packet because of duplicated ACKs. |
| 532 for (int i = 0; i < 3; ++i) { | 536 for (int i = 0; i < 3; ++i) { |
| 533 RtcpCastMessage ack_feedback(1); | 537 RtcpCastMessage ack_feedback(1); |
| 534 ack_feedback.media_ssrc = 2; | 538 ack_feedback.media_ssrc = 2; |
| 535 ack_feedback.ack_frame_id = 0; | 539 ack_feedback.ack_frame_id = 0; |
| 536 video_sender_->OnReceivedCastFeedback(ack_feedback); | 540 video_sender_->OnReceivedCastFeedback(ack_feedback); |
| 537 } | 541 } |
| 538 | 542 |
| 539 transport_.SetPause(false); | 543 transport_->SetPause(false); |
| 540 RunTasks(100); | 544 RunTasks(100); |
| 541 EXPECT_LT(number_of_packets_sent + 1, transport_.number_of_rtp_packets()); | 545 EXPECT_LT(number_of_packets_sent + 1, transport_->number_of_rtp_packets()); |
| 542 } | 546 } |
| 543 | 547 |
| 544 TEST_F(VideoSenderTest, AcksCancelRetransmits) { | 548 TEST_F(VideoSenderTest, AcksCancelRetransmits) { |
| 545 InitEncoder(false, true); | 549 InitEncoder(false, true); |
| 546 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); | 550 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 547 | 551 |
| 548 transport_.SetPause(true); | 552 transport_->SetPause(true); |
| 549 scoped_refptr<media::VideoFrame> video_frame = GetLargeNewVideoFrame(); | 553 scoped_refptr<media::VideoFrame> video_frame = GetLargeNewVideoFrame(); |
| 550 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 554 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 551 RunTasks(33); | 555 RunTasks(33); |
| 552 | 556 |
| 553 // Frame should be in buffer, waiting. Now let's ack it. | 557 // Frame should be in buffer, waiting. Now let's ack it. |
| 554 RtcpCastMessage cast_feedback(1); | 558 RtcpCastMessage cast_feedback(1); |
| 555 cast_feedback.media_ssrc = 2; | 559 cast_feedback.media_ssrc = 2; |
| 556 cast_feedback.ack_frame_id = 0; | 560 cast_feedback.ack_frame_id = 0; |
| 557 video_sender_->OnReceivedCastFeedback(cast_feedback); | 561 video_sender_->OnReceivedCastFeedback(cast_feedback); |
| 558 | 562 |
| 559 transport_.SetPause(false); | 563 transport_->SetPause(false); |
| 560 RunTasks(33); | 564 RunTasks(33); |
| 561 EXPECT_EQ(0, transport_.number_of_rtp_packets()); | 565 EXPECT_EQ(0, transport_->number_of_rtp_packets()); |
| 562 } | 566 } |
| 563 | 567 |
| 564 TEST_F(VideoSenderTest, CheckVideoFrameFactoryIsNull) { | 568 TEST_F(VideoSenderTest, CheckVideoFrameFactoryIsNull) { |
| 565 InitEncoder(false, true); | 569 InitEncoder(false, true); |
| 566 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); | 570 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 567 | 571 |
| 568 EXPECT_EQ(nullptr, video_sender_->CreateVideoFrameFactory().get()); | 572 EXPECT_EQ(nullptr, video_sender_->CreateVideoFrameFactory().get()); |
| 569 } | 573 } |
| 570 | 574 |
| 571 TEST_F(VideoSenderTest, PopulatesResourceUtilizationInFrameMetadata) { | 575 TEST_F(VideoSenderTest, PopulatesResourceUtilizationInFrameMetadata) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 593 media::VideoFrameMetadata::RESOURCE_UTILIZATION, &utilization)); | 597 media::VideoFrameMetadata::RESOURCE_UTILIZATION, &utilization)); |
| 594 EXPECT_LE(0.0, utilization); | 598 EXPECT_LE(0.0, utilization); |
| 595 if (i == 0) | 599 if (i == 0) |
| 596 EXPECT_GE(1.0, utilization); // Key frames never exceed 1.0. | 600 EXPECT_GE(1.0, utilization); // Key frames never exceed 1.0. |
| 597 DVLOG(1) << "Utilization computed by VideoSender is: " << utilization; | 601 DVLOG(1) << "Utilization computed by VideoSender is: " << utilization; |
| 598 } | 602 } |
| 599 } | 603 } |
| 600 | 604 |
| 601 } // namespace cast | 605 } // namespace cast |
| 602 } // namespace media | 606 } // namespace media |
| OLD | NEW |