| 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
|
|
|