vsp_vp8.c revision daf2d4ff530a3c8ad9f789d5cceeccaf63825965
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)
47901ada31b87b21f8fd87f64597581f55830f2669Sun, Mingruo#define VSP_VP8ENC_STATE_SIZE (1*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
5519fc7221d7f03f50d8508136ed306c6fb905f03cSun, Mingruo#define VP8_ENC_CBR 0
5619fc7221d7f03f50d8508136ed306c6fb905f03cSun, Mingruo#define VP8_ENC_CBR_HRD 1
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
6620b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruotypedef struct _Ref_frame_surface {
6720b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    struct VssProcPictureVP8 ref_frame_buffers[4];
6820b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo} ref_frame_surface;
6920b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo
70ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define FUNCTION_NAME \
71ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    printf("ENTER %s.\n",__FUNCTION__);
72ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
73ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#define EXIT_FUNCTION_NAME \
74ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    printf("EXIT %s.\n",__FUNCTION__);
75ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
76ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
774dadd5529a552fd10d5f270b8423bee758c42fc5zhangzhatypedef union{
784dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        struct {
794dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            /* force this frame to be a keyframe */
804dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            unsigned int force_kf                       : 1;
81233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        /* don't reference the last frame */
824dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            unsigned int no_ref_last                    : 1;
83233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        /* don't reference the golden frame */
844dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            unsigned int no_ref_gf                      : 1;
85233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        /* don't reference the alternate reference frame */
864dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            unsigned int no_ref_arf                     : 1;
874dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
884dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha         unsigned int upd_last                     : 1;
894dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha         unsigned int upd_gf                     : 2;
904dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha         unsigned int upd_arf                     : 2;
914dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha         unsigned int no_upd_last                     : 1;
924dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha         unsigned int no_upd_gf                     : 1;
934dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha         unsigned int no_upd_arf                     : 1;
940cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo         unsigned int upd_entropy                     : 1;
954dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        } bits;
964dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        unsigned int value;
974dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    } vp8_fw_pic_flags;
984dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
994dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
100ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic void vsp_VP8_DestroyContext(object_context_p obj_context);
101ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
102ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp__VP8_check_legal_picture(object_context_p obj_context, object_config_p obj_config);
103ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
104ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic void vsp_VP8_QueryConfigAttributes(
105ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAProfile profile,
106ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAEntrypoint entrypoint,
107ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAConfigAttrib *attrib_list,
108ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int num_attribs)
109ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
1109ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    int i;
1119ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s\n", __FUNCTION__);
1129ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo
1139ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    for (i = 0; i < num_attribs; i++) {
1149ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo        switch (attrib_list[i].type) {
1150cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        case VAConfigAttribRTFormat:
1160cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            break;
1170cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        case VAConfigAttribRateControl:
1180cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            attrib_list[i].value = VA_RC_CBR | VA_RC_VBR;
1190cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            break;
1200cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        case VAConfigAttribEncAutoReference:
1210cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            attrib_list[i].value = 1;
1220cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            break;
1230cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        case VAConfigAttribEncMaxRefFrames:
1240cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            attrib_list[i].value = 4;
1250cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            break;
1260cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        case VAConfigAttribEncRateControlExt:
1270cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    attrib_list[i].value = 3;
1280cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    break;
129233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
1300cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        default:
1310cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
1320cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            break;
1330cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        }
1349ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    }
135ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
136ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
137ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_ValidateConfig(
138ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_config_p obj_config)
139ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
140ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int i;
1419ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s\n", __FUNCTION__);
1429ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo
143ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* Check all attributes */
144ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    for (i = 0; i < obj_config->attrib_count; i++) {
145ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        switch (obj_config->attrib_list[i].type) {
1460cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        case VAConfigAttribRTFormat:
1470cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            /* Ignore */
1480cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            break;
1490cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        case VAConfigAttribRateControl:
1500cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            break;
1510cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        case VAConfigAttribEncAutoReference:
1520cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            break;
1530cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        case VAConfigAttribEncMaxRefFrames:
1540cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            break;
1550cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        case VAConfigAttribEncRateControlExt:
1560cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            break;
157ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
1580cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        default:
1590cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
160ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        }
161ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
162ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
163ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return VA_STATUS_SUCCESS;
164ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
165ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
166233384d7e88c1295775705f074fbe3fd2e57ff35zhangzhavoid vsp_VP8_set_default_params(struct VssVp8encSequenceParameterBuffer *vp8_seq)
167233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha{
168233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
1690cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->frame_width = 1280;
1700cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->frame_height = 720;
1710cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->frame_rate = 30;
1720cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->error_resilient = 0;
1730cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->num_token_partitions = 2;
1740cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->kf_mode = 1;
1750cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->kf_min_dist = 0;
1760cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->kf_max_dist = 30;
1770cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->rc_target_bitrate = 2000;
1780cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->rc_min_quantizer = 4;
1790cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->rc_max_quantizer = 63;
1800cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->rc_undershoot_pct = 100;
1810cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->rc_overshoot_pct = 100;
1820cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->rc_end_usage = VP8_ENC_CBR_HRD;
1830cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->rc_buf_sz = 6000;
1840cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->rc_buf_initial_sz = 4000;
1850cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->rc_buf_optimal_sz = 5000;
1860cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->max_intra_rate = 0;
1870cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->cyclic_intra_refresh = 0;
1880cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->concatenate_partitions = 1;
1890cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    vp8_seq->recon_buffer_mode = vss_vp8enc_seq_param_recon_buffer_mode_per_seq;
190233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    vp8_seq->ts_number_layers = 1;
191768afffeffa1b5e3e51534d26a6472e7e8d257bdSun, Mingruo    vp8_seq->ts_layer_id[0] = 0;
192768afffeffa1b5e3e51534d26a6472e7e8d257bdSun, Mingruo    vp8_seq->ts_rate_decimator[0] = 1;
193768afffeffa1b5e3e51534d26a6472e7e8d257bdSun, Mingruo    vp8_seq->ts_periodicity = 1;
194768afffeffa1b5e3e51534d26a6472e7e8d257bdSun, Mingruo    vp8_seq->ts_target_bitrate[0] = 2000;
195233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha}
196233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
197ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_CreateContext(
198ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context,
199ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_config_p obj_config)
200ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
201ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
2029ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    /* currently vp8 will use vpp's context since they will use the same cmdbuf */
203ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    context_VPP_p ctx;
204ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int i;
205ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
206ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx = (context_VPP_p) calloc(1, sizeof(struct context_VPP_s));
207ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (NULL == ctx) {
208ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
209ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        DEBUG_FAILURE;
210ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        return vaStatus;
211ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
212ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
213233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    //set default VP8 sequence params
214233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    vsp_VP8_set_default_params(&ctx->vp8_seq_param);
215233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ctx->temporal_layer_number = 1;
216233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
2179ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    for (i = 0; i < obj_config->attrib_count; i++) {
2180cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if (obj_config->attrib_list[i].type == VAConfigAttribRateControl) {
219233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha            ctx->vp8_seq_param.rc_end_usage =
220233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                obj_config->attrib_list[i].value == VA_RC_VBR ?
221233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                                                                VP8_ENC_CBR:
222233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                                                                VP8_ENC_CBR_HRD;
2230cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	}
2249ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    }
225ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
226ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* set size */
227ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->param_sz = 0;
228ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->pic_param_sz = ALIGN_TO_128(sizeof(struct VssVp8encPictureParameterBuffer));
229ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->param_sz += ctx->pic_param_sz;
230ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->seq_param_sz = ALIGN_TO_128(sizeof(struct VssVp8encSequenceParameterBuffer));
231ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->param_sz += ctx->seq_param_sz;
23220b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    ctx->ref_param_sz = ALIGN_TO_128(sizeof(ref_frame_surface));
23320b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    ctx->param_sz += ctx->ref_param_sz;
234ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
235ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* set offset */
236ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->pic_param_offset = 0;
237ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->seq_param_offset = ctx->pic_param_sz;
23820b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    ctx->ref_param_offset = ctx->pic_param_sz + ctx->seq_param_sz;
239ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
240025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo
241ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->context_buf = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s));
242ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (NULL == ctx->context_buf) {
243ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
244ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        DEBUG_FAILURE;
245ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        goto out;
246ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
247ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
248ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vaStatus = psb_buffer_create(obj_context->driver_data, VSP_VP8ENC_STATE_SIZE, psb_bt_vpu_only, ctx->context_buf);
249ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
250ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (VA_STATUS_SUCCESS != vaStatus) {
251ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        goto out;
252ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
253ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
254ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    obj_context->format_data = (void*) ctx;
255ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->obj_context = obj_context;
2569ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo
257ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
258ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
259ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruoout:
260ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_DestroyContext(obj_context);
261ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
262ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (ctx)
263ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        free(ctx);
264ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
265ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
266ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
267ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
268ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic void vsp_VP8_DestroyContext(
269ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context)
270ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
271ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
272ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
273ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (ctx->context_buf) {
274ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        psb_buffer_destroy(ctx->context_buf);
275ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        free(ctx->context_buf);
276ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        ctx->context_buf = NULL;
277ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
278ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
279ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (ctx->filters) {
280ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        free(ctx->filters);
281ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        ctx->num_filters = 0;
282ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
283ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
284ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    free(obj_context->format_data);
285ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    obj_context->format_data = NULL;
286ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
287ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
288ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_vp8_process_seqence_param(
2891e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo    psb_driver_data_p driver_data,
290ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    context_VPP_p ctx,
291ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p obj_buffer)
292ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
293ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
294ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
295ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf;
296ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int i;
297233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    int ref_frame_width, ref_frame_height,ref_chroma_height, ref_size;
298ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
299ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAEncSequenceParameterBufferVP8 *va_seq =
300ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            (VAEncSequenceParameterBufferVP8 *) obj_buffer->buffer_data;
3010cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    struct VssVp8encSequenceParameterBuffer *seq = &ctx->vp8_seq_param;
302233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    struct VssVp8encSequenceParameterBuffer *seq_to_firmware =
303ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p;
304ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
305daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    struct ref_frame_surface *ref =
306233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        (struct ref_frame_surface*)cmdbuf->ref_param_p;
307ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
308ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    seq->frame_width       = va_seq->frame_width;
309ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    seq->frame_height      = va_seq->frame_height;
3109ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->rc_target_bitrate = va_seq->bits_per_second / 1000;
311233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    seq->max_intra_rate    = 100 * ctx->max_frame_size /
312233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                                 (va_seq->bits_per_second / seq->frame_rate);
313ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* FIXME: API doc says max 5000, but for current default test vector we still use 6000 */
3140cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    seq->kf_mode           = va_seq->kf_auto;   /* AUTO */
3159ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->kf_max_dist       = va_seq->kf_max_dist;
3169ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->kf_min_dist       = va_seq->kf_min_dist;
3179ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->error_resilient   = va_seq->error_resilient;
318768afffeffa1b5e3e51534d26a6472e7e8d257bdSun, Mingruo    seq->ts_target_bitrate[0] = seq->rc_target_bitrate;
319ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
3200cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    if (ctx->temporal_layer_number == 2) {
3210cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_layer_id[0] = 0;
3220cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_layer_id[1] = 1;
3230cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_periodicity = 2;
3240cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    } else if (ctx->temporal_layer_number == 3) {
3250cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_layer_id[0] = 0;
3260cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_layer_id[1] = 2;
3270cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_layer_id[2] = 1;
3280cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_layer_id[3] = 2;
3290cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_periodicity = 4;
3300cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    }
3310cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
332233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_frame_width = (seq->frame_width + 2 * 32 + 63) & (~63);
333233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_frame_height = (seq->frame_height + 2 * 32 + 63) & (~63);
334233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_chroma_height = (ref_frame_height / 2 + 63) & (~63);
335233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_size = ref_frame_width * (ref_frame_height + ref_chroma_height);
336de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo
33720b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    for (i = 0; i < 4; i++) {
3381e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        seq->ref_frame_buffers[i].surface_id = va_seq->reference_frames[i];
3391e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        seq->ref_frame_buffers[i].width = ref_frame_width;
3401e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        seq->ref_frame_buffers[i].height = ref_frame_height;
34120b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    }
34220b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo
343ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    for (i = 0; i < 4; i++) {
3441e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        object_surface_p ref_surf = SURFACE(va_seq->reference_frames[i]);
3450cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if (!ref_surf)
3460cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            return VA_STATUS_ERROR_UNKNOWN;
3470cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
3480cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        ref_surf->is_ref_surface = 2;
3490b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun
3501e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        if (ref_surf->psb_surface->size < ref_size) {
3511e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            /* re-alloc buffer */
3521e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            ref_surf->psb_surface->size = ref_size;
3531e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            psb_buffer_destroy(&ref_surf->psb_surface->buf);
3541e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            vaStatus = psb_buffer_create(driver_data, ref_surf->psb_surface->size, psb_bt_surface, &ref_surf->psb_surface->buf);
3551e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            if (VA_STATUS_SUCCESS != vaStatus)
3561e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                return VA_STATUS_ERROR_ALLOCATION_FAILED;
3571e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        }
3581e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo
3590cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(seq->ref_frame_buffers[i].base),
3600cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                                   0,
3610cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                                   &(ref_surf->psb_surface->buf),
3620cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                                   cmdbuf->param_mem_loc, seq);
363ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
364ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
365233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    *seq_to_firmware = *seq;
3661e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo
3671e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo    vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VP8_ID, &cmdbuf->param_mem,
3681e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                              VssVp8encSetSequenceParametersCommand,
3691e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                              ctx->seq_param_offset,
3701e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                              sizeof(struct VssVp8encSequenceParameterBuffer));
3711e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo    ctx->vp8_seq_cmd_send = 1;
372ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
373ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
374ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
375ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
3764dadd5529a552fd10d5f270b8423bee758c42fc5zhangzhastatic VAStatus vsp_vp8_process_dynamic_seqence_param(
3774dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    context_VPP_p ctx)
3784dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha{
3794dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3804dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAStatus vaStatus = VA_STATUS_SUCCESS;
3814dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf;
3824dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    int ref_frame_width, ref_frame_height;
3834dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3844dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    struct VssVp8encSequenceParameterBuffer *seq =
3854dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p;
3864dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3874dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    *seq = ctx->vp8_seq_param ;
388233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    //todo: fix it for multi temporal layers
3890cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    seq->max_intra_rate    = 100 * ctx->max_frame_size /
3900cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                                   (seq->rc_target_bitrate * 1000 / seq->frame_rate);
3914dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3920cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    if (!ctx->vp8_seq_cmd_send) {
3930cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VP8_ID, &cmdbuf->param_mem,
3944dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                              VssVp8encSetSequenceParametersCommand,
3954dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                              ctx->seq_param_offset,
3964dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                              sizeof(struct VssVp8encSequenceParameterBuffer));
3970cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    }
3984dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3994dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    return vaStatus;
4004dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha}
401ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
402ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
403ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_vp8_process_picture_param(
404ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    psb_driver_data_p driver_data,
405ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    context_VPP_p ctx,
406ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p obj_buffer,
407ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VASurfaceID surface_id)
408ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
409ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
410ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
411ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf;
412ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
413ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAEncPictureParameterBufferVP8 *va_pic =
414daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            (VAEncPictureParameterBufferVP8 *) obj_buffer->buffer_data;
415daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    struct VssVp8encPictureParameterBuffer *pic =
416daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo		(struct VssVp8encPictureParameterBuffer *)cmdbuf->pic_param_p;
417ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    struct VssVp8encSequenceParameterBuffer *seq =
418ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo           (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p;
419ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VACodedBufferSegment *p = &obj_buffer->codedbuf_mapinfo[0];
420de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    int ref_frame_width, ref_frame_height;
421de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo
422233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_frame_width = (ctx->vp8_seq_param.frame_width + 2 * 32 + 63) & (~63);
423233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_frame_height = (ctx->vp8_seq_param.frame_height + 2 * 32 + 63) & (~63);
424ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
425ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    //map parameters
426ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p pObj = BUFFER(va_pic->coded_buf); //tobe modified
4270b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun    if (!pObj)
428233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        return VA_STATUS_ERROR_UNKNOWN;
4290b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun
430ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_surface_p src_surface = SURFACE(surface_id);
431ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
432ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.surface_id = surface_id;
433ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.irq        = 1;
434233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    pic->input_frame.height     = ctx->vp8_seq_param.frame_height;
435233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    pic->input_frame.width      = ctx->vp8_seq_param.frame_width;
436591565b9a60b10365dd813a19c9d4b8ba44c970bSun, Mingruo    /* NOTE: In VIED API doc, stride must be the nearest integer multiple of 32 */
437591565b9a60b10365dd813a19c9d4b8ba44c970bSun, Mingruo    /* use vaCreateSurfaceWithAttribute with VAExternalMemoryNULL to create surface*/
438591565b9a60b10365dd813a19c9d4b8ba44c970bSun, Mingruo    //pic->input_frame.stride     = (ctx->frame_width + 31) & (~31);
439591565b9a60b10365dd813a19c9d4b8ba44c970bSun, Mingruo    pic->input_frame.stride     = ctx->obj_context->current_render_target->psb_surface->stride;
440ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.format     = 0; /* TODO: Specify NV12 = 0 */
441ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
442de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    pic->recon_frame.irq = 0;
443de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    pic->recon_frame.width = ref_frame_width;
444de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    pic->recon_frame.height = ref_frame_height;
445de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo
446ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->version = 0;
4474dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha#if 0
448ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->pic_flags = (1<< 2) |  /* corresponds to  VP8_EFLAG_NO_REF_GF      */
449ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                     (1<< 3) |  /* corresponds to  VP8_EFLAG_NO_REF_ARF     */
450ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                     (1<< 12);   /* corresponds to ~VP8_EFLAG_NO_UPD_ENTROPY */
4514dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha#else
4524dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha   vp8_fw_pic_flags flags;
4534dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha   flags.value =0;
4544dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
455025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo   flags.bits.force_kf = va_pic->ref_flags.bits.force_kf;
456025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo   flags.bits.no_ref_last = va_pic->ref_flags.bits.no_ref_last;
457025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo   flags.bits.no_ref_gf = va_pic->ref_flags.bits.no_ref_gf;
458025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo   flags.bits.no_ref_arf = va_pic->ref_flags.bits.no_ref_arf;
4594dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha   flags.bits.upd_last  = va_pic->pic_flags.bits.refresh_last;
46019fc7221d7f03f50d8508136ed306c6fb905f03cSun, Mingruo   flags.bits.upd_gf  = va_pic->pic_flags.bits.copy_buffer_to_golden;
46119fc7221d7f03f50d8508136ed306c6fb905f03cSun, Mingruo   flags.bits.upd_arf  = va_pic->pic_flags.bits.copy_buffer_to_alternate;
4624dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha   flags.bits.no_upd_last  = !va_pic->pic_flags.bits.refresh_last;
4634dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha   flags.bits.no_upd_gf  = !va_pic->pic_flags.bits.refresh_golden_frame;
4644dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha   flags.bits.no_upd_arf  = !va_pic->pic_flags.bits.refresh_alternate_frame;
4650cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo   flags.bits.upd_entropy  = va_pic->pic_flags.bits.refresh_entropy_probs;
4660cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo   if (ctx->temporal_layer_number > 1)
4670cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	   flags.bits.upd_entropy = 0;
4680cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
4690cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    if (ctx->temporal_layer_number == 2) {
4700cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            /*
4710cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  layer 0: frame #0,#2,#4...
4720cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  layer 1: frame #1,#3,#5...
4730cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *
4740cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #1 refers frame #0
4750cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #2 refers frame #0
4760cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #3 refers frame #2
4770cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #4 refers frame #2
4780cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  ........
4790cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo             */
4800cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if (ctx->obj_context->frame_count % 2 == 0) {
4810cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            /* layer 0: base layer */
4820cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_ref_last = 0;
4830cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_ref_gf = 1;
4840cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_ref_arf = 1;
4850cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
4860cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_upd_last = 0;
4870cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.upd_last = 1;
4880cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	} else {
4890cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            /* layer 1 */
4900cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.force_kf = 0;
4910cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_ref_last = 0;
4920cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_ref_gf = 1;
4930cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_ref_arf = 1;
4940cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
4950cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_upd_last = 1;
4960cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	}
4970cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    }
4980cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    else if (ctx->temporal_layer_number >= 3) {
4990cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            /*
5000cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  layer 0: frame #0,#4,#8...
5010cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  layer 1: frame #2,#6,#10....
5020cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  layer 2: frame #1,#3,#5,#7,#9,#11...
5030cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *
5040cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #1 refers frame #0
5050cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #2 refers frame #0
5060cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #3 refers frame #2
5070cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #4 refers frame #0
5080cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  ........
5090cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo             */
5100cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    if (ctx->obj_context->frame_count % 4 == 0) {
5110cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                /* layer 0: base layer */
5120cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_ref_last = 0;
5130cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_ref_gf = 1;
5140cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_ref_arf = 1;
5150cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
5160cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.upd_last = 1;
5170cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_upd_last = 0;
5180cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    } else if (ctx->obj_context->frame_count % 4 == 2) {
5190cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                /* layer 1: update golden ref frame */
5200cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.force_kf = 0;
5210cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_ref_last = 0;
5220cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_ref_gf = 1;
5230cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_ref_arf = 1;
5240cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
5250cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_upd_last = 1;
5260cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_upd_gf = 0;
5270cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.upd_gf = 3;
5280cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    } else {
5290cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                /* layer 2 */
5300cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.force_kf = 0;
5310cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo		if (ctx->obj_context->frame_count % 4 == 1) {
5320cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                   flags.bits.no_ref_last = 0;
5330cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                   flags.bits.no_ref_gf = 0;
5340cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo		} else {
5350cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                   flags.bits.no_ref_last = 1;
5360cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                   flags.bits.no_ref_gf = 0;
5370cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo		}
5380cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_ref_arf = 1;
5390cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
5400cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_upd_last = 1;
5410cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_upd_gf = 1;
5420cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    }
5430cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    }
5444dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
5450cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    pic->pic_flags = flags.value;
5464dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha#endif
5470cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
548ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->prev_frame_dropped = 0; /* Not yet used */
549ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->cpuused            = 5;
5504dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    pic->sharpness          = va_pic->sharpness_level;
5514dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    pic->num_token_partitions = va_pic->pic_flags.bits.num_token_partitions; /* 2^2 = 4 partitions */
5524dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    pic->encoded_frame_size = pObj->size & ~31;
553daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    pic->encoded_frame_base = (uint32_t)pObj->buffer_data;
554ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
555ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    {
556ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(pic->encoded_frame_base),
557ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   ctx->pic_param_offset, pObj->psb_buffer,
558ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   cmdbuf->param_mem_loc, pic);
559ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
560ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
561ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    {
562ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        object_surface_p cur_surf = SURFACE(surface_id);
5630cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if(!cur_surf)
5640cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            return VA_STATUS_ERROR_UNKNOWN;
5650b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun
566ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(pic->input_frame.base),
5671e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                                   0, &(cur_surf->psb_surface->buf),
568ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   cmdbuf->param_mem_loc, pic);
5691e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(pic->input_frame.base_uv),
570233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                       pic->input_frame.stride * ctx->obj_context->current_render_target->height,
5710cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                       &(cur_surf->psb_surface->buf),
5720cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                       cmdbuf->param_mem_loc, pic);
573ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
574ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
575233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha     *cmdbuf->cmd_idx++ = CONTEXT_VP8_ID;
576233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha     *cmdbuf->cmd_idx++ = VssVp8encEncodeFrameCommand;
577233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha      VSP_RELOC_CMDBUF(cmdbuf->cmd_idx++, ctx->pic_param_offset, &cmdbuf->param_mem);
578233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha      *cmdbuf->cmd_idx++ = sizeof(struct VssVp8encPictureParameterBuffer);
579233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha      *cmdbuf->cmd_idx++ = 0; *cmdbuf->cmd_idx++ = 0;
580233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha      *cmdbuf->cmd_idx++ = wsbmKBufHandle(wsbmKBuf(pObj->psb_buffer->drm_buf)) ;
581233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha      *cmdbuf->cmd_idx++ = wsbmKBufHandle(wsbmKBuf((&cmdbuf->param_mem)->drm_buf));
582ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
583ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
584ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
585ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
5864dadd5529a552fd10d5f270b8423bee758c42fc5zhangzhastatic VAStatus vsp_vp8_process_misc_param(context_VPP_p ctx, object_buffer_p obj_buffer)
5874dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha{
5884dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterBuffer *pBuffer;
5894dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterAIR *air_param;
5904dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterBufferMaxFrameSize *max_frame_size_param;
5914dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterFrameRate *frame_rate_param;
5924dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterRateControl *rate_control_param;
593025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo    VAEncMiscParameterHRD *hrd_param;
59416752f679f82f92454ac160f0457be83e0fa4b77zhangzha    VAEncMiscParameterTemporalLayerStructure* tslayer_param;
5950cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    struct VssVp8encSequenceParameterBuffer *seq = &ctx->vp8_seq_param;
5964dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAStatus vaStatus = VA_STATUS_SUCCESS;
597daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    uint32_t layer_id, i;
5980cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
5994dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    ASSERT(obj_buffer->type == VAEncMiscParameterBufferType);
6004dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    pBuffer = (VAEncMiscParameterBuffer *) obj_buffer->buffer_data;
6014dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    obj_buffer->size = 0;
6020cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
6034dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    switch (pBuffer->type) {
60416752f679f82f92454ac160f0457be83e0fa4b77zhangzha    case VAEncMiscParameterTypeTemporalLayerStructure:
60516752f679f82f92454ac160f0457be83e0fa4b77zhangzha       tslayer_param = (VAEncMiscParameterTemporalLayerStructure *)pBuffer->data;
60616752f679f82f92454ac160f0457be83e0fa4b77zhangzha       //verify parameter
607daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo       if (tslayer_param->number_of_layers < 2 && tslayer_param->number_of_layers > 3) {
608daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo           drv_debug_msg(VIDEO_DEBUG_ERROR, "Temporal Layer Number should be 2 or 3\n");
609daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo           vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
61016752f679f82f92454ac160f0457be83e0fa4b77zhangzha           break;
61116752f679f82f92454ac160f0457be83e0fa4b77zhangzha       }
61216752f679f82f92454ac160f0457be83e0fa4b77zhangzha
613daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo       if (tslayer_param->periodicity > 32 || tslayer_param->periodicity < 1) {
614daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo           drv_debug_msg(VIDEO_DEBUG_ERROR, "ts_periodicity shoulde be 1 - 32\n");
615daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo           vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
616daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo           break;
61716752f679f82f92454ac160f0457be83e0fa4b77zhangzha       }
61816752f679f82f92454ac160f0457be83e0fa4b77zhangzha
619daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo       for (i = 0; i < tslayer_param->periodicity; i++) {
62016752f679f82f92454ac160f0457be83e0fa4b77zhangzha          layer_id = tslayer_param->layer_id[i];
621daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            if (layer_id > (tslayer_param->number_of_layers - 1)) {
622daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                drv_debug_msg(VIDEO_DEBUG_ERROR, "layer_id shoulde be 0 - %d\n",
623daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                                          tslayer_param->number_of_layers - 1);
624daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
625daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                break;
62616752f679f82f92454ac160f0457be83e0fa4b77zhangzha            }
62716752f679f82f92454ac160f0457be83e0fa4b77zhangzha       }
62816752f679f82f92454ac160f0457be83e0fa4b77zhangzha
62916752f679f82f92454ac160f0457be83e0fa4b77zhangzha       if (vaStatus == VA_STATUS_ERROR_INVALID_PARAMETER )
630daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo           break;
63116752f679f82f92454ac160f0457be83e0fa4b77zhangzha
63216752f679f82f92454ac160f0457be83e0fa4b77zhangzha       seq->ts_number_layers = tslayer_param->number_of_layers;
63316752f679f82f92454ac160f0457be83e0fa4b77zhangzha       ctx->temporal_layer_number = tslayer_param->number_of_layers;
63416752f679f82f92454ac160f0457be83e0fa4b77zhangzha       seq->ts_periodicity = tslayer_param->periodicity;
635daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
636daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo       for (i = 0; i < seq->ts_periodicity; i++)
637daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo           seq->ts_layer_id[i] = tslayer_param->layer_id[i];
638daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
639daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo       ctx->re_send_seq_params = 1;
64016752f679f82f92454ac160f0457be83e0fa4b77zhangzha       break;
6414dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    case VAEncMiscParameterTypeFrameRate:
6424dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        frame_rate_param = (VAEncMiscParameterFrameRate *)pBuffer->data;
6434dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        if (frame_rate_param->framerate < 1 || frame_rate_param->framerate > 65535) {
6444dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
6454dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            break;
6464dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        }
6470cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
6480cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if (ctx->temporal_layer_number == 1) {
6490cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            if (seq->frame_rate != frame_rate_param->framerate) {
6500cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                drv_debug_msg(VIDEO_DEBUG_GENERAL, "frame rate changed from %d to %d\n",
6510cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                              seq->frame_rate,
6520cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                              frame_rate_param->framerate);
653daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                seq->frame_rate = frame_rate_param->framerate;
654daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                ctx->re_send_seq_params = 1;
655daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo	    }
6560cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        } else {
6570cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            layer_id = frame_rate_param->framerate_flags.bits.temporal_id % 3;
6580cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            if (ctx->frame_rate[layer_id] != frame_rate_param->framerate) {
6590cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                drv_debug_msg(VIDEO_DEBUG_GENERAL, "frame rate of layer %d will be changed from %d to %d\n",
6600cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                              layer_id, ctx->frame_rate[layer_id], frame_rate_param->framerate);
6610cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                ctx->frame_rate[layer_id] = frame_rate_param->framerate;
662daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                if (layer_id == ctx->temporal_layer_number - 1) { //top layer
663daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                     seq->frame_rate = ctx->frame_rate[layer_id];
664daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                }
665daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
6660cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                seq->ts_rate_decimator[layer_id] =
667233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                            seq->frame_rate / ctx->frame_rate[layer_id];
6680cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                ctx->re_send_seq_params = 1 ;
6690cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            }
670233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        }
6714dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
6724dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    case VAEncMiscParameterTypeRateControl:
6734dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        rate_control_param = (VAEncMiscParameterRateControl *)pBuffer->data;
6744dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        if (rate_control_param->initial_qp > 63 ||
6754dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            rate_control_param->min_qp > 63) {
6764dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            drv_debug_msg(VIDEO_DEBUG_ERROR, "Initial_qp(%d) and min_qpinitial_qp(%d) "
6774dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                          "are invalid.\nQP shouldn't be larger than 63 for VP8\n",
6784dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                          rate_control_param->initial_qp, rate_control_param->min_qp);
6794dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
6804dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            break;
6814dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        }
682233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
683233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        if (rate_control_param->min_qp != seq->rc_min_quantizer) {
6844dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            drv_debug_msg(VIDEO_DEBUG_ERROR, "min_qp was changed from %d to %d\n",
685233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                          seq->rc_min_quantizer, rate_control_param->min_qp);
686233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha            seq->rc_min_quantizer = rate_control_param->min_qp;
6874dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        }
6880cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
689233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        if (rate_control_param->max_qp != seq->rc_max_quantizer) {
690025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo            drv_debug_msg(VIDEO_DEBUG_ERROR, "max_qp was changed from %d to %d\n",
691233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                          seq->rc_max_quantizer, rate_control_param->max_qp);
692233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha            seq->rc_max_quantizer = rate_control_param->max_qp;
693025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo        }
694233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
6950cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        // no initial qp for vp8
696233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
697233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        if (rate_control_param->target_percentage != seq->rc_undershoot_pct) {
698025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo            drv_debug_msg(VIDEO_DEBUG_ERROR, "rc_undershoot was changed from %d to %d\n",
699233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                          seq->rc_undershoot_pct, rate_control_param->target_percentage);
700233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha            seq->rc_undershoot_pct = rate_control_param->target_percentage;
701025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo        }
702025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo
7030cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if (ctx->temporal_layer_number == 1) {
7040cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            if(rate_control_param->bits_per_second / 1000 != seq->rc_target_bitrate) {
705233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                drv_debug_msg(VIDEO_DEBUG_ERROR, "bitrate was changed from %dkbps to %dkbps\n",
706233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                          seq->rc_target_bitrate, rate_control_param->bits_per_second/1000);
7070cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                seq->rc_target_bitrate = rate_control_param->bits_per_second / 1000;
708768afffeffa1b5e3e51534d26a6472e7e8d257bdSun, Mingruo		seq->ts_target_bitrate[0] = rate_control_param->bits_per_second / 1000;
7090cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            }
7100cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        } else {
7110cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            layer_id = rate_control_param->rc_flags.bits.temporal_id % 3;
7120cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            if(rate_control_param->bits_per_second / 1000 != seq->ts_target_bitrate[layer_id]) {
713233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                drv_debug_msg(VIDEO_DEBUG_ERROR, "bitrate was changed from %dkbps to %dkbps\n",
714233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                          seq->ts_target_bitrate[layer_id], rate_control_param->bits_per_second/1000);
7150cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                seq->ts_target_bitrate[layer_id] = rate_control_param->bits_per_second / 1000;
7160cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            }
7170cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        }
7180cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
7190cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        ctx->re_send_seq_params = 1;
7204dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
7214dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    case VAEncMiscParameterTypeMaxFrameSize:
7224dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        max_frame_size_param = (VAEncMiscParameterBufferMaxFrameSize *)pBuffer->data;
7234dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        if (ctx->max_frame_size == max_frame_size_param->max_frame_size)
7244dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            break;
7250cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
7266e762d8b43b8a9cf3b7111877d9dc9579a9170afSun, Mingruo        drv_debug_msg(VIDEO_DEBUG_ERROR, "max frame size changed from %d to %d\n",
7274dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                      ctx->max_frame_size, max_frame_size_param->max_frame_size);
7284dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        ctx->max_frame_size = max_frame_size_param->max_frame_size ;
7294dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        ctx->re_send_seq_params = 1 ;
7304dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
7314dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    case VAEncMiscParameterTypeAIR:
7324dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        air_param = (VAEncMiscParameterAIR *)pBuffer->data;
7334dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        if (air_param->air_num_mbs > 65535 ||
7344dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            air_param->air_threshold > 65535) {
7350cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
7360cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                break;
7374dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        }
7380cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
7394dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        drv_debug_msg(VIDEO_DEBUG_GENERAL, "air slice size changed to num_air_mbs %d "
7404dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                      "air_threshold %d, air_auto %d\n",
7414dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                      air_param->air_num_mbs, air_param->air_threshold,
7424dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                      air_param->air_auto);
743233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        seq->cyclic_intra_refresh = air_param->air_threshold;
7444dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
745025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo    case VAEncMiscParameterTypeHRD:
7460cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        hrd_param = (VAEncMiscParameterHRD *)pBuffer->data;
7470cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->rc_buf_sz = hrd_param->buffer_size;
7480cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->rc_buf_initial_sz = hrd_param->initial_buffer_fullness;
7490cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->rc_buf_optimal_sz = hrd_param->optimal_buffer_fullness;
7500cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        ctx->re_send_seq_params = 1;
7510cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        break;
752025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo    case VAEncMiscParameterTypeQualityLevel:
7530cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        break;
7540cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
7554dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    default:
7564dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        vaStatus = VA_STATUS_ERROR_UNKNOWN;
7574dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        DEBUG_FAILURE;
7584dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
7594dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    }
7600cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
7614dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    free(obj_buffer->buffer_data);
7624dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    obj_buffer->buffer_data = NULL;
7630cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
7644dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    return vaStatus;
7654dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha}
766ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_RenderPicture(
767ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context,
768ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p *buffers,
769ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int num_buffers)
770ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
771ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
772ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int i;
773ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    psb_driver_data_p driver_data = obj_context->driver_data;
774ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
775ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VASurfaceID surface_id;
776ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
777ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
7780cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    for (i = 0; i < num_buffers; i++) {
779ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
780ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        object_buffer_p obj_buffer = buffers[i];
781ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        switch (obj_buffer->type) {
782ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        case VAEncSequenceParameterBufferType:
7831e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            vaStatus = vsp_vp8_process_seqence_param(driver_data, ctx, obj_buffer);
784ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            break;
785ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        case VAEncPictureParameterBufferType:
786ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            surface_id = obj_context->current_render_surface_id;
787ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            vaStatus = vsp_vp8_process_picture_param(driver_data,ctx, obj_buffer,surface_id);
788ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            break;
7894dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        case VAEncMiscParameterBufferType:
7904dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            vaStatus = vsp_vp8_process_misc_param(ctx, obj_buffer);
7914dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            break;
792ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        default:
793ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            vaStatus = VA_STATUS_SUCCESS;//VA_STATUS_ERROR_UNKNOWN;
794ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            DEBUG_FAILURE;
795ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        }
7960cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
797ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        if (vaStatus != VA_STATUS_SUCCESS) {
798ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            break;
799ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        }
800ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
801ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
802ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
803ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
804ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
805ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_BeginPicture(
806ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context)
807ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
808ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int ret;
809ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
810ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
811ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf;
812ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
813ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* Initialise the command buffer */
814ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ret = vsp_context_get_next_cmdbuf(ctx->obj_context);
815ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (ret) {
816ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        drv_debug_msg(VIDEO_DEBUG_GENERAL, "get next cmdbuf fail\n");
817ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            vaStatus = VA_STATUS_ERROR_UNKNOWN;
818ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            return vaStatus;
819ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo     }
820ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
821ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    cmdbuf = obj_context->vsp_cmdbuf;
822ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
8230cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    if (ctx->obj_context->frame_count == 0) { /* first picture */
8248672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo        vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VP8_ID, ctx->context_buf, Vss_Sys_STATE_BUF_COMMAND,
825ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                  0, VSP_VP8ENC_STATE_SIZE);
826ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
827ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
828ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* map param mem */
829ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vaStatus = psb_buffer_map(&cmdbuf->param_mem, &cmdbuf->param_mem_p);
830ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (vaStatus) {
831ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        return vaStatus;
832ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
833ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
834ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    cmdbuf->pic_param_p = cmdbuf->param_mem_p;
835ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    cmdbuf->seq_param_p = cmdbuf->param_mem_p + ctx->seq_param_offset;
83620b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    cmdbuf->ref_param_p = cmdbuf->param_mem_p + ctx->ref_param_offset;
8374dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    ctx->vp8_seq_cmd_send = 0;
8384dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    ctx->re_send_seq_params = 0;
8390cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
840ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return VA_STATUS_SUCCESS;
841ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
842ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
843daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruostatic inline void  dump_vssporcPicture(struct VssProcPictureVP8 * frame)
844daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo{
845daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    drv_debug_msg(VIDEO_DEBUG_ERROR, "surface_id 0x%08x\n", frame->surface_id);
846daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    drv_debug_msg(VIDEO_DEBUG_ERROR, "irq %d\n", frame->irq);
847daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    drv_debug_msg(VIDEO_DEBUG_ERROR, "base 0x%08x\n", frame->base);
848daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    drv_debug_msg(VIDEO_DEBUG_ERROR, "base_uv 0x%08x\n", frame->base_uv);
849daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    drv_debug_msg(VIDEO_DEBUG_ERROR, "height %d\n", frame->height);
850daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    drv_debug_msg(VIDEO_DEBUG_ERROR, "width %d\n", frame->width);
851daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    drv_debug_msg(VIDEO_DEBUG_ERROR, "stride %d\n", frame->stride);
852daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    drv_debug_msg(VIDEO_DEBUG_ERROR, "format %d\n", frame->format);
853daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo}
854daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
855daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruostatic void vsp_vp8_dump_commands(vsp_cmdbuf_p cmdbuf)
856daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo{
857daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    unsigned int i, cmd_idx;
858daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    unsigned int cmdbuffer_size = (unsigned char *)cmdbuf->cmd_idx - cmdbuf->cmd_start; /* In bytes */
859daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    unsigned int cmd_number = cmdbuffer_size / sizeof(struct vss_command_t);
860daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    struct vss_command_t *cmd = (struct vss_command_t *)cmdbuf->cmd_start;
861daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    struct VssVp8encPictureParameterBuffer *pic =
862daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo		(struct VssVp8encPictureParameterBuffer *)cmdbuf->pic_param_p;
863daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    struct VssVp8encSequenceParameterBuffer *seq =
864daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p;
865daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
866daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    for (cmd_idx = 0; cmd_idx < cmd_number; cmd_idx++) {
867daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo        drv_debug_msg(VIDEO_ENCODE_DEBUG, "\n============command start============\ncontext %d\ntype%d\n",
868daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo		      cmd[cmd_idx].context, cmd[cmd_idx].type);
869daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo	if (cmd[cmd_idx].type == VssVp8encEncodeFrameCommand) {
870daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo	    drv_debug_msg(VIDEO_ENCODE_DEBUG, "input frame\n");
871daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo	    dump_vssporcPicture(&pic->input_frame);
872daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
873daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo	    drv_debug_msg(VIDEO_ENCODE_DEBUG, "recon frame\n");
874daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo	    dump_vssporcPicture(&pic->recon_frame);
875daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
876daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "version %d\n", pic->version);
877daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "pic_flags 0x%08x\n", pic->pic_flags);
878daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "prev_frame_dropped %d\n", pic->prev_frame_dropped);
879daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "cpuused %d\n", pic->cpuused);
880daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "sharpness %d\n", pic->sharpness);
881daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "num_token_partitions %d\n", pic->num_token_partitions);
882daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "encoded_frame_size %d\n", pic->encoded_frame_size);
883daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "encoded_frame_base 0x%08x\n", pic->encoded_frame_base);
884daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo        }
885daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
886daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo        if (cmd[cmd_idx].type == VssVp8encSetSequenceParametersCommand) {
887daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "frame_width %d\n", seq->frame_width);
888daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "frame_height %d\n", seq->frame_height);
889daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "frame_rate %d\n", seq->frame_rate);
890daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "error_resilient %d\n", seq->error_resilient);
891daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "num_token_partitions %d\n", seq->num_token_partitions);
892daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "kf_mode %d\n", seq->kf_mode);
893daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "kf_min_dist %d\n", seq->kf_min_dist);
894daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "kf_max_dist %d\n", seq->kf_max_dist);
895daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_target_bitrate %d\n", seq->rc_target_bitrate);
896daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_min_quantizer %d\n", seq->rc_min_quantizer);
897daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_max_quantizer %d\n", seq->rc_max_quantizer);
898daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_undershoot_pct %d\n", seq->rc_undershoot_pct);
899daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_overshoot_pct %d\n", seq->rc_overshoot_pct);
900daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_end_usage %d\n", seq->rc_end_usage);
901daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_buf_sz %d\n", seq->rc_buf_sz);
902daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_buf_initial_sz %d\n", seq->rc_buf_initial_sz);
903daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_buf_optimal_sz %d\n", seq->rc_buf_optimal_sz);
904daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "max_intra_rate %d\n", seq->max_intra_rate);
905daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "cyclic_intra_refresh %d\n", seq->cyclic_intra_refresh);
906daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "concatenate_partitions %d\n", seq->concatenate_partitions);
907daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "recon_buffer_mode %d\n", seq->recon_buffer_mode);
908daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "ts_number_layers %d\n", seq->ts_number_layers);
909daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
910daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            for (i = 0; i < 3; i++)
911daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                drv_debug_msg(VIDEO_ENCODE_DEBUG, "ts_target_bitrate[%d] %d\n", i, seq->ts_target_bitrate[i]);
912daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
913daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            for (i = 0; i < 3; i++)
914daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                drv_debug_msg(VIDEO_ENCODE_DEBUG, "ts_rate_decimator[%d] %d\n", i, seq->ts_rate_decimator[i]);
915daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                drv_debug_msg(VIDEO_ENCODE_DEBUG, "ts_periodicity %d\n", seq->ts_periodicity);
916daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
917daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                for (i = 0; i < seq->ts_periodicity; i++)
918daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                    drv_debug_msg(VIDEO_ENCODE_DEBUG, "ts_layer_id[%d] %d\n", i, seq->ts_layer_id[i]);
919daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
920daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                for (i = 0; i < 4; i++)	{
921daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                    drv_debug_msg(VIDEO_ENCODE_DEBUG, "ref_frame_buffer %d\n", i);
922daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                    dump_vssporcPicture(&seq->ref_frame_buffers[i]);
923daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo		}
924daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo	}
925daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
926daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo        drv_debug_msg(VIDEO_ENCODE_DEBUG, "============command end============\n");
927daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    }
928daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo}
929daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
930daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
931ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_EndPicture(
932ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context)
933ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
934ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
935ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    psb_driver_data_p driver_data = obj_context->driver_data;
936ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf = obj_context->vsp_cmdbuf;
937ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
9380cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    if(ctx->re_send_seq_params) {
9394dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        vsp_vp8_process_dynamic_seqence_param(ctx);
9404dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    }
9414dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
942daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    drv_debug_msg(VIDEO_ENCODE_DEBUG, "ctx->obj_context->frame_count=%d\n", ctx->obj_context->frame_count + 1);
943daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    vsp_vp8_dump_commands(cmdbuf);
944daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
945ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (cmdbuf->param_mem_p != NULL) {
946ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        psb_buffer_unmap(&cmdbuf->param_mem);
947ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->param_mem_p = NULL;
948ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->pic_param_p = NULL;
949ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->end_param_p = NULL;
950ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->pipeline_param_p = NULL;
951ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->denoise_param_p = NULL;
952ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->enhancer_param_p = NULL;
953ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->sharpen_param_p = NULL;
954ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->frc_param_p = NULL;
95520b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo        cmdbuf->ref_param_p = NULL;
956ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo     }
957ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
9588f868258b5396c3d39dd33f2d05a829ff855aa0dSun, Mingruo    if (vsp_context_flush_cmdbuf(ctx->obj_context)) {
959daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VP8: flush deblock cmdbuf error\n");
9606e762d8b43b8a9cf3b7111877d9dc9579a9170afSun, Mingruo        return VA_STATUS_ERROR_UNKNOWN;
9618f868258b5396c3d39dd33f2d05a829ff855aa0dSun, Mingruo    }
962ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
963ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return VA_STATUS_SUCCESS;
964ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
965ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
966ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostruct format_vtable_s vsp_VP8_vtable = {
967ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruoqueryConfigAttributes:
968ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_QueryConfigAttributes,
969ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruovalidateConfig:
970ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_ValidateConfig,
971ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruocreateContext:
972ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_CreateContext,
973ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruodestroyContext:
974ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_DestroyContext,
975ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruobeginPicture:
976ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_BeginPicture,
977ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruorenderPicture:
978ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_RenderPicture,
979ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruoendPicture:
980ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_EndPicture
981ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo};
982ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
983