vsp_vp8.c revision 9ab46f9986463a0a5e6ba912fffb71be24d119d9
1ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo/*
2ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
3ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo *
4ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * Permission is hereby granted, free of charge, to any person obtaining a
5ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * copy of this software and associated documentation files (the
6ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * "Software"), to deal in the Software without restriction, including
7ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * without limitation the rights to use, copy, modify, merge, publish,
8ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * distribute, sub license, and/or sell copies of the Software, and to
9ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * permit persons to whom the Software is furnished to do so, subject to
10ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * the following conditions:
11ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo *
12ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * The above copyright notice and this permission notice (including the
13ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * next paragraph) shall be included in all copies or substantial portions
14ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * of the Software.
15ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo *
16ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo *
24ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo * Authors:
25ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo *    Zhangfei Zhang <zhangfei.zhang@intel.com>
26ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo *    Mingruo Sun <mingruo.sun@intel.com>
27ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo *
28ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo */
29ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#include "vsp_VPP.h"
30ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#include "vsp_vp8.h"
31ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#include "psb_buffer.h"
32ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#include "psb_surface.h"
33ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#include "vsp_cmdbuf.h"
34ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#include "psb_drv_debug.h"
35ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#include "va/va_enc_vp8.h"
36ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
37ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData;
38ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define INIT_CONTEXT_VPP    context_VPP_p ctx = (context_VPP_p) obj_context->format_data;
39ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define CONFIG(id)  ((object_config_p) object_heap_lookup( &driver_data->config_heap, id ))
40ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id ))
41ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define BUFFER(id)  ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id ))
42ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
43ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define SURFACE(id)    ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id ))
44ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
45ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define KB 1024
46ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define MB (KB * KB)
47ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define VSP_VP8ENC_STATE_SIZE (48*MB)
48ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
49ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define ALIGN_TO_128(value) ((value + 128 - 1) & ~(128 - 1))
50ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
51ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define REF_FRAME_WIDTH  1920
52ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define REF_FRAME_HEIGHT 1088
53ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define REF_FRAME_BORDER   32
54ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
559ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo#define VP8_ENC_CBR 1
569ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo#define VP8_ENC_CBR_HRD 0
579ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo
58ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define XMEM_FRAME_BUFFER_SIZE_IN_BYTE ((REF_FRAME_WIDTH + 2 * REF_FRAME_BORDER) * (REF_FRAME_HEIGHT + 2 * REF_FRAME_BORDER) + \
59ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        2 * ((REF_FRAME_WIDTH + 2 * REF_FRAME_BORDER) >> 1) * (REF_FRAME_HEIGHT / 2 + REF_FRAME_BORDER)) // Allocated for HD
60ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
61ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruoenum filter_status {
62ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    FILTER_DISABLED = 0,
63ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    FILTER_ENABLED
64ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo};
65ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
66ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define FUNCTION_NAME \
67ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    printf("ENTER %s.\n",__FUNCTION__);
68ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
69ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define EXIT_FUNCTION_NAME \
70ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    printf("EXIT %s.\n",__FUNCTION__);
71ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
72ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
73ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic void vsp_VP8_DestroyContext(object_context_p obj_context);
74ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
75ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp__VP8_check_legal_picture(object_context_p obj_context, object_config_p obj_config);
76ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
77ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic void vsp_VP8_QueryConfigAttributes(
78ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAProfile profile,
79ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAEntrypoint entrypoint,
80ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAConfigAttrib *attrib_list,
81ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int num_attribs)
82ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
839ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    int i;
849ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s\n", __FUNCTION__);
859ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo
869ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    for (i = 0; i < num_attribs; i++) {
879ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo        switch (attrib_list[i].type) {
889ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	case VAConfigAttribRTFormat:
899ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	    break;
909ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	case VAConfigAttribRateControl:
919ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	    break;
929ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	case VAConfigAttribEncAutoReference:
939ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	    attrib_list[i].value = 1;
949ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	    break;
959ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	case VAConfigAttribEncMaxRefFrames:
969ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	    attrib_list[i].value = 4;
979ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	    break;
989ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo
999ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	default:
1009ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	    attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
1019ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	    break;
1029ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	}
1039ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    }
104ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
105ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
106ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_ValidateConfig(
107ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_config_p obj_config)
108ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
109ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int i;
1109ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s\n", __FUNCTION__);
1119ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo
112ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* Check all attributes */
113ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    for (i = 0; i < obj_config->attrib_count; i++) {
114ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        switch (obj_config->attrib_list[i].type) {
115ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            case VAConfigAttribRTFormat:
116ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                /* Ignore */
117ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                break;
1189ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo            case VAConfigAttribRateControl:
1199ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo		break;
1209ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo            case VAConfigAttribEncAutoReference:
1219ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo		break;
1229ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo            case VAConfigAttribEncMaxRefFrames:
1239ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo		break;
124ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
125ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            default:
126ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
127ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        }
128ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
129ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
130ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return VA_STATUS_SUCCESS;
131ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
132ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
133ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_CreateContext(
134ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context,
135ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_config_p obj_config)
136ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
137ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
1389ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    /* currently vp8 will use vpp's context since they will use the same cmdbuf */
139ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    context_VPP_p ctx;
140ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int i;
141ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
142ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx = (context_VPP_p) calloc(1, sizeof(struct context_VPP_s));
143ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (NULL == ctx) {
144ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
145ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        DEBUG_FAILURE;
146ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        return vaStatus;
147ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
148ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
1499ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    for (i = 0; i < obj_config->attrib_count; i++) {
1509ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	if (obj_config->attrib_list[i].type == VAConfigAttribRateControl) {
1519ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo            ctx->rc_mode = obj_config->attrib_list[i].value;
1529ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	    break;
1539ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo	}
1549ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    }
155ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
156ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* set size */
157ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->param_sz = 0;
158ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->pic_param_sz = ALIGN_TO_128(sizeof(struct VssVp8encPictureParameterBuffer));
159ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->param_sz += ctx->pic_param_sz;
160ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->seq_param_sz = ALIGN_TO_128(sizeof(struct VssVp8encSequenceParameterBuffer));
161ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->param_sz += ctx->seq_param_sz;
162ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
163ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* set offset */
164ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->pic_param_offset = 0;
165ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->seq_param_offset = ctx->pic_param_sz;
166ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
167ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->context_buf = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s));
168ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (NULL == ctx->context_buf) {
169ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
170ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        DEBUG_FAILURE;
171ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        goto out;
172ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
173ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
174ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vaStatus = psb_buffer_create(obj_context->driver_data, VSP_VP8ENC_STATE_SIZE, psb_bt_vpu_only, ctx->context_buf);
175ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
176ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (VA_STATUS_SUCCESS != vaStatus) {
177ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        goto out;
178ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
179ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
180ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    obj_context->format_data = (void*) ctx;
181ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->obj_context = obj_context;
1829ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo
183ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
184ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
185ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruoout:
186ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_DestroyContext(obj_context);
187ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
188ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (ctx)
189ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        free(ctx);
190ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
191ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
192ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
193ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
194ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic void vsp_VP8_DestroyContext(
195ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context)
196ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
197ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
198ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
199ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (ctx->context_buf) {
200ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        psb_buffer_destroy(ctx->context_buf);
201ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        free(ctx->context_buf);
202ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        ctx->context_buf = NULL;
203ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
204ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
205ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (ctx->filters) {
206ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        free(ctx->filters);
207ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        ctx->num_filters = 0;
208ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
209ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
210ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    free(obj_context->format_data);
211ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    obj_context->format_data = NULL;
212ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
213ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
214ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_vp8_process_seqence_param(
215ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    context_VPP_p ctx,
216ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p obj_buffer)
217ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
218ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
219ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
220ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf;
221ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int i;
222de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    int ref_frame_width, ref_frame_height;
223ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
224ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAEncSequenceParameterBufferVP8 *va_seq =
225ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            (VAEncSequenceParameterBufferVP8 *) obj_buffer->buffer_data;
226ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    struct VssVp8encSequenceParameterBuffer *seq =
227ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p;
228ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
229ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->frame_width = va_seq->frame_width;
230ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->frame_height = va_seq->frame_height;
231ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
232ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /*cmd structures initializations*/
233ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    seq->frame_width       = va_seq->frame_width;
234ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    seq->frame_height      = va_seq->frame_height;
2359ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->rc_target_bitrate = va_seq->bits_per_second / 1000;
236ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    seq->max_intra_rate    = 0;
2379ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->rc_undershoot_pct = va_seq->rc_undershoot;
2389ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->rc_overshoot_pct  = va_seq->rc_overshoot;
239ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* FIXME: API doc says max 5000, but for current default test vector we still use 6000 */
2409ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->rc_buf_sz         = va_seq->hrd_buf_size;
2419ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->rc_buf_initial_sz = va_seq->hrd_buf_initial_fullness;
2429ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->rc_buf_optimal_sz = va_seq->hrd_buf_optimal_fullness;
2439ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->rc_min_quantizer  = va_seq->min_qp;
2449ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->rc_max_quantizer  = va_seq->max_qp;
2459ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->kf_max_dist       = va_seq->kf_max_dist;
2469ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->kf_min_dist       = va_seq->kf_min_dist;
247ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    seq->frame_rate        = va_seq->frame_rate;
2489ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->error_resilient   = va_seq->error_resilient;
249ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    seq->num_token_partitions = 2; // (log2: 2^2 = 4)
2509ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->rc_end_usage         = (ctx->rc_mode == VA_RC_CBR) ? VP8_ENC_CBR_HRD : VP8_ENC_CBR;  /* CBR */
2519ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->kf_mode              = va_seq->kf_auto;   /* AUTO */
252ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    seq->cyclic_intra_refresh = 0;
253ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
254ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    seq->concatenate_partitions = 1; //Make 0 not to concatenate partitions
255ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
256de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    ref_frame_width = (ctx->frame_width + 2 * 32 + 63) & (~63);
257de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    ref_frame_height = (ctx->frame_height + 2 * 32 + 63) & (~63);
258de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo
259ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    for (i = 0; i < 4; i++)
260ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    {
261ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        seq->ref_frame_buffers[i].surface_id = va_seq->reference_frames[i];// not used now.
262de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo        seq->ref_frame_buffers[i].width = ref_frame_width;
263de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo        seq->ref_frame_buffers[i].height = ref_frame_height;
264ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
265ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
266ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    for (i = 0; i < 4; i++) {
267ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        object_surface_p ref_surf = SURFACE(va_seq->reference_frames[i]);
2680b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun	if (!ref_surf)
2690b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun		return VA_STATUS_ERROR_UNKNOWN;
2700b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun
271ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(seq->ref_frame_buffers[i].base),
272ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   ctx->seq_param_offset,
273ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   &(ref_surf->psb_surface->buf),
274ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   cmdbuf->param_mem_loc, seq);
275ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
276ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
277ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_insert_command(cmdbuf, &cmdbuf->param_mem,
278ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                              VssVp8encSetSequenceParametersCommand,
279ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                              ctx->seq_param_offset,
280ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                              sizeof(struct VssVp8encSequenceParameterBuffer));
281ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
282ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
283ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
284ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
285ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
286ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
287ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_vp8_process_picture_param(
288ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    psb_driver_data_p driver_data,
289ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    context_VPP_p ctx,
290ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p obj_buffer,
291ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VASurfaceID surface_id)
292ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
293ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
294ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
295ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf;
296ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
297de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    VAEncSequenceParameterBufferVP8 *va_seq =
298de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo            (VAEncSequenceParameterBufferVP8 *) obj_buffer->buffer_data;
299ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAEncPictureParameterBufferVP8 *va_pic =
300ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            (VAProcPipelineParameterBuffer *) obj_buffer->buffer_data;
301ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    struct VssVp8encPictureParameterBuffer *pic = cmdbuf->pic_param_p;
302ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    struct VssVp8encSequenceParameterBuffer *seq =
303ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo           (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p;
304ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VACodedBufferSegment *p = &obj_buffer->codedbuf_mapinfo[0];
305de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    int ref_frame_width, ref_frame_height;
306de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo
307de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    ref_frame_width = (ctx->frame_width + 2 * 32 + 63) & (~63);
308de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    ref_frame_height = (ctx->frame_height + 2 * 32 + 63) & (~63);
309ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
310ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    //map parameters
311ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p pObj = BUFFER(va_pic->coded_buf); //tobe modified
3120b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun    if (!pObj)
3130b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun		return VA_STATUS_ERROR_UNKNOWN;
3140b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun
315ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_surface_p src_surface = SURFACE(surface_id);
316ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
317ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.surface_id = surface_id;
318ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.irq        = 1;
319ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.height     = ctx->frame_height;
320ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.width      = ctx->frame_width;
321ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.stride     = (ctx->frame_width + 31) & (~31);
322ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.format     = 0; /* TODO: Specify NV12 = 0 */
323ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
324de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    pic->recon_frame.surface_id = va_seq->reference_frames[0];
325de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    pic->recon_frame.irq = 0;
326de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    pic->recon_frame.width = ref_frame_width;
327de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    pic->recon_frame.height = ref_frame_height;
328de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo
329ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->version = 0;
330ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->pic_flags = (1<< 2) |  /* corresponds to  VP8_EFLAG_NO_REF_GF      */
331ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                     (1<< 3) |  /* corresponds to  VP8_EFLAG_NO_REF_ARF     */
332ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                     (1<< 12);   /* corresponds to ~VP8_EFLAG_NO_UPD_ENTROPY */
333ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->prev_frame_dropped = 0; /* Not yet used */
334ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->cpuused            = 5;
335ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->sharpness          = 0;
336ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->num_token_partitions = 2; /* 2^2 = 4 partitions */
337ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->encoded_frame_size = ((sizeof(struct VssVp8encEncodedFrame) + 2*1024*1024 - 1) + 31) & (~31); //pObj->size;
338ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->encoded_frame_base = pObj->buffer_data  ;//tobe modified
339ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
340ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    {
341ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(pic->encoded_frame_base),
342ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   ctx->pic_param_offset, pObj->psb_buffer,
343ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   cmdbuf->param_mem_loc, pic);
344ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
345ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
346ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    {
347ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        object_surface_p cur_surf = SURFACE(surface_id);
3480b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun	if(!cur_surf)
3490b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun		return VA_STATUS_ERROR_UNKNOWN;
3500b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun
351ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(pic->input_frame.base),
352ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   ctx->pic_param_offset, &(cur_surf->psb_surface->buf),
353ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   cmdbuf->param_mem_loc, pic);
354ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
355ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
356ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    //vsp_cmdbuf_insert_command(cmdbuf, &cmdbuf->param_mem,
357ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    //                        VssVp8encEncodeFrameCommand,
358ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    //                        ctx->pic_param_offset,
359ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    //                        sizeof(VssVp8encPictureParameterBuffer));
360ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    //vsp_cmdbuf_fence_pic_param(cmdbuf, wsbmKBufHandle(wsbmKBuf(cmdbuf->param_mem.drm_buf)));
361ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
362ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    do { *cmdbuf->cmd_idx++ = 0;\
363ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo         *cmdbuf->cmd_idx++ = VssVp8encEncodeFrameCommand;\
364ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo         VSP_RELOC_CMDBUF(cmdbuf->cmd_idx++, ctx->pic_param_offset, &cmdbuf->param_mem);\
365ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo         *cmdbuf->cmd_idx++ = sizeof(struct VssVp8encPictureParameterBuffer);\
366ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo         *cmdbuf->cmd_idx++ = 0; *cmdbuf->cmd_idx++ = 0;\
367ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo         *cmdbuf->cmd_idx++ = wsbmKBufHandle(wsbmKBuf(pObj->psb_buffer->drm_buf)) ; \
368ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo         *cmdbuf->cmd_idx++ = wsbmKBufHandle(wsbmKBuf((&cmdbuf->param_mem)->drm_buf)); } while(0);
369ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
370ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
371ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
372ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
373ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_RenderPicture(
374ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context,
375ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p *buffers,
376ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int num_buffers)
377ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
378ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
379ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int i;
380ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    psb_driver_data_p driver_data = obj_context->driver_data;
381ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
382ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VASurfaceID surface_id;
383ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
384ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
385ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    for (i = 0; i < num_buffers; i++)
386ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    {
387ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
388ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        object_buffer_p obj_buffer = buffers[i];
389ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        switch (obj_buffer->type) {
390ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        case VAEncSequenceParameterBufferType:
391ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            vaStatus = vsp_vp8_process_seqence_param(ctx, obj_buffer);
392ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            break;
393ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        case VAEncPictureParameterBufferType:
394ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            surface_id = obj_context->current_render_surface_id;
395ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            vaStatus = vsp_vp8_process_picture_param(driver_data,ctx, obj_buffer,surface_id);
396ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            break;
397ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        default:
398ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            vaStatus = VA_STATUS_SUCCESS;//VA_STATUS_ERROR_UNKNOWN;
399ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            DEBUG_FAILURE;
400ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        }
401ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        if (vaStatus != VA_STATUS_SUCCESS) {
402ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            break;
403ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        }
404ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
405ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
406ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
407ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
408ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
409ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_BeginPicture(
410ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context)
411ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
412ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int ret;
413ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
414ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
415ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf;
416ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
417ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* Initialise the command buffer */
418ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ret = vsp_context_get_next_cmdbuf(ctx->obj_context);
419ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (ret) {
420ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        drv_debug_msg(VIDEO_DEBUG_GENERAL, "get next cmdbuf fail\n");
421ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            vaStatus = VA_STATUS_ERROR_UNKNOWN;
422ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            return vaStatus;
423ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo     }
424ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
425ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    cmdbuf = obj_context->vsp_cmdbuf;
426ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
427ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (ctx->obj_context->frame_count == 0) /* first picture */
428ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    {
429ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vsp_cmdbuf_insert_command(cmdbuf, ctx->context_buf, Vss_Sys_STATE_BUF_COMMAND,
430ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                  0, VSP_VP8ENC_STATE_SIZE);
431ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
432ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
433ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* map param mem */
434ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vaStatus = psb_buffer_map(&cmdbuf->param_mem, &cmdbuf->param_mem_p);
435ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (vaStatus) {
436ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        return vaStatus;
437ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
438ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
439ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    cmdbuf->pic_param_p = cmdbuf->param_mem_p;
440ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    cmdbuf->seq_param_p = cmdbuf->param_mem_p + ctx->seq_param_offset;
441ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
442ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return VA_STATUS_SUCCESS;
443ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
444ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
445ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_EndPicture(
446ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context)
447ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
448ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
449ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    psb_driver_data_p driver_data = obj_context->driver_data;
450ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf = obj_context->vsp_cmdbuf;
451ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
452ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (cmdbuf->param_mem_p != NULL) {
453ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        psb_buffer_unmap(&cmdbuf->param_mem);
454ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->param_mem_p = NULL;
455ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->pic_param_p = NULL;
456ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->end_param_p = NULL;
457ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->pipeline_param_p = NULL;
458ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->denoise_param_p = NULL;
459ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->enhancer_param_p = NULL;
460ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->sharpen_param_p = NULL;
461ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->frc_param_p = NULL;
462ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo     }
463ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
4649ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo//    ctx->obj_context->frame_count++;
465ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
466ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (vsp_context_flush_cmdbuf(ctx->obj_context))
467ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VPP: flush deblock cmdbuf error\n");
468ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
469ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return VA_STATUS_SUCCESS;
470ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
471ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
472ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostruct format_vtable_s vsp_VP8_vtable = {
473ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruoqueryConfigAttributes:
474ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_QueryConfigAttributes,
475ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruovalidateConfig:
476ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_ValidateConfig,
477ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruocreateContext:
478ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_CreateContext,
479ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruodestroyContext:
480ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_DestroyContext,
481ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruobeginPicture:
482ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_BeginPicture,
483ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruorenderPicture:
484ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_RenderPicture,
485ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruoendPicture:
486ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_EndPicture
487ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo};
488ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
489