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

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: Use callback function for decoders Created 5 years, 12 months 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..19d249f9ab76118eb626a995fe3d2c52596f31ce 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_) {
+ std::vector<GpuVideoEncodeAccelerator::CreateVEACb>
+ create_vea_cbs = CreateEncoderCbs();
+ if (create_vea_cbs.empty()) {
Pawel Osciak 2014/12/31 07:56:00 Not needed?
henryhsu 2014/12/31 08:47:53 Done.
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 < 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) {
@@ -165,12 +172,28 @@ void GpuVideoEncodeAccelerator::OnWillDestroyStub() {
// static
std::vector<gpu::VideoEncodeAcceleratorSupportedProfile>
GpuVideoEncodeAccelerator::GetSupportedProfiles() {
- scoped_ptr<media::VideoEncodeAccelerator> encoder = CreateEncoder();
- if (!encoder)
+ std::vector<media::VideoEncodeAccelerator::SupportedProfile> profiles;
+ std::vector<GpuVideoEncodeAccelerator::CreateVEACb>
+ create_vea_cbs = CreateEncoderCbs();
+ if (create_vea_cbs.empty())
Pawel Osciak 2014/12/31 07:56:00 Not needed, for() handles this?
henryhsu 2014/12/31 08:47:53 Done.
return std::vector<gpu::VideoEncodeAcceleratorSupportedProfile>();
- return ConvertMediaToGpuProfiles(encoder->GetSupportedProfiles());
+
+ std::set<media::VideoEncodeAccelerator::SupportedProfile> profile_set;
+ 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();
+ 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,20 +211,50 @@ GpuVideoEncodeAccelerator::ConvertMediaToGpuProfiles(const std::vector<
return profiles;
}
+// static
+std::vector<GpuVideoEncodeAccelerator::CreateVEACb>
+GpuVideoEncodeAccelerator::CreateEncoderCbs() {
+ std::vector<GpuVideoEncodeAccelerator::CreateVEACb> create_vea_cbs;
+#if defined(OS_CHROMEOS) && defined(USE_X11)
Pawel Osciak 2014/12/31 07:56:00 Same as in gvda.cc
henryhsu 2014/12/31 08:47:53 Done.
+ create_vea_cbs.push_back(base::Bind(&CreateV4L2Encoder));
+#if defined(ARCH_CPU_X86_FAMILY)
+ create_vea_cbs.push_back(base::Bind(&CreateVaapiEncoder));
+#endif
+#elif defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
+ create_vea_cbs.push_back(base::Bind(&CreateAndroidEncoder));
+#endif
+ return create_vea_cbs;
+}
+
+// static
scoped_ptr<media::VideoEncodeAccelerator>
-GpuVideoEncodeAccelerator::CreateEncoder() {
+GpuVideoEncodeAccelerator::CreateV4L2Encoder() {
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)
+#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)
+ return encoder.Pass();
+}
+
+// static
+scoped_ptr<media::VideoEncodeAccelerator>
+GpuVideoEncodeAccelerator::CreateAndroidEncoder() {
+ scoped_ptr<media::VideoEncodeAccelerator> encoder;
+#if defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
encoder.reset(new AndroidVideoEncodeAccelerator());
#endif
return encoder.Pass();

Powered by Google App Engine
This is Rietveld 408576698