aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);