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:
committed by
Commit Bot
parent
a85995ac66
commit
6003e7afe0
@ -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) {
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user