Index: content/common/gpu/media/vaapi_video_decode_accelerator.cc |
diff --git a/content/common/gpu/media/vaapi_video_decode_accelerator.cc b/content/common/gpu/media/vaapi_video_decode_accelerator.cc |
index cd18574a8d8142d65f6fb5485444a60218d62a25..64d30da3c2c5e28cb3227ae5aff1550aa7294aad 100644 |
--- a/content/common/gpu/media/vaapi_video_decode_accelerator.cc |
+++ b/content/common/gpu/media/vaapi_video_decode_accelerator.cc |
@@ -74,7 +74,11 @@ class VaapiVideoDecodeAccelerator::TFPPicture { |
static linked_ptr<TFPPicture> Create( |
const base::Callback<bool(void)>& make_context_current, |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
const GLXFBConfig& fb_config, |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ EGLDisplay egl_display, |
+#endif |
Display* x_display, |
int32 picture_buffer_id, |
uint32 texture_id, |
@@ -105,8 +109,11 @@ class VaapiVideoDecodeAccelerator::TFPPicture { |
int32 picture_buffer_id, |
uint32 texture_id, |
gfx::Size size); |
- |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
bool Initialize(const GLXFBConfig& fb_config); |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ bool Initialize(EGLDisplay egl_display); |
+#endif |
base::Callback<bool(void)> make_context_current_; |
@@ -120,8 +127,12 @@ class VaapiVideoDecodeAccelerator::TFPPicture { |
// Pixmaps bound to this texture. |
Pixmap x_pixmap_; |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
GLXPixmap glx_pixmap_; |
- |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ EGLDisplay egl_display_; |
+ EGLImageKHR egl_image_; |
+#endif |
DISALLOW_COPY_AND_ASSIGN(TFPPicture); |
}; |
@@ -137,14 +148,24 @@ VaapiVideoDecodeAccelerator::TFPPicture::TFPPicture( |
texture_id_(texture_id), |
size_(size), |
x_pixmap_(0), |
- glx_pixmap_(0) { |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
+ glx_pixmap_(0) |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ egl_display_(0), |
+ egl_image_(0) |
+#endif |
+ { |
DCHECK(!make_context_current_.is_null()); |
}; |
linked_ptr<VaapiVideoDecodeAccelerator::TFPPicture> |
VaapiVideoDecodeAccelerator::TFPPicture::Create( |
const base::Callback<bool(void)>& make_context_current, |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
const GLXFBConfig& fb_config, |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ EGLDisplay egl_display, |
+#endif |
Display* x_display, |
int32 picture_buffer_id, |
uint32 texture_id, |
@@ -154,14 +175,22 @@ VaapiVideoDecodeAccelerator::TFPPicture::Create( |
new TFPPicture(make_context_current, x_display, picture_buffer_id, |
texture_id, size)); |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
if (!tfp_picture->Initialize(fb_config)) |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ if (!tfp_picture->Initialize(egl_display)) |
+#endif |
tfp_picture.reset(); |
return tfp_picture; |
} |
bool VaapiVideoDecodeAccelerator::TFPPicture::Initialize( |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
const GLXFBConfig& fb_config) { |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ EGLDisplay egl_display) { |
+#endif |
// Check for NULL prevents unittests from crashing on nonexistent ChildThread. |
DCHECK(ChildThread::current() == NULL || |
ChildThread::current()->message_loop() == base::MessageLoop::current()); |
@@ -179,7 +208,7 @@ bool VaapiVideoDecodeAccelerator::TFPPicture::Initialize( |
DVLOG(1) << "Failed creating an X Pixmap for TFP"; |
return false; |
} |
- |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
static const int pixmap_attr[] = { |
GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT, |
GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGB_EXT, |
@@ -192,6 +221,20 @@ bool VaapiVideoDecodeAccelerator::TFPPicture::Initialize( |
DVLOG(1) << "Failed creating a GLX Pixmap for TFP"; |
return false; |
} |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ egl_display_ = egl_display; |
+ EGLint image_attrs[] = { EGL_IMAGE_PRESERVED_KHR, 1 , EGL_NONE }; |
+ |
+ egl_image_ = eglCreateImageKHR(egl_display_, |
+ EGL_NO_CONTEXT, |
+ EGL_NATIVE_PIXMAP_KHR, |
+ (EGLClientBuffer)x_pixmap_, |
+ image_attrs); |
+ if (!egl_image_) { |
+ DVLOG(1) << "Failed creating a EGLImage from Pixmap for KHR"; |
+ return false; |
+ } |
+#endif |
return true; |
} |
@@ -202,10 +245,16 @@ VaapiVideoDecodeAccelerator::TFPPicture::~TFPPicture() { |
ChildThread::current()->message_loop() == base::MessageLoop::current()); |
// Unbind surface from texture and deallocate resources. |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
if (glx_pixmap_ && make_context_current_.Run()) { |
glXReleaseTexImageEXT(x_display_, glx_pixmap_, GLX_FRONT_LEFT_EXT); |
glXDestroyPixmap(x_display_, glx_pixmap_); |
} |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ if (egl_image_ && make_context_current_.Run()) { |
+ eglDestroyImageKHR(egl_display_, egl_image_); |
+ } |
+#endif |
if (x_pixmap_) |
XFreePixmap(x_display_, x_pixmap_); |
@@ -214,7 +263,11 @@ VaapiVideoDecodeAccelerator::TFPPicture::~TFPPicture() { |
bool VaapiVideoDecodeAccelerator::TFPPicture::Bind() { |
DCHECK(x_pixmap_); |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
DCHECK(glx_pixmap_); |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ DCHECK(egl_image_); |
+#endif |
// Check for NULL prevents unittests from crashing on nonexistent ChildThread. |
DCHECK(ChildThread::current() == NULL || |
ChildThread::current()->message_loop() == base::MessageLoop::current()); |
@@ -223,8 +276,11 @@ bool VaapiVideoDecodeAccelerator::TFPPicture::Bind() { |
return false; |
gfx::ScopedTextureBinder texture_binder(GL_TEXTURE_2D, texture_id_); |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
glXBindTexImageEXT(x_display_, glx_pixmap_, GLX_FRONT_LEFT_EXT, NULL); |
- |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, egl_image_); |
+#endif |
return true; |
} |
@@ -240,11 +296,21 @@ VaapiVideoDecodeAccelerator::TFPPicture* |
} |
VaapiVideoDecodeAccelerator::VaapiVideoDecodeAccelerator( |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
Display* x_display, GLXContext glx_context, |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ EGLDisplay egl_display, EGLContext egl_context, |
+#endif |
Client* client, |
const base::Callback<bool(void)>& make_context_current) |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
: x_display_(x_display), |
glx_context_(glx_context), |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ : x_display_(0), |
+ egl_display_(egl_display), |
+ egl_context_(egl_context), |
+#endif |
make_context_current_(make_context_current), |
state_(kUninitialized), |
input_ready_(&lock_), |
@@ -272,7 +338,7 @@ class ScopedPtrXFree { |
::XFree(x); |
} |
}; |
- |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
bool VaapiVideoDecodeAccelerator::InitializeFBConfig() { |
const int fbconfig_attr[] = { |
GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT, |
@@ -294,7 +360,7 @@ bool VaapiVideoDecodeAccelerator::InitializeFBConfig() { |
fb_config_ = glx_fb_configs.get()[0]; |
return true; |
} |
- |
+#endif |
bool VaapiVideoDecodeAccelerator::Initialize( |
media::VideoCodecProfile profile) { |
DCHECK_EQ(message_loop_, base::MessageLoop::current()); |
@@ -306,10 +372,14 @@ bool VaapiVideoDecodeAccelerator::Initialize( |
if (!make_context_current_.Run()) |
return false; |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
if (!InitializeFBConfig()) { |
DVLOG(1) << "Could not get a usable FBConfig"; |
return false; |
} |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ x_display_ = base::MessagePumpForUI::GetDefaultXDisplay(); |
+#endif |
vaapi_wrapper_ = VaapiWrapper::Create( |
profile, x_display_, |
@@ -718,7 +788,11 @@ void VaapiVideoDecodeAccelerator::AssignPictureBuffers( |
<< " VASurfaceID: " << va_surface_ids[i]; |
linked_ptr<TFPPicture> tfp_picture( |
+#if defined(VIDEO_TEXTURE_GLX_BACKEND) |
TFPPicture::Create(make_context_current_, fb_config_, x_display_, |
+#elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
+ TFPPicture::Create(make_context_current_, egl_display_, x_display_, |
+#endif |
buffers[i].id(), buffers[i].texture_id(), |
requested_pic_size_)); |