aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormahongpe <hongpeng.ma@intel.com>2015-05-15 01:55:58 +0800
committerPat Tjin <pattjin@google.com>2015-06-01 20:03:57 +0000
commit4ad4af4508156a7abb6ec8d8278495c5d25d6024 (patch)
treef09da6478ffda01dde6f638742d634c9e46b9ad6
parent7de87243f14370339bca45b55d98624a2be48596 (diff)
downloadpsb_video-4ad4af4508156a7abb6ec8d8278495c5d25d6024.tar.gz
enable metadata mode support in psb_video
clear gfx buffer before decoding. Bug: 19197299 Change-Id: I83f09fed7d38fc6698749756427771119a51003b Signed-off-by: mahongpe <hongpeng.ma@intel.com>
-rw-r--r--src/android/psb_surface_gralloc.c21
-rwxr-xr-xsrc/psb_drv_video.c156
2 files changed, 121 insertions, 56 deletions
diff --git a/src/android/psb_surface_gralloc.c b/src/android/psb_surface_gralloc.c
index abbbf6b..26e4b26 100644
--- a/src/android/psb_surface_gralloc.c
+++ b/src/android/psb_surface_gralloc.c
@@ -263,8 +263,6 @@ VAStatus psb_CreateSurfacesFromGralloc(
unsigned long handle;
int size = num_surfaces * sizeof(unsigned int);
void *vaddr[GRALLOC_SUB_BUFFER_MAX];
- unsigned char * surface_data = NULL;
-
/* follow are gralloc-buffers */
format = format & (~VA_RT_FORMAT_PROTECTED);
@@ -412,6 +410,15 @@ VAStatus psb_CreateSurfacesFromGralloc(
attribute_tpi->reserved[1] = (unsigned long)obj_surface->share_info;
+ if (vaddr[GRALLOC_SUB_BUFFER0] == NULL) {
+ drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to lock graphic buffer in psb_video");
+ }
+ else {
+ size = psb_surface->chroma_offset;
+ memset((char *)vaddr[GRALLOC_SUB_BUFFER0], 0, size);
+ memset((char *)vaddr[GRALLOC_SUB_BUFFER0] + size, 0x80, psb_surface->size - size);
+ }
+
obj_surface->share_info->surface_protected = driver_data->protected;
if (driver_data->render_rect.width == 0 || driver_data->render_rect.height == 0) {
obj_surface->share_info->crop_width = obj_surface->share_info->width;
@@ -433,16 +440,6 @@ VAStatus psb_CreateSurfacesFromGralloc(
}
gralloc_unlock((buffer_handle_t)handle);
psb_surface->buf.user_ptr = NULL;
-
- if (psb_buffer_map(&psb_surface->buf, &surface_data)) {
- drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to map rotation buffer before clear it");
- }
- else {
- size = psb_surface->chroma_offset;
- memset(surface_data, 0, size);
- memset(surface_data + size, 0x80, psb_surface->size - size);
- psb_buffer_unmap(&psb_surface->buf);
- }
}
pthread_mutex_unlock(&gralloc_mutex);
diff --git a/src/psb_drv_video.c b/src/psb_drv_video.c
index 3311f7d..7417b25 100755
--- a/src/psb_drv_video.c
+++ b/src/psb_drv_video.c
@@ -113,8 +113,12 @@
#define MAX_UNUSED_BUFFERS 16
+#define PSB_SURFACE_UNAVAILABLE 0x40000000
+
#define PSB_MAX_FLIP_DELAY (1000/30/10)
+#define PSB_SURFACE_UNAVAILABLE 0x40000000
+
#include <signal.h>
#define EXPORT __attribute__ ((visibility("default")))
@@ -669,6 +673,40 @@ VAStatus psb_GetSurfaceAttributes(
}
+#ifdef PSBVIDEO_MSVDX_DEC_TILING
+unsigned long psb__tile_stride_log2_256(int w)
+{
+ int stride_mode = 0;
+
+ if (512 >= w)
+ stride_mode = 1;
+ else if (1024 >= w)
+ stride_mode = 2;
+ else if (2048 >= w)
+ stride_mode = 3;
+ else if (4096 >= w)
+ stride_mode = 4;
+
+ return stride_mode;
+}
+
+unsigned long psb__tile_stride_log2_512(int w)
+{
+ int stride_mode = 0;
+
+ if (512 >= w)
+ stride_mode = 0;
+ else if (1024 >= w)
+ stride_mode = 1;
+ else if (2048 >= w)
+ stride_mode = 2;
+ else if (4096 >= w)
+ stride_mode = 3;
+
+ return stride_mode;
+}
+#endif
+
VAStatus psb_CreateSurfaces(
VADriverContextP __maybe_unused ctx,
int __maybe_unused width,
@@ -907,7 +945,8 @@ VAStatus psb_DestroySurfaces(
)
{
INIT_DRIVER_DATA
- int i;
+ int i, j;
+ object_context_p obj_context = NULL;
VAStatus vaStatus = VA_STATUS_SUCCESS;
if (num_surfaces <= 0) {
@@ -942,6 +981,17 @@ VAStatus psb_DestroySurfaces(
/* Surface is being displaying. Need to stop overlay here */
psb_coverlay_stop(ctx);
}
+
+ obj_context = CONTEXT(obj_surface->context_id);
+ if (obj_context != NULL) {
+ for (j = 0; j < obj_context->num_render_targets; j++) {
+ if (obj_context->render_targets[j] == obj_surface->surface_id) {
+ obj_context->render_targets[j] = VA_INVALID_SURFACE;
+ break;
+ }
+ }
+ }
+
drv_debug_msg(VIDEO_DEBUG_INIT, "%s : obj_surface->surface_id = 0x%x\n",__FUNCTION__, obj_surface->surface_id);
if (obj_surface->share_info) {
psb_DestroySurfaceGralloc(obj_surface);
@@ -1002,40 +1052,6 @@ int psb_rm_context(psb_driver_data_p driver_data)
return ret;
}
-#ifdef PSBVIDEO_MSVDX_DEC_TILING
-unsigned long psb__tile_stride_log2_256(int w)
-{
- int stride_mode = 0;
-
- if (512 >= w)
- stride_mode = 1;
- else if (1024 >= w)
- stride_mode = 2;
- else if (2048 >= w)
- stride_mode = 3;
- else if (4096 >= w)
- stride_mode = 4;
-
- return stride_mode;
-}
-
-unsigned long psb__tile_stride_log2_512(int w)
-{
- int stride_mode = 0;
-
- if (512 >= w)
- stride_mode = 0;
- else if (1024 >= w)
- stride_mode = 1;
- else if (2048 >= w)
- stride_mode = 2;
- else if (4096 >= w)
- stride_mode = 3;
-
- return stride_mode;
-}
-#endif
-
VAStatus psb_CreateContext(
VADriverContextP ctx,
VAConfigID config_id,
@@ -1053,10 +1069,10 @@ VAStatus psb_CreateContext(
object_config_p obj_config;
int cmdbuf_num, encode = 0, proc = 0;
int i;
- drv_debug_msg(VIDEO_DEBUG_ERROR, "CreateContext config_id:%d, pic_w:%d, pic_h:%d, flag:%d, num_render_targets:%d.\n",
- config_id, picture_width, picture_height, flag, num_render_targets);
+ drv_debug_msg(VIDEO_DEBUG_ERROR, "CreateContext config_id:%d, pic_w:%d, pic_h:%d, flag:%d, num_render_targets:%d, render_targets: %p.\n",
+ config_id, picture_width, picture_height, flag, num_render_targets, render_targets);
- //CHECK_INVALID_PARAM(num_render_targets <= 0);
+ CHECK_INVALID_PARAM(num_render_targets < 0);
//CHECK_SURFACE(render_targets);
CHECK_CONTEXT(context);
@@ -1152,7 +1168,7 @@ VAStatus psb_CreateContext(
else
cmdbuf_num = PSB_MAX_CMDBUFS;
- if (num_render_targets > 0) {
+ if (num_render_targets > 0 && (render_targets != NULL)) {
for (i = 0; i < num_render_targets; i++) {
object_surface_p obj_surface = SURFACE(render_targets[i]);
psb_surface_p psb_surface;
@@ -1172,7 +1188,7 @@ VAStatus psb_CreateContext(
obj_context->render_targets[i] = render_targets[i];
obj_surface->context_id = contextID; /* Claim ownership of surface */
#ifdef PSBVIDEO_MSVDX_DEC_TILING
- if (GET_SURFACE_INFO_tiling(psb_surface))
+ if (GET_SURFACE_INFO_tiling(psb_surface)) {
#ifdef BAYTRAIL
obj_context->msvdx_tile = psb__tile_stride_log2_512(obj_surface->width);
#else
@@ -1183,9 +1199,7 @@ VAStatus psb_CreateContext(
else
obj_context->msvdx_tile = psb__tile_stride_log2_256(obj_surface->width);
#endif
- else {
- ;
- }
+ }
#endif
#if 0
/* for decode, move the surface into |TT */
@@ -1195,6 +1209,10 @@ VAStatus psb_CreateContext(
WSBM_PL_FLAG_TT | WSBM_PL_FLAG_SHARED, DRM_PSB_FLAG_MEM_MMU);
#endif
}
+ } else if (num_render_targets > 0) {
+ for (i = 0; i < num_render_targets; i++) {
+ obj_context->render_targets[i] = VA_INVALID_SURFACE;
+ }
}
obj_context->va_flags = flag;
@@ -1411,6 +1429,18 @@ VAStatus psb_CreateContext(
obj_context->ctp_type |= ((obj_context->msvdx_tile & 0xff) << 16);
}
+ if (obj_context->ctp_type & VAEntrypointVLD) {
+ if (render_targets == NULL) {
+ obj_context->ctp_type |= PSB_SURFACE_UNAVAILABLE;
+ }
+ }
+
+ if (obj_context->ctp_type & VAEntrypointVLD) {
+ if (render_targets == NULL) {
+ obj_context->ctp_type |= PSB_SURFACE_UNAVAILABLE;
+ }
+ }
+
if (obj_config->profile == VAProfileVC1Simple ||
obj_config->profile == VAProfileVC1Main ||
obj_config->profile == VAProfileVC1Advanced) {
@@ -2061,6 +2091,7 @@ VAStatus psb_BeginPicture(
object_context_p obj_context;
object_surface_p obj_surface;
object_config_p obj_config;
+ unsigned int i = 0, j = VA_INVALID_ID;
obj_context = CONTEXT(context);
CHECK_CONTEXT(obj_context);
@@ -2079,6 +2110,43 @@ VAStatus psb_BeginPicture(
if (obj_config == NULL)
return VA_STATUS_ERROR_INVALID_CONFIG;
+ for (i = 0; i < (unsigned int)obj_context->num_render_targets; i++) {
+ if (obj_context->render_targets[i] == obj_surface->surface_id) {
+ break;
+ } else if (SURFACE(obj_context->render_targets[i]) == NULL) {
+ j = (i < j) ? i : j;
+ }
+ }
+
+ if (i >= (unsigned int)obj_context->num_render_targets) {
+ if (j < (unsigned int)obj_context->num_render_targets) {
+ obj_context->render_targets[j] = obj_surface->surface_id;
+ obj_surface->context_id = obj_context->context_id;
+
+#ifdef PSBVIDEO_MSVDX_DEC_TILING
+ if (GET_SURFACE_INFO_tiling(obj_surface->psb_surface)) {
+#ifdef BAYTRAIL
+ obj_context->msvdx_tile = psb__tile_stride_log2_512(obj_surface->width);
+#else
+ if ( (obj_config != NULL) &&
+ (obj_config->entrypoint == VAEntrypointVideoProc) &&
+ (obj_config->profile == VAProfileNone)) {
+ obj_context->msvdx_tile = psb__tile_stride_log2_256(obj_context->picture_width);
+ } else {
+ obj_context->msvdx_tile = psb__tile_stride_log2_256(obj_surface->width);
+ }
+#endif
+ }
+
+ obj_context->msvdx_tile &= 0xf; /* clear rotate tile */
+ obj_context->ctp_type &= (~PSB_CTX_TILING_MASK); /* clear tile context */
+ obj_context->ctp_type |= ((obj_context->msvdx_tile & 0xff) << 16);
+ obj_context->ctp_type &= (~PSB_SURFACE_UNAVAILABLE);
+ psb_update_context(driver_data, obj_context->ctp_type | driver_data->protected);
+#endif
+ }
+ }
+
/* if the surface is decode render target, and in displaying */
if (obj_config &&
(obj_config->entrypoint != VAEntrypointEncSlice) &&
@@ -2103,7 +2171,7 @@ VAStatus psb_BeginPicture(
driver_data->disable_msvdx_rotate = 0;
#endif
if (obj_context->interlaced_stream || driver_data->disable_msvdx_rotate) {
- int i;
+ int i = 0;
obj_context->msvdx_rotate = 0;
if (obj_context->num_render_targets > 0) {
for (i = 0; i < obj_context->num_render_targets; i++) {