OSDN Git Service

Initial android backend
authorAustin Yuan <shengquan.yuan@gmail.com>
Wed, 31 Mar 2010 06:23:36 +0000 (14:23 +0800)
committerAustin Yuan <shengquan.yuan@gmail.com>
Wed, 31 Mar 2010 06:23:36 +0000 (14:23 +0800)
Signed-off-by: Austin Yuan <shengquan.yuan@gmail.com>
va/android/va_android.c [new file with mode: 0644]
va/va.c
va/va_android.h [new file with mode: 0644]
va/va_trace.c
va/x11/va_x11.c

diff --git a/va/android/va_android.c b/va/android/va_android.c
new file mode 100644 (file)
index 0000000..9642228
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 2007 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#define _GNU_SOURCE 1
+#include "config.h"
+#include "va.h"
+#include "va_backend.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+
+static VADisplayContextP pDisplayContexts = NULL;
+
+static int va_DisplayContextIsValid (
+    VADisplayContextP pDisplayContext
+)
+{
+    VADisplayContextP ctx = pDisplayContexts;
+
+    while (ctx)
+    {
+       if (ctx == pDisplayContext && pDisplayContext->pDriverContext)
+           return 1;
+       ctx = ctx->pNext;
+    }
+    return 0;
+}
+
+static void va_DisplayContextDestroy (
+    VADisplayContextP pDisplayContext
+)
+{
+    VADisplayContextP *ctx = &pDisplayContexts;
+
+    /* Throw away pDisplayContext */
+    while (*ctx)
+    {
+       if (*ctx == pDisplayContext)
+       {
+           *ctx = pDisplayContext->pNext;
+           pDisplayContext->pNext = NULL;
+           break;
+       }
+       ctx = &((*ctx)->pNext);
+    }
+    free(pDisplayContext->pDriverContext->dri_state);
+    free(pDisplayContext->pDriverContext);
+    free(pDisplayContext);
+}
+
+
+static VAStatus va_DisplayContextGetDriverName (
+    VADisplayContextP pDisplayContext,
+    char **driver_name
+)
+{
+    VAStatus vaStatus VA_STATUS_SUCCESS;
+    char *driver_name_env;
+    struct {
+        unsigned int verndor_id;
+        unsigned int device_id;
+        char driver_name[64];
+    } devices[] = {
+        { 0x8086, 0x4100, "pvr" },
+    };
+
+    if (driver_name)
+       *driver_name = NULL;
+
+    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;
+    }
+
+    *driver_name = strdup(devices[0].driver_name);
+    
+    return vaStatus;
+}
+
+
+VADisplay vaGetDisplay (
+    Display *native_dpy /* implementation specific */
+)
+{
+  VADisplay dpy = NULL;
+  VADisplayContextP pDisplayContext = pDisplayContexts;
+
+  if (!native_dpy)
+      return NULL;
+
+  while (pDisplayContext)
+  {
+      if (pDisplayContext->pDriverContext &&
+         pDisplayContext->pDriverContext->native_dpy == (void *)native_dpy)
+      {
+          dpy = (VADisplay)pDisplayContext;
+          break;
+      }
+      pDisplayContext = pDisplayContext->pNext;
+  }
+
+  if (!dpy)
+  {
+      /* create new entry */
+      VADriverContextP pDriverContext;
+      struct dri_state *dri_state;
+      pDisplayContext = calloc(1, sizeof(*pDisplayContext));
+      pDriverContext  = calloc(1, sizeof(*pDriverContext));
+      if (pDisplayContext && pDriverContext && dri_state)
+      {
+         pDisplayContext->vadpy_magic = VA_DISPLAY_MAGIC;          
+
+         pDriverContext->native_dpy       = (void *)native_dpy;
+         pDisplayContext->pNext           = pDisplayContexts;
+         pDisplayContext->pDriverContext  = pDriverContext;
+         pDisplayContext->vaIsValid       = va_DisplayContextIsValid;
+         pDisplayContext->vaDestroy       = va_DisplayContextDestroy;
+         pDisplayContext->vaGetDriverName = va_DisplayContextGetDriverName;
+         pDisplayContexts                 = pDisplayContext;
+         pDriverContext->dri_state        = dri_state;
+         dpy                              = (VADisplay)pDisplayContext;
+      }
+      else
+      {
+         if (pDisplayContext)
+             free(pDisplayContext);
+         if (pDriverContext)
+             free(pDriverContext);
+      }
+  }
+  
+  return dpy;
+}
diff --git a/va/va.c b/va/va.c
index a674bd9..14ea2da 100644 (file)
--- a/va/va.c
+++ b/va/va.c
@@ -739,32 +739,6 @@ VAStatus vaQuerySurfaceStatus (
   return ctx->vtable.vaQuerySurfaceStatus( ctx, render_target, status );
 }
 
