psb_video: conform to latest VP8 and pass color info

The definition of macroblock_offset in VASliceParameterBufferVP8
has been changed. It is the offset to the first bit of MB from
the first byte of slice data.
pass color info to hwc with payload

Change-Id: I74c62a1a029009b4f4019d6cb684c879f0c4c2a8
Signed-off-by: Haitao Ding <haitao.ding@intel.com>
diff --git a/src/android/psb_surface_gralloc.c b/src/android/psb_surface_gralloc.c
index 26e4b26..fcd4b47 100644
--- a/src/android/psb_surface_gralloc.c
+++ b/src/android/psb_surface_gralloc.c
@@ -418,6 +418,20 @@
                         memset((char *)vaddr[GRALLOC_SUB_BUFFER0], 0, size);
                         memset((char *)vaddr[GRALLOC_SUB_BUFFER0] + size, 0x80, psb_surface->size - size);
                     }
+                    // overlay only support BT.601 and BT.709
+                    if (driver_data->load_csc_matrix == 1) {
+                        obj_surface->share_info->csc_mode = (driver_data->is_BT601 == 1) ? 0 : 1;
+                    } else {
+                        // if csc matrix is not set, use BT601 by default
+                        obj_surface->share_info->csc_mode = 0;
+                    }
+
+                    if (driver_data->set_video_range == 1) {
+                        obj_surface->share_info->video_range = driver_data->video_range;
+                    } else {
+                        // if video range is not set, use limited range by default
+                        obj_surface->share_info->video_range = 0;
+                    }
 
                     obj_surface->share_info->surface_protected = driver_data->protected;
                     if (driver_data->render_rect.width == 0 || driver_data->render_rect.height == 0) {
diff --git a/src/pnw_rotate.c b/src/pnw_rotate.c
index 5dc1518..30f9d45 100755
--- a/src/pnw_rotate.c
+++ b/src/pnw_rotate.c
@@ -426,7 +426,7 @@
         if (obj_context->interlaced_stream) {
             SET_SURFACE_INFO_rotate(obj_surface->psb_surface, 0);
             obj_context->msvdx_rotate = 0;
-            share_info->bob_deinterlace = 1;
+            share_info->bob_deinterlace = 0; //enable interlace flag
         } else {
            share_info->bob_deinterlace = 0;
        }
diff --git a/src/psb_drv_video.h b/src/psb_drv_video.h
index e036985..6df3424 100755
--- a/src/psb_drv_video.h
+++ b/src/psb_drv_video.h
@@ -137,6 +137,24 @@
 /* Some funtions aren't used but we'd like to keep them as reference code in future */
 #define PSB_MFLD_DUMMY_CODE     0
 
+/*
+ * ITU-R BT.601 and BT.709 transfer matrices from VA 2.0
+ * Video Color Field definitions Design Spec(Version 0.03).
+ * [R', G', B'] values are in the range [0, 1], Y' is in the range [0,1]
+ * and [Pb, Pr] components are in the range [-0.5, 0.5].
+ */
+static float s601[9] = {
+    1, -0.000001, 1.402,
+    1, -0.344136, -0.714136,
+    1, 1.772, 0
+};
+
+static float s709[9] = {
+    1, 0, 1.5748,
+    1, -0.187324, -0.468124,
+    1, 1.8556, 0
+};
+
 typedef struct object_config_s *object_config_p;
 typedef struct object_context_s *object_context_p;
 typedef struct object_surface_s *object_surface_p;
@@ -266,7 +284,11 @@
     int  is_oold;
 
     unsigned int load_csc_matrix;
-    signed int   csc_matrix[CSC_MATRIX_X][CSC_MATRIX_Y];
+    float   csc_matrix[CSC_MATRIX_X][CSC_MATRIX_Y];
+    int  is_BT601;
+
+    unsigned int set_video_range;
+    unsigned int video_range;
 
     /* subpic number current buffers support */
     unsigned int max_subpic;
@@ -504,6 +526,10 @@
     unsigned int coded_width;
     unsigned int coded_height;
     unsigned int initialized;
+
+    unsigned int csc_mode;
+    unsigned int video_range;
+
 };
 
 struct object_surface_s {
diff --git a/src/psb_output.c b/src/psb_output.c
index 0d02cac..fff6dbc 100755
--- a/src/psb_output.c
+++ b/src/psb_output.c
@@ -51,6 +51,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <sys/ioctl.h>
+#include <math.h>
 
 #define INIT_DRIVER_DATA        psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData;
 
@@ -1858,7 +1859,8 @@
         BRIGHTNESS_MIN,
         BRIGHTNESS_MAX,
         BRIGHTNESS_DEFAULT_VALUE,
-        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE
+        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE,
+        NULL
     },
 
     {
@@ -1866,7 +1868,8 @@
         CONTRAST_MIN,
         CONTRAST_MAX,
         CONTRAST_DEFAULT_VALUE,
-        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE
+        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE,
+        NULL
     },
 
     {
@@ -1874,7 +1877,8 @@
         HUE_MIN,
         HUE_MAX,
         HUE_DEFAULT_VALUE,
-        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE
+        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE,
+        NULL
     },
 
     {
@@ -1882,77 +1886,88 @@
         SATURATION_MIN,
         SATURATION_MAX,
         SATURATION_DEFAULT_VALUE,
-        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE
+        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE,
+        NULL
     },
     {
         VADisplayAttribBackgroundColor,
         0x00000000,
         0xffffffff,
         0x00000000,
-        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE
+        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE,
+        NULL
     },
     {
         VADisplayAttribRotation,
         VA_ROTATION_NONE,
         VA_ROTATION_270,
         VA_ROTATION_NONE,
-        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE
+        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE,
+        NULL
     },
     {
         VADisplayAttribOutofLoopDeblock,
         VA_OOL_DEBLOCKING_FALSE,
         VA_OOL_DEBLOCKING_TRUE,
         VA_OOL_DEBLOCKING_FALSE,
-        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE
+        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE,
+        NULL
     },
     {
         VADisplayAttribBlendColor,
         0x00000000,
         0xffffffff,
         0x00000000,
-        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE
+        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE,
+        NULL
     },
     {
         VADisplayAttribOverlayColorKey,
         0x00000000,
         0xffffffff,
         0x00000000,
-        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE
+        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE,
+        NULL
     },
     {
         VADisplayAttribOverlayAutoPaintColorKey,
         0x00000000,
         0xffffffff,
         0x00000000,
-        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE
+        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE,
+        NULL
     },
     {
         VADisplayAttribCSCMatrix,
         0x00000000,
         0xffffffff,
         0x00000000,
-        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE
+        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE,
+        NULL
     },
     {
         VADisplayAttribRenderDevice,
         0x00000000,
         0xffffffff,
         0x00000000,
-        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE
+        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE,
+        NULL
     },
     {
         VADisplayAttribRenderMode,
         0x00000000,
         0xffffffff,
         0x00000000,
-        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE
+        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE,
+        NULL
     },
     {
         VADisplayAttribRenderRect,
         0x00000000,
         0xffffffff,
         0x00000000,
-        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE
+        VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE,
+        NULL
     }
 };
 
