save
authorAustin Yuan <shengquan.yuan@gmail.com>
Thu, 15 Apr 2010 21:36:59 +0000 (05:36 +0800)
committerAustin Yuan <shengquan.yuan@gmail.com>
Thu, 15 Apr 2010 21:36:59 +0000 (05:36 +0800)
Signed-off-by: Austin Yuan <shengquan.yuan@gmail.com>
configure.ac
va/Makefile.am
va/android/va_android.c
va/va_android.h

index a59fa2b..9bb2db8 100644 (file)
@@ -119,6 +119,7 @@ AC_OUTPUT([
        va/Makefile
        va/va_version.h
        va/x11/Makefile
+       va/android/Makefile
        dummy_drv_video/Makefile
        i965_drv_video/Makefile
        i965_drv_video/shaders/Makefile
index fd94382..2c89cfa 100644 (file)
@@ -40,7 +40,7 @@ libva_x11_la_LIBADD  = $(libvacorelib) x11/libva_x11.la $(LIBVA_LIBS) $(X11_LIBS
 libva_x11_la_LDFLAGS = $(LDADD)
 libva_x11_la_DEPENDENCIES = $(libvacorelib) x11/libva_x11.la
 
-SUBDIRS = x11
+SUBDIRS = x11 android
 
 libva_la_SOURCES = va.c va_trace.c
 
index c7176c9..f3ae345 100644 (file)
@@ -26,6 +26,7 @@
 #include "va.h"
 #include "va_backend.h"
 #include "va_android.h"
+#include "va_dricommon.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
@@ -36,6 +37,7 @@
 #include <fcntl.h>
 #include <errno.h>
 
+
 static VADisplayContextP pDisplayContexts = NULL;
 
 static int va_DisplayContextIsValid (
@@ -70,6 +72,7 @@ static void va_DisplayContextDestroy (
        }
        ctx = &((*ctx)->pNext);
     }
+    free(pDisplayContext->pDriverContext->dri_state);
     free(pDisplayContext->pDriverContext);
     free(pDisplayContext);
 }
@@ -79,8 +82,11 @@ static VAStatus va_DisplayContextGetDriverName (
     VADisplayContextP pDisplayContext,
     char **driver_name
 )
-{  
+{
+    VADriverContextP ctx = pDisplayContext->pDriverContext;
+    struct dri_state *dri_state = (struct dri_state *)ctx->dri_state;
     char *driver_name_env;
+    
     struct {
         unsigned int verndor_id;
         unsigned int device_id;
@@ -89,17 +95,29 @@ static VAStatus va_DisplayContextGetDriverName (
         { 0x8086, 0x4100, "pvr" },
     };
 
-    if (driver_name)
-       *driver_name = NULL;
+    memset(dri_state, 0, sizeof(*dri_state));
+    dri_state->fd = drm_open_any_master();
+    if (dri_state->fd < 0)
+        return VA_STATUS_ERROR_UNKNOWN;
+    
+    if ((driver_name_env = getenv("LIBVA_DRIVER_NAME")) != NULL
+        && geteuid() == getuid())
+    {
+        /* don't allow setuid apps to use LIBVA_DRIVER_NAME */
+        *driver_name = strdup(driver_name_env);
+        return VA_STATUS_SUCCESS;
+    } else /* TBD: other vendor driver names */
+        *driver_name = strdup(devices[0].driver_name);
 
-    *driver_name = strdup(devices[0].driver_name);
+    
+    dri_state->driConnectedFlag = VA_DRI2;
     
     return VA_STATUS_SUCCESS;
 }
 
 
 VADisplay vaGetDisplay (
-    Display *native_dpy /* implementation specific */
+    void *native_dpy /* implementation specific */
 )
 {
   VADisplay dpy = NULL;
@@ -123,9 +141,12 @@ VADisplay vaGetDisplay (
   {
       /* create new entry */
       VADriverContextP pDriverContext;
+      struct dri_state *dri_state;
       pDisplayContext = (VADisplayContextP)calloc(1, sizeof(*pDisplayContext));
       pDriverContext  = (VADriverContextP)calloc(1, sizeof(*pDriverContext));
-      if (pDisplayContext && pDriverContext)
+      dri_state       = calloc(1, sizeof(*dri_state));
+      
+      if (pDisplayContext && pDriverContext && dri_state)
       {
          pDisplayContext->vadpy_magic = VA_DISPLAY_MAGIC;          
 
@@ -136,6 +157,7 @@ VADisplay vaGetDisplay (
          pDisplayContext->vaDestroy       = va_DisplayContextDestroy;
          pDisplayContext->vaGetDriverName = va_DisplayContextGetDriverName;
          pDisplayContexts                 = pDisplayContext;
+         pDriverContext->dri_state        = dri_state;
          dpy                              = (VADisplay)pDisplayContext;
       }
       else
@@ -144,6 +166,8 @@ VADisplay vaGetDisplay (
              free(pDisplayContext);
          if (pDriverContext)
              free(pDriverContext);
+          if (dri_state)
+              free(dri_state);
       }
   }
   
@@ -160,6 +184,7 @@ static int vaDisplayIsValid(VADisplay dpy)
     return pDisplayContext && (pDisplayContext->vadpy_magic == VA_DISPLAY_MAGIC) && pDisplayContext->vaIsValid(pDisplayContext);
 }
 
+#ifdef ANDROID
 VAStatus vaPutSurface (
     VADisplay dpy,
     VASurfaceID surface,
@@ -214,3 +239,4 @@ VAStatus vaPutSurfaceBuf (
   return ctx->vtable.vaPutSurfaceBuf( ctx, surface, draw, data, data_len, srcx, srcy, srcw, srch,
                                      destx, desty, destw, desth, cliprects, number_cliprects, flags );
 }
+#endif
index eefe4f4..4b92c88 100644 (file)
@@ -2,13 +2,13 @@
 #define _VA_ANDROID_H_
 
 #include <va/va.h>
-#include <ui/Surface.h>
-class Surface;
+
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+    
 /*
  * Returns a suitable VADisplay for VA API
  */
@@ -16,6 +16,11 @@ VADisplay vaGetDisplay (
     void *dpy
 );
 
+#ifdef ANDROID
+
+#include <ui/Surface.h>
+class Surface;
+    
 /*
  * Output rendering
  * Following is the rendering interface for X windows, 
@@ -42,23 +47,26 @@ VAStatus vaPutSurface (
 );
 
 VAStatus vaPutSurfaceBuf (
-       VADriverContextP ctx,
-               VASurfaceID surface,
-               Drawable draw, /* X Drawable */
-               unsigned char* data,
-                int* data_len,
-                short srcx,
-                short srcy,
-                unsigned short srcw,
-                unsigned short srch,
-                short destx,
-                short desty,
-                unsigned short destw,
-                unsigned short desth,
-                VARectangle *cliprects, /* client supplied clip list */
-                unsigned int number_cliprects, /* number of clip rects in the clip list */
-                unsigned int flags /* de-interlacing flags */
-       );
+    VADriverContextP ctx,
+    VASurfaceID surface,
+    Drawable draw, /* X Drawable */
+    unsigned char* data,
+    int* data_len,
+    short srcx,
+    short srcy,
+    unsigned short srcw,
+    unsigned short srch,
+    short destx,
+    short desty,
+    unsigned short destw,
+    unsigned short desth,
+    VARectangle *cliprects, /* client supplied clip list */
+    unsigned int number_cliprects, /* number of clip rects in the clip list */
+    unsigned int flags /* de-interlacing flags */
+);
+
+#endif
+    
 #ifdef __cplusplus
 }
 #endif