-VAStatus vaPutSurface (
-    VADisplay dpy,
-    VASurfaceID surface,
-    Drawable draw, /* X Drawable */
-    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;
-  CHECK_DISPLAY(dpy);
-  ctx = CTX(dpy);
-
-  return ctx->vtable.vaPutSurface( ctx, surface, draw, srcx, srcy, srcw, srch,
-                                   destx, desty, destw, desth,
-                                   cliprects, number_cliprects, flags );
-}
-
 /* Get maximum number of image formats supported by the implementation */
 int vaMaxNumImageFormats (
     VADisplay dpy
diff --git a/va/va_android.h b/va/va_android.h
new file mode 100644 (file)
index 0000000..9858049
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef _VA_ANDROID_H_
+#define _VA_ANDROID_H_
+
+#include <va/va.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Returns a suitable VADisplay for VA API
+ */
+VADisplay vaGetDisplay (
+    void *dpy
+);
+
+/*
+ * Output rendering
+ * Following is the rendering interface for X windows, 
+ * to get the decode output surface to a X drawable
+ * It basically performs a de-interlacing (if needed), 
+ * color space conversion and scaling to the destination
+ * rectangle
+ */
+VAStatus vaPutSurface (
+    VADisplay dpy,
+    VASurfaceID surface,       
+    Surface *draw, /* Android Window/Surface */
+    short srcx,
+    short srcy,
+    unsigned short srcw,
+    unsigned short srch,
+    short destx,
+    short desty,
+    unsigned short destw,
+    unsigned short desth,
+    VARectangle *cliprects, /* client supplied destination clip list */
+    unsigned int number_cliprects, /* number of clip rects in the clip list */
+    unsigned int flags /* PutSurface flags */
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VA_ANDROID_H_ */
index 9242b52..e0e335f 100644 (file)
@@ -28,6 +28,7 @@
 
 #include <assert.h>
 #include <stdarg.h>
+#include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <dlfcn.h>
@@ -49,7 +50,7 @@ static unsigned int trace_height;
 
 int va_TraceInit(void)
 {
-    trace_file = getenv("LIBVA_TRACE");
+    trace_file = (const char *)getenv("LIBVA_TRACE");
     if (trace_file) {
        trace_fp = fopen(trace_file, "w");
         if (trace_fp)
@@ -1109,5 +1110,5 @@ int va_TraceEndPicture(
             tmp = UV_data + i * chroma_u_stride;
         }
     }
-    free(buffer);
+    free((void *)buffer);
 }
index 9c29140..491f7c3 100644 (file)
@@ -215,3 +215,29 @@ VADisplay vaGetDisplay (
   
   return dpy;
 }
+
+VAStatus vaPutSurface (
+    VADisplay dpy,
+    VASurfaceID surface,
+    Drawable draw, /* X Drawable */
+    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;
+  CHECK_DISPLAY(dpy);
+  ctx = CTX(dpy);
+
+  return ctx->vtable.vaPutSurface( ctx, surface, draw, srcx, srcy, srcw, srch,
+                                   destx, desty, destw, desth,
+                                   cliprects, number_cliprects, flags );
+}