Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2007 Intel Corporation. All Rights Reserved.
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the
  6.  * "Software"), to deal in the Software without restriction, including
  7.  * without limitation the rights to use, copy, modify, merge, publish,
  8.  * distribute, sub license, and/or sell copies of the Software, and to
  9.  * permit persons to whom the Software is furnished to do so, subject to
  10.  * the following conditions:
  11.  *
  12.  * The above copyright notice and this permission notice (including the
  13.  * next paragraph) shall be included in all copies or substantial portions
  14.  * of the Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  17.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  18.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  19.  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
  20.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  21.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  22.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  23.  */
  24.  
  25. /*
  26.  * Initial EGL backend, and subject to change
  27.  *
  28.  * Gstreamer gst-gltexture has a framework to support associating a buffer
  29.  * to a texture via EGL_KHR_image_base and GL_OES_EGL_image_external.
  30.  *
  31.  * EGL_KHR_image_base:
  32.  *   EGLImageKHR eglCreateImageKHR(
  33.  *                           EGLDisplay dpy,
  34.  *                           EGLContext ctx,
  35.  *                           EGLenum target,
  36.  *                           EGLClientBuffer buffer,
  37.  *                           const EGLint *attrib_list)
  38.  *
  39.  * GL_OES_EGL_image_external:
  40.  * This extension provides a mechanism for creating EGLImage texture targets
  41.  * from EGLImages.  This extension defines a new texture target TEXTURE_EXTERNAL_OES.
  42.  * This texture target can only be specified using an EGLImage.
  43.  * The first eglCreateImageKHR will create an EGLImage from an EGLClientBufferm, and with
  44.  * an EGLImage, gst-gltexture can use GL_OES_EGL_image_external extension to create textures.
  45.  *
  46.  * eglCreateImageKHR and GL_OES_EGL_image_external are all called directly from gst-gltexture,
  47.  * thus the simplest way to support gst-gltexture is defining a new API to pass EGLClientBuffer
  48.  * to gst-gltexture.
  49.  *
  50.  * EGLClientBuffer is gfx/video driver implementation specific (?). It means we need to pass up
  51.  * the low-level buffer ID (or handle) of the decoded surface to gst-gltexture, and gst-gltexture
  52.  * then pass down it to gfx driver.  
  53.  *
  54.  * Bellow API vaGetEGLClientBufferFromSurface is for this purpose
  55.  */
  56.  
  57. #include "va.h"
  58. #include "va_backend_egl.h"
  59. #include "va_egl.h"
  60.  
  61. #define CTX(dpy) (((VADisplayContextP)dpy)->pDriverContext)
  62. #define CHECK_DISPLAY(dpy) if( !vaDisplayIsValid(dpy) ) { return VA_STATUS_ERROR_INVALID_DISPLAY; }
  63.  
  64. VAStatus vaGetEGLClientBufferFromSurface (
  65.     VADisplay dpy,
  66.     VASurfaceID surface,
  67.     EGLClientBuffer *buffer /* out*/
  68. )
  69. {
  70.   VADriverContextP ctx;
  71.   struct VADriverVTableEGL *va_egl;
  72.   CHECK_DISPLAY(dpy);
  73.   ctx = CTX(dpy);
  74.  
  75.   va_egl = (struct VADriverVTableEGL *)ctx->vtable_egl;
  76.   if (va_egl && va_egl->vaGetEGLClientBufferFromSurface) {
  77.       return va_egl->vaGetEGLClientBufferFromSurface(ctx, surface, buffer);
  78.   } else
  79.       return VA_STATUS_ERROR_UNIMPLEMENTED;
  80. }
  81.  
  82.  
  83.