Support YV12 format for ISV functions

In current design, all YUV420 surface will be handled with VA_FOURCC_NV12.
The correct pixel format will be saved in extra_info[8].
VSP driver will indentify YV12 format with extra_info[8].

BZ: 229811
Bug: 17383204


Change-Id: I405b37bbac273e611b7415781b6dc586808b78ba
Signed-off-by: Wang Kun <kun.k.wang@intel.com>
diff --git a/src/android/psb_surface_gralloc.c b/src/android/psb_surface_gralloc.c
index f98aff5..54fe648 100644
--- a/src/android/psb_surface_gralloc.c
+++ b/src/android/psb_surface_gralloc.c
@@ -445,6 +445,8 @@
         buffer_stride = psb_surface->stride;
         /* by default, surface fourcc is NV12 */
         psb_surface->extra_info[4] = fourcc;
+        /* save the pixel format set by application */
+        psb_surface->extra_info[8] = external_buffers->pixel_format;
 #ifdef PSBVIDEO_MSVDX_DEC_TILING
         psb_surface->extra_info[7] = external_buffers->tiling;
 #endif
diff --git a/src/psb_drv_video.c b/src/psb_drv_video.c
index dc4f8f0..930f208 100755
--- a/src/psb_drv_video.c
+++ b/src/psb_drv_video.c
@@ -881,6 +881,7 @@
         buffer_stride = psb_surface->stride;
         /* by default, surface fourcc is NV12 */
         psb_surface->extra_info[4] = fourcc;
+        psb_surface->extra_info[8] = fourcc;
         obj_surface->psb_surface = psb_surface;
     }
 
diff --git a/src/psb_surface.c b/src/psb_surface.c
index 876ea0d..446be3e 100644
--- a/src/psb_surface.c
+++ b/src/psb_surface.c
@@ -183,6 +183,7 @@
     psb_surface->chroma_offset = chroma_u_offset;
     psb_surface->size = size;
     psb_surface->extra_info[4] = VA_FOURCC_NV12;
+    psb_surface->extra_info[8] = VA_FOURCC_NV12;
 
     ret = psb_buffer_create(driver_data, psb_surface->size, psb_bt_cpu_vpu_shared, &psb_surface->buf);
 
@@ -231,6 +232,7 @@
     psb_surface->chroma_offset = chroma_u_offset;
     psb_surface->size = size;
     psb_surface->extra_info[4] = VA_FOURCC_NV12;
+    psb_surface->extra_info[8] = VA_FOURCC_NV12;
 
     ret = psb_kbuffer_reference(driver_data, &psb_surface->buf, kbuf_handle);
 
diff --git a/src/psb_surface.h b/src/psb_surface.h
index 3eaf53d..5ed0997 100644
--- a/src/psb_surface.h
+++ b/src/psb_surface.h
@@ -69,8 +69,9 @@
      * extra_info[5]: surface skippeded or not for encode, rotate info for decode
      * extra_info[6]: mfld protected surface
      * extra_info[7]: linear or tiled
+     * extra_info[8]: the fourcc set by application
      */
-    int extra_info[8];
+    int extra_info[9];
     int size;
     unsigned int bc_buffer;
     void *handle;
diff --git a/src/psb_surface_attrib.c b/src/psb_surface_attrib.c
index f30819b..3b2b0fd 100644
--- a/src/psb_surface_attrib.c
+++ b/src/psb_surface_attrib.c
@@ -112,6 +112,8 @@
             psb_surface->extra_info[4] = VA_FOURCC_RGBA;
         }
 
+        psb_surface->extra_info[8] = psb_surface->extra_info[4];
+
     } else {
         return VA_STATUS_ERROR_ALLOCATION_FAILED;
     }
@@ -389,6 +391,7 @@
         /* by default, surface fourcc is NV12 */
         memset(psb_surface->extra_info, 0, sizeof(psb_surface->extra_info));
         psb_surface->extra_info[4] = fourcc;
