Proposed new vaCreateSurfaceFromV4L2Buffer to replace origin vaCreateSurfaceFromMrstV...
authorAustin Yuan <shengquan.yuan@intel.com>
Fri, 19 Jun 2009 18:20:52 +0000 (02:20 +0800)
committerAustin Yuan <shengquan.yuan@intel.com>
Fri, 19 Jun 2009 18:20:52 +0000 (02:20 +0800)
Signed-off-by: Austin Yuan <shengquan.yuan@intel.com>
dummy_drv_video/dummy_drv_video.c
src/va.c
src/va_backend.h

index 4db2e46..20ee3ae 100644 (file)
@@ -1154,11 +1154,17 @@ VAStatus dummy_SetDisplayAttributes (
 }
 
 
-VAStatus dummy_DbgCopySurfaceToBuffer(
+VAStatus dummy_CopySurfaceToBuffer(
                VADriverContextP ctx,
                VASurfaceID surface,
-               void **buffer, /* out */
-               unsigned int *stride /* out */
+                unsigned int *fourcc, /* following are output argument */
+                unsigned int *luma_stride,
+                unsigned int *chroma_u_stride,
+                unsigned int *chroma_v_stride,
+                unsigned int *luma_offset,
+                unsigned int *chroma_u_offset,
+                unsigned int *chroma_v_offset,
+               void **buffer
        )
 {
     /* TODO */
@@ -1266,7 +1272,7 @@ VAStatus __vaDriverInit_0_29(  VADriverContextP ctx )
     ctx->vtable.vaGetDisplayAttributes = dummy_GetDisplayAttributes;
     ctx->vtable.vaSetDisplayAttributes = dummy_SetDisplayAttributes;
     
-    ctx->vtable.vaDbgCopySurfaceToBuffer = dummy_DbgCopySurfaceToBuffer;
+    ctx->vtable.vaCopySurfaceToBuffer = dummy_CopySurfaceToBuffer;
 
     driver_data = (struct dummy_driver_data *) malloc( sizeof(*driver_data) );
     ctx->pDriverData = (void *) driver_data;
index 1473f38..fe6e1bd 100644 (file)
--- a/src/va.c
+++ b/src/va.c
@@ -34,6 +34,8 @@
 #include <dlfcn.h>
 #include <unistd.h>
 
+#include <linux/videodev2.h>
+
 #define VA_STR_VERSION         VA_BUILD_DATE VA_BUILD_GIT
 
 #define VA_MAJOR_VERSION       0
@@ -1222,7 +1224,14 @@ 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,
@@ -1242,33 +1251,42 @@ VAStatus vaCreateSurfaceFromCIFrame (
 }
 
 
-VAStatus vaCreateSurfaceFromMrstV4L2Buf(
+/* 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,
-    unsigned int width,
-    unsigned int height,
-    unsigned int size,
-    unsigned int fourcc,
-    unsigned int luma_stride,
-    unsigned int chroma_u_stride,
-    unsigned int chroma_v_stride,
-    unsigned int luma_offset,
-    unsigned int chroma_u_offset,
-    unsigned int chroma_v_offset,
-    VASurfaceID *surface       /* out */
+    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);
 
-  TRACE(vtable.vaCreateSurfaceFromMrstV4L2Buf);
+  TRACE(vtable.vaCreateSurfaceFromV4L2Buf);
 
-  if (ctx->vtable.vaCreateSurfaceFromMrstV4L2Buf) 
-      return ctx->vtable.vaCreateSurfaceFromMrstV4L2Buf( ctx, width, height, size, fourcc, luma_stride, chroma_u_stride, chroma_v_stride, luma_offset, chroma_u_offset, chroma_v_offset, surface );
+  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,
     VASurfaceID surface,
index fee5181..f8456ad 100755 (executable)
@@ -38,6 +38,7 @@
 #endif
 
 #include <stdlib.h>
+#include <linux/videodev2.h>
 
 
 typedef struct VADriverContext *VADriverContextP;
@@ -382,19 +383,12 @@ struct VADriverVTable
        );
     
     
-        VAStatus (*vaCreateSurfaceFromMrstV4L2Buf) (
-               VADriverContextP ctx,
-                unsigned int width,
-                unsigned int height,
-                unsigned int size,
-                unsigned int fourcc,
-                unsigned int luma_stride,
-                unsigned int chroma_u_stride,
-                unsigned int chroma_v_stride,
-                unsigned int luma_offset,
-                unsigned int chroma_u_offset,
-                unsigned int chroma_v_offset,
-                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 */
         );
     
         VAStatus (*vaCopySurfaceToBuffer) (