| Index: content/common/gpu/media/gpu_video_encode_accelerator.cc
|
| diff --git a/content/common/gpu/media/gpu_video_encode_accelerator.cc b/content/common/gpu/media/gpu_video_encode_accelerator.cc
|
| index 639d1d8ae6af4cf4098825199dc4a0ae174c99e1..77925f4f12823b5f7481742edb203e1ac7d37a7e 100644
|
| --- a/content/common/gpu/media/gpu_video_encode_accelerator.cc
|
| +++ b/content/common/gpu/media/gpu_video_encode_accelerator.cc
|
| @@ -18,13 +18,12 @@
|
| #include "media/base/video_frame.h"
|
|
|
| #if defined(OS_CHROMEOS)
|
| -
|
| -#if defined(ARCH_CPU_ARMEL) && defined(USE_X11)
|
| +#if defined(USE_OZONE) || defined(ARCH_CPU_ARMEL)
|
| #include "content/common/gpu/media/v4l2_video_encode_accelerator.h"
|
| -#elif defined(ARCH_CPU_X86_FAMILY)
|
| +#endif // defined(USE_OZONE) || defined(ARCH_CPU_ARMEL)
|
| +#if defined(ARCH_CPU_X86_FAMILY)
|
| #include "content/common/gpu/media/vaapi_video_encode_accelerator.h"
|
| -#endif
|
| -
|
| +#endif // defined(ARCH_CPU_X86_FAMILY)
|
| #elif defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
|
| #include "content/common/gpu/media/android_video_encode_accelerator.h"
|
| #endif
|
| @@ -94,26 +93,26 @@ void GpuVideoEncodeAccelerator::Initialize(
|
| return;
|
| }
|
|
|
| - encoder_ = CreateEncoder();
|
| - if (!encoder_) {
|
| - DLOG(ERROR)
|
| - << "GpuVideoEncodeAccelerator::Initialize(): VEA creation failed";
|
| - SendCreateEncoderReply(init_done_msg, false);
|
| - return;
|
| - }
|
| - if (!encoder_->Initialize(input_format,
|
| - input_visible_size,
|
| - output_profile,
|
| - initial_bitrate,
|
| - this)) {
|
| - DLOG(ERROR)
|
| - << "GpuVideoEncodeAccelerator::Initialize(): VEA initialization failed";
|
| - SendCreateEncoderReply(init_done_msg, false);
|
| - return;
|
| + std::vector<GpuVideoEncodeAccelerator::CreateVEAFp>
|
| + create_vea_fps = CreateVEAFps();
|
| + // Try all possible encoders and use the first successful encoder.
|
| + for (size_t i = 0; i < create_vea_fps.size(); ++i) {
|
| + encoder_ = (*create_vea_fps[i])();
|
| + if (encoder_ && encoder_->Initialize(input_format,
|
| + input_visible_size,
|
| + output_profile,
|
| + initial_bitrate,
|
| + this)) {
|
| + input_format_ = input_format;
|
| + input_visible_size_ = input_visible_size;
|
| + SendCreateEncoderReply(init_done_msg, true);
|
| + return;
|
| + }
|
| }
|
| - input_format_ = input_format;
|
| - input_visible_size_ = input_visible_size;
|
| - SendCreateEncoderReply(init_done_msg, true);
|
| + encoder_.reset();
|
| + DLOG(ERROR)
|
| + << "GpuVideoEncodeAccelerator::Initialize(): VEA initialization failed";
|
| + SendCreateEncoderReply(init_done_msg, false);
|
| }
|
|
|
| bool GpuVideoEncodeAccelerator::OnMessageReceived(const IPC::Message& message) {
|
| @@ -164,12 +163,23 @@ void GpuVideoEncodeAccelerator::OnWillDestroyStub() {
|
| // static
|
| std::vector<gpu::VideoEncodeAcceleratorSupportedProfile>
|
| GpuVideoEncodeAccelerator::GetSupportedProfiles() {
|
| - scoped_ptr<media::VideoEncodeAccelerator> encoder = CreateEncoder();
|
| - if (!encoder)
|
| - return std::vector<gpu::VideoEncodeAcceleratorSupportedProfile>();
|
| - return ConvertMediaToGpuProfiles(encoder->GetSupportedProfiles());
|
| + std::vector<media::VideoEncodeAccelerator::SupportedProfile> profiles;
|
| + std::vector<GpuVideoEncodeAccelerator::CreateVEAFp>
|
| + create_vea_fps = CreateVEAFps();
|
| +
|
| + for (size_t i = 0; i < create_vea_fps.size(); ++i) {
|
| + scoped_ptr<media::VideoEncodeAccelerator>
|
| + encoder = (*create_vea_fps[i])();
|
| + if (!encoder)
|
| + continue;
|
| + std::vector<media::VideoEncodeAccelerator::SupportedProfile>
|
| + vea_profiles = encoder->GetSupportedProfiles();
|
| + profiles.insert(profiles.end(), vea_profiles.begin(), vea_profiles.end());
|
| + }
|
| + return ConvertMediaToGpuProfiles(profiles);
|
| }
|
|
|
| +// static
|
| std::vector<gpu::VideoEncodeAcceleratorSupportedProfile>
|
| GpuVideoEncodeAccelerator::ConvertMediaToGpuProfiles(const std::vector<
|
| media::VideoEncodeAccelerator::SupportedProfile>& media_profiles) {
|
| @@ -187,20 +197,45 @@ GpuVideoEncodeAccelerator::ConvertMediaToGpuProfiles(const std::vector<
|
| return profiles;
|
| }
|
|
|
| +// static
|
| +std::vector<GpuVideoEncodeAccelerator::CreateVEAFp>
|
| +GpuVideoEncodeAccelerator::CreateVEAFps() {
|
| + std::vector<GpuVideoEncodeAccelerator::CreateVEAFp> create_vea_fps;
|
| + create_vea_fps.push_back(&GpuVideoEncodeAccelerator::CreateV4L2VEA);
|
| + create_vea_fps.push_back(&GpuVideoEncodeAccelerator::CreateVaapiVEA);
|
| + create_vea_fps.push_back(&GpuVideoEncodeAccelerator::CreateAndroidVEA);
|
| + return create_vea_fps;
|
| +}
|
| +
|
| +// static
|
| scoped_ptr<media::VideoEncodeAccelerator>
|
| -GpuVideoEncodeAccelerator::CreateEncoder() {
|
| +GpuVideoEncodeAccelerator::CreateV4L2VEA() {
|
| scoped_ptr<media::VideoEncodeAccelerator> encoder;
|
| -#if defined(OS_CHROMEOS)
|
| -#if defined(ARCH_CPU_ARMEL) && defined(USE_X11)
|
| +#if defined(OS_CHROMEOS) && (defined(USE_OZONE) || defined(ARCH_CPU_ARMEL))
|
| scoped_ptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kEncoder);
|
| if (device)
|
| encoder.reset(new V4L2VideoEncodeAccelerator(device.Pass()));
|
| -#elif defined(ARCH_CPU_X86_FAMILY)
|
| +#endif
|
| + return encoder.Pass();
|
| +}
|
| +
|
| +// static
|
| +scoped_ptr<media::VideoEncodeAccelerator>
|
| +GpuVideoEncodeAccelerator::CreateVaapiVEA() {
|
| + scoped_ptr<media::VideoEncodeAccelerator> encoder;
|
| +#if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY)
|
| const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
|
| if (!cmd_line->HasSwitch(switches::kDisableVaapiAcceleratedVideoEncode))
|
| encoder.reset(new VaapiVideoEncodeAccelerator());
|
| #endif
|
| -#elif defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
|
| + return encoder.Pass();
|
| +}
|
| +
|
| +// static
|
| +scoped_ptr<media::VideoEncodeAccelerator>
|
| +GpuVideoEncodeAccelerator::CreateAndroidVEA() {
|
| + scoped_ptr<media::VideoEncodeAccelerator> encoder;
|
| +#if defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
|
| encoder.reset(new AndroidVideoEncodeAccelerator());
|
| #endif
|
| return encoder.Pass();
|
|
|