Fix FakeEncoder to produce correct bitrate for several temporal layers

Also fix retransmission video send stream tests to not depend on actual frames sizes

Also, reduce key-frame scaling factor in FakeEncoder to better reflect real encoders behavior.

Bug: none
Change-Id: I33118160f3fec67ae8e732d9a85f0e9ee0784b7c
Reviewed-on: https://webrtc-review.googlesource.com/c/105642
Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25165}
This commit is contained in:
Ilya Nikolaevskiy
2018-10-15 10:47:23 +02:00
committed by Commit Bot
parent a85995ac66
commit 6003e7afe0
2 changed files with 34 additions and 11 deletions

View File

@ -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) {

View File

@ -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<uint16_t>(header.sequenceNumber - 3));
nacked_sequence_numbers_.push_back(
static_cast<uint16_t>(header.sequenceNumber - 2));
nacked_sequence_numbers_.push_back(
static_cast<uint16_t>(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<uint16_t> nacked_sequence_numbers_;
std::vector<uint16_t> non_padding_sequence_numbers_;
} test(retransmit_ssrc, retransmit_payload_type);
RunBaseTest(&test);