| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 const int kDefaultMinPixelsPerFrame = 320 * 180; | 32 const int kDefaultMinPixelsPerFrame = 320 * 180; |
| 33 } // namespace | 33 } // namespace |
| 34 | 34 |
| 35 class VideoEncoderSoftwareFallbackWrapperTest : public ::testing::Test { | 35 class VideoEncoderSoftwareFallbackWrapperTest : public ::testing::Test { |
| 36 protected: | 36 protected: |
| 37 VideoEncoderSoftwareFallbackWrapperTest() | 37 VideoEncoderSoftwareFallbackWrapperTest() |
| 38 : VideoEncoderSoftwareFallbackWrapperTest("") {} | 38 : VideoEncoderSoftwareFallbackWrapperTest("") {} |
| 39 explicit VideoEncoderSoftwareFallbackWrapperTest( | 39 explicit VideoEncoderSoftwareFallbackWrapperTest( |
| 40 const std::string& field_trials) | 40 const std::string& field_trials) |
| 41 : override_field_trials_(field_trials), | 41 : override_field_trials_(field_trials), |
| 42 fallback_wrapper_(cricket::VideoCodec("VP8"), &fake_encoder_) {} | 42 fake_encoder_(new CountingFakeEncoder()), |
| 43 fallback_wrapper_(cricket::VideoCodec("VP8"), |
| 44 std::unique_ptr<VideoEncoder>(fake_encoder_)) {} |
| 43 | 45 |
| 44 class CountingFakeEncoder : public VideoEncoder { | 46 class CountingFakeEncoder : public VideoEncoder { |
| 45 public: | 47 public: |
| 46 int32_t InitEncode(const VideoCodec* codec_settings, | 48 int32_t InitEncode(const VideoCodec* codec_settings, |
| 47 int32_t number_of_cores, | 49 int32_t number_of_cores, |
| 48 size_t max_payload_size) override { | 50 size_t max_payload_size) override { |
| 49 ++init_encode_count_; | 51 ++init_encode_count_; |
| 50 return init_encode_return_code_; | 52 return init_encode_return_code_; |
| 51 } | 53 } |
| 52 int32_t Encode(const VideoFrame& frame, | 54 int32_t Encode(const VideoFrame& frame, |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 void UtilizeFallbackEncoder(); | 129 void UtilizeFallbackEncoder(); |
| 128 void FallbackFromEncodeRequest(); | 130 void FallbackFromEncodeRequest(); |
| 129 void EncodeFrame(); | 131 void EncodeFrame(); |
| 130 void EncodeFrame(int expected_ret); | 132 void EncodeFrame(int expected_ret); |
| 131 void CheckLastEncoderName(const char* expected_name) { | 133 void CheckLastEncoderName(const char* expected_name) { |
| 132 EXPECT_STREQ(expected_name, callback_.last_codec_name_.c_str()); | 134 EXPECT_STREQ(expected_name, callback_.last_codec_name_.c_str()); |
| 133 } | 135 } |
| 134 | 136 |
| 135 test::ScopedFieldTrials override_field_trials_; | 137 test::ScopedFieldTrials override_field_trials_; |
| 136 FakeEncodedImageCallback callback_; | 138 FakeEncodedImageCallback callback_; |
| 137 CountingFakeEncoder fake_encoder_; | 139 // |fake_encoder_| is owned and released by |fallback_wrapper_|. |
| 140 CountingFakeEncoder* fake_encoder_; |
| 138 VideoEncoderSoftwareFallbackWrapper fallback_wrapper_; | 141 VideoEncoderSoftwareFallbackWrapper fallback_wrapper_; |
| 139 VideoCodec codec_ = {}; | 142 VideoCodec codec_ = {}; |
| 140 std::unique_ptr<VideoFrame> frame_; | 143 std::unique_ptr<VideoFrame> frame_; |
| 141 std::unique_ptr<SimulcastRateAllocator> rate_allocator_; | 144 std::unique_ptr<SimulcastRateAllocator> rate_allocator_; |
| 142 }; | 145 }; |
| 143 | 146 |
| 144 void VideoEncoderSoftwareFallbackWrapperTest::EncodeFrame() { | 147 void VideoEncoderSoftwareFallbackWrapperTest::EncodeFrame() { |
| 145 EncodeFrame(WEBRTC_VIDEO_CODEC_OK); | 148 EncodeFrame(WEBRTC_VIDEO_CODEC_OK); |
| 146 } | 149 } |
| 147 | 150 |
| 148 void VideoEncoderSoftwareFallbackWrapperTest::EncodeFrame(int expected_ret) { | 151 void VideoEncoderSoftwareFallbackWrapperTest::EncodeFrame(int expected_ret) { |
| 149 rtc::scoped_refptr<I420Buffer> buffer = | 152 rtc::scoped_refptr<I420Buffer> buffer = |
| 150 I420Buffer::Create(codec_.width, codec_.height); | 153 I420Buffer::Create(codec_.width, codec_.height); |
| 151 I420Buffer::SetBlack(buffer); | 154 I420Buffer::SetBlack(buffer); |
| 152 std::vector<FrameType> types(1, kVideoFrameKey); | 155 std::vector<FrameType> types(1, kVideoFrameKey); |
| 153 | 156 |
| 154 frame_.reset(new VideoFrame(buffer, 0, 0, webrtc::kVideoRotation_0)); | 157 frame_.reset(new VideoFrame(buffer, 0, 0, webrtc::kVideoRotation_0)); |
| 155 EXPECT_EQ(expected_ret, fallback_wrapper_.Encode(*frame_, nullptr, &types)); | 158 EXPECT_EQ(expected_ret, fallback_wrapper_.Encode(*frame_, nullptr, &types)); |
| 156 } | 159 } |
| 157 | 160 |
| 158 void VideoEncoderSoftwareFallbackWrapperTest::UtilizeFallbackEncoder() { | 161 void VideoEncoderSoftwareFallbackWrapperTest::UtilizeFallbackEncoder() { |
| 159 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_); | 162 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_); |
| 160 EXPECT_EQ(&callback_, fake_encoder_.encode_complete_callback_); | 163 EXPECT_EQ(&callback_, fake_encoder_->encode_complete_callback_); |
| 161 | 164 |
| 162 // Register with failing fake encoder. Should succeed with VP8 fallback. | 165 // Register with failing fake encoder. Should succeed with VP8 fallback. |
| 163 codec_.codecType = kVideoCodecVP8; | 166 codec_.codecType = kVideoCodecVP8; |
| 164 codec_.maxFramerate = kFramerate; | 167 codec_.maxFramerate = kFramerate; |
| 165 codec_.width = kWidth; | 168 codec_.width = kWidth; |
| 166 codec_.height = kHeight; | 169 codec_.height = kHeight; |
| 167 codec_.VP8()->numberOfTemporalLayers = 1; | 170 codec_.VP8()->numberOfTemporalLayers = 1; |
| 168 std::unique_ptr<TemporalLayersFactory> tl_factory( | 171 std::unique_ptr<TemporalLayersFactory> tl_factory( |
| 169 new TemporalLayersFactory()); | 172 new TemporalLayersFactory()); |
| 170 codec_.VP8()->tl_factory = tl_factory.get(); | 173 codec_.VP8()->tl_factory = tl_factory.get(); |
| 171 rate_allocator_.reset( | 174 rate_allocator_.reset( |
| 172 new SimulcastRateAllocator(codec_, std::move(tl_factory))); | 175 new SimulcastRateAllocator(codec_, std::move(tl_factory))); |
| 173 | 176 |
| 174 fake_encoder_.init_encode_return_code_ = WEBRTC_VIDEO_CODEC_ERROR; | 177 fake_encoder_->init_encode_return_code_ = WEBRTC_VIDEO_CODEC_ERROR; |
| 175 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, | 178 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, |
| 176 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); | 179 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); |
| 177 EXPECT_EQ( | 180 EXPECT_EQ( |
| 178 WEBRTC_VIDEO_CODEC_OK, | 181 WEBRTC_VIDEO_CODEC_OK, |
| 179 fallback_wrapper_.SetRateAllocation( | 182 fallback_wrapper_.SetRateAllocation( |
| 180 rate_allocator_->GetAllocation(300000, kFramerate), kFramerate)); | 183 rate_allocator_->GetAllocation(300000, kFramerate), kFramerate)); |
| 181 | 184 |
| 182 int callback_count = callback_.callback_count_; | 185 int callback_count = callback_.callback_count_; |
| 183 int encode_count = fake_encoder_.encode_count_; | 186 int encode_count = fake_encoder_->encode_count_; |
| 184 EncodeFrame(); | 187 EncodeFrame(); |
| 185 EXPECT_EQ(encode_count, fake_encoder_.encode_count_); | 188 EXPECT_EQ(encode_count, fake_encoder_->encode_count_); |
| 186 EXPECT_EQ(callback_count + 1, callback_.callback_count_); | 189 EXPECT_EQ(callback_count + 1, callback_.callback_count_); |
| 187 } | 190 } |
| 188 | 191 |
| 189 void VideoEncoderSoftwareFallbackWrapperTest::FallbackFromEncodeRequest() { | 192 void VideoEncoderSoftwareFallbackWrapperTest::FallbackFromEncodeRequest() { |
| 190 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_); | 193 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_); |
| 191 codec_.codecType = kVideoCodecVP8; | 194 codec_.codecType = kVideoCodecVP8; |
| 192 codec_.maxFramerate = kFramerate; | 195 codec_.maxFramerate = kFramerate; |
| 193 codec_.width = kWidth; | 196 codec_.width = kWidth; |
| 194 codec_.height = kHeight; | 197 codec_.height = kHeight; |
| 195 codec_.VP8()->numberOfTemporalLayers = 1; | 198 codec_.VP8()->numberOfTemporalLayers = 1; |
| 196 std::unique_ptr<TemporalLayersFactory> tl_factory( | 199 std::unique_ptr<TemporalLayersFactory> tl_factory( |
| 197 new TemporalLayersFactory()); | 200 new TemporalLayersFactory()); |
| 198 codec_.VP8()->tl_factory = tl_factory.get(); | 201 codec_.VP8()->tl_factory = tl_factory.get(); |
| 199 rate_allocator_.reset( | 202 rate_allocator_.reset( |
| 200 new SimulcastRateAllocator(codec_, std::move(tl_factory))); | 203 new SimulcastRateAllocator(codec_, std::move(tl_factory))); |
| 201 fallback_wrapper_.InitEncode(&codec_, 2, kMaxPayloadSize); | 204 fallback_wrapper_.InitEncode(&codec_, 2, kMaxPayloadSize); |
| 202 EXPECT_EQ( | 205 EXPECT_EQ( |
| 203 WEBRTC_VIDEO_CODEC_OK, | 206 WEBRTC_VIDEO_CODEC_OK, |
| 204 fallback_wrapper_.SetRateAllocation( | 207 fallback_wrapper_.SetRateAllocation( |
| 205 rate_allocator_->GetAllocation(300000, kFramerate), kFramerate)); | 208 rate_allocator_->GetAllocation(300000, kFramerate), kFramerate)); |
| 206 EXPECT_EQ(1, fake_encoder_.init_encode_count_); | 209 EXPECT_EQ(1, fake_encoder_->init_encode_count_); |
| 207 | 210 |
| 208 // Have the non-fallback encoder request a software fallback. | 211 // Have the non-fallback encoder request a software fallback. |
| 209 fake_encoder_.encode_return_code_ = WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE; | 212 fake_encoder_->encode_return_code_ = WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE; |
| 210 int callback_count = callback_.callback_count_; | 213 int callback_count = callback_.callback_count_; |
| 211 int encode_count = fake_encoder_.encode_count_; | 214 int encode_count = fake_encoder_->encode_count_; |
| 212 EncodeFrame(); | 215 EncodeFrame(); |
| 213 // Single encode request, which returned failure. | 216 // Single encode request, which returned failure. |
| 214 EXPECT_EQ(encode_count + 1, fake_encoder_.encode_count_); | 217 EXPECT_EQ(encode_count + 1, fake_encoder_->encode_count_); |
| 215 EXPECT_EQ(callback_count + 1, callback_.callback_count_); | 218 EXPECT_EQ(callback_count + 1, callback_.callback_count_); |
| 216 } | 219 } |
| 217 | 220 |
| 218 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, InitializesEncoder) { | 221 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, InitializesEncoder) { |
| 219 VideoCodec codec = {}; | 222 VideoCodec codec = {}; |
| 220 fallback_wrapper_.InitEncode(&codec, 2, kMaxPayloadSize); | 223 fallback_wrapper_.InitEncode(&codec, 2, kMaxPayloadSize); |
| 221 EXPECT_EQ(1, fake_encoder_.init_encode_count_); | 224 EXPECT_EQ(1, fake_encoder_->init_encode_count_); |
| 222 } | 225 } |
| 223 | 226 |
| 224 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, EncodeRequestsFallback) { | 227 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, EncodeRequestsFallback) { |
| 225 FallbackFromEncodeRequest(); | 228 FallbackFromEncodeRequest(); |
| 226 // After fallback, further encodes shouldn't hit the fake encoder. | 229 // After fallback, further encodes shouldn't hit the fake encoder. |
| 227 int encode_count = fake_encoder_.encode_count_; | 230 int encode_count = fake_encoder_->encode_count_; |
| 228 EncodeFrame(); | 231 EncodeFrame(); |
| 229 EXPECT_EQ(encode_count, fake_encoder_.encode_count_); | 232 EXPECT_EQ(encode_count, fake_encoder_->encode_count_); |
| 230 } | 233 } |
| 231 | 234 |
| 232 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, CanUtilizeFallbackEncoder) { | 235 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, CanUtilizeFallbackEncoder) { |
| 233 UtilizeFallbackEncoder(); | 236 UtilizeFallbackEncoder(); |
| 234 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); | 237 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); |
| 235 } | 238 } |
| 236 | 239 |
| 237 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, | 240 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, |
| 238 InternalEncoderReleasedDuringFallback) { | 241 InternalEncoderReleasedDuringFallback) { |
| 239 EXPECT_EQ(0, fake_encoder_.release_count_); | 242 EXPECT_EQ(0, fake_encoder_->release_count_); |
| 240 UtilizeFallbackEncoder(); | 243 UtilizeFallbackEncoder(); |
| 241 EXPECT_EQ(1, fake_encoder_.release_count_); | 244 EXPECT_EQ(1, fake_encoder_->release_count_); |
| 242 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); | 245 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); |
| 243 // No extra release when the fallback is released. | 246 // No extra release when the fallback is released. |
| 244 EXPECT_EQ(1, fake_encoder_.release_count_); | 247 EXPECT_EQ(1, fake_encoder_->release_count_); |
| 245 } | 248 } |
| 246 | 249 |
| 247 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, | 250 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, |
| 248 InternalEncoderNotEncodingDuringFallback) { | 251 InternalEncoderNotEncodingDuringFallback) { |
| 249 UtilizeFallbackEncoder(); | 252 UtilizeFallbackEncoder(); |
| 250 int encode_count = fake_encoder_.encode_count_; | 253 int encode_count = fake_encoder_->encode_count_; |
| 251 EncodeFrame(); | 254 EncodeFrame(); |
| 252 EXPECT_EQ(encode_count, fake_encoder_.encode_count_); | 255 EXPECT_EQ(encode_count, fake_encoder_->encode_count_); |
| 253 | 256 |
| 254 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); | 257 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); |
| 255 } | 258 } |
| 256 | 259 |
| 257 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, | 260 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, |
| 258 CanRegisterCallbackWhileUsingFallbackEncoder) { | 261 CanRegisterCallbackWhileUsingFallbackEncoder) { |
| 259 UtilizeFallbackEncoder(); | 262 UtilizeFallbackEncoder(); |
| 260 // Registering an encode-complete callback should still work when fallback | 263 // Registering an encode-complete callback should still work when fallback |
| 261 // encoder is being used. | 264 // encoder is being used. |
| 262 FakeEncodedImageCallback callback2; | 265 FakeEncodedImageCallback callback2; |
| 263 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback2); | 266 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback2); |
| 264 EXPECT_EQ(&callback2, fake_encoder_.encode_complete_callback_); | 267 EXPECT_EQ(&callback2, fake_encoder_->encode_complete_callback_); |
| 265 | 268 |
| 266 // Encoding a frame using the fallback should arrive at the new callback. | 269 // Encoding a frame using the fallback should arrive at the new callback. |
| 267 std::vector<FrameType> types(1, kVideoFrameKey); | 270 std::vector<FrameType> types(1, kVideoFrameKey); |
| 268 frame_->set_timestamp(frame_->timestamp() + 1000); | 271 frame_->set_timestamp(frame_->timestamp() + 1000); |
| 269 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, | 272 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, |
| 270 fallback_wrapper_.Encode(*frame_, nullptr, &types)); | 273 fallback_wrapper_.Encode(*frame_, nullptr, &types)); |
| 271 | 274 |
| 272 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); | 275 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); |
| 273 } | 276 } |
| 274 | 277 |
| 275 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, | 278 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, |
| 276 SetChannelParametersForwardedDuringFallback) { | 279 SetChannelParametersForwardedDuringFallback) { |
| 277 UtilizeFallbackEncoder(); | 280 UtilizeFallbackEncoder(); |
| 278 EXPECT_EQ(0, fake_encoder_.set_channel_parameters_count_); | 281 EXPECT_EQ(0, fake_encoder_->set_channel_parameters_count_); |
| 279 fallback_wrapper_.SetChannelParameters(1, 1); | 282 fallback_wrapper_.SetChannelParameters(1, 1); |
| 280 EXPECT_EQ(1, fake_encoder_.set_channel_parameters_count_); | 283 EXPECT_EQ(1, fake_encoder_->set_channel_parameters_count_); |
| 281 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); | 284 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); |
| 282 } | 285 } |
| 283 | 286 |
| 284 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, | 287 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, |
| 285 SetRatesForwardedDuringFallback) { | 288 SetRatesForwardedDuringFallback) { |
| 286 UtilizeFallbackEncoder(); | 289 UtilizeFallbackEncoder(); |
| 287 EXPECT_EQ(1, fake_encoder_.set_rates_count_); | 290 EXPECT_EQ(1, fake_encoder_->set_rates_count_); |
| 288 fallback_wrapper_.SetRateAllocation(BitrateAllocation(), 1); | 291 fallback_wrapper_.SetRateAllocation(BitrateAllocation(), 1); |
| 289 EXPECT_EQ(2, fake_encoder_.set_rates_count_); | 292 EXPECT_EQ(2, fake_encoder_->set_rates_count_); |
| 290 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); | 293 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); |
| 291 } | 294 } |
| 292 | 295 |
| 293 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, | 296 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, |
| 294 SupportsNativeHandleForwardedWithoutFallback) { | 297 SupportsNativeHandleForwardedWithoutFallback) { |
| 295 fallback_wrapper_.SupportsNativeHandle(); | 298 fallback_wrapper_.SupportsNativeHandle(); |
| 296 EXPECT_EQ(1, fake_encoder_.supports_native_handle_count_); | 299 EXPECT_EQ(1, fake_encoder_->supports_native_handle_count_); |
| 297 } | 300 } |
| 298 | 301 |
| 299 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, | 302 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, |
| 300 SupportsNativeHandleNotForwardedDuringFallback) { | 303 SupportsNativeHandleNotForwardedDuringFallback) { |
| 301 UtilizeFallbackEncoder(); | 304 UtilizeFallbackEncoder(); |
| 302 fallback_wrapper_.SupportsNativeHandle(); | 305 fallback_wrapper_.SupportsNativeHandle(); |
| 303 EXPECT_EQ(0, fake_encoder_.supports_native_handle_count_); | 306 EXPECT_EQ(0, fake_encoder_->supports_native_handle_count_); |
| 304 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); | 307 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); |
| 305 } | 308 } |
| 306 | 309 |
| 307 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, ReportsImplementationName) { | 310 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, ReportsImplementationName) { |
| 308 codec_.width = kWidth; | 311 codec_.width = kWidth; |
| 309 codec_.height = kHeight; | 312 codec_.height = kHeight; |
| 310 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_); | 313 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_); |
| 311 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize); | 314 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize); |
| 312 EncodeFrame(); | 315 EncodeFrame(); |
| 313 CheckLastEncoderName("fake-encoder"); | 316 CheckLastEncoderName("fake-encoder"); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 336 : VideoEncoderSoftwareFallbackWrapperTest(field_trials) {} | 339 : VideoEncoderSoftwareFallbackWrapperTest(field_trials) {} |
| 337 | 340 |
| 338 ~ForcedFallbackTest() override {} | 341 ~ForcedFallbackTest() override {} |
| 339 | 342 |
| 340 protected: | 343 protected: |
| 341 void SetUp() override { | 344 void SetUp() override { |
| 342 clock_.SetTimeMicros(1234); | 345 clock_.SetTimeMicros(1234); |
| 343 ConfigureVp8Codec(); | 346 ConfigureVp8Codec(); |
| 344 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.InitEncode( | 347 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.InitEncode( |
| 345 &codec_, kNumCores, kMaxPayloadSize)); | 348 &codec_, kNumCores, kMaxPayloadSize)); |
| 346 EXPECT_EQ(1, fake_encoder_.init_encode_count_); | 349 EXPECT_EQ(1, fake_encoder_->init_encode_count_); |
| 347 } | 350 } |
| 348 | 351 |
| 349 void TearDown() override { | 352 void TearDown() override { |
| 350 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); | 353 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); |
| 351 } | 354 } |
| 352 | 355 |
| 353 void ConfigureVp8Codec() { | 356 void ConfigureVp8Codec() { |
| 354 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_); | 357 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_); |
| 355 std::unique_ptr<TemporalLayersFactory> tl_factory( | 358 std::unique_ptr<TemporalLayersFactory> tl_factory( |
| 356 new TemporalLayersFactory()); | 359 new TemporalLayersFactory()); |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 // Duration passed, expect fallback. | 505 // Duration passed, expect fallback. |
| 503 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); | 506 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); |
| 504 EncodeFrameAndVerifyLastName("libvpx"); | 507 EncodeFrameAndVerifyLastName("libvpx"); |
| 505 // Bitrate at high threshold, expect fallback ended. | 508 // Bitrate at high threshold, expect fallback ended. |
| 506 SetRateAllocation(kHighKbps); | 509 SetRateAllocation(kHighKbps); |
| 507 EncodeFrameAndVerifyLastName("fake-encoder"); | 510 EncodeFrameAndVerifyLastName("fake-encoder"); |
| 508 } | 511 } |
| 509 } | 512 } |
| 510 | 513 |
| 511 TEST_F(ForcedFallbackTestEnabled, DropsFirstNonNativeFrameAfterFallbackEnds) { | 514 TEST_F(ForcedFallbackTestEnabled, DropsFirstNonNativeFrameAfterFallbackEnds) { |
| 512 fake_encoder_.supports_native_handle_ = true; | 515 fake_encoder_->supports_native_handle_ = true; |
| 513 | 516 |
| 514 // Bitrate at low threshold. | 517 // Bitrate at low threshold. |
| 515 SetRateAllocation(kLowKbps); | 518 SetRateAllocation(kLowKbps); |
| 516 EncodeFrameAndVerifyLastName("fake-encoder"); | 519 EncodeFrameAndVerifyLastName("fake-encoder"); |
| 517 // Duration passed, expect fallback. | 520 // Duration passed, expect fallback. |
| 518 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); | 521 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); |
| 519 EncodeFrameAndVerifyLastName("libvpx"); | 522 EncodeFrameAndVerifyLastName("libvpx"); |
| 520 // Bitrate at high threshold, fallback should be ended but first non-native | 523 // Bitrate at high threshold, fallback should be ended but first non-native |
| 521 // frame dropped (i.e. frame not encoded). | 524 // frame dropped (i.e. frame not encoded). |
| 522 SetRateAllocation(kHighKbps); | 525 SetRateAllocation(kHighKbps); |
| 523 EncodeFrameAndVerifyLastName("libvpx", WEBRTC_VIDEO_CODEC_ERROR); | 526 EncodeFrameAndVerifyLastName("libvpx", WEBRTC_VIDEO_CODEC_ERROR); |
| 524 // Next frame should be encoded. | 527 // Next frame should be encoded. |
| 525 EncodeFrameAndVerifyLastName("fake-encoder"); | 528 EncodeFrameAndVerifyLastName("fake-encoder"); |
| 526 } | 529 } |
| 527 | 530 |
| 528 TEST_F(ForcedFallbackTestEnabled, FallbackIsKeptWhenInitEncodeIsCalled) { | 531 TEST_F(ForcedFallbackTestEnabled, FallbackIsKeptWhenInitEncodeIsCalled) { |
| 529 // Bitrate below low threshold. | 532 // Bitrate below low threshold. |
| 530 SetRateAllocation(kLowKbps - 1); | 533 SetRateAllocation(kLowKbps - 1); |
| 531 EncodeFrameAndVerifyLastName("fake-encoder"); | 534 EncodeFrameAndVerifyLastName("fake-encoder"); |
| 532 // Duration passed, expect fallback. | 535 // Duration passed, expect fallback. |
| 533 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); | 536 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); |
| 534 EncodeFrameAndVerifyLastName("libvpx"); | 537 EncodeFrameAndVerifyLastName("libvpx"); |
| 535 | 538 |
| 536 // Re-initialize encoder, still expect fallback. | 539 // Re-initialize encoder, still expect fallback. |
| 537 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, | 540 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, |
| 538 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); | 541 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); |
| 539 EXPECT_EQ(1, fake_encoder_.init_encode_count_); // No change. | 542 EXPECT_EQ(1, fake_encoder_->init_encode_count_); // No change. |
| 540 SetRateAllocation(kLowKbps); | 543 SetRateAllocation(kLowKbps); |
| 541 EncodeFrameAndVerifyLastName("libvpx"); | 544 EncodeFrameAndVerifyLastName("libvpx"); |
| 542 } | 545 } |
| 543 | 546 |
| 544 TEST_F(ForcedFallbackTestEnabled, FallbackIsEndedWhenResolutionIsTooLarge) { | 547 TEST_F(ForcedFallbackTestEnabled, FallbackIsEndedWhenResolutionIsTooLarge) { |
| 545 // Bitrate below low threshold. | 548 // Bitrate below low threshold. |
| 546 SetRateAllocation(kLowKbps - 1); | 549 SetRateAllocation(kLowKbps - 1); |
| 547 EncodeFrameAndVerifyLastName("fake-encoder"); | 550 EncodeFrameAndVerifyLastName("fake-encoder"); |
| 548 // Duration passed, expect fallback. | 551 // Duration passed, expect fallback. |
| 549 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); | 552 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); |
| 550 EncodeFrameAndVerifyLastName("libvpx"); | 553 EncodeFrameAndVerifyLastName("libvpx"); |
| 551 | 554 |
| 552 // Re-initialize encoder with a larger resolution, expect no fallback. | 555 // Re-initialize encoder with a larger resolution, expect no fallback. |
| 553 codec_.width += 1; | 556 codec_.width += 1; |
| 554 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, | 557 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, |
| 555 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); | 558 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); |
| 556 EXPECT_EQ(2, fake_encoder_.init_encode_count_); | 559 EXPECT_EQ(2, fake_encoder_->init_encode_count_); |
| 557 SetRateAllocation(kLowKbps); | 560 SetRateAllocation(kLowKbps); |
| 558 EncodeFrameAndVerifyLastName("fake-encoder"); | 561 EncodeFrameAndVerifyLastName("fake-encoder"); |
| 559 } | 562 } |
| 560 | 563 |
| 561 TEST_F(ForcedFallbackTestEnabled, FallbackIsEndedForNonValidSettings) { | 564 TEST_F(ForcedFallbackTestEnabled, FallbackIsEndedForNonValidSettings) { |
| 562 // Bitrate below low threshold. | 565 // Bitrate below low threshold. |
| 563 SetRateAllocation(kLowKbps - 1); | 566 SetRateAllocation(kLowKbps - 1); |
| 564 EncodeFrameAndVerifyLastName("fake-encoder"); | 567 EncodeFrameAndVerifyLastName("fake-encoder"); |
| 565 // Duration passed, expect fallback. | 568 // Duration passed, expect fallback. |
| 566 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); | 569 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); |
| 567 EncodeFrameAndVerifyLastName("libvpx"); | 570 EncodeFrameAndVerifyLastName("libvpx"); |
| 568 | 571 |
| 569 // Re-initialize encoder with invalid setting, expect no fallback. | 572 // Re-initialize encoder with invalid setting, expect no fallback. |
| 570 codec_.VP8()->numberOfTemporalLayers = 2; | 573 codec_.VP8()->numberOfTemporalLayers = 2; |
| 571 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, | 574 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, |
| 572 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); | 575 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); |
| 573 EXPECT_EQ(2, fake_encoder_.init_encode_count_); | 576 EXPECT_EQ(2, fake_encoder_->init_encode_count_); |
| 574 SetRateAllocation(kLowKbps); | 577 SetRateAllocation(kLowKbps); |
| 575 EncodeFrameAndVerifyLastName("fake-encoder"); | 578 EncodeFrameAndVerifyLastName("fake-encoder"); |
| 576 | 579 |
| 577 // Re-initialize encoder with valid setting but fallback disabled from now on. | 580 // Re-initialize encoder with valid setting but fallback disabled from now on. |
| 578 codec_.VP8()->numberOfTemporalLayers = 1; | 581 codec_.VP8()->numberOfTemporalLayers = 1; |
| 579 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, | 582 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, |
| 580 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); | 583 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); |
| 581 EXPECT_EQ(3, fake_encoder_.init_encode_count_); | 584 EXPECT_EQ(3, fake_encoder_->init_encode_count_); |
| 582 // Bitrate at low threshold. | 585 // Bitrate at low threshold. |
| 583 SetRateAllocation(kLowKbps); | 586 SetRateAllocation(kLowKbps); |
| 584 EncodeFrameAndVerifyLastName("fake-encoder"); | 587 EncodeFrameAndVerifyLastName("fake-encoder"); |
| 585 // Duration passed, expect no fallback. | 588 // Duration passed, expect no fallback. |
| 586 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); | 589 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); |
| 587 EncodeFrameAndVerifyLastName("fake-encoder"); | 590 EncodeFrameAndVerifyLastName("fake-encoder"); |
| 588 } | 591 } |
| 589 | 592 |
| 590 TEST_F(ForcedFallbackTestEnabled, GetScaleSettingsWithoutFallback) { | 593 TEST_F(ForcedFallbackTestEnabled, GetScaleSettingsWithoutFallback) { |
| 591 // Bitrate at low threshold. | 594 // Bitrate at low threshold. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 615 SetRateAllocation(kLowKbps); | 618 SetRateAllocation(kLowKbps); |
| 616 EncodeFrameAndVerifyLastName("fake-encoder"); | 619 EncodeFrameAndVerifyLastName("fake-encoder"); |
| 617 // Duration passed, expect fallback. | 620 // Duration passed, expect fallback. |
| 618 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); | 621 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); |
| 619 EncodeFrameAndVerifyLastName("libvpx"); | 622 EncodeFrameAndVerifyLastName("libvpx"); |
| 620 | 623 |
| 621 // Re-initialize encoder with a resolution less than |kMinPixelsStop|. | 624 // Re-initialize encoder with a resolution less than |kMinPixelsStop|. |
| 622 codec_.height = kMinPixelsStop / codec_.width - 1; | 625 codec_.height = kMinPixelsStop / codec_.width - 1; |
| 623 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, | 626 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, |
| 624 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); | 627 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); |
| 625 EXPECT_EQ(1, fake_encoder_.init_encode_count_); // No change | 628 EXPECT_EQ(1, fake_encoder_->init_encode_count_); // No change |
| 626 SetRateAllocation(kHighKbps - 1); | 629 SetRateAllocation(kHighKbps - 1); |
| 627 EncodeFrameAndVerifyLastName("libvpx"); | 630 EncodeFrameAndVerifyLastName("libvpx"); |
| 628 // Bitrate at high threshold but resolution too small for fallback to end. | 631 // Bitrate at high threshold but resolution too small for fallback to end. |
| 629 SetRateAllocation(kHighKbps); | 632 SetRateAllocation(kHighKbps); |
| 630 EncodeFrameAndVerifyLastName("libvpx"); | 633 EncodeFrameAndVerifyLastName("libvpx"); |
| 631 | 634 |
| 632 // Re-initialize encoder with a resolution equal to |kMinPixelsStop|. | 635 // Re-initialize encoder with a resolution equal to |kMinPixelsStop|. |
| 633 codec_.height++; | 636 codec_.height++; |
| 634 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, | 637 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, |
| 635 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); | 638 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); |
| 636 EXPECT_EQ(1, fake_encoder_.init_encode_count_); // No change | 639 EXPECT_EQ(1, fake_encoder_->init_encode_count_); // No change |
| 637 SetRateAllocation(kHighKbps - 1); | 640 SetRateAllocation(kHighKbps - 1); |
| 638 EncodeFrameAndVerifyLastName("libvpx"); | 641 EncodeFrameAndVerifyLastName("libvpx"); |
| 639 // Bitrate at high threshold and resolution large enough for fallback to end. | 642 // Bitrate at high threshold and resolution large enough for fallback to end. |
| 640 SetRateAllocation(kHighKbps); | 643 SetRateAllocation(kHighKbps); |
| 641 EncodeFrameAndVerifyLastName("fake-encoder"); | 644 EncodeFrameAndVerifyLastName("fake-encoder"); |
| 642 } | 645 } |
| 643 | 646 |
| 644 } // namespace webrtc | 647 } // namespace webrtc |
| OLD | NEW |