| 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 | 
|---|