+        psb_surface->extra_info[8] = fourcc;
 #ifdef PSBVIDEO_MSVDX_DEC_TILING
 	psb_surface->extra_info[7] = tiling;
 #endif
@@ -526,6 +529,7 @@
     /* by default, surface fourcc is NV12 */
     memset(psb_surface->extra_info, 0, sizeof(psb_surface->extra_info));
     psb_surface->extra_info[4] = kBuf_fourcc;
+    psb_surface->extra_info[8] = kBuf_fourcc;
 #ifdef PSBVIDEO_MSVDX_DEC_TILING
     psb_surface->extra_info[7] = tiling;
 #endif
@@ -618,6 +622,7 @@
         /* by default, surface fourcc is NV12 */
         memset(psb_surface->extra_info, 0, sizeof(psb_surface->extra_info));
         psb_surface->extra_info[4] = fourcc;
+        psb_surface->extra_info[8] = fourcc;
         obj_surface->psb_surface = psb_surface;
 
         /* Error recovery */
@@ -736,6 +741,7 @@
         /* by default, surface fourcc is NV12 */
         memset(psb_surface->extra_info, 0, sizeof(psb_surface->extra_info));
         psb_surface->extra_info[4] = fourcc;
+        psb_surface->extra_info[8] = fourcc;
         obj_surface->psb_surface = psb_surface;
 
         /* Error recovery */
diff --git a/src/vsp_VPP.c b/src/vsp_VPP.c
index 772cc87..05ef2b5 100644
--- a/src/vsp_VPP.c
+++ b/src/vsp_VPP.c
@@ -404,6 +404,8 @@
 	struct psb_surface_s *output_surface;
 	psb_surface_share_info_p input_share_info = NULL;
 	psb_surface_share_info_p output_share_info = NULL;
+ 	enum vsp_format format;
+
 
 	psb_driver_data_p driver_data = obj_context->driver_data;
 
@@ -539,6 +541,21 @@
 	/* get the tiling flag*/
 	tiled = GET_SURFACE_INFO_tiling(input_surface->psb_surface);
 #endif
+
+	/* get the surface format info  */
+	switch (input_surface->psb_surface->extra_info[8]) {
+		case VA_FOURCC_YV12:
+			format = VSP_YV12;
+			break;
+		case VA_FOURCC_NV12:
+			format = VSP_NV12;
+			break;
+		default:
+			vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
+			drv_debug_msg(VIDEO_DEBUG_ERROR, "Only support NV12 and YV12 format!\n");
+			goto out;
+	}
+
 	/*  According to VIED's design, the width must be multiple of 16 */
 	width = ALIGN_TO_16(input_surface->width);
 	if (width > input_surface->psb_surface->stride)
@@ -557,7 +574,7 @@
 	cell_proc_picture_param->input_picture[0].width = width;
 	cell_proc_picture_param->input_picture[0].irq = 0;
 	cell_proc_picture_param->input_picture[0].stride = input_surface->psb_surface->stride;
-	cell_proc_picture_param->input_picture[0].format = ctx->format;
+	cell_proc_picture_param->input_picture[0].format = format;
 	cell_proc_picture_param->input_picture[0].tiled = tiled;
 	cell_proc_picture_param->input_picture[0].rot_angle = 0;
 
@@ -665,7 +682,7 @@
 		cell_proc_picture_param->output_picture[i].width = width;
 		cell_proc_picture_param->output_picture[i].stride = stride;
 		cell_proc_picture_param->output_picture[i].irq = 1;
-		cell_proc_picture_param->output_picture[i].format = ctx->format;
+		cell_proc_picture_param->output_picture[i].format = format;
 		cell_proc_picture_param->output_picture[i].rot_angle = vsp_rotation_angle;
 		cell_proc_picture_param->output_picture[i].tiled = tiled;