Index: webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter_unittest.cc |
diff --git a/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter_unittest.cc b/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter_unittest.cc |
index 0ccbb548558baf162fcce38f91d677039b2c8a58..8bc2c5050092feb937822e52941303d1528528db 100644 |
--- a/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter_unittest.cc |
+++ b/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter_unittest.cc |
@@ -95,12 +95,6 @@ TEST_F(TestSimulcastEncoderAdapter, TestSpatioTemporalLayers321PatternEncoder) { |
TestVp8Simulcast::TestSpatioTemporalLayers321PatternEncoder(); |
} |
-// TODO(ronghuawu): Enable this test when SkipEncodingUnusedStreams option is |
-// implemented for SimulcastEncoderAdapter. |
-TEST_F(TestSimulcastEncoderAdapter, DISABLED_TestSkipEncodingUnusedStreams) { |
- TestVp8Simulcast::TestSkipEncodingUnusedStreams(); |
-} |
- |
TEST_F(TestSimulcastEncoderAdapter, DISABLED_TestRPSIEncoder) { |
TestVp8Simulcast::TestRPSIEncoder(); |
} |
@@ -132,8 +126,9 @@ class MockVideoEncoder : public VideoEncoder { |
int32_t Release() /* override */ { return 0; } |
- int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) /* override */ { |
- last_set_bitrate_ = static_cast<int32_t>(newBitRate); |
+ int32_t SetRateAllocation(const BitrateAllocation& bitrate_allocation, |
+ uint32_t framerate) { |
+ last_set_bitrate_ = bitrate_allocation; |
return 0; |
} |
@@ -160,13 +155,13 @@ class MockVideoEncoder : public VideoEncoder { |
void set_supports_native_handle(bool enabled) { |
supports_native_handle_ = enabled; |
} |
- int32_t last_set_bitrate() const { return last_set_bitrate_; } |
+ BitrateAllocation last_set_bitrate() const { return last_set_bitrate_; } |
MOCK_CONST_METHOD0(ImplementationName, const char*()); |
private: |
bool supports_native_handle_ = false; |
- int32_t last_set_bitrate_ = -1; |
+ BitrateAllocation last_set_bitrate_; |
VideoCodec codec_; |
EncodedImageCallback* callback_; |
@@ -273,6 +268,9 @@ class TestSimulcastEncoderAdapterFake : public ::testing::Test, |
void SetupCodec() { |
TestVp8Simulcast::DefaultSettings( |
&codec_, static_cast<const int*>(kTestTemporalLayerProfile)); |
+ rate_allocator_.reset(new SimulcastRateAllocator(codec_, nullptr)); |
+ tl_factory_.SetListener(rate_allocator_.get()); |
+ codec_.codecSpecific.VP8.tl_factory = &tl_factory_; |
EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); |
adapter_->RegisterEncodeCompleteCallback(this); |
} |
@@ -309,8 +307,6 @@ class TestSimulcastEncoderAdapterFake : public ::testing::Test, |
target.codecSpecific.VP8.frameDroppingOn); |
EXPECT_EQ(ref.codecSpecific.VP8.keyFrameInterval, |
target.codecSpecific.VP8.keyFrameInterval); |
- EXPECT_EQ(ref.codecSpecific.VP8.tl_factory, |
- target.codecSpecific.VP8.tl_factory); |
EXPECT_EQ(ref.qpMax, target.qpMax); |
EXPECT_EQ(0, target.numberOfSimulcastStreams); |
EXPECT_EQ(ref.mode, target.mode); |
@@ -323,6 +319,7 @@ class TestSimulcastEncoderAdapterFake : public ::testing::Test, |
*ref_codec = codec_; |
ref_codec->codecSpecific.VP8.numberOfTemporalLayers = |
kTestTemporalLayerProfile[stream_index]; |
+ ref_codec->codecSpecific.VP8.tl_factory = &tl_factory_; |
ref_codec->width = codec_.simulcastStream[stream_index].width; |
ref_codec->height = codec_.simulcastStream[stream_index].height; |
ref_codec->maxBitrate = codec_.simulcastStream[stream_index].maxBitrate; |
@@ -366,6 +363,8 @@ class TestSimulcastEncoderAdapterFake : public ::testing::Test, |
int last_encoded_image_width_; |
int last_encoded_image_height_; |
int last_encoded_image_simulcast_index_; |
+ TemporalLayersFactory tl_factory_; |
+ std::unique_ptr<SimulcastRateAllocator> rate_allocator_; |
}; |
TEST_F(TestSimulcastEncoderAdapterFake, InitEncode) { |
@@ -385,7 +384,7 @@ TEST_F(TestSimulcastEncoderAdapterFake, EncodedCallbackForDifferentEncoders) { |
SetupCodec(); |
// Set bitrates so that we send all layers. |
- adapter_->SetRates(1200, 30); |
+ adapter_->SetRateAllocation(rate_allocator_->GetAllocation(1200, 30), 30); |
// At this point, the simulcast encoder adapter should have 3 streams: HD, |
// quarter HD, and quarter quarter HD. We're going to mostly ignore the exact |
@@ -418,6 +417,7 @@ TEST_F(TestSimulcastEncoderAdapterFake, EncodedCallbackForDifferentEncoders) { |
TEST_F(TestSimulcastEncoderAdapterFake, SupportsNativeHandleForSingleStreams) { |
TestVp8Simulcast::DefaultSettings( |
&codec_, static_cast<const int*>(kTestTemporalLayerProfile)); |
+ codec_.codecSpecific.VP8.tl_factory = &tl_factory_; |
codec_.numberOfSimulcastStreams = 1; |
EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); |
adapter_->RegisterEncodeCompleteCallback(this); |
@@ -431,27 +431,37 @@ TEST_F(TestSimulcastEncoderAdapterFake, SupportsNativeHandleForSingleStreams) { |
TEST_F(TestSimulcastEncoderAdapterFake, SetRatesUnderMinBitrate) { |
TestVp8Simulcast::DefaultSettings( |
&codec_, static_cast<const int*>(kTestTemporalLayerProfile)); |
+ codec_.codecSpecific.VP8.tl_factory = &tl_factory_; |
codec_.minBitrate = 50; |
codec_.numberOfSimulcastStreams = 1; |
EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); |
+ rate_allocator_.reset(new SimulcastRateAllocator(codec_, nullptr)); |
// Above min should be respected. |
- adapter_->SetRates(100, 30); |
- EXPECT_EQ(100, helper_->factory()->encoders()[0]->last_set_bitrate()); |
+ BitrateAllocation target_bitrate = |
+ rate_allocator_->GetAllocation(codec_.minBitrate * 1000, 30); |
+ adapter_->SetRateAllocation(target_bitrate, 30); |
+ EXPECT_EQ(target_bitrate, |
+ helper_->factory()->encoders()[0]->last_set_bitrate()); |
// Below min but non-zero should be replaced with the min bitrate. |
- adapter_->SetRates(15, 30); |
- EXPECT_EQ(50, helper_->factory()->encoders()[0]->last_set_bitrate()); |
+ BitrateAllocation too_low_bitrate = |
+ rate_allocator_->GetAllocation((codec_.minBitrate - 1) * 1000, 30); |
+ adapter_->SetRateAllocation(too_low_bitrate, 30); |
+ EXPECT_EQ(target_bitrate, |
+ helper_->factory()->encoders()[0]->last_set_bitrate()); |
// Zero should be passed on as is, since it means "pause". |
- adapter_->SetRates(0, 30); |
- EXPECT_EQ(0, helper_->factory()->encoders()[0]->last_set_bitrate()); |
+ adapter_->SetRateAllocation(BitrateAllocation(), 30); |
+ EXPECT_EQ(BitrateAllocation(), |
+ helper_->factory()->encoders()[0]->last_set_bitrate()); |
} |
TEST_F(TestSimulcastEncoderAdapterFake, SupportsImplementationName) { |
EXPECT_STREQ("SimulcastEncoderAdapter", adapter_->ImplementationName()); |
TestVp8Simulcast::DefaultSettings( |
&codec_, static_cast<const int*>(kTestTemporalLayerProfile)); |
+ codec_.codecSpecific.VP8.tl_factory = &tl_factory_; |
std::vector<const char*> encoder_names; |
encoder_names.push_back("codec1"); |
encoder_names.push_back("codec2"); |
@@ -474,6 +484,7 @@ TEST_F(TestSimulcastEncoderAdapterFake, |
SupportsNativeHandleForMultipleStreams) { |
TestVp8Simulcast::DefaultSettings( |
&codec_, static_cast<const int*>(kTestTemporalLayerProfile)); |
+ codec_.codecSpecific.VP8.tl_factory = &tl_factory_; |
codec_.numberOfSimulcastStreams = 3; |
EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); |
adapter_->RegisterEncodeCompleteCallback(this); |
@@ -502,6 +513,7 @@ TEST_F(TestSimulcastEncoderAdapterFake, |
NativeHandleForwardingForMultipleStreams) { |
TestVp8Simulcast::DefaultSettings( |
&codec_, static_cast<const int*>(kTestTemporalLayerProfile)); |
+ codec_.codecSpecific.VP8.tl_factory = &tl_factory_; |
codec_.numberOfSimulcastStreams = 3; |
// High start bitrate, so all streams are enabled. |
codec_.startBitrate = 3000; |
@@ -526,6 +538,7 @@ TEST_F(TestSimulcastEncoderAdapterFake, |
TEST_F(TestSimulcastEncoderAdapterFake, TestFailureReturnCodesFromEncodeCalls) { |
TestVp8Simulcast::DefaultSettings( |
&codec_, static_cast<const int*>(kTestTemporalLayerProfile)); |
+ codec_.codecSpecific.VP8.tl_factory = &tl_factory_; |
codec_.numberOfSimulcastStreams = 3; |
EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); |
adapter_->RegisterEncodeCompleteCallback(this); |