diff options
-rw-r--r-- | src/android/psb_surface_gralloc.c | 14 | ||||
-rwxr-xr-x | src/pnw_rotate.c | 2 | ||||
-rwxr-xr-x | src/psb_drv_video.h | 28 | ||||
-rwxr-xr-x | src/psb_output.c | 74 | ||||
-rw-r--r-- | src/tng_VP8.c | 4 |
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); |