aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaitao Ding <haitao.ding@intel.com>2015-05-19 18:19:45 -0400
committerPatrick Tjin <pattjin@google.com>2015-06-09 07:56:18 -0700
commit94ef7ebe0b0f58b76bf652ce74d09673c8918936 (patch)
tree81313d0038adc6411dc95087405ccf1c528dc479
parent4ad4af4508156a7abb6ec8d8278495c5d25d6024 (diff)
downloadpsb_video-94ef7ebe0b0f58b76bf652ce74d09673c8918936.tar.gz
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>
-rw-r--r--src/android/psb_surface_gralloc.c14
-rwxr-xr-xsrc/pnw_rotate.c2
-rwxr-xr-xsrc/psb_drv_video.h28
-rwxr-xr-xsrc/psb_output.c74
-rw-r--r--src/tng_VP8.c4
5 files changed, 98 insertions, 24 deletions
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 @@ VAStatus psb_CreateSurfacesFromGralloc(
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 @@ void psb_CheckInterlaceRotate(object_context_p obj_context, unsigned char *pic_p
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 @@ struct psb_driver_data_s {
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 @@ struct psb_surface_share_info_s {
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 @@ static VADisplayAttribute psb__DisplayAttribute[] = {
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 @@ static VADisplayAttribute psb__DisplayAttribute[] = {
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 @@ static VADisplayAttribute psb__DisplayAttribute[] = {
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 @@ static VADisplayAttribute psb__DisplayAttribute[] = {
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 @@ VAStatus psb_SetDisplayAttributes(
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 @@ VAStatus psb_SetDisplayAttributes(
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 @@ VAStatus psb_SetDisplayAttributes(
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 @@ static void tng__VP8_set_slice_param(context_VP8_p ctx) {
//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 @@ static void tng__VP8_FE_Registers_Write(context_VP8_p ctx) {
/* 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);