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