Seperate 3rd party API (e.g. vaCreateSurfaceFromXXX) into a libva-tpi.so 73/573/1
authorAustin Yuan <shengquan.yuan@gmail.com>
Fri, 7 May 2010 18:03:56 +0000 (02:03 +0800)
committerAustin Yuan <shengquan.yuan@gmail.com>
Fri, 7 May 2010 18:03:56 +0000 (02:03 +0800)
and driver table memory is allocated by driver if driver wants to support it.

Signed-off-by: Austin Yuan <shengquan.yuan@gmail.com>
dummy_drv_video/dummy_drv_video.c
va/Makefile.am
va/android/va_android.c [changed from file to symlink]
va/android/va_android.cpp
va/va.c
va/va.h
va/va_backend.h
va/va_backend_tpi.h [new file with mode: 0644]
va/va_tpi.c [new file with mode: 0644]
va/va_tpi.h [new file with mode: 0644]
va/va_trace.c

index 98561a9..ed72824 100644 (file)
@@ -1107,7 +1107,22 @@ VAStatus dummy_SetDisplayAttributes (
 }
 
 
-VAStatus dummy_CopySurfaceToBuffer(
+VAStatus dummy_BufferInfo(
+        VADriverContextP ctx,
+        VAContextID context,   /* in */
+        VABufferID buf_id,     /* in */
+        VABufferType *type,    /* out */
+        unsigned int *size,            /* out */
+        unsigned int *num_elements /* out */
+    )
+{
+    /* TODO */
+    return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+    
+
+VAStatus dummy_LockSurface(
                VADriverContextP ctx,
                VASurfaceID surface,
                 unsigned int *fourcc, /* following are output argument */
@@ -1117,11 +1132,21 @@ VAStatus dummy_CopySurfaceToBuffer(
                 unsigned int *luma_offset,
                 unsigned int *chroma_u_offset,
                 unsigned int *chroma_v_offset,
+                unsigned int *buffer_name,
                void **buffer
        )
 {
     /* TODO */
-    return VA_STATUS_ERROR_UNKNOWN;
+    return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus dummy_UnlockSurface(
+               VADriverContextP ctx,
+               VASurfaceID surface
+       )
+{
+    /* TODO */
+    return VA_STATUS_ERROR_UNIMPLEMENTED;
 }
 
 VAStatus dummy_Terminate( VADriverContextP ctx )
@@ -1222,8 +1247,9 @@ VAStatus __vaDriverInit_0_31(  VADriverContextP ctx )
     ctx->vtable.vaQueryDisplayAttributes = dummy_QueryDisplayAttributes;
     ctx->vtable.vaGetDisplayAttributes = dummy_GetDisplayAttributes;
     ctx->vtable.vaSetDisplayAttributes = dummy_SetDisplayAttributes;
-    
-    ctx->vtable.vaCopySurfaceToBuffer = dummy_CopySurfaceToBuffer;
+    ctx->vtable.vaLockSurface = dummy_LockSurface;
+    ctx->vtable.vaUnlockSurface = dummy_UnlockSurface;
+    ctx->vtable.vaBufferInfo = dummy_BufferInfo;
 
     driver_data = (struct dummy_driver_data *) malloc( sizeof(*driver_data) );
     ctx->pDriverData = (void *) driver_data;
index f57ac42..5241b6a 100644 (file)
@@ -29,12 +29,17 @@ LDADD = \
 
 lib_LTLIBRARIES = \
        libva.la \
+       libva-tpi.la \
        libva-x11.la
 
 libva_ladir = $(libdir)
 libva_la_LDFLAGS = $(LDADD) -no-undefined
 libva_la_LIBADD = $(LIBVA_LIBS) -ldl
 
+libva_tpi_ladir = $(libdir)
+libva_tpi_la_LDFLAGS = $(LDADD) -no-undefined
+libva_tpi_la_LIBADD = $(libvacorelib) -ldl
+
 libva_x11_la_SOURCES = 
 libva_x11_la_LIBADD  = $(libvacorelib) x11/libva_x11.la $(LIBVA_LIBS) $(X11_LIBS) $(XEXT_LIBS) $(DRM_LIBS) $(XFIXES_LIBS)
 libva_x11_la_LDFLAGS = $(LDADD)
@@ -55,9 +60,10 @@ SUBDIRS += dummy
 endif
 
 libva_la_SOURCES = va.c va_trace.c
+libva_tpi_la_SOURCES = va_tpi.c
 
 libvaincludedir = ${includedir}/va
-libvainclude_HEADERS = va.h va_x11.h va_backend.h va_dummy.h va_version.h
+libvainclude_HEADERS = va.h va_tpi.h va_x11.h va_backend.h va_backend_tpi.h va_dummy.h va_version.h
 
 DISTCLEANFILES = \
        va_version.h
deleted file mode 100644 (file)
index 31f8581f7af64c4215da5408e61f4ec6a6900258..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * 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 "va.h"
-#include "va_backend.h"
-#include "va_android.h"
-#include "va_dricommon.h" /* needs some helper functions from this file */
-#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 <dlfcn.h>
-#include <errno.h>
-#ifndef ANDROID
-#include <libudev.h>
-#include "drm_test.h"
-#endif
-
-#define CHECK_SYMBOL(func) { if (!func) printf("func %s not found\n", #func); return VA_STATUS_ERROR_UNKNOWN; }
-#define DEVICE_NAME "/dev/card0"
-
-static VADisplayContextP pDisplayContexts = NULL;
-
-static int open_device (char *dev_name)
-{
-  struct stat st;
-  int fd;
-
-  if (-1 == stat (dev_name, &st))
-    {
-      printf ("Cannot identify '%s': %d, %s\n",
-               dev_name, errno, strerror (errno));
-      return -1;
-    }
-
-  if (!S_ISCHR (st.st_mode))
-    {
-      printf ("%s is no device\n", dev_name);
-      return -1;
-    }
-
-  fd = open (dev_name, O_RDWR);
-
-  if (-1 == fd)
-    {
-      fprintf (stderr, "Cannot open '%s': %d, %s\n",
-               dev_name, errno, strerror (errno));
-      return -1;
-    }
-
-  return fd;
-}
-
-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);
-}
-
-#ifdef ANDROID
-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;
-    int vendor_id, device_id;
-    
-    struct {
-        int vendor_id;
-        int device_id;
-        char driver_name[64];
-    } devices[] = {
-        { 0x8086, 0x4100, "pvr" },
-        { 0x8086, 0x0130, "pvr" },
-        { 0x0,    0x0,    "\0" },
-    };
-
-    memset(dri_state, 0, sizeof(*dri_state));
-    dri_state->fd = open_device(DEVICE_NAME);
-    
-    if (dri_state->fd < 0) {
-        fprintf(stderr,"can't open DRM devices\n");
-        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 */
-       vendor_id = devices[0].vendor_id;
-       device_id = devices[0].device_id;
-       *driver_name = strdup(devices[0].driver_name);
-    }
-
-    dri_state->driConnectedFlag = VA_DUMMY;
-    
-    return VA_STATUS_SUCCESS;
-}
-#else
-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;
-    int vendor_id, device_id;
-    
-    struct {
-        int vendor_id;
-        int device_id;
-        char driver_name[64];
-    } devices[] = {
-        { 0x8086, 0x4100, "pvr" },
-        { 0x8086, 0x0130, "pvr" },
-        { 0x0,    0x0,    "\0" },
-    };
-
-    memset(dri_state, 0, sizeof(*dri_state));
-    dri_state->fd = drm_open_any(&vendor_id, &device_id);
-    
-    if (dri_state->fd < 0) {
-        fprintf(stderr,"can't open DRM devices\n");
-        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 */
-        int i = 0;
-
-        while (devices[i].device_id != 0) {
-            if ((devices[i].vendor_id == vendor_id) &&
-                (devices[i].device_id == device_id))
-                break;
-            i++;
-        }
-
-        if (devices[i].device_id != 0)
-            *driver_name = strdup(devices[i].driver_name);
-        else {
-            fprintf(stderr,"device (0x%04x:0x%04x) is not supported\n",
-                    vendor_id, device_id);
-            
-            return VA_STATUS_ERROR_UNKNOWN;
-        }            
-    }
-
-    printf("DRM device is opened, loading driver %s for device 0x%04x:0x%04x\n",
-           driver_name, vendor_id, device_id);
-    
-    dri_state->driConnectedFlag = VA_DUMMY;
-    
-    return VA_STATUS_SUCCESS;
-}
-#endif
-
-VADisplay vaGetDisplay (
-    void *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 = (VADisplayContextP)calloc(1, sizeof(*pDisplayContext));
-      pDriverContext  = (VADriverContextP)calloc(1, sizeof(*pDriverContext));
-      dri_state       = calloc(1, sizeof(*dri_state));
-      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);
-          if (dri_state)
-              free(dri_state);
-      }
-  }
-  
-  return dpy;
-}
-
-#define CTX(dpy) (((VADisplayContextP)dpy)->pDriverContext)
-#define CHECK_DISPLAY(dpy) if( !vaDisplayIsValid(dpy) ) { return VA_STATUS_ERROR_INVALID_DISPLAY; }
-
-static int vaDisplayIsValid(VADisplay dpy)
-{
-    VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
-    return pDisplayContext && (pDisplayContext->vadpy_magic == VA_DISPLAY_MAGIC) && pDisplayContext->vaIsValid(pDisplayContext);
-}
-
-#ifdef ANDROID
-VAStatus vaPutSurface (
-    VADisplay dpy,
-    VASurfaceID surface,
-    Surface *draw, /* Android Surface/Window */
-    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, (void *)draw, srcx, srcy, srcw, srch, 
-                                   destx, desty, destw, desth,
-                                   cliprects, number_cliprects, flags );
-}
-
-#endif
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..b47bd16b797ce7f360c2c90cab3fe61c9226e7d4
--- /dev/null
@@ -0,0 +1 @@
+va_android.cpp
\ No newline at end of file
index caa6fcb..c9c017d 100644 (file)
@@ -39,7 +39,7 @@
 #include <errno.h>
 #ifndef ANDROID
 #include <libudev.h>
