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..84150ee06d48ebedcd84fbd4082aa5d8100fe287 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::CreateVEACb> |
+ create_vea_cbs = CreateVEACbs(); |
+ // Try all possible encoders and use the first successful encoder. |
+ for (size_t i = 0; i < create_vea_cbs.size(); ++i) { |
+ encoder_ = create_vea_cbs[i].Run(); |
+ 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,22 @@ 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::CreateVEACb> |
+ create_vea_cbs = CreateVEACbs(); |
+ |
+ for (size_t i = 0; i < create_vea_cbs.size(); ++i) { |
+ scoped_ptr<media::VideoEncodeAccelerator> encoder = create_vea_cbs[i].Run(); |
+ 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 +196,48 @@ GpuVideoEncodeAccelerator::ConvertMediaToGpuProfiles(const std::vector< |
return profiles; |
} |
+// static |
+std::vector<GpuVideoEncodeAccelerator::CreateVEACb> |
+GpuVideoEncodeAccelerator::CreateVEACbs() { |
+ std::vector<GpuVideoEncodeAccelerator::CreateVEACb> create_vea_cbs; |
piman
2015/01/05 23:50:06
Same wrt static array. They're all static too, so
henryhsu
2015/01/06 08:13:40
For consistency, I remove callback function and re
|
+ create_vea_cbs.push_back(base::Bind( |
+ &GpuVideoEncodeAccelerator::CreateV4L2VEA)); |
+ create_vea_cbs.push_back(base::Bind( |
+ &GpuVideoEncodeAccelerator::CreateVaapiVEA)); |
+ create_vea_cbs.push_back(base::Bind( |
+ &GpuVideoEncodeAccelerator::CreateAndroidVEA)); |
+ return create_vea_cbs; |
+} |
+ |
+// 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(); |