Index: media/cast/video_sender/video_sender_unittest.cc |
diff --git a/media/cast/video_sender/video_sender_unittest.cc b/media/cast/video_sender/video_sender_unittest.cc |
index faa3180a8c4fd15f701d5e645af310d68959eda5..32efae49176b965b3012c4c993f50dac37301417 100644 |
--- a/media/cast/video_sender/video_sender_unittest.cc |
+++ b/media/cast/video_sender/video_sender_unittest.cc |
@@ -317,28 +317,29 @@ TEST_F(VideoSenderTest, StopSendingInTheAbsenceOfAck) { |
InitEncoder(false); |
// Send a stream of frames and don't ACK; by default we shouldn't have more |
// than 4 frames in flight. |
- // Store size in packets of frame 0, as it should be resent sue to timeout. |
scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
RunTasks(33); |
- const int size_of_frame0 = transport_.number_of_rtp_packets(); |
- for (int i = 1; i < 4; ++i) { |
+ // Send 3 more frames and record the number of packets sent. |
+ for (int i = 0; i < 3; ++i) { |
scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
RunTasks(33); |
} |
- |
const int number_of_packets_sent = transport_.number_of_rtp_packets(); |
- // Send 4 more frames - they should not be sent to the transport, as we have |
- // received any acks. |
+ |
+ // Send 3 more frames - they should not be encoded, as we have not received |
+ // any acks. |
for (int i = 0; i < 3; ++i) { |
scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
RunTasks(33); |
} |
- EXPECT_EQ(number_of_packets_sent + size_of_frame0, |
+ // We expect a frame to be retransmitted because of duplicated ACKs. |
+ // Only one packet of the frame is re-transmitted. |
+ EXPECT_EQ(number_of_packets_sent + 1, |
transport_.number_of_rtp_packets()); |
// Start acking and make sure we're back to steady-state. |
@@ -358,5 +359,45 @@ TEST_F(VideoSenderTest, StopSendingInTheAbsenceOfAck) { |
transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); |
} |
+TEST_F(VideoSenderTest, DuplicateAckRetransmit) { |
+ InitEncoder(false); |
+ scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
+ video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
+ RunTasks(33); |
+ RtcpCastMessage cast_feedback(1); |
+ cast_feedback.media_ssrc_ = 2; |
+ cast_feedback.ack_frame_id_ = 0; |
+ |
+ // Send 3 more frames but don't ACK. |
+ for (int i = 0; i < 3; ++i) { |
+ scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
+ video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
+ RunTasks(33); |
+ } |
+ const int number_of_packets_sent = transport_.number_of_rtp_packets(); |
+ |
+ // Send duplicated ACKs and mix some invalid NACKs. |
+ for (int i = 0; i < 10; ++i) { |
+ RtcpCastMessage ack_feedback(1); |
+ ack_feedback.media_ssrc_ = 2; |
+ ack_feedback.ack_frame_id_ = 0; |
+ RtcpCastMessage nack_feedback(1); |
+ nack_feedback.media_ssrc_ = 2; |
+ nack_feedback.missing_frames_and_packets_[255] = PacketIdSet(); |
+ video_sender_->OnReceivedCastFeedback(ack_feedback); |
+ video_sender_->OnReceivedCastFeedback(nack_feedback); |
+ } |
+ EXPECT_EQ(number_of_packets_sent, transport_.number_of_rtp_packets()); |
+ |
+ // Re-transmit one packet because of duplicated ACKs. |
+ for (int i = 0; i < 3; ++i) { |
+ RtcpCastMessage ack_feedback(1); |
+ ack_feedback.media_ssrc_ = 2; |
+ ack_feedback.ack_frame_id_ = 0; |
+ video_sender_->OnReceivedCastFeedback(ack_feedback); |
+ } |
+ EXPECT_EQ(number_of_packets_sent + 1, transport_.number_of_rtp_packets()); |
+} |
+ |
} // namespace cast |
} // namespace media |