diff --git a/test/fake_encoder.cc b/test/fake_encoder.cc index 8e2c7dd8ce..ca99038e2d 100644 --- a/test/fake_encoder.cc +++ b/test/fake_encoder.cc @@ -24,7 +24,16 @@ namespace webrtc { namespace test { -const int kKeyframeSizeFactor = 10; +const int kKeyframeSizeFactor = 5; + +// Inverse of proportion of frames assigned to each temporal layer for all +// possible temporal layers numbers. +const int kTemporalLayerRateFactor[4][4] = { + {1, 0, 0, 0}, // 1/1 + {2, 2, 0, 0}, // 1/2 + 1/2 + {4, 4, 2, 0}, // 1/4 + 1/4 + 1/2 + {8, 8, 4, 2}, // 1/8 + 1/8 + 1/4 + 1/2 +}; FakeEncoder::FakeEncoder(Clock* clock) : clock_(clock), @@ -168,7 +177,9 @@ FakeEncoder::FrameInfo FakeEncoder::NextFrame( if (frame_info.keyframe) { layer_info.temporal_id = 0; size_t avg_frame_size = - (target_bitrate.GetBitrate(i, 0) + 7) / (8 * framerate); + (target_bitrate.GetBitrate(i, 0) + 7) * + kTemporalLayerRateFactor[frame_info.layers.size() - 1][i] / + (8 * framerate); // The first frame is a key frame and should be larger. // Store the overshoot bytes and distribute them over the coming frames, @@ -177,7 +188,8 @@ FakeEncoder::FrameInfo FakeEncoder::NextFrame( layer_info.size = kKeyframeSizeFactor * avg_frame_size; } else { size_t avg_frame_size = - (target_bitrate.GetBitrate(i, layer_info.temporal_id) + 7) / + (target_bitrate.GetBitrate(i, layer_info.temporal_id) + 7) * + kTemporalLayerRateFactor[frame_info.layers.size() - 1][i] / (8 * framerate); layer_info.size = avg_frame_size; if (debt_bytes_ > 0) { diff --git a/video/video_send_stream_tests.cc b/video/video_send_stream_tests.cc index 76bd227f1b..ffd3132cb8 100644 --- a/video/video_send_stream_tests.cc +++ b/video/video_send_stream_tests.cc @@ -865,15 +865,23 @@ void VideoSendStreamTest::TestNackRetransmission( RTPHeader header; EXPECT_TRUE(parser_->Parse(packet, length, &header)); - int kRetransmitTarget = 6; + // NACK packets two times at some arbitrary points. + const int kNackedPacketsAtOnceCount = 3; + const int kRetransmitTarget = kNackedPacketsAtOnceCount * 2; + + // Skip padding packets because they will never be retransmitted. + if (header.paddingLength + header.headerLength == length) { + return SEND_PACKET; + } + ++send_count_; + + // NACK packets at arbitrary points. if (send_count_ == 5 || send_count_ == 25) { - nacked_sequence_numbers_.push_back( - static_cast(header.sequenceNumber - 3)); - nacked_sequence_numbers_.push_back( - static_cast(header.sequenceNumber - 2)); - nacked_sequence_numbers_.push_back( - static_cast(header.sequenceNumber - 1)); + nacked_sequence_numbers_.insert( + nacked_sequence_numbers_.end(), + non_padding_sequence_numbers_.end() - kNackedPacketsAtOnceCount, + non_padding_sequence_numbers_.end()); RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(), nullptr, nullptr, nullptr, transport_adapter_.get(), @@ -891,7 +899,6 @@ void VideoSendStreamTest::TestNackRetransmission( } uint16_t sequence_number = header.sequenceNumber; - if (header.ssrc == retransmit_ssrc_ && retransmit_ssrc_ != kVideoSendSsrcs[0]) { // Not kVideoSendSsrcs[0], assume correct RTX packet. Extract sequence @@ -899,6 +906,7 @@ void VideoSendStreamTest::TestNackRetransmission( const uint8_t* rtx_header = packet + header.headerLength; sequence_number = (rtx_header[0] << 8) + rtx_header[1]; } + auto found = std::find(nacked_sequence_numbers_.begin(), nacked_sequence_numbers_.end(), sequence_number); if (found != nacked_sequence_numbers_.end()) { @@ -909,6 +917,8 @@ void VideoSendStreamTest::TestNackRetransmission( EXPECT_EQ(retransmit_payload_type_, header.payloadType); observation_complete_.Set(); } + } else { + non_padding_sequence_numbers_.push_back(sequence_number); } return SEND_PACKET; @@ -937,6 +947,7 @@ void VideoSendStreamTest::TestNackRetransmission( uint32_t retransmit_ssrc_; uint8_t retransmit_payload_type_; std::vector nacked_sequence_numbers_; + std::vector non_padding_sequence_numbers_; } test(retransmit_ssrc, retransmit_payload_type); RunBaseTest(&test);