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

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

Issue 826663002: Support multiple video decoders and encoders (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address wucheng's 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_decode_accelerator.cc
diff --git a/content/common/gpu/media/gpu_video_decode_accelerator.cc b/content/common/gpu/media/gpu_video_decode_accelerator.cc
index f741cb20418fbecfa99b83d54dd814f131c33892..410cc14a0fa3989dc9dec18f00784411bb06e3a4 100644
--- a/content/common/gpu/media/gpu_video_decode_accelerator.cc
+++ b/content/common/gpu/media/gpu_video_decode_accelerator.cc
@@ -32,6 +32,8 @@
#include "content/common/gpu/media/v4l2_video_decode_accelerator.h"
#include "content/common/gpu/media/v4l2_video_device.h"
#elif defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) && defined(USE_X11)
+#include "content/common/gpu/media/v4l2_video_decode_accelerator.h"
+#include "content/common/gpu/media/v4l2_video_device.h"
#include "content/common/gpu/media/vaapi_video_decode_accelerator.h"
#include "ui/gl/gl_context_glx.h"
#include "ui/gl/gl_implementation.h"
@@ -259,30 +261,18 @@ void GpuVideoDecodeAccelerator::Initialize(
static_cast<CGLContextObj>(
stub_->decoder()->GetGLContext()->GetHandle()),
make_context_current_));
-#elif defined(OS_CHROMEOS) && defined(ARCH_CPU_ARMEL) && defined(USE_X11)
+#elif defined(OS_CHROMEOS) && defined(USE_X11) && \
+ (defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL))
Pawel Osciak 2014/12/28 23:28:02 I don't think it would hurt to not check for arch
henryhsu 2014/12/29 09:43:26 How to check we have EGL? I think we cannot use 'g
Pawel Osciak 2014/12/30 06:14:38 We'll have a separate CL for this, so we can skip
scoped_ptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kDecoder);
- if (!device.get()) {
- SendCreateDecoderReply(init_done_msg, false);
- return;
+ if (device.get()) {
+ video_decode_accelerator_.reset(new V4L2VideoDecodeAccelerator(
+ gfx::GLSurfaceEGL::GetHardwareDisplay(),
+ stub_->decoder()->GetGLContext()->GetHandle(),
+ weak_factory_for_io_.GetWeakPtr(),
+ make_context_current_,
+ device.Pass(),
+ io_message_loop_));
}
- video_decode_accelerator_.reset(new V4L2VideoDecodeAccelerator(
- gfx::GLSurfaceEGL::GetHardwareDisplay(),
- stub_->decoder()->GetGLContext()->GetHandle(),
- weak_factory_for_io_.GetWeakPtr(),
- make_context_current_,
- device.Pass(),
- io_message_loop_));
-#elif defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) && defined(USE_X11)
- if (gfx::GetGLImplementation() != gfx::kGLImplementationDesktopGL) {
- VLOG(1) << "HW video decode acceleration not available without "
- "DesktopGL (GLX).";
- SendCreateDecoderReply(init_done_msg, false);
- return;
- }
- gfx::GLContextGLX* glx_context =
- static_cast<gfx::GLContextGLX*>(stub_->decoder()->GetGLContext());
- video_decode_accelerator_.reset(new VaapiVideoDecodeAccelerator(
- glx_context->display(), make_context_current_));
#elif defined(USE_OZONE)
media::MediaOzonePlatform* platform =
media::MediaOzonePlatform::GetInstance();
@@ -302,17 +292,44 @@ void GpuVideoDecodeAccelerator::Initialize(
return;
#endif
- if (video_decode_accelerator_->CanDecodeOnIOThread()) {
- filter_ = new MessageFilter(this, host_route_id_);
- stub_->channel()->AddFilter(filter_.get());
+ if (InitializeDecoder(profile)) {
Pawel Osciak 2014/12/28 23:28:02 I think the code would be simpler and more extensi
henryhsu 2014/12/29 09:43:26 yes. But ScopedVector does not support DefaultDele
+ SendCreateDecoderReply(init_done_msg, true);
+ return;
}
- if (!video_decode_accelerator_->Initialize(profile, this)) {
+#if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) && defined(USE_X11)
+ // X86 platforms try V4L2 device first. If V4L2 device initialization fails,
Pawel Osciak 2014/12/28 23:28:02 s/X86/x86/ s/V4L2 device/V4L2 VDA/
henryhsu 2014/12/29 09:43:26 Done.
+ // try VAAPI device again.
Pawel Osciak 2014/12/28 23:28:01 s/VAAPI device/VAAPI VDA/ s/ again//
henryhsu 2014/12/29 09:43:26 Done.
+ if (gfx::GetGLImplementation() != gfx::kGLImplementationDesktopGL) {
+ VLOG(1) << "HW video decode acceleration not available without "
+ "DesktopGL (GLX).";
SendCreateDecoderReply(init_done_msg, false);
return;
}
+ gfx::GLContextGLX* glx_context =
+ static_cast<gfx::GLContextGLX*>(stub_->decoder()->GetGLContext());
+ video_decode_accelerator_.reset(new VaapiVideoDecodeAccelerator(
+ glx_context->display(), make_context_current_));
+
+ if (InitializeDecoder(profile)) {
+ SendCreateDecoderReply(init_done_msg, true);
+ return;
+ }
+#endif
+ SendCreateDecoderReply(init_done_msg, false);
+}
- SendCreateDecoderReply(init_done_msg, true);
+bool GpuVideoDecodeAccelerator::InitializeDecoder(
+ media::VideoCodecProfile profile) {
+ if (video_decode_accelerator_.get() &&
+ video_decode_accelerator_->Initialize(profile, this)) {
+ if (video_decode_accelerator_->CanDecodeOnIOThread()) {
Pawel Osciak 2014/12/28 23:28:01 if (!vda_.get() || !vda_->Initialize()) return f
henryhsu 2014/12/29 09:43:26 Done.
+ filter_ = new MessageFilter(this, host_route_id_);
+ stub_->channel()->AddFilter(filter_.get());
+ }
+ return true;
+ }
+ return false;
}
// Runs on IO thread if video_decode_accelerator_->CanDecodeOnIOThread() is

Powered by Google App Engine
This is Rietveld 408576698