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 |