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 |