Add the csc conversion from YV16 to NV12
authorZhao Yakui <yakui.zhao@intel.com>
Fri, 14 Mar 2014 07:16:26 +0000 (15:16 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Wed, 23 Apr 2014 06:16:51 +0000 (14:16 +0800)
V1->V2: Follow Zhiwen's comment to handle the scenario of CSC conversion from
YV16 to NV12  when the source is YV16 image instead of YV16 surface.

Reviewed-by: Wind Yuan <feng.yuan@intel.com>
Tested-by: Wind Yuan <feng.yuan@intel.com>
Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
(cherry picked from commit 2b5fad11a5c12d3c6ffbef15c02449a3b4e90b98)

src/gen8_post_processing.c
src/i965_post_processing.c

index 78f5a83..84d4864 100644 (file)
@@ -470,8 +470,10 @@ gen8_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
     dri_bo *bo;
     int fourcc = pp_get_surface_fourcc(ctx, surface);
     const int U = (fourcc == VA_FOURCC('Y', 'V', '1', '2') ||
+                   fourcc == VA_FOURCC('Y', 'V', '1', '6') ||
                    fourcc == VA_FOURCC('I', 'M', 'C', '1')) ? 2 : 1;
     const int V = (fourcc == VA_FOURCC('Y', 'V', '1', '2') ||
+                   fourcc == VA_FOURCC('Y', 'V', '1', '6') ||
                    fourcc == VA_FOURCC('I', 'M', 'C', '1')) ? 1 : 2;
     int interleaved_uv = fourcc == VA_FOURCC('N', 'V', '1', '2');
     int packed_yuv = (fourcc == VA_FOURCC('Y', 'U', 'Y', '2') || fourcc == VA_FOURCC('U', 'Y', 'V', 'Y'));
@@ -538,6 +540,12 @@ gen8_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
             height[2] = obj_image->image.height / 2;
             pitch[2] = obj_image->image.pitches[V];
             offset[2] = obj_image->image.offsets[V];
+            if (fourcc == VA_FOURCC('V', 'V', '1', '6')) {
+                width[1] = obj_image->image.width / 2;
+                height[1] = obj_image->image.height;
+                width[2] = obj_image->image.width / 2;
+                height[2] = obj_image->image.height;
+            }
         }
     }
 
index 8d53676..6713e05 100755 (executable)
@@ -1702,8 +1702,12 @@ pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_processin
     dri_bo *bo;
     int fourcc = pp_get_surface_fourcc(ctx, surface);
     const int Y = 0;
-    const int U = fourcc == VA_FOURCC('Y', 'V', '1', '2') ? 2 : 1;
-    const int V = fourcc == VA_FOURCC('Y', 'V', '1', '2') ? 1 : 2;
+    const int U = ((fourcc == VA_FOURCC('Y', 'V', '1', '2')) ||
+                   (fourcc == VA_FOURCC('Y', 'V', '1', '6')))
+                   ? 2 : 1;
+    const int V = ((fourcc == VA_FOURCC('Y', 'V', '1', '2')) ||
+                   (fourcc == VA_FOURCC('Y', 'V', '1', '6')))
+                   ? 1 : 2;
     const int UV = 1;
     int interleaved_uv = fourcc == VA_FOURCC('N', 'V', '1', '2');
     int packed_yuv = (fourcc == VA_FOURCC('Y', 'U', 'Y', '2') || fourcc == VA_FOURCC('U', 'Y', 'V', 'Y')); 
@@ -1770,6 +1774,12 @@ pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_processin
             height[2] = obj_image->image.height / 2;
             pitch[2] = obj_image->image.pitches[2];
             offset[2] = obj_image->image.offsets[2];
+            if (fourcc == VA_FOURCC('V', 'V', '1', '6')) {
+                width[1] = obj_image->image.width / 2;
+                height[1] = obj_image->image.height;
+                width[2] = obj_image->image.width / 2;
+                height[2] = obj_image->image.height;
+            }
         }
     }
 
@@ -1813,8 +1823,10 @@ gen7_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
     dri_bo *bo;
     int fourcc = pp_get_surface_fourcc(ctx, surface);
     const int U = (fourcc == VA_FOURCC('Y', 'V', '1', '2') ||
+                   fourcc == VA_FOURCC('V', 'V', '1', '6') ||
                    fourcc == VA_FOURCC('I', 'M', 'C', '1')) ? 2 : 1;
     const int V = (fourcc == VA_FOURCC('Y', 'V', '1', '2') ||
+                   fourcc == VA_FOURCC('V', 'V', '1', '6') ||
                    fourcc == VA_FOURCC('I', 'M', 'C', '1')) ? 1 : 2;
     int interleaved_uv = fourcc == VA_FOURCC('N', 'V', '1', '2');
     int packed_yuv = (fourcc == VA_FOURCC('Y', 'U', 'Y', '2') || fourcc == VA_FOURCC('U', 'Y', 'V', 'Y'));
@@ -1880,6 +1892,12 @@ gen7_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
             height[2] = obj_image->image.height / 2;
             pitch[2] = obj_image->image.pitches[V];
             offset[2] = obj_image->image.offsets[V];
+            if (fourcc == VA_FOURCC('V', 'V', '1', '6')) {
+                width[1] = obj_image->image.width / 2;
+                height[1] = obj_image->image.height;
+                width[2] = obj_image->image.width / 2;
+                height[2] = obj_image->image.height;
+            }
         }
     }
 
@@ -5069,6 +5087,7 @@ i965_image_processing(VADriverContextP ctx,
         case VA_FOURCC('4', '2', '2', 'V'):
         case VA_FOURCC('4', '1', '1', 'P'):
         case VA_FOURCC('4', '4', '4', 'P'):
+        case VA_FOURCC('Y', 'V', '1', '6'):
             status = i965_image_pl3_processing(ctx,
                                                src_surface,
                                                src_rect,