[PATCH] i965_drv_video: implement vaGetImage by internal post proc pipeline

Xiang, Haihao haihao.xiang at intel.com
Tue Jul 26 01:10:24 PDT 2011


Signed-off-by: Xiang, Haihao <haihao.xiang at intel.com>
---
 src/i965_drv_video.c |   48 +++++++++++++++++-------------------------------
 1 files changed, 17 insertions(+), 31 deletions(-)

diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c
index effc51d..2779b85 100644
--- a/src/i965_drv_video.c
+++ b/src/i965_drv_video.c
@@ -2442,13 +2442,16 @@ i965_GetImage(VADriverContextP ctx,
               VAImageID image)
 {
     struct i965_driver_data *i965 = i965_driver_data(ctx);
-    struct i965_render_state *render_state = &i965->render_state;
-
+    struct i965_surface src_surface;
+    struct i965_surface dst_surface;
+    VAStatus va_status;
+    VARectangle rect;
     struct object_surface *obj_surface = SURFACE(surface);
+    struct object_image *obj_image = IMAGE(image);
+
     if (!obj_surface)
         return VA_STATUS_ERROR_INVALID_SURFACE;
 
-    struct object_image *obj_image = IMAGE(image);
     if (!obj_image)
         return VA_STATUS_ERROR_INVALID_IMAGE;
 
@@ -2461,40 +2464,23 @@ i965_GetImage(VADriverContextP ctx,
         y + height > obj_image->image.height)
         return VA_STATUS_ERROR_INVALID_PARAMETER;
 
-    VAStatus va_status;
-    void *image_data = NULL;
-
-    va_status = i965_MapBuffer(ctx, obj_image->image.buf, &image_data);
-    if (va_status != VA_STATUS_SUCCESS)
-        return va_status;
+    if (!obj_surface->bo)
+        return VA_STATUS_SUCCESS;
 
-    VARectangle rect;
     rect.x = x;
     rect.y = y;
     rect.width = width;
     rect.height = height;
+    src_surface.id = surface;
+    src_surface.flag = I965_SURFACE_SURFACE;
+    dst_surface.id = image;
+    dst_surface.flag = I965_SURFACE_IMAGE;
+    va_status = i965_image_processing(ctx,
+                                      &src_surface,
+                                      &rect,
+                                      &dst_surface,
+                                      &rect);
 
-    switch (obj_image->image.format.fourcc) {
-    case VA_FOURCC('Y','V','1','2'):
-    case VA_FOURCC('I','4','2','0'):
-        /* I420 is native format for MPEG-2 decoded surfaces */
-        if (render_state->interleaved_uv)
-            goto operation_failed;
-        get_image_i420(obj_image, image_data, obj_surface, &rect);
-        break;
-    case VA_FOURCC('N','V','1','2'):
-        /* NV12 is native format for H.264 decoded surfaces */
-        if (!render_state->interleaved_uv)
-            goto operation_failed;
-        get_image_nv12(obj_image, image_data, obj_surface, &rect);
-        break;
-    default:
-    operation_failed:
-        va_status = VA_STATUS_ERROR_OPERATION_FAILED;
-        break;
-    }
-
-    i965_UnmapBuffer(ctx, obj_image->image.buf);
     return va_status;
 }
 
-- 
1.7.5.4





More information about the Libva mailing list