Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(136)

Unified Diff: content/common/gpu/media/gpu_video_encode_accelerator.cc

Issue 826663002: Support multiple video decoders and encoders (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address patch set 4 review comments Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 12b473fcce23a5bd61f98c28a9b98d5e6419475e..91c181bca36d9906a72a083d5391c3af170ab5cf 100644
--- a/content/common/gpu/media/gpu_video_encode_accelerator.cc
+++ b/content/common/gpu/media/gpu_video_encode_accelerator.cc
@@ -22,6 +22,7 @@
#if defined(ARCH_CPU_ARMEL)
#include "content/common/gpu/media/v4l2_video_encode_accelerator.h"
#elif defined(ARCH_CPU_X86_FAMILY)
+#include "content/common/gpu/media/v4l2_video_encode_accelerator.h"
#include "content/common/gpu/media/vaapi_video_encode_accelerator.h"
#include "ui/gfx/x/x11_types.h"
#endif
@@ -95,26 +96,32 @@ void GpuVideoEncodeAccelerator::Initialize(
return;
}
- encoder_ = CreateEncoder();
- if (!encoder_) {
+ scoped_ptr<media::VideoEncodeAccelerator> encoders[2] = {
+ CreateDefaultEncoder(), CreateVaapiEncoder()
Pawel Osciak 2014/12/30 06:14:38 Oh, this is not a bad idea! But I'd instead have a
henryhsu 2014/12/30 14:40:51 Good idea!
+ };
+ if (!encoders[0] && !encoders[1]) {
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;
+ // Try all possible encoders and use the first successful encoder.
+ for (size_t i = 0; i < 2; ++i) {
+ if (encoders[i] && encoders[i]->Initialize(input_format,
+ input_visible_size,
+ output_profile,
+ initial_bitrate,
+ this)) {
+ encoder_ = encoders[i].Pass();
+ 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);
+ DLOG(ERROR)
+ << "GpuVideoEncodeAccelerator::Initialize(): VEA initialization failed";
+ SendCreateEncoderReply(init_done_msg, false);
}
bool GpuVideoEncodeAccelerator::OnMessageReceived(const IPC::Message& message) {
@@ -165,12 +172,27 @@ void GpuVideoEncodeAccelerator::OnWillDestroyStub() {
// static
std::vector<gpu::VideoEncodeAcceleratorSupportedProfile>
GpuVideoEncodeAccelerator::GetSupportedProfiles() {
- scoped_ptr<media::VideoEncodeAccelerator> encoder = CreateEncoder();
- if (!encoder)
+ std::vector<media::VideoEncodeAccelerator::SupportedProfile> profiles;
+ scoped_ptr<media::VideoEncodeAccelerator> encoders[2] = {
+ CreateDefaultEncoder(), CreateVaapiEncoder()
+ };
+ if (!encoders[0] && !encoders[1])
return std::vector<gpu::VideoEncodeAcceleratorSupportedProfile>();
- return ConvertMediaToGpuProfiles(encoder->GetSupportedProfiles());
+
+ std::set<media::VideoEncodeAccelerator::SupportedProfile> profile_set;
+ for (size_t i = 0; i < 2; ++i) {
+ if (!encoders[i])
+ continue;
+ std::vector<media::VideoEncodeAccelerator::SupportedProfile>
+ vea_profiles = encoders[i]->GetSupportedProfiles();
+ for (size_t j = 0; j < vea_profiles.size(); ++j)
+ profile_set.insert(vea_profiles[j]);
+ }
+ profiles.assign(profile_set.begin(), profile_set.end());
+ return ConvertMediaToGpuProfiles(profiles);
}
+// static
std::vector<gpu::VideoEncodeAcceleratorSupportedProfile>
GpuVideoEncodeAccelerator::ConvertMediaToGpuProfiles(const std::vector<
media::VideoEncodeAccelerator::SupportedProfile>& media_profiles) {
@@ -188,22 +210,29 @@ GpuVideoEncodeAccelerator::ConvertMediaToGpuProfiles(const std::vector<
return profiles;
}
+// static
scoped_ptr<media::VideoEncodeAccelerator>
-GpuVideoEncodeAccelerator::CreateEncoder() {
+GpuVideoEncodeAccelerator::CreateDefaultEncoder() {
scoped_ptr<media::VideoEncodeAccelerator> encoder;
#if defined(OS_CHROMEOS) && defined(USE_X11)
-#if 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)
+#elif defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
+ encoder.reset(new AndroidVideoEncodeAccelerator());
+#endif
+ return encoder.Pass();
+}
+
+// static
+scoped_ptr<media::VideoEncodeAccelerator>
+GpuVideoEncodeAccelerator::CreateVaapiEncoder() {
+ scoped_ptr<media::VideoEncodeAccelerator> encoder;
+#if defined(OS_CHROMEOS) && defined(USE_X11) && defined(ARCH_CPU_X86_FAMILY)
const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
if (!cmd_line->HasSwitch(switches::kDisableVaapiAcceleratedVideoEncode))
encoder.reset(new VaapiVideoEncodeAccelerator(gfx::GetXDisplay()));
#endif
-#elif defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
- encoder.reset(new AndroidVideoEncodeAccelerator());
-#endif
return encoder.Pass();
}

Powered by Google App Engine
This is Rietveld 408576698