-#include "drm_test.h"
+#include "drmtest.h"
 #endif
 
 #define CHECK_SYMBOL(func) { if (!func) printf("func %s not found\n", #func); return VA_STATUS_ERROR_UNKNOWN; }
diff --git a/va/va.c b/va/va.c
index 1917716..def7200 100644 (file)
--- a/va/va.c
+++ b/va/va.c
@@ -679,10 +679,7 @@ VAStatus vaBufferInfo (
   CHECK_DISPLAY(dpy);
   ctx = CTX(dpy);
 
-  if (ctx->vtable.vaBufferInfo)
-      return ctx->vtable.vaBufferInfo( ctx, context, buf_id, type, size, num_elements );
-  else
-      return VA_STATUS_ERROR_UNIMPLEMENTED;
+  return ctx->vtable.vaBufferInfo( ctx, context, buf_id, type, size, num_elements );
 }
 
 VAStatus vaBeginPicture (
@@ -1153,67 +1150,7 @@ VAStatus vaSetDisplayAttributes (
   return ctx->vtable.vaSetDisplayAttributes ( ctx, attr_list, num_attributes );
 }
 
-/* Wrap a CI (camera imaging) frame as a VA surface to share captured video between camear
- * and VA encode. With frame_id, VA driver need to call CI interfaces to get the information
- * of the frame, and to determine if the frame can be wrapped as a VA surface
- *
- * Application should make sure the frame is idle before the frame is passed into VA stack
- * and also a vaSyncSurface should be called before application tries to access the frame
- * from CI stack
- */
-VAStatus vaCreateSurfaceFromCIFrame (
-    VADisplay dpy,
-    unsigned long frame_id,
-    VASurfaceID *surface       /* out */
-)
-{
-  VADriverContextP ctx;
-  CHECK_DISPLAY(dpy);
-  ctx = CTX(dpy);
-
-  if (ctx->vtable.vaCreateSurfaceFromCIFrame)
-      return ctx->vtable.vaCreateSurfaceFromCIFrame( ctx, frame_id, surface );
-  else
-      return VA_STATUS_ERROR_UNIMPLEMENTED;
-}
-
-
-/* Wrap a V4L2 buffer as a VA surface, so that V4L2 camera, VA encode
- * can share the data without copy
- * The VA driver should query the camera device from v4l2_fd to see
- * if camera device memory/buffer can be wrapped into a VA surface
- * Buffer information is passed in by v4l2_fmt and v4l2_buf structure,
- * VA driver also needs do further check if the buffer can meet encode
- * hardware requirement, such as dimension, fourcc, stride, etc
- *
- * Application should make sure the buffer is idle before the frame into VA stack
- * and also a vaSyncSurface should be called before application tries to access the frame
- * from V4L2 stack
- */
-VAStatus vaCreateSurfaceFromV4L2Buf(
-    VADisplay dpy,
-    int v4l2_fd,         /* file descriptor of V4L2 device */
-    struct v4l2_format *v4l2_fmt,       /* format of V4L2 */
-    struct v4l2_buffer *v4l2_buf,       /* V4L2 buffer */
-    VASurfaceID *surface              /* out */
-)
-{
-  VADriverContextP ctx;
-  CHECK_DISPLAY(dpy);
-  ctx = CTX(dpy);
-
-  if (ctx->vtable.vaCreateSurfaceFromV4L2Buf) 
-      return ctx->vtable.vaCreateSurfaceFromV4L2Buf( ctx, v4l2_fd, v4l2_fmt, v4l2_buf, surface );
-  else
-      return VA_STATUS_ERROR_UNKNOWN;
-}
-
-/* It is a debug interface, and isn't exported in core VAAPI
- * It is used to dump surface data into system memory
- * Application should explicitly call free to release the buffer memory
- */
-
-VAStatus vaCopySurfaceToBuffer(VADisplay dpy,
+VAStatus vaLockSurface(VADisplay dpy,
     VASurfaceID surface,
     unsigned int *fourcc, /* following are output argument */
     unsigned int *luma_stride,
@@ -1222,6 +1159,7 @@ VAStatus vaCopySurfaceToBuffer(VADisplay dpy,
     unsigned int *luma_offset,
     unsigned int *chroma_u_offset,
     unsigned int *chroma_v_offset,
+    unsigned int *buffer_name,
     void **buffer 
 )
 {
@@ -1229,8 +1167,17 @@ VAStatus vaCopySurfaceToBuffer(VADisplay dpy,
   CHECK_DISPLAY(dpy);
   ctx = CTX(dpy);
 
-  if (ctx->vtable.vaCopySurfaceToBuffer)
-      return ctx->vtable.vaCopySurfaceToBuffer( ctx, surface, fourcc, luma_stride, chroma_u_stride, chroma_v_stride, luma_offset, chroma_u_offset, chroma_v_offset, buffer);
-  else
-      return VA_STATUS_ERROR_UNIMPLEMENTED;
+  return ctx->vtable.vaLockSurface( ctx, surface, fourcc, luma_stride, chroma_u_stride, chroma_v_stride, luma_offset, chroma_u_offset, chroma_v_offset, buffer_name, buffer);
+}
+
+
+VAStatus vaUnlockSurface(VADisplay dpy,
+    VASurfaceID surface
+)
+{
+  VADriverContextP ctx;
+  CHECK_DISPLAY(dpy);
+  ctx = CTX(dpy);
+
+  return ctx->vtable.vaUnlockSurface( ctx, surface );
 }
diff --git a/va/va.h b/va/va.h
index de962df..bb11048 100644 (file)
--- a/va/va.h
+++ b/va/va.h
@@ -411,20 +411,6 @@ VAStatus vaCreateSurfaces (
     VASurfaceID *surfaces      /* out */
 );
 
-/* Wrap a CI (camera imaging) frame as a VA surface to share captured video between camear
- * and VA encode. With frame_id, VA driver need to call CI interfaces to get the information
- * of the frame, and to determine if the frame can be wrapped as a VA surface
- *
- * Application should make sure the frame is idle before the frame is passed into VA stack
- * and also a vaSyncSurface should be called before application tries to access the frame
- * from CI stack
- */
-VAStatus vaCreateSurfaceFromCIFrame (
-    VADisplay dpy,
-    unsigned long frame_id,
-    VASurfaceID *surface       /* out */
-);
-    
     
 /*
  * vaDestroySurfaces - Destroy resources associated with surfaces. 
index 423de2d..9ba9000 100644 (file)
@@ -338,22 +338,7 @@ struct VADriverVTable
                 int num_attributes
         );
 
-        /* device specific */
-       VAStatus (*vaCreateSurfaceFromCIFrame) (
-               VADriverContextP ctx,
-               unsigned long frame_id,
-               VASurfaceID *surface            /* out */
-       );
-    
-    
-        VAStatus (*vaCreateSurfaceFromV4L2Buf) (
-               VADriverContextP ctx,
-                int v4l2_fd,         /* file descriptor of V4L2 device */
-                struct v4l2_format *v4l2_fmt,       /* format of V4L2 */
-                struct v4l2_buffer *v4l2_buf,       /* V4L2 buffer */
-                VASurfaceID *surface              /* out */
-        );
-
+        /* used by va trace */        
         VAStatus (*vaBufferInfo) (
                    VADriverContextP ctx,
                    VAContextID context, /* in */
@@ -363,8 +348,8 @@ struct VADriverVTable
                    unsigned int *num_elements /* out */
         );
 
-    
-        VAStatus (*vaCopySurfaceToBuffer) (
+        /* lock/unlock surface for external access */    
+        VAStatus (*vaLockSurface) (
                VADriverContextP ctx,
                 VASurfaceID surface,
                 unsigned int *fourcc, /* out  for follow argument */
@@ -374,7 +359,17 @@ struct VADriverVTable
                 unsigned int *luma_offset,
                 unsigned int *chroma_u_offset,
                 unsigned int *chroma_v_offset,
-                void **buffer
+                unsigned int *buffer_name, /* if it is not NULL, assign the low lever
+                                            * surface buffer name
+                                            */
+                void **buffer /* if it is not NULL, map the surface buffer for
+                                * CPU access
+                                */
+        );
+    
+        VAStatus (*vaUnlockSurface) (
+               VADriverContextP ctx,
+                VASurfaceID surface
         );
 };
 
@@ -382,6 +377,7 @@ struct VADriverContext
 {
     void *pDriverData;
     struct VADriverVTable vtable;
+    void *vtable_tpi; /* the structure is malloc-ed */
 
     void *native_dpy;
     int x11_screen;
diff --git a/va/va_backend_tpi.h b/va/va_backend_tpi.h
new file mode 100644 (file)
index 0000000..898a467
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+
+/*
+ * Video Decode Acceleration -Backend API
+ */
+
+#ifndef _VA_BACKEND_TPI_H_
+#define _VA_BACKEND_TPI_H_
+
+#include <va/va.h>
+#include <va/va_backend.h>
+
+#include <linux/videodev2.h>
+
+struct VADriverVTableTPI
+{
+        /* device specific */
+       VAStatus (*vaCreateSurfaceFromCIFrame) (
+               VADriverContextP ctx,
+               unsigned long frame_id,
+               VASurfaceID *surface            /* out */
+       );
+    
+        VAStatus (*vaCreateSurfaceFromV4L2Buf) (
+               VADriverContextP ctx,
+                int v4l2_fd,         /* file descriptor of V4L2 device */
+                struct v4l2_format *v4l2_fmt,       /* format of V4L2 */
+                struct v4l2_buffer *v4l2_buf,       /* V4L2 buffer */
+                VASurfaceID *surface              /* out */
+        );
+};
+
+
+#endif /* _VA_BACKEND_TPI_H_ */
diff --git a/va/va_tpi.c b/va/va_tpi.c
new file mode 100644 (file)
index 0000000..fccd089
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * 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 "va.h"
+#include "va_backend.h"
+#include "va_backend_tpi.h"
+#include "config.h"
+
+#include <assert.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <unistd.h>
+
+#define CTX(dpy) (((VADisplayContextP)dpy)->pDriverContext)
+#define CHECK_DISPLAY(dpy) if( !vaDisplayIsValid(dpy) ) { return VA_STATUS_ERROR_INVALID_DISPLAY; }
+
+/* Wrap a CI (camera imaging) frame as a VA surface to share captured video between camear
+ * and VA encode. With frame_id, VA driver need to call CI interfaces to get the information
+ * of the frame, and to determine if the frame can be wrapped as a VA surface
+ *
+ * Application should make sure the frame is idle before the frame is passed into VA stack
+ * and also a vaSyncSurface should be called before application tries to access the frame
+ * from CI stack
+ */
+VAStatus vaCreateSurfaceFromCIFrame (
+    VADisplay dpy,
+    unsigned long frame_id,
+    VASurfaceID *surface       /* out */
+)
+{
+  VADriverContextP ctx;
+  struct VADriverVTableTPI *tpi;
+  CHECK_DISPLAY(dpy);
+  ctx = CTX(dpy);
+  
+  tpi = ( struct VADriverVTableTPI *)ctx->vtable_tpi;
+  if (tpi && tpi->vaCreateSurfaceFromCIFrame) {
+      return tpi->vaCreateSurfaceFromCIFrame( ctx, frame_id, surface );
+  } else
+      return VA_STATUS_ERROR_UNIMPLEMENTED;
+  
+}
+
+/* Wrap a V4L2 buffer as a VA surface, so that V4L2 camera, VA encode
+ * can share the data without copy
+ * The VA driver should query the camera device from v4l2_fd to see
+ * if camera device memory/buffer can be wrapped into a VA surface
+ * Buffer information is passed in by v4l2_fmt and v4l2_buf structure,
+ * VA driver also needs do further check if the buffer can meet encode
+ * hardware requirement, such as dimension, fourcc, stride, etc
+ *
+ * Application should make sure the buffer is idle before the frame into VA stack
+ * and also a vaSyncSurface should be called before application tries to access the frame
+ * from V4L2 stack
+ */
+VAStatus vaCreateSurfaceFromV4L2Buf(
+    VADisplay dpy,
+    int v4l2_fd,         /* file descriptor of V4L2 device */
+    struct v4l2_format *v4l2_fmt,       /* format of V4L2 */
+    struct v4l2_buffer *v4l2_buf,       /* V4L2 buffer */
+    VASurfaceID *surface              /* out */
+)
+{
+  VADriverContextP ctx;
+  struct VADriverVTableTPI *tpi;
+  CHECK_DISPLAY(dpy);
+  ctx = CTX(dpy);
+  
+  tpi = ( struct VADriverVTableTPI *)ctx->vtable_tpi;
+  if (tpi && tpi->vaCreateSurfaceFromV4L2Buf) {
+      return tpi->vaCreateSurfaceFromV4L2Buf( ctx, v4l2_fd, v4l2_fmt, v4l2_buf, surface );
+  } else
+      return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
diff --git a/va/va_tpi.h b/va/va_tpi.h
new file mode 100644 (file)
index 0000000..559fdfc
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2007-2009 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 INTEL 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.
+ */
+
+/* Wrap a CI (camera imaging) frame as a VA surface to share captured video between camear
+ * and VA encode. With frame_id, VA driver need to call CI interfaces to get the information
+ * of the frame, and to determine if the frame can be wrapped as a VA surface
+ *
+ * Application should make sure the frame is idle before the frame is passed into VA stack
+ * and also a vaSyncSurface should be called before application tries to access the frame
+ * from CI stack
+ */
+
+#include <va/va.h>
+VAStatus vaCreateSurfaceFromCIFrame (
+    VADisplay dpy,
+    unsigned long frame_id,
+    VASurfaceID *surface       /* out */
+);
+
+VAStatus vaCreateSurfaceFromV4L2Buf(
+    VADisplay dpy,
+    int v4l2_fd,         /* file descriptor of V4L2 device */
+    struct v4l2_format *v4l2_fmt,       /* format of V4L2 */
+    struct v4l2_buffer *v4l2_buf,       /* V4L2 buffer */
+    VASurfaceID *surface       /* out */
+);
+
+    
index e0e335f..dbd0749 100644 (file)
@@ -1048,6 +1048,7 @@ int va_TraceEndPicture(
     unsigned int luma_offset;
     unsigned int chroma_u_offset;
     unsigned int chroma_v_offset;
+    unsigned int buffer_name;
     void *buffer;
     char *Y_data, *UV_data, *tmp;
     
@@ -1061,8 +1062,8 @@ int va_TraceEndPicture(
 
     va_TraceMsg("***dump surface data***\n", trace_rendertarget);
 
-    va_status = vaCopySurfaceToBuffer(dpy, trace_rendertarget, &fourcc, &luma_stride, &chroma_u_stride, &chroma_v_stride,
-                                      &luma_offset, &chroma_u_offset, &chroma_v_offset, &buffer);
+    va_status = vaLockSurface(dpy, trace_rendertarget, &fourcc, &luma_stride, &chroma_u_stride, &chroma_v_stride,
+                                      &luma_offset, &chroma_u_offset, &chroma_v_offset, &buffer_name, &buffer);
 
     if (va_status != VA_STATUS_SUCCESS)
         return va_status;
@@ -1110,5 +1111,4 @@ int va_TraceEndPicture(
             tmp = UV_data + i * chroma_u_stride;
         }
     }
-    free((void *)buffer);
 }