Updates tests for turning simulcast streams on/off.

Due to libvpx we were restricted to always turning the low simulcast
stream on, or else the encoder would always label the active streams'
encoded frames as key frames. Now that libvpx has been updated and
rolled in, this change updates tests to reflect that it is working.

Bug: webrtc:8653
Change-Id: I065ef817ace2292605e27e135802cf4a3e90647e
Reviewed-on: https://webrtc-review.googlesource.com/46340
Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Seth Hampson <shampson@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21831}
This commit is contained in:
Seth Hampson 2018-01-30 10:31:07 -08:00 committed by Commit Bot
parent 96d7f76036
commit 8fb22e71ee

View file

@ -284,6 +284,23 @@ class TestVp8Simulcast : public ::testing::Test {
rate_allocator_->GetAllocation(bitrate_kbps * 1000, fps), fps); rate_allocator_->GetAllocation(bitrate_kbps * 1000, fps), fps);
} }
void RunActiveStreamsTest(const std::vector<bool> active_streams) {
std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
kVideoFrameDelta);
UpdateActiveStreams(active_streams);
// Set sufficient bitrate for all streams so we can test active without
// bitrate being an issue.
SetRates(kMaxBitrates[0] + kMaxBitrates[1] + kMaxBitrates[2], 30);
ExpectStreams(kVideoFrameKey, active_streams);
input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
ExpectStreams(kVideoFrameDelta, active_streams);
input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
}
void UpdateActiveStreams(const std::vector<bool> active_streams) { void UpdateActiveStreams(const std::vector<bool> active_streams) {
ASSERT_EQ(static_cast<int>(active_streams.size()), ASSERT_EQ(static_cast<int>(active_streams.size()),
kNumberOfSimulcastStreams); kNumberOfSimulcastStreams);
@ -291,6 +308,10 @@ class TestVp8Simulcast : public ::testing::Test {
settings_.simulcastStream[i].active = active_streams[i]; settings_.simulcastStream[i].active = active_streams[i];
} }
// Re initialize the allocator and encoder with the new settings. // Re initialize the allocator and encoder with the new settings.
// TODO(bugs.webrtc.org/8807): Currently, we do a full "hard"
// reconfiguration of the allocator and encoder. When the video bitrate
// allocator has support for updating active streams without a
// reinitialization, we can just call that here instead.
SetUpRateAllocator(); SetUpRateAllocator();
EXPECT_EQ(0, encoder_->InitEncode(&settings_, 1, 1200)); EXPECT_EQ(0, encoder_->InitEncode(&settings_, 1, 1200));
} }
@ -526,40 +547,22 @@ class TestVp8Simulcast : public ::testing::Test {
} }
void TestActiveStreams() { void TestActiveStreams() {
const int kEnoughBitrateAllStreams = // All streams on.
kMaxBitrates[0] + kMaxBitrates[1] + kMaxBitrates[2]; RunActiveStreamsTest({true, true, true});
std::vector<FrameType> frame_types(kNumberOfSimulcastStreams, // All streams off.
kVideoFrameDelta); RunActiveStreamsTest({false, false, false});
// TODO(shampson): Currently turning off the base stream causes unexpected // Low stream off.
// behavior in the libvpx encoder. The libvpx encoder labels key frames RunActiveStreamsTest({false, true, true});
// based upon the base stream. If the base stream is never enabled, it // Middle stream off.
// will continue to spit out encoded images labeled as key frames for the RunActiveStreamsTest({true, false, true});
// other streams that are enabled. Once this is fixed in libvpx, update this // High stream off.
// test to reflect that change. RunActiveStreamsTest({true, true, false});
// Only low stream turned on.
// Only turn on the the base stream. RunActiveStreamsTest({true, false, false});
std::vector<bool> active_streams = {true, false, false}; // Only middle stream turned on.
UpdateActiveStreams(active_streams); RunActiveStreamsTest({false, true, false});
SetRates(kEnoughBitrateAllStreams, 30); // Only high stream turned on.
ExpectStreams(kVideoFrameKey, active_streams); RunActiveStreamsTest({false, false, true});
input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
ExpectStreams(kVideoFrameDelta, active_streams);
input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
// Turn off only the middle stream.
active_streams = {true, false, true};
UpdateActiveStreams(active_streams);
SetRates(kEnoughBitrateAllStreams, 30);
ExpectStreams(kVideoFrameKey, active_streams);
input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
ExpectStreams(kVideoFrameDelta, active_streams);
input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
} }
void SwitchingToOneStream(int width, int height) { void SwitchingToOneStream(int width, int height) {