1437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK 4437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * 5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a 6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the 7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including 8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish, 9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to 10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to 11f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions: 123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * 13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the 14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions 15f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software. 163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * 17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * 25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors: 26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Elaine Wang <elaine.wang@intel.com> 27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Zeng Li <zeng.li@intel.com> 28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * 29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */ 30437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 31437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_def.h" 32437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_surface.h" 33437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_cmdbuf.h" 34437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_H263ES.h" 35437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_hostcode.h" 36437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_hostheader.h" 37c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h" 38437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 39437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdlib.h> 40437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdint.h> 41437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <string.h> 42437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 43437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 44437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define TOPAZ_H263_MAX_BITRATE 16000000 45437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 46437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define INIT_CONTEXT_H263ES context_ENC_p ctx = (context_ENC_p) (obj_context->format_data) 47437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id )) 48437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define BUFFER(id) ((object_buffer_p) object_heap_lookup( &ctx->obj_context->driver_data->buffer_heap, id )) 49437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 50437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 51437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void pnw_H263ES_QueryConfigAttributes( 52cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VAProfile __maybe_unused profile, 53cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VAEntrypoint __maybe_unused entrypoint, 54437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAConfigAttrib *attrib_list, 55dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int num_attribs) 56437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 57437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int i; 58c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263ES_QueryConfigAttributes\n"); 59437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 60437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* RateControl attributes */ 61437b3eda28a4bf098efa80598cab67f190275266Fei Jiang for (i = 0; i < num_attribs; i++) { 62437b3eda28a4bf098efa80598cab67f190275266Fei Jiang switch (attrib_list[i].type) { 63437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAConfigAttribRTFormat: 64437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 65437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 66437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAConfigAttribRateControl: 67437b3eda28a4bf098efa80598cab67f190275266Fei Jiang attrib_list[i].value = VA_RC_NONE | VA_RC_CBR | VA_RC_VBR; 68437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 69437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 70437b3eda28a4bf098efa80598cab67f190275266Fei Jiang default: 71437b3eda28a4bf098efa80598cab67f190275266Fei Jiang attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED; 72437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 73437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 74437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 75437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 76437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 77437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 78437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 79437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_H263ES_ValidateConfig( 80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_config_p obj_config) 81437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 82242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang int i; 83242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang /* Check all attributes */ 84242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang for (i = 0; i < obj_config->attrib_count; i++) { 853f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang switch (obj_config->attrib_list[i].type) { 863f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang case VAConfigAttribRTFormat: 873f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang /* Ignore */ 883f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang break; 893f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang case VAConfigAttribRateControl: 903f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang break; 913f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang default: 923f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED; 933f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang } 943f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang } 95242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang 96242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang return VA_STATUS_SUCCESS; 97437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 98437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 99437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 100437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_H263ES_CreateContext( 101437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context, 102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_config_p obj_config) 103437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 104437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 105437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int eRCmode; 106437b3eda28a4bf098efa80598cab67f190275266Fei Jiang context_ENC_p ctx; 107437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int i; 108437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 109c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263ES_CreateContext\n"); 110437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 111437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw_CreateContext(obj_context, obj_config, 0);/* alloc context_ENC_s and BO */ 112437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS != vaStatus) 114437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 115437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 116437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx = (context_ENC_p) obj_context->format_data; 117437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < obj_config->attrib_count; i++) { 119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_config->attrib_list[i].type == VAConfigAttribRateControl) 120437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 121437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 122437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (i >= obj_config->attrib_count) 124437b3eda28a4bf098efa80598cab67f190275266Fei Jiang eRCmode = VA_RC_NONE; 125437b3eda28a4bf098efa80598cab67f190275266Fei Jiang else 126437b3eda28a4bf098efa80598cab67f190275266Fei Jiang eRCmode = obj_config->attrib_list[i].value; 127437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 128437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (eRCmode == VA_RC_VBR) { 130437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->eCodec = IMG_CODEC_H263_VBR; 131437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.RCEnable = IMG_TRUE; 132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (eRCmode == VA_RC_CBR) { 133437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->eCodec = IMG_CODEC_H263_CBR; 134437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.RCEnable = IMG_TRUE; 135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (eRCmode == VA_RC_NONE) { 136437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->eCodec = IMG_CODEC_H263_NO_RC; 137437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.RCEnable = IMG_FALSE; 138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 139437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT; 140437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->eFormat = IMG_CODEC_PL12; 141437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 142437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->Slices = ctx->Height / 16; 143437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->ParallelCores = 1; /* H263 encode use only one core from DDKv186 */ 144437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 145437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->IPEControl = pnw__get_ipe_control(ctx->eCodec); 146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 147437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 148437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 149437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 150437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 151437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 152437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 153437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void pnw_H263ES_DestroyContext( 154437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context) 155437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 156437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 157c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263ES_DestroyContext\n"); 158437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 159437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_DestroyContext(obj_context); 160437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 161437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 162437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_H263ES_BeginPicture( 163437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context) 164437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 165437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 166437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 167437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_CONTEXT_H263ES; 168437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 169c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263ES_BeginPicture\n"); 170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 171437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw_BeginPicture(ctx); 172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 173437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 174437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 175437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 176437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 177437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__H263ES_process_sequence_param(context_ENC_p ctx, object_buffer_p obj_buffer) 178437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 179437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* 180437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * process rate control parameters 181437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 182437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAEncSequenceParameterBufferH263 *pSequenceParams; 183437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int i; 184176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding unsigned int frame_size; 185437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 186437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(obj_buffer->type == VAEncSequenceParameterBufferType); 187437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(obj_buffer->num_elements == 1); 188437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(obj_buffer->size == sizeof(VAEncSequenceParameterBufferH263)); 189f31d5416a60f83e184b0906a7ec77ba021840531hding //initialize the frame_rate and qp 190f31d5416a60f83e184b0906a7ec77ba021840531hding ctx->sRCParams.InitialQp = 15; 191f31d5416a60f83e184b0906a7ec77ba021840531hding ctx->sRCParams.MinQP = 1; 192f31d5416a60f83e184b0906a7ec77ba021840531hding ctx->sRCParams.FrameRate = 30; 193437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 194437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if ((obj_buffer->num_elements != 1) || 195bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (obj_buffer->size != sizeof(VAEncSequenceParameterBufferH263))) { 196437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_ERROR_UNKNOWN; 197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 199437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pSequenceParams = (VAEncSequenceParameterBufferH263 *) obj_buffer->buffer_data; 200437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 201437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->size = 0; 202437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pSequenceParams->bits_per_second > TOPAZ_H263_MAX_BITRATE) { 204dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BitsPerSecond = TOPAZ_H263_MAX_BITRATE; 205c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, " bits_per_second(%d) exceeds \ 206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun the maximum bitrate, set it with %d\n", 207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pSequenceParams->bits_per_second, 208dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun TOPAZ_H263_MAX_BITRATE); 209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BitsPerSecond = pSequenceParams->bits_per_second; 211437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 212e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying ctx->sRCParams.FrameRate = (pSequenceParams->frame_rate < 1) ? 1 : 213e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying ((65535 < pSequenceParams->frame_rate) ? 65535 : pSequenceParams->frame_rate); 214437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.InitialQp = pSequenceParams->initial_qp; 215437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.MinQP = pSequenceParams->min_qp; 216437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.BUSize = 0; /* default 0, and will be set in pnw__setup_busize */ 217437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 218786232ae58944b036adf11e551edfc8dd092af03Elaine Wang ctx->sRCParams.BufferSize = ctx->sRCParams.BitsPerSecond; 219176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding frame_size = ctx->sRCParams.BitsPerSecond / ctx->sRCParams.FrameRate; 220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_UINT16 MBRows = 0; 222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if(ctx->Height <= 400) 223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MBRows = 1; 224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (ctx->Height < 800) 225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MBRows = 2; 226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 227437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.Slices = ctx->Slices; 228437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.QCPOffset = 0;/* FIXME */ 2295cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang if (ctx->sRCParams.IntraFreq != pSequenceParams->intra_period 2305cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang && ctx->raw_frame_count != 0 2315cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang && ctx->sRCParams.IntraFreq != 0 2325cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang && ((ctx->obj_context->frame_count + 1) % ctx->sRCParams.IntraFreq) != 0 2335cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang && (!ctx->sRCParams.bDisableFrameSkipping)) { 2345cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang drv_debug_msg(VIDEO_DEBUG_ERROR, 2355cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang "Changing intra period value in the middle of a GOP is\n" 2365cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang "not allowed if frame skip isn't disabled.\n" 2375cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang "it can cause I frame been skipped\n"); 2385cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang return VA_STATUS_ERROR_INVALID_PARAMETER; 2395cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang } 2405cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang else 2415cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang ctx->sRCParams.IntraFreq = pSequenceParams->intra_period; 2425cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang 243437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.InitialLevel = (3 * ctx->sRCParams.BufferSize) >> 4; 244176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding /* Aligned with target frame size */ 245176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.InitialLevel += (frame_size / 2); 246176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.InitialLevel /= frame_size; 247176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.InitialLevel *= frame_size; 248176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.InitialDelay = ctx->sRCParams.BufferSize - ctx->sRCParams.InitialLevel; 249176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->buffer_size = ctx->sRCParams.BufferSize; 250437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 2512befccec034c13d34746a9e87149889d59ac767bFei Jiang /*if (ctx->sRCParams.BitsPerSecond < 256000) 252437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.BufferSize = (9 * ctx->sRCParams.BitsPerSecond) >> 1; 253437b3eda28a4bf098efa80598cab67f190275266Fei Jiang else 254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BufferSize = (5 * ctx->sRCParams.BitsPerSecond) >> 1;*/ 255437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 256176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding if (ctx->raw_frame_count == 0) { /* Add Register IO behind begin Picture */ 257176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding for (i = (ctx->ParallelCores - 1); i >= 0; i--) 258dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_set_bias(ctx, i); 259437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 260437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 261437b3eda28a4bf098efa80598cab67f190275266Fei Jiang free(pSequenceParams); 262437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_SUCCESS; 263437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 264437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 265437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 266437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* Work done by the followinig funcs in testbench should be done here. 267437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * IMG_C_StartPicture() 268437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * IMG_C_InsertSync() 269437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * APP_H263_SendPictureHeader() 270437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Frame skip must be taken into consideration 271437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * */ 272437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__H263ES_process_picture_param(context_ENC_p ctx, object_buffer_p obj_buffer) 273437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 274437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 275437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAEncPictureParameterBufferH263 *pBuffer; 276437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_p cmdbuf = ctx->obj_context->pnw_cmdbuf; 277437b3eda28a4bf098efa80598cab67f190275266Fei Jiang H263_SOURCE_FORMAT_TYPE SourceFormatType; 278437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int i; 279437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 280437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(obj_buffer->type == VAEncPictureParameterBufferType); 281437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 282437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if ((obj_buffer->num_elements != 1) || 283bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (obj_buffer->size != sizeof(VAEncPictureParameterBufferH263))) { 284437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_ERROR_UNKNOWN; 285437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 286437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 287437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Transfer ownership of VAEncPictureParameterBufferH263 data */ 288437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pBuffer = (VAEncPictureParameterBufferH263 *) obj_buffer->buffer_data; 289437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 290437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->size = 0; 291437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 292437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->ref_surface = SURFACE(pBuffer->reference_picture); 293437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->dest_surface = SURFACE(pBuffer->reconstructed_picture); 294437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->coded_buf = BUFFER(pBuffer->coded_buf); 295437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 29688c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang ctx->RawWidth = pBuffer->picture_width; 29788c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang ctx->RawHeight = pBuffer->picture_height; 298437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 299437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Insert do_header command here */ 300437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((ctx->Width == 128) && (ctx->Height == 96)) 302437b3eda28a4bf098efa80598cab67f190275266Fei Jiang SourceFormatType = _128x96_SubQCIF; 303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if ((ctx->Width == 176) && (ctx->Height == 144)) 304437b3eda28a4bf098efa80598cab67f190275266Fei Jiang SourceFormatType = _176x144_QCIF; 305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if ((ctx->Width == 352) && (ctx->Height == 288)) 306437b3eda28a4bf098efa80598cab67f190275266Fei Jiang SourceFormatType = _352x288_CIF; 307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if ((ctx->Width == 704) && (ctx->Height == 576)) 308437b3eda28a4bf098efa80598cab67f190275266Fei Jiang SourceFormatType = _704x576_4CIF; 309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if ((ctx->Width <= 720) && (ctx->Height <= 576)) 310437b3eda28a4bf098efa80598cab67f190275266Fei Jiang SourceFormatType = 7; 311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else { 312c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Unsupported resolution!\n"); 313437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED; 314437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 315437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 316e968fbfc452194dd51c12901ffa338c312a5e3c7Fei Jiang memset(cmdbuf->header_mem_p + ctx->pic_header_ofs, 317dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, 318dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HEADER_SIZE); 319437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw__H263_prepare_picture_header(cmdbuf->header_mem_p + ctx->pic_header_ofs, 320437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->obj_context->frame_count, 321437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pBuffer->picture_type, 322437b3eda28a4bf098efa80598cab67f190275266Fei Jiang SourceFormatType, 323437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.FrameRate, 32488c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang ctx->RawWidth, 32588c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang ctx->RawHeight); 326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 327437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_insert_command_package(ctx->obj_context, 328437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->ParallelCores - 1, /* Send to the last core as this will complete first */ 329437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MTX_CMDID_DO_HEADER, 330437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &cmdbuf->header_mem, 331437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->pic_header_ofs); 332437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 333437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 334437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Prepare START_PICTURE params */ 335437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Actually H263 only use 1 core from DDKv186 */ 336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = (ctx->ParallelCores - 1); i >= 0; i--) 337437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw_RenderPictureParameter(ctx, i); 338437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 339437b3eda28a4bf098efa80598cab67f190275266Fei Jiang free(pBuffer); 340437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 341437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 342437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 343437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 344437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__H263ES_process_slice_param(context_ENC_p ctx, object_buffer_p obj_buffer) 345437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 346437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Prepare InParams for macros of current slice, insert slice header, insert do slice command */ 347437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAEncSliceParameterBuffer *pBuffer; 348dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_cmdbuf_p cmdbuf = ctx->obj_context->pnw_cmdbuf; 349437b3eda28a4bf098efa80598cab67f190275266Fei Jiang PIC_PARAMS *psPicParams = (PIC_PARAMS *)(cmdbuf->pic_params_p); 350e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned int i; 3514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int slice_param_idx; 352437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 353437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(obj_buffer->type == VAEncSliceParameterBufferType); 354dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 355437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Transfer ownership of VAEncPictureParameterBufferH263 data */ 356437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pBuffer = (VAEncSliceParameterBuffer *) obj_buffer->buffer_data; 357437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->size = 0; 358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /*In case the slice number changes*/ 360dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((ctx->slice_param_cache != NULL) && (obj_buffer->num_elements != ctx->slice_param_num)) { 361c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Slice number changes. Previous value is %d. Now it's %d\n", 362dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num, obj_buffer->num_elements); 363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(ctx->slice_param_cache); 364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_cache = NULL; 365dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num = 0; 366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 367dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 368dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == ctx->slice_param_cache) { 369dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num = obj_buffer->num_elements; 370c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate %d VAEncSliceParameterBuffer cache buffers\n", 2 * ctx->slice_param_num); 371dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_cache = calloc(2 * ctx->slice_param_num, sizeof(VAEncSliceParameterBuffer)); 372dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == ctx->slice_param_cache) { 373c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Run out of memory!\n"); 374dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(obj_buffer->buffer_data); 375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_ALLOCATION_FAILED; 376dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 3774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 3784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 379dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < obj_buffer->num_elements; i++) { 380437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /*Todo list: 381437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *1.Insert Do header command 382437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *2.setup InRowParams 383437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *3.setup Slice params 384437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *4.Insert Do slice command 385437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * */ 386437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned char deblock_idc; 387437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 388437b3eda28a4bf098efa80598cab67f190275266Fei Jiang deblock_idc = pBuffer->slice_flags.bits.disable_deblocking_filter_idc; 389437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 390437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Insert Do Header command, relocation is needed */ 391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ctx->obj_context->slice_count) { /*First slice of a frame need not slice header*/ 392dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memset(cmdbuf->header_mem_p + ctx->slice_header_ofs 393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + ctx->obj_context->slice_count * HEADER_SIZE, 394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, 395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HEADER_SIZE); 396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw__H263_prepare_GOBslice_header( 398e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang cmdbuf->header_mem_p + ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE, 399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->obj_context->slice_count, 400dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->obj_context->frame_count); 401e968fbfc452194dd51c12901ffa338c312a5e3c7Fei Jiang 402437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->LastSliceNum[ctx->SliceToCore] = ctx->obj_context->slice_count; 403437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 404437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_insert_command_package(ctx->obj_context, 405437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->SliceToCore, 406437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MTX_CMDID_DO_HEADER, 407437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &cmdbuf->header_mem, 408437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE); 409437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (0 == ctx->SliceToCore) { 411437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->SliceToCore = ctx->ParallelCores; 412437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 413437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->SliceToCore--; 414437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 415437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((pBuffer->start_row_number == 0) && pBuffer->slice_flags.bits.is_intra) { 418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_reset_encoder_params(ctx); /* originally do in BeginPicture, but beginpicture has no intra info */ 419437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->BelowParamsBufIdx = (ctx->BelowParamsBufIdx + 1) & 0x1; 420437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 421437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 422dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun slice_param_idx = (pBuffer->slice_flags.bits.is_intra ? 0 : 1) * ctx->slice_param_num + i; 423dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VAEncSliceParameter_Equal(&ctx->slice_param_cache[slice_param_idx], pBuffer) == 0) { 424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* cache current param parameters */ 425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(&ctx->slice_param_cache[slice_param_idx], 426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer, sizeof(VAEncSliceParameterBuffer)); 427dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Setup InParams value*/ 429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_setup_slice_params(ctx, 430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->start_row_number * 16, 431bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang pBuffer->slice_height * 16, 432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->slice_flags.bits.is_intra, 433dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->obj_context->frame_count > 0, 434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psPicParams->sInParams.SeInitQP); 435dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 437dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Insert do slice command and setup related buffer value */ 438437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw__send_encode_slice_params(ctx, 439437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pBuffer->slice_flags.bits.is_intra, 440437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pBuffer->start_row_number * 16, 441437b3eda28a4bf098efa80598cab67f190275266Fei Jiang deblock_idc, 442437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->obj_context->frame_count, 443bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang pBuffer->slice_height * 16, 444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->obj_context->slice_count); 445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 446c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Now frame_count/slice_count is %d/%d\n", 447437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->obj_context->frame_count, ctx->obj_context->slice_count); 448437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 449437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->obj_context->slice_count++; 450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer++; /*Move to the next buffer*/ 451437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 452437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(ctx->obj_context->slice_count < MAX_SLICES_PER_PICTURE); 453437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 454437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(obj_buffer->buffer_data); 456437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 457437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_SUCCESS; 458437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 459437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 460437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 461437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 462437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_H263ES_RenderPicture( 463437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context, 464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_buffer_p *buffers, 465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int num_buffers) 466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int i; 468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_CONTEXT_H263ES; 469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 471c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263ES_RenderPicture\n"); 472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < num_buffers; i++) { 474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_buffer_p obj_buffer = buffers[i]; 475437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (obj_buffer->type) { 477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAEncSequenceParameterBufferType: 478c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263_RenderPicture got VAEncSequenceParameterBufferType\n"); 479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw__H263ES_process_sequence_param(ctx, obj_buffer); 480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 482437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAEncPictureParameterBufferType: 484c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263_RenderPicture got VAEncPictureParameterBuffer\n"); 485437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw__H263ES_process_picture_param(ctx, obj_buffer); 486437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 487437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 488437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 489437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAEncSliceParameterBufferType: 490c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263_RenderPicture got VAEncSliceParameterBufferType\n"); 491437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw__H263ES_process_slice_param(ctx, obj_buffer); 492437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 493437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 495437b3eda28a4bf098efa80598cab67f190275266Fei Jiang default: 496437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = VA_STATUS_ERROR_UNKNOWN; 497437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 498437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 499dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (vaStatus != VA_STATUS_SUCCESS) { 500437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 501437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 502437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 503437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 504437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 505437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 506437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 507437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 508437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_H263ES_EndPicture( 509437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context) 510437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 511437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 512437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_CONTEXT_H263ES; 513437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 514c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263ES_EndPicture\n"); 515437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 516437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw_EndPicture(ctx); 517437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 518437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 519437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 520437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 521437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 522437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstruct format_vtable_s pnw_H263ES_vtable = { 523dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunqueryConfigAttributes: 524dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_H263ES_QueryConfigAttributes, 525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvalidateConfig: 526dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_H263ES_ValidateConfig, 527dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuncreateContext: 528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_H263ES_CreateContext, 529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkundestroyContext: 530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_H263ES_DestroyContext, 531dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunbeginPicture: 532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_H263ES_BeginPicture, 533dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunrenderPicture: 534dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_H263ES_RenderPicture, 535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunendPicture: 536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_H263ES_EndPicture 537437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}; 538