vsp_vp8.c revision 16752f679f82f92454ac160f0457be83e0fa4b77
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;
191233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
192233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha}
193233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
194ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_CreateContext(
195ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context,
196ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_config_p obj_config)
197ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
198ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
1999ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    /* currently vp8 will use vpp's context since they will use the same cmdbuf */
200ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    context_VPP_p ctx;
201ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int i;
202ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
203ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx = (context_VPP_p) calloc(1, sizeof(struct context_VPP_s));
204ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (NULL == ctx) {
205ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
206ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        DEBUG_FAILURE;
207ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        return vaStatus;
208ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
209ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
210233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    //set default VP8 sequence params
211233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    vsp_VP8_set_default_params(&ctx->vp8_seq_param);
212233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ctx->temporal_layer_number = 1;
213233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
2149ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    for (i = 0; i < obj_config->attrib_count; i++) {
2150cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if (obj_config->attrib_list[i].type == VAConfigAttribRateControl) {
216233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha            ctx->vp8_seq_param.rc_end_usage =
217233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                obj_config->attrib_list[i].value == VA_RC_VBR ?
218233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                                                                VP8_ENC_CBR:
219233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                                                                VP8_ENC_CBR_HRD;
2200cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	}
2219ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    }
222ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
223ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* set size */
224ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->param_sz = 0;
225ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->pic_param_sz = ALIGN_TO_128(sizeof(struct VssVp8encPictureParameterBuffer));
226ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->param_sz += ctx->pic_param_sz;
227ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->seq_param_sz = ALIGN_TO_128(sizeof(struct VssVp8encSequenceParameterBuffer));
228ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->param_sz += ctx->seq_param_sz;
22920b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    ctx->ref_param_sz = ALIGN_TO_128(sizeof(ref_frame_surface));
23020b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    ctx->param_sz += ctx->ref_param_sz;
231ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
232ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* set offset */
233ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->pic_param_offset = 0;
234ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->seq_param_offset = ctx->pic_param_sz;
23520b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    ctx->ref_param_offset = ctx->pic_param_sz + ctx->seq_param_sz;
236ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
237025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo
238ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->context_buf = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s));
239ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (NULL == ctx->context_buf) {
240ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
241ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        DEBUG_FAILURE;
242ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        goto out;
243ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
244ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
245ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vaStatus = psb_buffer_create(obj_context->driver_data, VSP_VP8ENC_STATE_SIZE, psb_bt_vpu_only, ctx->context_buf);
246ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
247ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (VA_STATUS_SUCCESS != vaStatus) {
248ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        goto out;
249ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
250ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
251ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    obj_context->format_data = (void*) ctx;
252ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ctx->obj_context = obj_context;
2539ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo
254ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
255ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
256ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruoout:
257ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_DestroyContext(obj_context);
258ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
259ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (ctx)
260ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        free(ctx);
261ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
262ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
263ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
264ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
265ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic void vsp_VP8_DestroyContext(
266ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context)
267ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
268ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
269ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
270ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (ctx->context_buf) {
271ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        psb_buffer_destroy(ctx->context_buf);
272ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        free(ctx->context_buf);
273ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        ctx->context_buf = NULL;
274ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
275ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
276ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (ctx->filters) {
277ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        free(ctx->filters);
278ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        ctx->num_filters = 0;
279ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
280ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
281ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    free(obj_context->format_data);
282ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    obj_context->format_data = NULL;
283ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
284ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
285ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_vp8_process_seqence_param(
2861e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo    psb_driver_data_p driver_data,
287ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    context_VPP_p ctx,
288ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p obj_buffer)
289ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
290ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
291ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
292ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf;
293ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int i;
294233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    int ref_frame_width, ref_frame_height,ref_chroma_height, ref_size;
295ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
296ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAEncSequenceParameterBufferVP8 *va_seq =
297ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            (VAEncSequenceParameterBufferVP8 *) obj_buffer->buffer_data;
2980cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    struct VssVp8encSequenceParameterBuffer *seq = &ctx->vp8_seq_param;
299233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    struct VssVp8encSequenceParameterBuffer *seq_to_firmware =
300ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p;
301ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
30220b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    ref_frame_surface *ref =
303233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        (struct ref_frame_surface*)cmdbuf->ref_param_p;
304ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
305ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    seq->frame_width       = va_seq->frame_width;
306ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    seq->frame_height      = va_seq->frame_height;
3079ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->rc_target_bitrate = va_seq->bits_per_second / 1000;
308233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    seq->max_intra_rate    = 100 * ctx->max_frame_size /
309233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                                 (va_seq->bits_per_second / seq->frame_rate);
310ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* FIXME: API doc says max 5000, but for current default test vector we still use 6000 */
3110cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    seq->kf_mode           = va_seq->kf_auto;   /* AUTO */
3129ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->kf_max_dist       = va_seq->kf_max_dist;
3139ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->kf_min_dist       = va_seq->kf_min_dist;
3149ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo    seq->error_resilient   = va_seq->error_resilient;
315ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
3160cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    if (ctx->temporal_layer_number == 2) {
3170cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_layer_id[0] = 0;
3180cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_layer_id[1] = 1;
3190cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_periodicity = 2;
3200cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    } else if (ctx->temporal_layer_number == 3) {
3210cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_layer_id[0] = 0;
3220cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_layer_id[1] = 2;
3230cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_layer_id[2] = 1;
3240cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_layer_id[3] = 2;
3250cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->ts_periodicity = 4;
3260cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    }
3270cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
328233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_frame_width = (seq->frame_width + 2 * 32 + 63) & (~63);
329233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_frame_height = (seq->frame_height + 2 * 32 + 63) & (~63);
330233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_chroma_height = (ref_frame_height / 2 + 63) & (~63);
331233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_size = ref_frame_width * (ref_frame_height + ref_chroma_height);
332de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo
33320b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    for (i = 0; i < 4; i++) {
3341e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        seq->ref_frame_buffers[i].surface_id = va_seq->reference_frames[i];
3351e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        seq->ref_frame_buffers[i].width = ref_frame_width;
3361e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        seq->ref_frame_buffers[i].height = ref_frame_height;
33720b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    }
33820b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo
339ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    for (i = 0; i < 4; i++) {
3401e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        object_surface_p ref_surf = SURFACE(va_seq->reference_frames[i]);
3410cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if (!ref_surf)
3420cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            return VA_STATUS_ERROR_UNKNOWN;
3430cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
3440cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        ref_surf->is_ref_surface = 2;
3450b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun
3461e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        if (ref_surf->psb_surface->size < ref_size) {
3471e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            /* re-alloc buffer */
3481e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            ref_surf->psb_surface->size = ref_size;
3491e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            psb_buffer_destroy(&ref_surf->psb_surface->buf);
3501e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            vaStatus = psb_buffer_create(driver_data, ref_surf->psb_surface->size, psb_bt_surface, &ref_surf->psb_surface->buf);
3511e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            if (VA_STATUS_SUCCESS != vaStatus)
3521e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                return VA_STATUS_ERROR_ALLOCATION_FAILED;
3531e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        }
3541e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo
3550cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(seq->ref_frame_buffers[i].base),
3560cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                                   0,
3570cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                                   &(ref_surf->psb_surface->buf),
3580cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                                   cmdbuf->param_mem_loc, seq);
359ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
360ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
361233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    *seq_to_firmware = *seq;
3621e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo
3631e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo    vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VP8_ID, &cmdbuf->param_mem,
3641e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                              VssVp8encSetSequenceParametersCommand,
3651e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                              ctx->seq_param_offset,
3661e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                              sizeof(struct VssVp8encSequenceParameterBuffer));
3671e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo    ctx->vp8_seq_cmd_send = 1;
368ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
369ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
370ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
371ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
3724dadd5529a552fd10d5f270b8423bee758c42fc5zhangzhastatic VAStatus vsp_vp8_process_dynamic_seqence_param(
3734dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    context_VPP_p ctx)
3744dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha{
3754dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3764dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAStatus vaStatus = VA_STATUS_SUCCESS;
3774dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf;
3784dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    int ref_frame_width, ref_frame_height;
3794dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3804dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    struct VssVp8encSequenceParameterBuffer *seq =
3814dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p;
3824dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3834dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    *seq = ctx->vp8_seq_param ;
384233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    //todo: fix it for multi temporal layers
3850cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    seq->max_intra_rate    = 100 * ctx->max_frame_size /
3860cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                                   (seq->rc_target_bitrate * 1000 / seq->frame_rate);
3874dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3880cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    if (!ctx->vp8_seq_cmd_send) {
3890cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VP8_ID, &cmdbuf->param_mem,
3904dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                              VssVp8encSetSequenceParametersCommand,
3914dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                              ctx->seq_param_offset,
3924dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                              sizeof(struct VssVp8encSequenceParameterBuffer));
3930cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    }
3944dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3954dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    return vaStatus;
3964dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha}
397ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
398ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
399ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_vp8_process_picture_param(
400ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    psb_driver_data_p driver_data,
401ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    context_VPP_p ctx,
402ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p obj_buffer,
403ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VASurfaceID surface_id)
404ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
405ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
406ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
407ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf;
408ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
409ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAEncPictureParameterBufferVP8 *va_pic =
410ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            (VAProcPipelineParameterBuffer *) obj_buffer->buffer_data;
411ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    struct VssVp8encPictureParameterBuffer *pic = cmdbuf->pic_param_p;
412ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    struct VssVp8encSequenceParameterBuffer *seq =
413ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo           (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p;
414ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VACodedBufferSegment *p = &obj_buffer->codedbuf_mapinfo[0];
415de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    int ref_frame_width, ref_frame_height;
416de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo
417233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_frame_width = (ctx->vp8_seq_param.frame_width + 2 * 32 + 63) & (~63);
418233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_frame_height = (ctx->vp8_seq_param.frame_height + 2 * 32 + 63) & (~63);
419ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
420ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    //map parameters
421ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p pObj = BUFFER(va_pic->coded_buf); //tobe modified
4220b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun    if (!pObj)
423233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        return VA_STATUS_ERROR_UNKNOWN;
4240b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun
425ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_surface_p src_surface = SURFACE(surface_id);
426ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
427ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.surface_id = surface_id;
428ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.irq        = 1;
429233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    pic->input_frame.height     = ctx->vp8_seq_param.frame_height;
430233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    pic->input_frame.width      = ctx->vp8_seq_param.frame_width;
431591565b9a60b10365dd813a19c9d4b8ba44c970bSun, Mingruo    /* NOTE: In VIED API doc, stride must be the nearest integer multiple of 32 */
432591565b9a60b10365dd813a19c9d4b8ba44c970bSun, Mingruo    /* use vaCreateSurfaceWithAttribute with VAExternalMemoryNULL to create surface*/
433591565b9a60b10365dd813a19c9d4b8ba44c970bSun, Mingruo    //pic->input_frame.stride     = (ctx->frame_width + 31) & (~31);
434591565b9a60b10365dd813a19c9d4b8ba44c970bSun, Mingruo    pic->input_frame.stride     = ctx->obj_context->current_render_target->psb_surface->stride;
435ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.format     = 0; /* TODO: Specify NV12 = 0 */
436ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
437de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    pic->recon_frame.irq = 0;
438de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    pic->recon_frame.width = ref_frame_width;
439de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    pic->recon_frame.height = ref_frame_height;
440de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo
441ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->version = 0;
4424dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha#if 0
443ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->pic_flags = (1<< 2) |  /* corresponds to  VP8_EFLAG_NO_REF_GF      */
444ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                     (1<< 3) |  /* corresponds to  VP8_EFLAG_NO_REF_ARF     */
445ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                     (1<< 12);   /* corresponds to ~VP8_EFLAG_NO_UPD_ENTROPY */
4464dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha#else
4474dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha   vp8_fw_pic_flags flags;
4484dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha   flags.value =0;
4494dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
450025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo   flags.bits.force_kf = va_pic->ref_flags.bits.force_kf;
451025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo   flags.bits.no_ref_last = va_pic->ref_flags.bits.no_ref_last;
452025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo   flags.bits.no_ref_gf = va_pic->ref_flags.bits.no_ref_gf;
453025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo   flags.bits.no_ref_arf = va_pic->ref_flags.bits.no_ref_arf;
4544dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha   flags.bits.upd_last  = va_pic->pic_flags.bits.refresh_last;
45519fc7221d7f03f50d8508136ed306c6fb905f03cSun, Mingruo   flags.bits.upd_gf  = va_pic->pic_flags.bits.copy_buffer_to_golden;
45619fc7221d7f03f50d8508136ed306c6fb905f03cSun, Mingruo   flags.bits.upd_arf  = va_pic->pic_flags.bits.copy_buffer_to_alternate;
4574dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha   flags.bits.no_upd_last  = !va_pic->pic_flags.bits.refresh_last;
4584dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha   flags.bits.no_upd_gf  = !va_pic->pic_flags.bits.refresh_golden_frame;
4594dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha   flags.bits.no_upd_arf  = !va_pic->pic_flags.bits.refresh_alternate_frame;
4600cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo   flags.bits.upd_entropy  = va_pic->pic_flags.bits.refresh_entropy_probs;
4610cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo   if (ctx->temporal_layer_number > 1)
4620cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	   flags.bits.upd_entropy = 0;
4630cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
4640cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    if (ctx->temporal_layer_number == 2) {
4650cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            /*
4660cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  layer 0: frame #0,#2,#4...
4670cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  layer 1: frame #1,#3,#5...
4680cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *
4690cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #1 refers frame #0
4700cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #2 refers frame #0
4710cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #3 refers frame #2
4720cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #4 refers frame #2
4730cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  ........
4740cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo             */
4750cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if (ctx->obj_context->frame_count % 2 == 0) {
4760cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            /* layer 0: base layer */
4770cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_ref_last = 0;
4780cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_ref_gf = 1;
4790cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_ref_arf = 1;
4800cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
4810cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_upd_last = 0;
4820cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.upd_last = 1;
4830cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	} else {
4840cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            /* layer 1 */
4850cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.force_kf = 0;
4860cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_ref_last = 0;
4870cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_ref_gf = 1;
4880cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_ref_arf = 1;
4890cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
4900cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    flags.bits.no_upd_last = 1;
4910cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	}
4920cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    }
4930cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    else if (ctx->temporal_layer_number >= 3) {
4940cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            /*
4950cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  layer 0: frame #0,#4,#8...
4960cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  layer 1: frame #2,#6,#10....
4970cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  layer 2: frame #1,#3,#5,#7,#9,#11...
4980cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *
4990cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #1 refers frame #0
5000cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #2 refers frame #0
5010cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #3 refers frame #2
5020cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  frame #4 refers frame #0
5030cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	     *  ........
5040cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo             */
5050cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    if (ctx->obj_context->frame_count % 4 == 0) {
5060cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                /* layer 0: base layer */
5070cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_ref_last = 0;
5080cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_ref_gf = 1;
5090cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_ref_arf = 1;
5100cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
5110cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.upd_last = 1;
5120cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_upd_last = 0;
5130cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    } else if (ctx->obj_context->frame_count % 4 == 2) {
5140cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                /* layer 1: update golden ref frame */
5150cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.force_kf = 0;
5160cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_ref_last = 0;
5170cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_ref_gf = 1;
5180cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_ref_arf = 1;
5190cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
5200cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_upd_last = 1;
5210cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_upd_gf = 0;
5220cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.upd_gf = 3;
5230cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    } else {
5240cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                /* layer 2 */
5250cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.force_kf = 0;
5260cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo		if (ctx->obj_context->frame_count % 4 == 1) {
5270cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                   flags.bits.no_ref_last = 0;
5280cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                   flags.bits.no_ref_gf = 0;
5290cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo		} else {
5300cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                   flags.bits.no_ref_last = 1;
5310cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                   flags.bits.no_ref_gf = 0;
5320cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo		}
5330cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_ref_arf = 1;
5340cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
5350cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_upd_last = 1;
5360cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                flags.bits.no_upd_gf = 1;
5370cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo	    }
5380cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    }
5394dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
5400cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    pic->pic_flags = flags.value;
5414dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha#endif
5420cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
543ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->prev_frame_dropped = 0; /* Not yet used */
544ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->cpuused            = 5;
5454dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    pic->sharpness          = va_pic->sharpness_level;
5464dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    pic->num_token_partitions = va_pic->pic_flags.bits.num_token_partitions; /* 2^2 = 4 partitions */
5474dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    pic->encoded_frame_size = pObj->size & ~31;
5480cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    pic->encoded_frame_base = pObj->buffer_data; //tobe modified
549ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
550ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    {
551ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(pic->encoded_frame_base),
552ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   ctx->pic_param_offset, pObj->psb_buffer,
553ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   cmdbuf->param_mem_loc, pic);
554ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
555ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
556ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    {
557ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        object_surface_p cur_surf = SURFACE(surface_id);
5580cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if(!cur_surf)
5590cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            return VA_STATUS_ERROR_UNKNOWN;
5600b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun
561ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(pic->input_frame.base),
5621e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                                   0, &(cur_surf->psb_surface->buf),
563ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   cmdbuf->param_mem_loc, pic);
5641e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(pic->input_frame.base_uv),
565233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                       pic->input_frame.stride * ctx->obj_context->current_render_target->height,
5660cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                       &(cur_surf->psb_surface->buf),
5670cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                       cmdbuf->param_mem_loc, pic);
568ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
569ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
570233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha     *cmdbuf->cmd_idx++ = CONTEXT_VP8_ID;
571233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha     *cmdbuf->cmd_idx++ = VssVp8encEncodeFrameCommand;
572233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha      VSP_RELOC_CMDBUF(cmdbuf->cmd_idx++, ctx->pic_param_offset, &cmdbuf->param_mem);
573233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha      *cmdbuf->cmd_idx++ = sizeof(struct VssVp8encPictureParameterBuffer);
574233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha      *cmdbuf->cmd_idx++ = 0; *cmdbuf->cmd_idx++ = 0;
575233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha      *cmdbuf->cmd_idx++ = wsbmKBufHandle(wsbmKBuf(pObj->psb_buffer->drm_buf)) ;
576233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha      *cmdbuf->cmd_idx++ = wsbmKBufHandle(wsbmKBuf((&cmdbuf->param_mem)->drm_buf));
577ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
578ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
579ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
580ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
5814dadd5529a552fd10d5f270b8423bee758c42fc5zhangzhastatic VAStatus vsp_vp8_process_misc_param(context_VPP_p ctx, object_buffer_p obj_buffer)
5824dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha{
5834dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterBuffer *pBuffer;
5844dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterAIR *air_param;
5854dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterBufferMaxFrameSize *max_frame_size_param;
5864dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterFrameRate *frame_rate_param;
5874dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterRateControl *rate_control_param;
588025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo    VAEncMiscParameterHRD *hrd_param;
58916752f679f82f92454ac160f0457be83e0fa4b77zhangzha    VAEncMiscParameterTemporalLayerStructure* tslayer_param;
5900cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    struct VssVp8encSequenceParameterBuffer *seq = &ctx->vp8_seq_param;
5914dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAStatus vaStatus = VA_STATUS_SUCCESS;
59216752f679f82f92454ac160f0457be83e0fa4b77zhangzha     uint32_t layer_id,i;
5930cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
5944dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    ASSERT(obj_buffer->type == VAEncMiscParameterBufferType);
5954dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    pBuffer = (VAEncMiscParameterBuffer *) obj_buffer->buffer_data;
5964dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    obj_buffer->size = 0;
5970cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
5984dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    switch (pBuffer->type) {
59916752f679f82f92454ac160f0457be83e0fa4b77zhangzha    case VAEncMiscParameterTypeTemporalLayerStructure:
60016752f679f82f92454ac160f0457be83e0fa4b77zhangzha       tslayer_param = (VAEncMiscParameterTemporalLayerStructure *)pBuffer->data;
60116752f679f82f92454ac160f0457be83e0fa4b77zhangzha       //verify parameter
60216752f679f82f92454ac160f0457be83e0fa4b77zhangzha       if (tslayer_param->number_of_layers < 2 &&  tslayer_param->number_of_layers > 3){
60316752f679f82f92454ac160f0457be83e0fa4b77zhangzha          drv_debug_msg(VIDEO_DEBUG_ERROR, "Temporal Layer Number should be 2 or 3\n");
60416752f679f82f92454ac160f0457be83e0fa4b77zhangzha          vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
60516752f679f82f92454ac160f0457be83e0fa4b77zhangzha           break;
60616752f679f82f92454ac160f0457be83e0fa4b77zhangzha       }
60716752f679f82f92454ac160f0457be83e0fa4b77zhangzha
60816752f679f82f92454ac160f0457be83e0fa4b77zhangzha       if (tslayer_param->periodicity > 32 ||tslayer_param->periodicity< 1) {
60916752f679f82f92454ac160f0457be83e0fa4b77zhangzha              drv_debug_msg(VIDEO_DEBUG_ERROR, "ts_periodicity shoulde be 1 - 32\n");
61016752f679f82f92454ac160f0457be83e0fa4b77zhangzha              vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
61116752f679f82f92454ac160f0457be83e0fa4b77zhangzha              break;
61216752f679f82f92454ac160f0457be83e0fa4b77zhangzha       }
61316752f679f82f92454ac160f0457be83e0fa4b77zhangzha
61416752f679f82f92454ac160f0457be83e0fa4b77zhangzha       for(i=0;i<tslayer_param->periodicity; i++){
61516752f679f82f92454ac160f0457be83e0fa4b77zhangzha          layer_id = tslayer_param->layer_id[i];
61616752f679f82f92454ac160f0457be83e0fa4b77zhangzha            if (layer_id > (tslayer_param->number_of_layers-1)) {
61716752f679f82f92454ac160f0457be83e0fa4b77zhangzha              drv_debug_msg(VIDEO_DEBUG_ERROR, "layer_id shoulde be 0 - %d\n",
61816752f679f82f92454ac160f0457be83e0fa4b77zhangzha                                          tslayer_param->number_of_layers-1 );
61916752f679f82f92454ac160f0457be83e0fa4b77zhangzha              vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
62016752f679f82f92454ac160f0457be83e0fa4b77zhangzha              break;
62116752f679f82f92454ac160f0457be83e0fa4b77zhangzha            }
62216752f679f82f92454ac160f0457be83e0fa4b77zhangzha       }
62316752f679f82f92454ac160f0457be83e0fa4b77zhangzha
62416752f679f82f92454ac160f0457be83e0fa4b77zhangzha       if (vaStatus == VA_STATUS_ERROR_INVALID_PARAMETER )
62516752f679f82f92454ac160f0457be83e0fa4b77zhangzha            break;
62616752f679f82f92454ac160f0457be83e0fa4b77zhangzha
62716752f679f82f92454ac160f0457be83e0fa4b77zhangzha       seq->ts_number_layers = tslayer_param->number_of_layers;
62816752f679f82f92454ac160f0457be83e0fa4b77zhangzha       ctx->temporal_layer_number = tslayer_param->number_of_layers;
62916752f679f82f92454ac160f0457be83e0fa4b77zhangzha       seq->ts_periodicity = tslayer_param->periodicity;
63016752f679f82f92454ac160f0457be83e0fa4b77zhangzha       for(i=0;i<seq->ts_periodicity; i++)
63116752f679f82f92454ac160f0457be83e0fa4b77zhangzha          seq->ts_layer_id[i] = tslayer_param->layer_id[i];
63216752f679f82f92454ac160f0457be83e0fa4b77zhangzha	ctx->re_send_seq_params = 1;
63316752f679f82f92454ac160f0457be83e0fa4b77zhangzha       break;
6344dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    case VAEncMiscParameterTypeFrameRate:
6354dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        frame_rate_param = (VAEncMiscParameterFrameRate *)pBuffer->data;
6364dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        if (frame_rate_param->framerate < 1 || frame_rate_param->framerate > 65535) {
6374dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
6384dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            break;
6394dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        }
6400cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
6410cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if (ctx->temporal_layer_number == 1) {
6420cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            if (seq->frame_rate != frame_rate_param->framerate) {
6430cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                drv_debug_msg(VIDEO_DEBUG_GENERAL, "frame rate changed from %d to %d\n",
6440cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                              seq->frame_rate,
6450cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                              frame_rate_param->framerate);
6460cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                seq->frame_rate= frame_rate_param->framerate;
6470cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                ctx->re_send_seq_params = 1 ;
648233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha              }
6490cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        } else {
6500cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            layer_id = frame_rate_param->framerate_flags.bits.temporal_id % 3;
6510cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            if (ctx->frame_rate[layer_id] != frame_rate_param->framerate) {
6520cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                drv_debug_msg(VIDEO_DEBUG_GENERAL, "frame rate of layer %d will be changed from %d to %d\n",
6530cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                              layer_id, ctx->frame_rate[layer_id], frame_rate_param->framerate);
6540cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                ctx->frame_rate[layer_id] = frame_rate_param->framerate;
6550cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                //convert to ts_rate
6560cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                //todo: convert to ts_period_id
6570cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                seq->ts_rate_decimator[layer_id] =
658233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                            seq->frame_rate / ctx->frame_rate[layer_id];
6590cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                ctx->re_send_seq_params = 1 ;
6600cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            }
661233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        }
6624dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
6634dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    case VAEncMiscParameterTypeRateControl:
6644dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        rate_control_param = (VAEncMiscParameterRateControl *)pBuffer->data;
6654dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        if (rate_control_param->initial_qp > 63 ||
6664dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            rate_control_param->min_qp > 63) {
6674dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            drv_debug_msg(VIDEO_DEBUG_ERROR, "Initial_qp(%d) and min_qpinitial_qp(%d) "
6684dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                          "are invalid.\nQP shouldn't be larger than 63 for VP8\n",
6694dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                          rate_control_param->initial_qp, rate_control_param->min_qp);
6704dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
6714dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            break;
6724dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        }
673233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
674233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        if (rate_control_param->min_qp != seq->rc_min_quantizer) {
6754dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            drv_debug_msg(VIDEO_DEBUG_ERROR, "min_qp was changed from %d to %d\n",
676233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                          seq->rc_min_quantizer, rate_control_param->min_qp);
677233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha            seq->rc_min_quantizer = rate_control_param->min_qp;
6784dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        }
6790cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
680233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        if (rate_control_param->max_qp != seq->rc_max_quantizer) {
681025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo            drv_debug_msg(VIDEO_DEBUG_ERROR, "max_qp was changed from %d to %d\n",
682233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                          seq->rc_max_quantizer, rate_control_param->max_qp);
683233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha            seq->rc_max_quantizer = rate_control_param->max_qp;
684025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo        }
685233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
6860cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        // no initial qp for vp8
687233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
688233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        if (rate_control_param->target_percentage != seq->rc_undershoot_pct) {
689025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo            drv_debug_msg(VIDEO_DEBUG_ERROR, "rc_undershoot was changed from %d to %d\n",
690233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                          seq->rc_undershoot_pct, rate_control_param->target_percentage);
691233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha            seq->rc_undershoot_pct = rate_control_param->target_percentage;
692025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo        }
693025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo
6940cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if (ctx->temporal_layer_number == 1) {
6950cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            if(rate_control_param->bits_per_second / 1000 != seq->rc_target_bitrate) {
696233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                drv_debug_msg(VIDEO_DEBUG_ERROR, "bitrate was changed from %dkbps to %dkbps\n",
697233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                          seq->rc_target_bitrate, rate_control_param->bits_per_second/1000);
6980cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                seq->rc_target_bitrate = rate_control_param->bits_per_second / 1000;
6990cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            }
7000cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        } else {
7010cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            layer_id = rate_control_param->rc_flags.bits.temporal_id % 3;
7020cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            if(rate_control_param->bits_per_second / 1000 != seq->ts_target_bitrate[layer_id]) {
703233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                drv_debug_msg(VIDEO_DEBUG_ERROR, "bitrate was changed from %dkbps to %dkbps\n",
704233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                          seq->ts_target_bitrate[layer_id], rate_control_param->bits_per_second/1000);
7050cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                seq->ts_target_bitrate[layer_id] = rate_control_param->bits_per_second / 1000;
7060cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            }
7070cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        }
7080cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
7090cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        ctx->re_send_seq_params = 1;
7104dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
7114dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    case VAEncMiscParameterTypeMaxFrameSize:
7124dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        max_frame_size_param = (VAEncMiscParameterBufferMaxFrameSize *)pBuffer->data;
7134dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        if (ctx->max_frame_size == max_frame_size_param->max_frame_size)
7144dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            break;
7150cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
7166e762d8b43b8a9cf3b7111877d9dc9579a9170afSun, Mingruo        drv_debug_msg(VIDEO_DEBUG_ERROR, "max frame size changed from %d to %d\n",
7174dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                      ctx->max_frame_size, max_frame_size_param->max_frame_size);
7184dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        ctx->max_frame_size = max_frame_size_param->max_frame_size ;
7194dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        ctx->re_send_seq_params = 1 ;
7204dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
7214dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    case VAEncMiscParameterTypeAIR:
7224dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        air_param = (VAEncMiscParameterAIR *)pBuffer->data;
7234dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        if (air_param->air_num_mbs > 65535 ||
7244dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            air_param->air_threshold > 65535) {
7250cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
7260cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                break;
7274dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        }
7280cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
7294dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        drv_debug_msg(VIDEO_DEBUG_GENERAL, "air slice size changed to num_air_mbs %d "
7304dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                      "air_threshold %d, air_auto %d\n",
7314dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                      air_param->air_num_mbs, air_param->air_threshold,
7324dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                      air_param->air_auto);
733233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        seq->cyclic_intra_refresh = air_param->air_threshold;
7344dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
735025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo    case VAEncMiscParameterTypeHRD:
7360cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        hrd_param = (VAEncMiscParameterHRD *)pBuffer->data;
7370cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->rc_buf_sz = hrd_param->buffer_size;
7380cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->rc_buf_initial_sz = hrd_param->initial_buffer_fullness;
7390cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->rc_buf_optimal_sz = hrd_param->optimal_buffer_fullness;
7400cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        ctx->re_send_seq_params = 1;
7410cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        break;
742025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo    case VAEncMiscParameterTypeQualityLevel:
7430cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        break;
7440cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
7454dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    default:
7464dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        vaStatus = VA_STATUS_ERROR_UNKNOWN;
7474dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        DEBUG_FAILURE;
7484dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
7494dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    }
7500cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
7514dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    free(obj_buffer->buffer_data);
7524dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    obj_buffer->buffer_data = NULL;
7530cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
7544dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    return vaStatus;
7554dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha}
756ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_RenderPicture(
757ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context,
758ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p *buffers,
759ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int num_buffers)
760ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
761ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
762ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int i;
763ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    psb_driver_data_p driver_data = obj_context->driver_data;
764ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
765ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VASurfaceID surface_id;
766ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
767ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
7680cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    for (i = 0; i < num_buffers; i++) {
769ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
770ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        object_buffer_p obj_buffer = buffers[i];
771ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        switch (obj_buffer->type) {
772ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        case VAEncSequenceParameterBufferType:
7731e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            vaStatus = vsp_vp8_process_seqence_param(driver_data, ctx, obj_buffer);
774ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            break;
775ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        case VAEncPictureParameterBufferType:
776ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            surface_id = obj_context->current_render_surface_id;
777ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            vaStatus = vsp_vp8_process_picture_param(driver_data,ctx, obj_buffer,surface_id);
778ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            break;
7794dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        case VAEncMiscParameterBufferType:
7804dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            vaStatus = vsp_vp8_process_misc_param(ctx, obj_buffer);
7814dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            break;
782ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        default:
783ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            vaStatus = VA_STATUS_SUCCESS;//VA_STATUS_ERROR_UNKNOWN;
784ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            DEBUG_FAILURE;
785ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        }
7860cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
787ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        if (vaStatus != VA_STATUS_SUCCESS) {
788ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            break;
789ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        }
790ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
791ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
792ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
793ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
794ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
795ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_BeginPicture(
796ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context)
797ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
798ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int ret;
799ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
800ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
801ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf;
802ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
803ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* Initialise the command buffer */
804ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ret = vsp_context_get_next_cmdbuf(ctx->obj_context);
805ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (ret) {
806ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        drv_debug_msg(VIDEO_DEBUG_GENERAL, "get next cmdbuf fail\n");
807ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            vaStatus = VA_STATUS_ERROR_UNKNOWN;
808ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            return vaStatus;
809ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo     }
810ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
811ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    cmdbuf = obj_context->vsp_cmdbuf;
812ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
8130cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    if (ctx->obj_context->frame_count == 0) { /* first picture */
8148672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo        vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VP8_ID, ctx->context_buf, Vss_Sys_STATE_BUF_COMMAND,
815ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                  0, VSP_VP8ENC_STATE_SIZE);
816ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
817ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
818ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* map param mem */
819ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vaStatus = psb_buffer_map(&cmdbuf->param_mem, &cmdbuf->param_mem_p);
820ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (vaStatus) {
821ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        return vaStatus;
822ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
823ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
824ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    cmdbuf->pic_param_p = cmdbuf->param_mem_p;
825ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    cmdbuf->seq_param_p = cmdbuf->param_mem_p + ctx->seq_param_offset;
82620b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    cmdbuf->ref_param_p = cmdbuf->param_mem_p + ctx->ref_param_offset;
8274dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    ctx->vp8_seq_cmd_send = 0;
8284dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    ctx->re_send_seq_params = 0;
8290cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
830ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return VA_STATUS_SUCCESS;
831ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
832ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
833ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_EndPicture(
834ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context)
835ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
836ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
837ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    psb_driver_data_p driver_data = obj_context->driver_data;
838ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf = obj_context->vsp_cmdbuf;
839ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
8400cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    if(ctx->re_send_seq_params) {
8414dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        vsp_vp8_process_dynamic_seqence_param(ctx);
8424dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    }
8434dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
844ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (cmdbuf->param_mem_p != NULL) {
845ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        psb_buffer_unmap(&cmdbuf->param_mem);
846ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->param_mem_p = NULL;
847ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->pic_param_p = NULL;
848ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->end_param_p = NULL;
849ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->pipeline_param_p = NULL;
850ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->denoise_param_p = NULL;
851ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->enhancer_param_p = NULL;
852ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->sharpen_param_p = NULL;
853ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->frc_param_p = NULL;
85420b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo        cmdbuf->ref_param_p = NULL;
855ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo     }
856ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
8579ab46f9986463a0a5e6ba912fffb71be24d119d9Sun, Mingruo//    ctx->obj_context->frame_count++;
858ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
8594dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
8608f868258b5396c3d39dd33f2d05a829ff855aa0dSun, Mingruo    if (vsp_context_flush_cmdbuf(ctx->obj_context)) {
861ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VPP: flush deblock cmdbuf error\n");
8626e762d8b43b8a9cf3b7111877d9dc9579a9170afSun, Mingruo        return VA_STATUS_ERROR_UNKNOWN;
8638f868258b5396c3d39dd33f2d05a829ff855aa0dSun, Mingruo    }
864ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
865ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return VA_STATUS_SUCCESS;
866ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
867ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
868ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostruct format_vtable_s vsp_VP8_vtable = {
869ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruoqueryConfigAttributes:
870ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_QueryConfigAttributes,
871ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruovalidateConfig:
872ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_ValidateConfig,
873ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruocreateContext:
874ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_CreateContext,
875ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruodestroyContext:
876ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_DestroyContext,
877ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruobeginPicture:
878ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_BeginPicture,
879ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruorenderPicture:
880ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_RenderPicture,
881ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruoendPicture:
882ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_EndPicture
883ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo};
884ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
885