| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2017 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 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 }); | 182 }); |
| 183 | 183 |
| 184 // Process all frames. | 184 // Process all frames. |
| 185 int frame_number = 0; | 185 int frame_number = 0; |
| 186 const int num_frames = rate_profile.num_frames; | 186 const int num_frames = rate_profile.num_frames; |
| 187 RTC_DCHECK_GE(num_frames, 1); | 187 RTC_DCHECK_GE(num_frames, 1); |
| 188 while (frame_number < num_frames) { | 188 while (frame_number < num_frames) { |
| 189 // In order to not overwhelm the OpenMAX buffers in the Android | 189 // In order to not overwhelm the OpenMAX buffers in the Android |
| 190 // MediaCodec API, we roughly pace the frames here. The downside | 190 // MediaCodec API, we roughly pace the frames here. The downside |
| 191 // of this is that the encode run will be done in real-time. | 191 // of this is that the encode run will be done in real-time. |
| 192 // TODO(brandtr): Investigate if this is needed on iOS. | 192 #if defined(WEBRTC_ANDROID) |
| 193 if (config_.hw_encoder || config_.hw_decoder) { | 193 if (config_.hw_encoder || config_.hw_decoder) { |
| 194 SleepMs(rtc::kNumMillisecsPerSec / | 194 SleepMs(rtc::kNumMillisecsPerSec / |
| 195 rate_profile.input_frame_rate[rate_update_index]); | 195 rate_profile.input_frame_rate[rate_update_index]); |
| 196 } | 196 } |
| 197 #endif |
| 197 | 198 |
| 198 task_queue.PostTask([this] { processor_->ProcessFrame(); }); | 199 task_queue.PostTask([this] { processor_->ProcessFrame(); }); |
| 199 ++frame_number; | 200 ++frame_number; |
| 200 | 201 |
| 201 if (frame_number == | 202 if (frame_number == |
| 202 rate_profile.frame_index_rate_update[rate_update_index + 1]) { | 203 rate_profile.frame_index_rate_update[rate_update_index + 1]) { |
| 203 ++rate_update_index; | 204 ++rate_update_index; |
| 204 | 205 |
| 205 task_queue.PostTask([this, &rate_profile, rate_update_index] { | 206 task_queue.PostTask([this, &rate_profile, rate_update_index] { |
| 206 processor_->SetRates(rate_profile.target_bit_rate[rate_update_index], | 207 processor_->SetRates(rate_profile.target_bit_rate[rate_update_index], |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 EXPECT_EQ(kVideoCodecH264, config_.codec_settings.codecType) | 296 EXPECT_EQ(kVideoCodecH264, config_.codec_settings.codecType) |
| 296 << "iOS HW codecs only support H264."; | 297 << "iOS HW codecs only support H264."; |
| 297 decoder_factory_ = CreateObjCDecoderFactory(); | 298 decoder_factory_ = CreateObjCDecoderFactory(); |
| 298 #else | 299 #else |
| 299 RTC_NOTREACHED() << "Only support HW decoder on Android and iOS."; | 300 RTC_NOTREACHED() << "Only support HW decoder on Android and iOS."; |
| 300 #endif | 301 #endif |
| 301 } else { | 302 } else { |
| 302 decoder_factory_.reset(new cricket::InternalDecoderFactory()); | 303 decoder_factory_.reset(new cricket::InternalDecoderFactory()); |
| 303 } | 304 } |
| 304 | 305 |
| 305 cricket::VideoCodec encoder_codec; | 306 cricket::VideoCodec codec; |
| 307 cricket::VideoDecoderParams decoder_params; // Empty. |
| 306 switch (config_.codec_settings.codecType) { | 308 switch (config_.codec_settings.codecType) { |
| 307 case kVideoCodecVP8: | 309 case kVideoCodecVP8: |
| 308 encoder_codec = cricket::VideoCodec(cricket::kVp8CodecName); | 310 codec = cricket::VideoCodec(cricket::kVp8CodecName); |
| 309 encoder_.reset(encoder_factory->CreateVideoEncoder(encoder_codec)); | 311 encoder_.reset(encoder_factory->CreateVideoEncoder(codec)); |
| 310 decoder_ = decoder_factory_->CreateVideoDecoder(kVideoCodecVP8); | 312 decoder_ = |
| 313 decoder_factory_->CreateVideoDecoderWithParams(codec, decoder_params); |
| 311 break; | 314 break; |
| 312 case kVideoCodecVP9: | 315 case kVideoCodecVP9: |
| 313 encoder_codec = cricket::VideoCodec(cricket::kVp9CodecName); | 316 codec = cricket::VideoCodec(cricket::kVp9CodecName); |
| 314 encoder_.reset(encoder_factory->CreateVideoEncoder(encoder_codec)); | 317 encoder_.reset(encoder_factory->CreateVideoEncoder(codec)); |
| 315 decoder_ = decoder_factory_->CreateVideoDecoder(kVideoCodecVP9); | 318 decoder_ = |
| 319 decoder_factory_->CreateVideoDecoderWithParams(codec, decoder_params); |
| 316 break; | 320 break; |
| 317 case kVideoCodecH264: | 321 case kVideoCodecH264: |
| 318 // TODO(brandtr): Generalize so that we support multiple profiles here. | 322 // TODO(brandtr): Generalize so that we support multiple profiles here. |
| 319 encoder_codec = cricket::VideoCodec(cricket::kH264CodecName); | 323 codec = cricket::VideoCodec(cricket::kH264CodecName); |
| 320 encoder_.reset(encoder_factory->CreateVideoEncoder(encoder_codec)); | 324 encoder_.reset(encoder_factory->CreateVideoEncoder(codec)); |
| 321 decoder_ = decoder_factory_->CreateVideoDecoder(kVideoCodecH264); | 325 decoder_ = |
| 326 decoder_factory_->CreateVideoDecoderWithParams(codec, decoder_params); |
| 322 break; | 327 break; |
| 323 default: | 328 default: |
| 324 RTC_NOTREACHED(); | 329 RTC_NOTREACHED(); |
| 325 break; | 330 break; |
| 326 } | 331 } |
| 327 | 332 |
| 328 if (config_.sw_fallback_encoder) { | 333 if (config_.sw_fallback_encoder) { |
| 329 encoder_ = rtc::MakeUnique<VideoEncoderSoftwareFallbackWrapper>( | 334 encoder_ = rtc::MakeUnique<VideoEncoderSoftwareFallbackWrapper>( |
| 330 encoder_codec, std::move(encoder_)); | 335 codec, std::move(encoder_)); |
| 331 } | 336 } |
| 332 | 337 |
| 333 EXPECT_TRUE(encoder_) << "Encoder not successfully created."; | 338 EXPECT_TRUE(encoder_) << "Encoder not successfully created."; |
| 334 EXPECT_TRUE(decoder_) << "Decoder not successfully created."; | 339 EXPECT_TRUE(decoder_) << "Decoder not successfully created."; |
| 335 } | 340 } |
| 336 | 341 |
| 337 void VideoProcessorIntegrationTest::DestroyEncoderAndDecoder() { | 342 void VideoProcessorIntegrationTest::DestroyEncoderAndDecoder() { |
| 338 encoder_.reset(); | 343 encoder_.reset(); |
| 339 decoder_factory_->DestroyVideoDecoder(decoder_); | 344 decoder_factory_->DestroyVideoDecoder(decoder_); |
| 340 } | 345 } |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 perc_encoding_rate_mismatch_ = 0.0f; | 648 perc_encoding_rate_mismatch_ = 0.0f; |
| 644 num_frames_to_hit_target_ = | 649 num_frames_to_hit_target_ = |
| 645 rate_profile.frame_index_rate_update[rate_update_index + 1]; | 650 rate_profile.frame_index_rate_update[rate_update_index + 1]; |
| 646 encoding_rate_within_target_ = false; | 651 encoding_rate_within_target_ = false; |
| 647 sum_key_frame_size_mismatch_ = 0.0; | 652 sum_key_frame_size_mismatch_ = 0.0; |
| 648 num_key_frames_ = 0; | 653 num_key_frames_ = 0; |
| 649 } | 654 } |
| 650 | 655 |
| 651 } // namespace test | 656 } // namespace test |
| 652 } // namespace webrtc | 657 } // namespace webrtc |
| OLD | NEW |