@@ -2106,7 +2121,7 @@
 
     VADisplayAttribute *p = attr_list;
     int i, update_coeffs = 0;
-    unsigned int *p_tmp;
+    float *p_tmp;
 
     if (num_attributes <= 0) {
         return VA_STATUS_ERROR_INVALID_PARAMETER;
@@ -2155,13 +2170,32 @@
 
         case VADisplayAttribCSCMatrix:
             driver_data->load_csc_matrix = 1;
-            p_tmp = (unsigned int *)p->value;
+            p_tmp = (float *)(p->attrib_ptr);
             for (j = 0; j < CSC_MATRIX_Y; j++)
                 for (k = 0; k < CSC_MATRIX_X; k++) {
                     if (p_tmp)
                         driver_data->csc_matrix[j][k] = *p_tmp;
                    p_tmp++; 
                 }
+
+            for (j = 0; j < CSC_MATRIX_Y; j++)
+                for (k = 0; k < CSC_MATRIX_X; k++) {
+                    if (fabs(s601[j*CSC_MATRIX_X+k] - driver_data->csc_matrix[j][k]) > 1e-6) {
+                        break;
+                    }
+                    if (k < CSC_MATRIX_X) {
+                        break;
+                    }
+                }
+
+            if (j == CSC_MATRIX_Y && k == CSC_MATRIX_X) {
+                driver_data->is_BT601 = 1;
+            }
+            break;
+
+        case VADisplayAttribColorRange:
+            driver_data->set_video_range = 1;
+            driver_data->video_range = (p->value == VA_SOURCE_RANGE_FULL);
             break;
 
         case VADisplayAttribBlendColor:
@@ -2191,10 +2225,10 @@
             driver_data->render_mode = p->value & VA_RENDER_MODE_MASK;
             break;
         case VADisplayAttribRenderRect:
-            driver_data->render_rect.x = ((VARectangle *)(p->value))->x;
-            driver_data->render_rect.y = ((VARectangle *)(p->value))->y;
-            driver_data->render_rect.width = ((VARectangle *)(p->value))->width;
-            driver_data->render_rect.height = ((VARectangle *)(p->value))->height;
+            driver_data->render_rect.x = ((VARectangle *)(p->attrib_ptr))->x;
+            driver_data->render_rect.y = ((VARectangle *)(p->attrib_ptr))->y;
+            driver_data->render_rect.width = ((VARectangle *)(p->attrib_ptr))->width;
+            driver_data->render_rect.height = ((VARectangle *)(p->attrib_ptr))->height;
             break;
 
         default:
diff --git a/src/tng_VP8.c b/src/tng_VP8.c
index 28b841f..28a1dc1 100644
--- a/src/tng_VP8.c
+++ b/src/tng_VP8.c
@@ -995,7 +995,7 @@
     //ctx->cmd_header->ui32Cmd_AdditionalParams |= ((ctx->pic_params->partition_size[0] + ((ctx->pic_params->pic_fields.bits.key_frame == 0) ? 10 : 3)) & VP8_BUFFOFFSET_MASK) ;
     //ctx->cmd_header->ui32Cmd_AdditionalParams |= ((ctx->pic_params->num_of_partitions << VP8_PARTITIONSCOUNT_SHIFT) & VP8_PARTITIONSCOUNT_MASK) ; /* if the bistream is multistream */
 
-    (*ctx->dec_ctx.cmd_params) |= ((3 + ctx->slice_params->partition_size[0]) & VP8_BUFFOFFSET_MASK);
+    (*ctx->dec_ctx.cmd_params) |= ((ctx->slice_params->partition_size[0] + (ctx->pic_params->bool_coder_ctx.count & 0x07 ? 1 : 0) + (ctx->slice_params->macroblock_offset >> 3)) & VP8_BUFFOFFSET_MASK);
     (*ctx->dec_ctx.cmd_params) |= (((ctx->slice_params->num_of_partitions - 1) << VP8_PARTITIONSCOUNT_SHIFT) & VP8_PARTITIONSCOUNT_MASK) ; /* if the bistream is multistream */
     // not used in fw ctx->cmd_header->ui32Cmd_AdditionalParams |= ((ctx->pic_params->frame_type << VP8_FRAMETYPE_SHIFT) & VP8_BUFFOFFSET_MASK) ;
 }
@@ -1089,7 +1089,7 @@
        /* add the first partition offset */
        psb_cmdbuf_reg_start_block(cmdbuf, 0);
 
-       ctx->DCT_Base_Address_Offset = (3 + ctx->slice_params->partition_size[0]) + 3 * (ctx->slice_params->num_of_partitions - 2) ;
+       ctx->DCT_Base_Address_Offset = (ctx->slice_params->partition_size[0] + (ctx->pic_params->bool_coder_ctx.count & 0x07 ? 1 : 0) + (ctx->slice_params->macroblock_offset >> 3)) + 3 * (ctx->slice_params->num_of_partitions - 2) ;
        /* REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_VEC_VP8, CR_VEC_VP8_FE_DCT_BASE_ADDRESS, VP8_FE_DCT_BASE_ADDRESS, ctx->DCT_Base_Address); */
        psb_cmdbuf_reg_set_address(cmdbuf, REGISTER_OFFSET (MSVDX_VEC_VP8, CR_VEC_VP8_FE_DCT_BASE_ADDRESS),
 				  ctx->dec_ctx.slice_data_buffer, ctx->DCT_Base_Address_Offset);