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
7794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzhatypedef union {
7894e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    struct {
7994e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        /* force this frame to be a keyframe */
8094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        unsigned int force_kf                       : 1;
81233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        /* don't reference the last frame */
8294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        unsigned int no_ref_last                    : 1;
83233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        /* don't reference the golden frame */
8494e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        unsigned int no_ref_gf                      : 1;
85233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        /* don't reference the alternate reference frame */
8694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        unsigned int no_ref_arf                     : 1;
874dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
8894e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        unsigned int upd_last                     : 1;
8994e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        unsigned int upd_gf                     : 2;
9094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        unsigned int upd_arf                     : 2;
9194e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        unsigned int no_upd_last                     : 1;
9294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        unsigned int no_upd_gf                     : 1;
9394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        unsigned int no_upd_arf                     : 1;
9494e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        unsigned int upd_entropy                     : 1;
9594e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    } bits;
9694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    unsigned int value;
9794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha} 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(
105d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel    VAProfile __maybe_unused profile,
106b35344f5c0b8568df0630efe9fce076e810de8d3ywan    VAEntrypoint __maybe_unused 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:
118b35344f5c0b8568df0630efe9fce076e810de8d3ywan            attrib_list[i].value = VA_RC_CBR | VA_RC_VCM | 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:
12794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            attrib_list[i].value = 3;
12894e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            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;
182f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun    vp8_seq->rc_end_usage = VP8_ENC_CBR;
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;
1924457eceae6652c2336b5a1440b846456cd0b455cSun, Mingruo    vp8_seq->ts_rate_decimator[0] = 0;
1934457eceae6652c2336b5a1440b846456cd0b455cSun, Mingruo    vp8_seq->ts_periodicity = 0;
1944457eceae6652c2336b5a1440b846456cd0b455cSun, Mingruo    vp8_seq->ts_target_bitrate[0] = 0;
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) {
219f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun            if (obj_config->attrib_list[i].value == VA_RC_VCM)
220f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun               ctx->vp8_seq_param.rc_end_usage = VP8_ENC_CBR_HRD;
221f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun            else
222f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun               ctx->vp8_seq_param.rc_end_usage = VP8_ENC_CBR;
22394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        }
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;
29794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    int ref_frame_width, ref_frame_height, ref_chroma_height, ref_size;
298ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
299ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAEncSequenceParameterBufferVP8 *va_seq =
30094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        (VAEncSequenceParameterBufferVP8 *) obj_buffer->buffer_data;
3010cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    struct VssVp8encSequenceParameterBuffer *seq = &ctx->vp8_seq_param;
302233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    struct VssVp8encSequenceParameterBuffer *seq_to_firmware =
30394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        (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 /
31294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                             (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;
3180cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
319233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_frame_width = (seq->frame_width + 2 * 32 + 63) & (~63);
320233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_frame_height = (seq->frame_height + 2 * 32 + 63) & (~63);
321233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_chroma_height = (ref_frame_height / 2 + 63) & (~63);
322233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_size = ref_frame_width * (ref_frame_height + ref_chroma_height);
323de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo
32420b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    for (i = 0; i < 4; i++) {
3251e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        seq->ref_frame_buffers[i].surface_id = va_seq->reference_frames[i];
3261e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        seq->ref_frame_buffers[i].width = ref_frame_width;
3271e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        seq->ref_frame_buffers[i].height = ref_frame_height;
32820b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    }
32920b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo
330ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    for (i = 0; i < 4; i++) {
3311e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        object_surface_p ref_surf = SURFACE(va_seq->reference_frames[i]);
3320cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if (!ref_surf)
3330cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            return VA_STATUS_ERROR_UNKNOWN;
3340cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
3350cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        ref_surf->is_ref_surface = 2;
3360b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun
3371e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        if (ref_surf->psb_surface->size < ref_size) {
3381e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            /* re-alloc buffer */
3391e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            ref_surf->psb_surface->size = ref_size;
3401e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            psb_buffer_destroy(&ref_surf->psb_surface->buf);
3411e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            vaStatus = psb_buffer_create(driver_data, ref_surf->psb_surface->size, psb_bt_surface, &ref_surf->psb_surface->buf);
3421e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            if (VA_STATUS_SUCCESS != vaStatus)
3431e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                return VA_STATUS_ERROR_ALLOCATION_FAILED;
3441e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        }
3451e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo
3460cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(seq->ref_frame_buffers[i].base),
3470cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                                   0,
3480cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                                   &(ref_surf->psb_surface->buf),
3490cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                                   cmdbuf->param_mem_loc, seq);
350ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
351ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
352233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    *seq_to_firmware = *seq;
3531e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo
3541e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo    vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VP8_ID, &cmdbuf->param_mem,
3551e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                              VssVp8encSetSequenceParametersCommand,
3561e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                              ctx->seq_param_offset,
3571e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                              sizeof(struct VssVp8encSequenceParameterBuffer));
3581e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo    ctx->vp8_seq_cmd_send = 1;
359ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
360ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
361ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
362ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
3634dadd5529a552fd10d5f270b8423bee758c42fc5zhangzhastatic VAStatus vsp_vp8_process_dynamic_seqence_param(
3644dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    context_VPP_p ctx)
3654dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha{
3664dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3674dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAStatus vaStatus = VA_STATUS_SUCCESS;
3684dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf;
3694dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    int ref_frame_width, ref_frame_height;
3704dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3714dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    struct VssVp8encSequenceParameterBuffer *seq =
37294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p;
3734dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3744dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    *seq = ctx->vp8_seq_param ;
3750cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    seq->max_intra_rate    = 100 * ctx->max_frame_size /
37694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                             (seq->rc_target_bitrate * 1000 / seq->frame_rate);
3774dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3780cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    if (!ctx->vp8_seq_cmd_send) {
3790cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VP8_ID, &cmdbuf->param_mem,
38094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                                  VssVp8encSetSequenceParametersCommand,
38194e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                                  ctx->seq_param_offset,
38294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                                  sizeof(struct VssVp8encSequenceParameterBuffer));
3830cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    }
3844dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
3854dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    return vaStatus;
3864dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha}
387ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
388ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
389ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_vp8_process_picture_param(
390ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    psb_driver_data_p driver_data,
391ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    context_VPP_p ctx,
392ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p obj_buffer,
393ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VASurfaceID surface_id)
394ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
395ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
396ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
397ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf;
398ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
399ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAEncPictureParameterBufferVP8 *va_pic =
40094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        (VAEncPictureParameterBufferVP8 *) obj_buffer->buffer_data;
401daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    struct VssVp8encPictureParameterBuffer *pic =
40294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        (struct VssVp8encPictureParameterBuffer *)cmdbuf->pic_param_p;
403ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    struct VssVp8encSequenceParameterBuffer *seq =
40494e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p;
405de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    int ref_frame_width, ref_frame_height;
40694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    vp8_fw_pic_flags flags;
407de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo
408233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_frame_width = (ctx->vp8_seq_param.frame_width + 2 * 32 + 63) & (~63);
409233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    ref_frame_height = (ctx->vp8_seq_param.frame_height + 2 * 32 + 63) & (~63);
410ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
411ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    //map parameters
412ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p pObj = BUFFER(va_pic->coded_buf); //tobe modified
4130b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun    if (!pObj)
414233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        return VA_STATUS_ERROR_UNKNOWN;
4150b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun
416ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_surface_p src_surface = SURFACE(surface_id);
417ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
418ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.surface_id = surface_id;
419ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.irq        = 1;
420233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    pic->input_frame.height     = ctx->vp8_seq_param.frame_height;
421233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha    pic->input_frame.width      = ctx->vp8_seq_param.frame_width;
422591565b9a60b10365dd813a19c9d4b8ba44c970bSun, Mingruo    /* NOTE: In VIED API doc, stride must be the nearest integer multiple of 32 */
423591565b9a60b10365dd813a19c9d4b8ba44c970bSun, Mingruo    /* use vaCreateSurfaceWithAttribute with VAExternalMemoryNULL to create surface*/
424591565b9a60b10365dd813a19c9d4b8ba44c970bSun, Mingruo    //pic->input_frame.stride     = (ctx->frame_width + 31) & (~31);
425591565b9a60b10365dd813a19c9d4b8ba44c970bSun, Mingruo    pic->input_frame.stride     = ctx->obj_context->current_render_target->psb_surface->stride;
426ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->input_frame.format     = 0; /* TODO: Specify NV12 = 0 */
427ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
428de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    pic->recon_frame.irq = 0;
429de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    pic->recon_frame.width = ref_frame_width;
430de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo    pic->recon_frame.height = ref_frame_height;
431de74d37a8fb1eef75af159f486a52b419f9d3a00Sun, Mingruo
432ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->version = 0;
43394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha
43494e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    flags.value = 0;
43594e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    flags.bits.force_kf = va_pic->ref_flags.bits.force_kf;
43694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    flags.bits.no_ref_last = va_pic->ref_flags.bits.no_ref_last;
43794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    flags.bits.no_ref_gf = va_pic->ref_flags.bits.no_ref_gf;
43894e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    flags.bits.no_ref_arf = va_pic->ref_flags.bits.no_ref_arf;
43994e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    flags.bits.upd_last  = va_pic->pic_flags.bits.refresh_last;
44094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    flags.bits.upd_gf  = va_pic->pic_flags.bits.copy_buffer_to_golden;
44194e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    flags.bits.upd_arf  = va_pic->pic_flags.bits.copy_buffer_to_alternate;
44294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    flags.bits.no_upd_last  = !va_pic->pic_flags.bits.refresh_last;
44394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    flags.bits.no_upd_gf  = !va_pic->pic_flags.bits.refresh_golden_frame;
44494e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    flags.bits.no_upd_arf  = !va_pic->pic_flags.bits.refresh_alternate_frame;
44594e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    flags.bits.upd_entropy  = va_pic->pic_flags.bits.refresh_entropy_probs;
44694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    if (ctx->temporal_layer_number > 1)
44794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        flags.bits.upd_entropy = 0;
44894e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    pic->pic_flags = flags.value;
4490cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
450ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->prev_frame_dropped = 0; /* Not yet used */
451ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    pic->cpuused            = 5;
4524dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    pic->sharpness          = va_pic->sharpness_level;
4534dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    pic->num_token_partitions = va_pic->pic_flags.bits.num_token_partitions; /* 2^2 = 4 partitions */
4544dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    pic->encoded_frame_size = pObj->size & ~31;
455daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    pic->encoded_frame_base = (uint32_t)pObj->buffer_data;
456ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
457ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    {
458ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(pic->encoded_frame_base),
459ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   ctx->pic_param_offset, pObj->psb_buffer,
460ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   cmdbuf->param_mem_loc, pic);
461ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
462ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
463ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    {
464ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        object_surface_p cur_surf = SURFACE(surface_id);
46594e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        if (!cur_surf)
4660cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            return VA_STATUS_ERROR_UNKNOWN;
4670b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun
468ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(pic->input_frame.base),
4691e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                                   0, &(cur_surf->psb_surface->buf),
470ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                   cmdbuf->param_mem_loc, pic);
4711e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo        vsp_cmdbuf_reloc_pic_param(&(pic->input_frame.base_uv),
47294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                                   pic->input_frame.stride * ctx->obj_context->current_render_target->height,
47394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                                   &(cur_surf->psb_surface->buf),
47494e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                                   cmdbuf->param_mem_loc, pic);
475ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
476ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
47794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    *cmdbuf->cmd_idx++ = CONTEXT_VP8_ID;
47894e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    *cmdbuf->cmd_idx++ = VssVp8encEncodeFrameCommand;
47994e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    VSP_RELOC_CMDBUF(cmdbuf->cmd_idx++, ctx->pic_param_offset, &cmdbuf->param_mem);
48094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    *cmdbuf->cmd_idx++ = sizeof(struct VssVp8encPictureParameterBuffer);
48194e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    *cmdbuf->cmd_idx++ = 0;
48294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    *cmdbuf->cmd_idx++ = 0;
48394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    *cmdbuf->cmd_idx++ = wsbmKBufHandle(wsbmKBuf(pObj->psb_buffer->drm_buf)) ;
48494e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    *cmdbuf->cmd_idx++ = wsbmKBufHandle(wsbmKBuf((&cmdbuf->param_mem)->drm_buf));
485ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
486ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
487ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
488ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
4894dadd5529a552fd10d5f270b8423bee758c42fc5zhangzhastatic VAStatus vsp_vp8_process_misc_param(context_VPP_p ctx, object_buffer_p obj_buffer)
4904dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha{
4914dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterBuffer *pBuffer;
4924dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterAIR *air_param;
4934dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterBufferMaxFrameSize *max_frame_size_param;
4944dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterFrameRate *frame_rate_param;
4954dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAEncMiscParameterRateControl *rate_control_param;
496025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo    VAEncMiscParameterHRD *hrd_param;
49716752f679f82f92454ac160f0457be83e0fa4b77zhangzha    VAEncMiscParameterTemporalLayerStructure* tslayer_param;
4980cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    struct VssVp8encSequenceParameterBuffer *seq = &ctx->vp8_seq_param;
4994dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    VAStatus vaStatus = VA_STATUS_SUCCESS;
500daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    uint32_t layer_id, i;
5010cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
5024dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    ASSERT(obj_buffer->type == VAEncMiscParameterBufferType);
5034dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    pBuffer = (VAEncMiscParameterBuffer *) obj_buffer->buffer_data;
5044dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    obj_buffer->size = 0;
5050cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
5064dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    switch (pBuffer->type) {
50716752f679f82f92454ac160f0457be83e0fa4b77zhangzha    case VAEncMiscParameterTypeTemporalLayerStructure:
50894e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        tslayer_param = (VAEncMiscParameterTemporalLayerStructure *)pBuffer->data;
50994e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        //verify parameter
51094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        if (tslayer_param->number_of_layers < 2 && tslayer_param->number_of_layers > 3) {
51194e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            drv_debug_msg(VIDEO_DEBUG_ERROR, "Temporal Layer Number should be 2 or 3\n");
51294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
51394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            break;
51494e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        }
51594e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha
51694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        if (tslayer_param->periodicity > 32 || tslayer_param->periodicity < 1) {
51794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            drv_debug_msg(VIDEO_DEBUG_ERROR, "ts_periodicity shoulde be 1 - 32\n");
51894e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
51994e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            break;
52094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        }
52194e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha
52294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        for (i = 0; i < tslayer_param->periodicity; i++) {
52394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            layer_id = tslayer_param->layer_id[i];
524daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            if (layer_id > (tslayer_param->number_of_layers - 1)) {
525daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                drv_debug_msg(VIDEO_DEBUG_ERROR, "layer_id shoulde be 0 - %d\n",
52694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                              tslayer_param->number_of_layers - 1);
527daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
528daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                break;
52916752f679f82f92454ac160f0457be83e0fa4b77zhangzha            }
53094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        }
53116752f679f82f92454ac160f0457be83e0fa4b77zhangzha
53294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        if (vaStatus == VA_STATUS_ERROR_INVALID_PARAMETER)
53394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            break;
53416752f679f82f92454ac160f0457be83e0fa4b77zhangzha
53594e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        seq->ts_number_layers = tslayer_param->number_of_layers;
53694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        ctx->temporal_layer_number = tslayer_param->number_of_layers;
53794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        seq->ts_periodicity = tslayer_param->periodicity;
538daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
53994e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        for (i = 0; i < seq->ts_periodicity; i++)
54094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            seq->ts_layer_id[i] = tslayer_param->layer_id[i];
541daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
54294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        //set default bitrate and framerate
54394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        if (seq->ts_number_layers == 2) {
54494e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            seq->ts_target_bitrate[0] = seq->rc_target_bitrate * 6 / 10;
54594e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            seq->ts_target_bitrate[1] = seq->rc_target_bitrate ;
54694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            seq->ts_rate_decimator[0] = 2;
54794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            seq->ts_rate_decimator[1] = 1;
54894e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        }
54994e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        if (seq->ts_number_layers == 3) {
55094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            seq->ts_target_bitrate[0] = seq->rc_target_bitrate * 4 / 10;
55194e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            seq->ts_target_bitrate[1] = seq->rc_target_bitrate * 6 / 10;
55294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            seq->ts_target_bitrate[2] = seq->rc_target_bitrate ;
55394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            seq->ts_rate_decimator[0] = 4;
55494e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            seq->ts_rate_decimator[1] = 2;
55594e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            seq->ts_rate_decimator[2] = 1;
55694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        }
55794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha
55894e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        ctx->re_send_seq_params = 1;
55994e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        break;
5604dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    case VAEncMiscParameterTypeFrameRate:
5614dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        frame_rate_param = (VAEncMiscParameterFrameRate *)pBuffer->data;
562fe436fee778fb0470d1d07150a8150eb38232533hding        if (frame_rate_param->framerate > 120) {
563fe436fee778fb0470d1d07150a8150eb38232533hding            drv_debug_msg(VIDEO_DEBUG_ERROR, "%d is invalid."
564fe436fee778fb0470d1d07150a8150eb38232533hding                          "framerate could not be larger than 120\n",
565fe436fee778fb0470d1d07150a8150eb38232533hding                          frame_rate_param->framerate);
566fe436fee778fb0470d1d07150a8150eb38232533hding            frame_rate_param->framerate = 120;
567fe436fee778fb0470d1d07150a8150eb38232533hding        }
568fe436fee778fb0470d1d07150a8150eb38232533hding        if (frame_rate_param->framerate < 1) {
569fe436fee778fb0470d1d07150a8150eb38232533hding            drv_debug_msg(VIDEO_DEBUG_ERROR, "%d is invalid."
570fe436fee778fb0470d1d07150a8150eb38232533hding                          "framerate could not be smaller than 1\n",
571fe436fee778fb0470d1d07150a8150eb38232533hding                          frame_rate_param->framerate);
572fe436fee778fb0470d1d07150a8150eb38232533hding            frame_rate_param->framerate = 1;
5734dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        }
5740cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
5750cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if (ctx->temporal_layer_number == 1) {
5760cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            if (seq->frame_rate != frame_rate_param->framerate) {
5770cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                drv_debug_msg(VIDEO_DEBUG_GENERAL, "frame rate changed from %d to %d\n",
5780cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                              seq->frame_rate,
5790cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                              frame_rate_param->framerate);
580daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                seq->frame_rate = frame_rate_param->framerate;
581daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                ctx->re_send_seq_params = 1;
58294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            }
5830cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        } else {
5840cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            layer_id = frame_rate_param->framerate_flags.bits.temporal_id % 3;
5850cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            if (ctx->frame_rate[layer_id] != frame_rate_param->framerate) {
5860cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                drv_debug_msg(VIDEO_DEBUG_GENERAL, "frame rate of layer %d will be changed from %d to %d\n",
5870cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                              layer_id, ctx->frame_rate[layer_id], frame_rate_param->framerate);
5880cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                ctx->frame_rate[layer_id] = frame_rate_param->framerate;
589daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                if (layer_id == ctx->temporal_layer_number - 1) { //top layer
59094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                    seq->frame_rate = ctx->frame_rate[layer_id];
591daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                }
5920cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                ctx->re_send_seq_params = 1 ;
5930cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            }
594233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        }
5954dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
5964dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    case VAEncMiscParameterTypeRateControl:
5974dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        rate_control_param = (VAEncMiscParameterRateControl *)pBuffer->data;
598fe436fee778fb0470d1d07150a8150eb38232533hding        if (rate_control_param->max_qp > 63 ||
5994dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            rate_control_param->min_qp > 63) {
600fe436fee778fb0470d1d07150a8150eb38232533hding            drv_debug_msg(VIDEO_DEBUG_ERROR, "max_qp(%d) and min_qp(%d) "
6014dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                          "are invalid.\nQP shouldn't be larger than 63 for VP8\n",
602fe436fee778fb0470d1d07150a8150eb38232533hding                          rate_control_param->max_qp, rate_control_param->min_qp);
603fe436fee778fb0470d1d07150a8150eb38232533hding            rate_control_param->max_qp = 63;
604fe436fee778fb0470d1d07150a8150eb38232533hding            rate_control_param->min_qp = rate_control_param->max_qp;
6054dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        }
606233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
607233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        if (rate_control_param->min_qp != seq->rc_min_quantizer) {
6084dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            drv_debug_msg(VIDEO_DEBUG_ERROR, "min_qp was changed from %d to %d\n",
609233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                          seq->rc_min_quantizer, rate_control_param->min_qp);
610233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha            seq->rc_min_quantizer = rate_control_param->min_qp;
6114dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        }
6120cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
613233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        if (rate_control_param->max_qp != seq->rc_max_quantizer) {
614025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo            drv_debug_msg(VIDEO_DEBUG_ERROR, "max_qp was changed from %d to %d\n",
615233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                          seq->rc_max_quantizer, rate_control_param->max_qp);
616233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha            seq->rc_max_quantizer = rate_control_param->max_qp;
617025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo        }
618233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
6190cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        // no initial qp for vp8
620233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha
621233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        if (rate_control_param->target_percentage != seq->rc_undershoot_pct) {
622025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo            drv_debug_msg(VIDEO_DEBUG_ERROR, "rc_undershoot was changed from %d to %d\n",
623233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                          seq->rc_undershoot_pct, rate_control_param->target_percentage);
624233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha            seq->rc_undershoot_pct = rate_control_param->target_percentage;
625025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo        }
626025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo
627fe436fee778fb0470d1d07150a8150eb38232533hding        if (rate_control_param->bits_per_second / 1000 > 20000) {
628fe436fee778fb0470d1d07150a8150eb38232533hding            drv_debug_msg(VIDEO_DEBUG_ERROR, "%d is invalid."
629fe436fee778fb0470d1d07150a8150eb38232533hding                          "bitrate could not be larger than 20000\n",
630fe436fee778fb0470d1d07150a8150eb38232533hding                          rate_control_param->bits_per_second / 1000);
631fe436fee778fb0470d1d07150a8150eb38232533hding            rate_control_param->bits_per_second = 20000000;
632fe436fee778fb0470d1d07150a8150eb38232533hding        }
633fe436fee778fb0470d1d07150a8150eb38232533hding
6340cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        if (ctx->temporal_layer_number == 1) {
63594e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            if (rate_control_param->bits_per_second / 1000 != seq->rc_target_bitrate) {
636233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                drv_debug_msg(VIDEO_DEBUG_ERROR, "bitrate was changed from %dkbps to %dkbps\n",
63794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                              seq->rc_target_bitrate, rate_control_param->bits_per_second / 1000);
6380cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                seq->rc_target_bitrate = rate_control_param->bits_per_second / 1000;
63994e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                seq->ts_target_bitrate[0] = rate_control_param->bits_per_second / 1000;
64094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha
6410cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            }
6420cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        } else {
6430cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            layer_id = rate_control_param->rc_flags.bits.temporal_id % 3;
64494e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            if (rate_control_param->bits_per_second / 1000 != seq->ts_target_bitrate[layer_id]) {
645233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha                drv_debug_msg(VIDEO_DEBUG_ERROR, "bitrate was changed from %dkbps to %dkbps\n",
64694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                              seq->ts_target_bitrate[layer_id], rate_control_param->bits_per_second / 1000);
6470cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo                seq->ts_target_bitrate[layer_id] = rate_control_param->bits_per_second / 1000;
6480cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo            }
6490cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        }
6500cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
6510cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        ctx->re_send_seq_params = 1;
6524dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
6534dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    case VAEncMiscParameterTypeMaxFrameSize:
6544dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        max_frame_size_param = (VAEncMiscParameterBufferMaxFrameSize *)pBuffer->data;
6554dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        if (ctx->max_frame_size == max_frame_size_param->max_frame_size)
6564dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            break;
6570cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
6586e762d8b43b8a9cf3b7111877d9dc9579a9170afSun, Mingruo        drv_debug_msg(VIDEO_DEBUG_ERROR, "max frame size changed from %d to %d\n",
6594dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                      ctx->max_frame_size, max_frame_size_param->max_frame_size);
6604dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        ctx->max_frame_size = max_frame_size_param->max_frame_size ;
6614dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        ctx->re_send_seq_params = 1 ;
6624dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
6634dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    case VAEncMiscParameterTypeAIR:
6644dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        air_param = (VAEncMiscParameterAIR *)pBuffer->data;
6654dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        if (air_param->air_num_mbs > 65535 ||
6664dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            air_param->air_threshold > 65535) {
66794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
66894e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            break;
6694dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        }
6700cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
6714dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        drv_debug_msg(VIDEO_DEBUG_GENERAL, "air slice size changed to num_air_mbs %d "
6724dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                      "air_threshold %d, air_auto %d\n",
6734dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                      air_param->air_num_mbs, air_param->air_threshold,
6744dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha                      air_param->air_auto);
675233384d7e88c1295775705f074fbe3fd2e57ff35zhangzha        seq->cyclic_intra_refresh = air_param->air_threshold;
6764dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
677025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo    case VAEncMiscParameterTypeHRD:
6780cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        hrd_param = (VAEncMiscParameterHRD *)pBuffer->data;
6790cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->rc_buf_sz = hrd_param->buffer_size;
6800cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->rc_buf_initial_sz = hrd_param->initial_buffer_fullness;
6810cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        seq->rc_buf_optimal_sz = hrd_param->optimal_buffer_fullness;
6820cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        ctx->re_send_seq_params = 1;
6830cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        break;
684025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo    case VAEncMiscParameterTypeQualityLevel:
6850cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo        break;
6860cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
6874dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    default:
6884dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        vaStatus = VA_STATUS_ERROR_UNKNOWN;
6894dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        DEBUG_FAILURE;
6904dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        break;
6914dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    }
6920cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
6934dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    free(obj_buffer->buffer_data);
6944dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    obj_buffer->buffer_data = NULL;
6950cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
6964dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    return vaStatus;
6974dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha}
698ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_RenderPicture(
699ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context,
700ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_buffer_p *buffers,
701ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int num_buffers)
702ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
703ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
704ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int i;
705ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    psb_driver_data_p driver_data = obj_context->driver_data;
706ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
707ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VASurfaceID surface_id;
708ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
709ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
7100cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    for (i = 0; i < num_buffers; i++) {
711ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
712ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        object_buffer_p obj_buffer = buffers[i];
713ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        switch (obj_buffer->type) {
714ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        case VAEncSequenceParameterBufferType:
7151e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo            vaStatus = vsp_vp8_process_seqence_param(driver_data, ctx, obj_buffer);
716ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            break;
717ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        case VAEncPictureParameterBufferType:
718ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            surface_id = obj_context->current_render_surface_id;
71994e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            vaStatus = vsp_vp8_process_picture_param(driver_data, ctx, obj_buffer, surface_id);
720ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            break;
7214dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        case VAEncMiscParameterBufferType:
7224dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            vaStatus = vsp_vp8_process_misc_param(ctx, obj_buffer);
7234dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha            break;
724ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        default:
725ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            vaStatus = VA_STATUS_SUCCESS;//VA_STATUS_ERROR_UNKNOWN;
726ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            DEBUG_FAILURE;
727ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        }
7280cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
729ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        if (vaStatus != VA_STATUS_SUCCESS) {
730ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            break;
731ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        }
732ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
733ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
734ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return vaStatus;
735ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
736ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
737ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_BeginPicture(
738ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context)
739ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
740ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    int ret;
741ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    VAStatus vaStatus = VA_STATUS_SUCCESS;
742ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
743ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf;
744ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
745ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* Initialise the command buffer */
746ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    ret = vsp_context_get_next_cmdbuf(ctx->obj_context);
747ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (ret) {
748ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        drv_debug_msg(VIDEO_DEBUG_GENERAL, "get next cmdbuf fail\n");
74994e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        vaStatus = VA_STATUS_ERROR_UNKNOWN;
75094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        return vaStatus;
75194e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    }
752ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
753ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    cmdbuf = obj_context->vsp_cmdbuf;
754ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
7550cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo    if (ctx->obj_context->frame_count == 0) { /* first picture */
7568672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo        vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VP8_ID, ctx->context_buf, Vss_Sys_STATE_BUF_COMMAND,
757ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                                  0, VSP_VP8ENC_STATE_SIZE);
758ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
759ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
760ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    /* map param mem */
761ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vaStatus = psb_buffer_map(&cmdbuf->param_mem, &cmdbuf->param_mem_p);
762ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (vaStatus) {
763ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        return vaStatus;
764ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    }
765ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
766ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    cmdbuf->pic_param_p = cmdbuf->param_mem_p;
767ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    cmdbuf->seq_param_p = cmdbuf->param_mem_p + ctx->seq_param_offset;
76820b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo    cmdbuf->ref_param_p = cmdbuf->param_mem_p + ctx->ref_param_offset;
7694dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    ctx->vp8_seq_cmd_send = 0;
7704dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    ctx->re_send_seq_params = 0;
7710cb595fd6d4185c319a05ef6ba67c46349db10d9Sun, Mingruo
772ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return VA_STATUS_SUCCESS;
773ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
774ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
775daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruostatic inline void  dump_vssporcPicture(struct VssProcPictureVP8 * frame)
776daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo{
77794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    drv_debug_msg(VIDEO_ENCODE_DEBUG, "surface_id 0x%08x\n", frame->surface_id);
77894e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    drv_debug_msg(VIDEO_ENCODE_DEBUG, "irq %d\n", frame->irq);
77994e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    drv_debug_msg(VIDEO_ENCODE_DEBUG, "base 0x%08x\n", frame->base);
78094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    drv_debug_msg(VIDEO_ENCODE_DEBUG, "base_uv 0x%08x\n", frame->base_uv);
78194e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    drv_debug_msg(VIDEO_ENCODE_DEBUG, "height %d\n", frame->height);
78294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    drv_debug_msg(VIDEO_ENCODE_DEBUG, "width %d\n", frame->width);
78394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    drv_debug_msg(VIDEO_ENCODE_DEBUG, "stride %d\n", frame->stride);
78494e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    drv_debug_msg(VIDEO_ENCODE_DEBUG, "format %d\n", frame->format);
785daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo}
786daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
787daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruostatic void vsp_vp8_dump_commands(vsp_cmdbuf_p cmdbuf)
788daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo{
789daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    unsigned int i, cmd_idx;
790daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    unsigned int cmdbuffer_size = (unsigned char *)cmdbuf->cmd_idx - cmdbuf->cmd_start; /* In bytes */
791daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    unsigned int cmd_number = cmdbuffer_size / sizeof(struct vss_command_t);
792daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    struct vss_command_t *cmd = (struct vss_command_t *)cmdbuf->cmd_start;
793daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    struct VssVp8encPictureParameterBuffer *pic =
79494e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        (struct VssVp8encPictureParameterBuffer *)cmdbuf->pic_param_p;
795daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    struct VssVp8encSequenceParameterBuffer *seq =
79694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        (struct VssVp8encSequenceParameterBuffer *)cmdbuf->seq_param_p;
797daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
798daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    for (cmd_idx = 0; cmd_idx < cmd_number; cmd_idx++) {
799daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo        drv_debug_msg(VIDEO_ENCODE_DEBUG, "\n============command start============\ncontext %d\ntype%d\n",
80094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                      cmd[cmd_idx].context, cmd[cmd_idx].type);
80194e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        if (cmd[cmd_idx].type == VssVp8encEncodeFrameCommand) {
80294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            drv_debug_msg(VIDEO_ENCODE_DEBUG, "input frame\n");
80394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            dump_vssporcPicture(&pic->input_frame);
804daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
80594e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            drv_debug_msg(VIDEO_ENCODE_DEBUG, "recon frame\n");
80694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            dump_vssporcPicture(&pic->recon_frame);
807daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
808daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "version %d\n", pic->version);
809daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "pic_flags 0x%08x\n", pic->pic_flags);
810daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "prev_frame_dropped %d\n", pic->prev_frame_dropped);
811daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "cpuused %d\n", pic->cpuused);
812daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "sharpness %d\n", pic->sharpness);
813daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "num_token_partitions %d\n", pic->num_token_partitions);
814daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "encoded_frame_size %d\n", pic->encoded_frame_size);
815daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "encoded_frame_base 0x%08x\n", pic->encoded_frame_base);
816daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo        }
817daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
818daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo        if (cmd[cmd_idx].type == VssVp8encSetSequenceParametersCommand) {
819daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "frame_width %d\n", seq->frame_width);
820daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "frame_height %d\n", seq->frame_height);
821daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "frame_rate %d\n", seq->frame_rate);
822daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "error_resilient %d\n", seq->error_resilient);
823daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "num_token_partitions %d\n", seq->num_token_partitions);
824daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "kf_mode %d\n", seq->kf_mode);
825daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "kf_min_dist %d\n", seq->kf_min_dist);
826daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "kf_max_dist %d\n", seq->kf_max_dist);
827daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_target_bitrate %d\n", seq->rc_target_bitrate);
828daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_min_quantizer %d\n", seq->rc_min_quantizer);
829daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_max_quantizer %d\n", seq->rc_max_quantizer);
830daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_undershoot_pct %d\n", seq->rc_undershoot_pct);
831daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_overshoot_pct %d\n", seq->rc_overshoot_pct);
832daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_end_usage %d\n", seq->rc_end_usage);
833daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_buf_sz %d\n", seq->rc_buf_sz);
834daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_buf_initial_sz %d\n", seq->rc_buf_initial_sz);
835daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "rc_buf_optimal_sz %d\n", seq->rc_buf_optimal_sz);
836daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "max_intra_rate %d\n", seq->max_intra_rate);
837daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "cyclic_intra_refresh %d\n", seq->cyclic_intra_refresh);
838daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "concatenate_partitions %d\n", seq->concatenate_partitions);
839daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "recon_buffer_mode %d\n", seq->recon_buffer_mode);
840daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            drv_debug_msg(VIDEO_ENCODE_DEBUG, "ts_number_layers %d\n", seq->ts_number_layers);
841daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
842daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            for (i = 0; i < 3; i++)
843daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                drv_debug_msg(VIDEO_ENCODE_DEBUG, "ts_target_bitrate[%d] %d\n", i, seq->ts_target_bitrate[i]);
844daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
845daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo            for (i = 0; i < 3; i++)
846daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo                drv_debug_msg(VIDEO_ENCODE_DEBUG, "ts_rate_decimator[%d] %d\n", i, seq->ts_rate_decimator[i]);
84794e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            drv_debug_msg(VIDEO_ENCODE_DEBUG, "ts_periodicity %d\n", seq->ts_periodicity);
848daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
84994e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            for (i = 0; i < seq->ts_periodicity; i++)
85094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                drv_debug_msg(VIDEO_ENCODE_DEBUG, "ts_layer_id[%d] %d\n", i, seq->ts_layer_id[i]);
851daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
85294e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            for (i = 0; i < 4; i++) {
85394e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                drv_debug_msg(VIDEO_ENCODE_DEBUG, "ref_frame_buffer %d\n", i);
85494e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha                dump_vssporcPicture(&seq->ref_frame_buffers[i]);
85594e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha            }
85694e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha        }
857daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
858daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo        drv_debug_msg(VIDEO_ENCODE_DEBUG, "============command end============\n");
859daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    }
860daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo}
861daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
862daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
863ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostatic VAStatus vsp_VP8_EndPicture(
864ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    object_context_p obj_context)
865ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo{
866ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    INIT_CONTEXT_VPP;
867ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    psb_driver_data_p driver_data = obj_context->driver_data;
868ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_cmdbuf_p cmdbuf = obj_context->vsp_cmdbuf;
869ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
87094e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    if (ctx->re_send_seq_params) {
8714dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha        vsp_vp8_process_dynamic_seqence_param(ctx);
8724dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha    }
8734dadd5529a552fd10d5f270b8423bee758c42fc5zhangzha
874daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    drv_debug_msg(VIDEO_ENCODE_DEBUG, "ctx->obj_context->frame_count=%d\n", ctx->obj_context->frame_count + 1);
875daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo    vsp_vp8_dump_commands(cmdbuf);
876daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo
877ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    if (cmdbuf->param_mem_p != NULL) {
878ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        psb_buffer_unmap(&cmdbuf->param_mem);
879ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->param_mem_p = NULL;
880ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->pic_param_p = NULL;
881ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->end_param_p = NULL;
882ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->pipeline_param_p = NULL;
883ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->denoise_param_p = NULL;
884ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->enhancer_param_p = NULL;
885ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->sharpen_param_p = NULL;
886ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo        cmdbuf->frc_param_p = NULL;
88720b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo        cmdbuf->ref_param_p = NULL;
88894e440a7f8f0938610d62f01fa49f9d7c4e3feeczhangzha    }
889ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
8908f868258b5396c3d39dd33f2d05a829ff855aa0dSun, Mingruo    if (vsp_context_flush_cmdbuf(ctx->obj_context)) {
891daf2d4ff530a3c8ad9f789d5cceeccaf63825965Sun, Mingruo        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VP8: flush deblock cmdbuf error\n");
8926e762d8b43b8a9cf3b7111877d9dc9579a9170afSun, Mingruo        return VA_STATUS_ERROR_UNKNOWN;
8938f868258b5396c3d39dd33f2d05a829ff855aa0dSun, Mingruo    }
894ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
895ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    return VA_STATUS_SUCCESS;
896ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo}
897ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
898ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruostruct format_vtable_s vsp_VP8_vtable = {
899ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruoqueryConfigAttributes:
900ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_QueryConfigAttributes,
901ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruovalidateConfig:
902ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_ValidateConfig,
903ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruocreateContext:
904ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_CreateContext,
905ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruodestroyContext:
906ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_DestroyContext,
907ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruobeginPicture:
908ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_BeginPicture,
909ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruorenderPicture:
910ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_RenderPicture,
911ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, MingruoendPicture:
912ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo    vsp_VP8_EndPicture
913ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo};
914