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

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: 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_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..a1dcd568c3f88ab00cb0e3edb2c60044c05c8253 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"
@@ -245,74 +247,141 @@ void GpuVideoDecodeAccelerator::Initialize(
}
#endif
-#if defined(OS_WIN)
- if (base::win::GetVersion() < base::win::VERSION_WIN7) {
- NOTIMPLEMENTED() << "HW video decode acceleration not available.";
+ std::vector<GpuVideoDecodeAccelerator::CreateVDACb>
+ create_vda_cbs = CreateDecoderCbs();
+
+ if (create_vda_cbs.empty()) {
Pawel Osciak 2014/12/31 07:55:59 I think not needed, since the for loop will not do
henryhsu 2014/12/31 08:47:53 Done.
SendCreateDecoderReply(init_done_msg, false);
return;
}
- DVLOG(0) << "Initializing DXVA HW decoder for windows.";
- video_decode_accelerator_.reset(
- new DXVAVideoDecodeAccelerator(make_context_current_));
+
+ for (size_t i = 0; i < create_vda_cbs.size(); ++i) {
+ video_decode_accelerator_ = create_vda_cbs[i].Run();
+ if (!video_decode_accelerator_.get() ||
Pawel Osciak 2014/12/31 07:55:59 IIRC, we don't need get()s on scoped_ptr?
henryhsu 2014/12/31 08:47:53 yes. We don't need. This references other codes in
Pawel Osciak 2015/01/02 01:49:14 Not sure if we need this kind of consistency ;) Bu
+ !video_decode_accelerator_->Initialize(profile, this))
+ continue;
+
+ if (video_decode_accelerator_->CanDecodeOnIOThread()) {
+ filter_ = new MessageFilter(this, host_route_id_);
+ stub_->channel()->AddFilter(filter_.get());
+ }
+ SendCreateDecoderReply(init_done_msg, true);
+ return;
+ }
+ video_decode_accelerator_.reset();
+ SendCreateDecoderReply(init_done_msg, false);
+}
+
+std::vector<GpuVideoDecodeAccelerator::CreateVDACb>
+GpuVideoDecodeAccelerator::CreateDecoderCbs() {
+ std::vector<GpuVideoDecodeAccelerator::CreateVDACb> create_vda_cbs;
+#if defined(OS_WIN)
Pawel Osciak 2014/12/31 07:55:59 Technically, we don't need all the #ifs here. The
henryhsu 2014/12/31 08:47:53 Sure. Then we will have many callback functions wi
+ create_vda_cbs.push_back(base::Bind(
+ &GpuVideoDecodeAccelerator::CreateDXVADecoder, base::Unretained(this)));
+#elif defined(OS_CHROMEOS) && defined(USE_X11) && \
+ (defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL))
+ create_vda_cbs.push_back(base::Bind(
+ &GpuVideoDecodeAccelerator::CreateV4L2Decoder, base::Unretained(this)));
+#if defined(ARCH_CPU_X86_FAMILY)
+ create_vda_cbs.push_back(base::Bind(
+ &GpuVideoDecodeAccelerator::CreateVaapiDecoder, base::Unretained(this)));
+#endif
#elif defined(OS_MACOSX)
- video_decode_accelerator_.reset(new VTVideoDecodeAccelerator(
- static_cast<CGLContextObj>(
- stub_->decoder()->GetGLContext()->GetHandle()),
- make_context_current_));
-#elif defined(OS_CHROMEOS) && defined(ARCH_CPU_ARMEL) && defined(USE_X11)
+ create_vda_cbs.push_back(base::Bind(
+ &GpuVideoDecodeAccelerator::CreateVTDecoder, base::Unretained(this)));
+#elif defined(OS_ANDROID)
+ create_vda_cbs.push_back(base::Bind(
+ &GpuVideoDecodeAccelerator::CreateAndroidDecoder,
+ base::Unretained(this)));
+#elif defined(USE_OZONE)
+ create_vda_cbs.push_back(base::Bind(
+ &GpuVideoDecodeAccelerator::CreateOzoneDecoder, base::Unretained(this)));
+#else
+ NOTIMPLEMENTED() << "HW video decode acceleration not available.";
+#endif
+ return create_vda_cbs;
+}
+
+scoped_ptr<media::VideoDecodeAccelerator>
+GpuVideoDecodeAccelerator::CreateDXVADecoder() {
+ scoped_ptr<media::VideoDecodeAccelerator> decoder;
+#if defined(OS_WIN)
+ if (base::win::GetVersion() >= base::win::VERSION_WIN7) {
+ DVLOG(0) << "Initializing DXVA HW decoder for windows.";
+ decoder.reset(new DXVAVideoDecodeAccelerator(make_context_current_));
+ } else
Pawel Osciak 2014/12/31 07:55:59 Per coding style both branches need a brace if one
henryhsu 2014/12/31 08:47:53 Done.
+ NOTIMPLEMENTED() << "HW video decode acceleration not available.";
+#endif
+ return decoder.Pass();
+}
+
+scoped_ptr<media::VideoDecodeAccelerator>
+GpuVideoDecodeAccelerator::CreateV4L2Decoder() {
+ scoped_ptr<media::VideoDecodeAccelerator> decoder;
+#if defined(OS_CHROMEOS) && defined(USE_X11) && \
+ (defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL))
scoped_ptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kDecoder);
- if (!device.get()) {
- SendCreateDecoderReply(init_done_msg, false);
- return;
+ if (device.get()) {
+ decoder.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)
+#endif
+ return decoder.Pass();
+}
+
+scoped_ptr<media::VideoDecodeAccelerator>
+GpuVideoDecodeAccelerator::CreateVaapiDecoder() {
+ scoped_ptr<media::VideoDecodeAccelerator> decoder;
+#if defined(OS_CHROMEOS) && defined(USE_X11) && defined(ARCH_CPU_X86_FAMILY)
if (gfx::GetGLImplementation() != gfx::kGLImplementationDesktopGL) {
VLOG(1) << "HW video decode acceleration not available without "
"DesktopGL (GLX).";
- SendCreateDecoderReply(init_done_msg, false);
- return;
+ return decoder.Pass();
}
gfx::GLContextGLX* glx_context =
static_cast<gfx::GLContextGLX*>(stub_->decoder()->GetGLContext());
- video_decode_accelerator_.reset(new VaapiVideoDecodeAccelerator(
+ decoder.reset(new VaapiVideoDecodeAccelerator(
glx_context->display(), make_context_current_));
-#elif defined(USE_OZONE)
- media::MediaOzonePlatform* platform =
- media::MediaOzonePlatform::GetInstance();
- video_decode_accelerator_.reset(platform->CreateVideoDecodeAccelerator(
+#endif
+ return decoder.Pass();
+}
+
+scoped_ptr<media::VideoDecodeAccelerator>
+GpuVideoDecodeAccelerator::CreateVTDecoder() {
+ scoped_ptr<media::VideoDecodeAccelerator> decoder;
+#if defined(OS_MACOSX)
+ decoder.reset(new VTVideoDecodeAccelerator(
+ static_cast<CGLContextObj>(stub_->decoder()->GetGLContext()->GetHandle()),
make_context_current_));
- if (!video_decode_accelerator_) {
- SendCreateDecoderReply(init_done_msg, false);
- return;
- }
-#elif defined(OS_ANDROID)
- video_decode_accelerator_.reset(new AndroidVideoDecodeAccelerator(
+#endif
+ return decoder.Pass();
+}
+
+scoped_ptr<media::VideoDecodeAccelerator>
+GpuVideoDecodeAccelerator::CreateAndroidDecoder() {
+ scoped_ptr<media::VideoDecodeAccelerator> decoder;
+#if defined(OS_ANDROID)
+ decoder.reset(new AndroidVideoDecodeAccelerator(
stub_->decoder()->AsWeakPtr(),
make_context_current_));
-#else
- NOTIMPLEMENTED() << "HW video decode acceleration not available.";
- SendCreateDecoderReply(init_done_msg, false);
- return;
#endif
+ return decoder.Pass();
+}
- if (video_decode_accelerator_->CanDecodeOnIOThread()) {
- filter_ = new MessageFilter(this, host_route_id_);
- stub_->channel()->AddFilter(filter_.get());
- }
-
- if (!video_decode_accelerator_->Initialize(profile, this)) {
- SendCreateDecoderReply(init_done_msg, false);
- return;
- }
-
- SendCreateDecoderReply(init_done_msg, true);
+scoped_ptr<media::VideoDecodeAccelerator>
+GpuVideoDecodeAccelerator::CreateOzoneDecoder() {
+ scoped_ptr<media::VideoDecodeAccelerator> decoder;
+#if defined(USE_OZONE)
+ media::MediaOzonePlatform* platform =
+ media::MediaOzonePlatform::GetInstance();
+ decoder.reset(platform->CreateVideoDecodeAccelerator(make_context_current_));
+#endif
+ return decoder.Pass();
}
// Runs on IO thread if video_decode_accelerator_->CanDecodeOnIOThread() is

Powered by Google App Engine
This is Rietveld 408576698