pnw_H263ES.c revision 176e0a50d1dc1d3cc1ea7fc456007a1816fee7fc
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( 52437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAProfile profile, 53437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAEntrypoint 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 218176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding frame_size = ctx->sRCParams.BitsPerSecond / ctx->sRCParams.FrameRate; 219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_UINT16 MBRows = 0; 221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if(ctx->Height <= 400) 222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MBRows = 1; 223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (ctx->Height < 800) 224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MBRows = 2; 225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 226437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.Slices = ctx->Slices; 227437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.QCPOffset = 0;/* FIXME */ 228437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.IntraFreq = pSequenceParams->intra_period; 229437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.InitialLevel = (3 * ctx->sRCParams.BufferSize) >> 4; 230176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding /* Aligned with target frame size */ 231176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.InitialLevel += (frame_size / 2); 232176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.InitialLevel /= frame_size; 233176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.InitialLevel *= frame_size; 234176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.InitialDelay = ctx->sRCParams.BufferSize - ctx->sRCParams.InitialLevel; 235176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->buffer_size = ctx->sRCParams.BufferSize; 236437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 2372befccec034c13d34746a9e87149889d59ac767bFei Jiang /*if (ctx->sRCParams.BitsPerSecond < 256000) 238437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.BufferSize = (9 * ctx->sRCParams.BitsPerSecond) >> 1; 239437b3eda28a4bf098efa80598cab67f190275266Fei Jiang else 240dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BufferSize = (5 * ctx->sRCParams.BitsPerSecond) >> 1;*/ 241437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 2422befccec034c13d34746a9e87149889d59ac767bFei Jiang ctx->sRCParams.BufferSize = ctx->sRCParams.BitsPerSecond; 243176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding if (ctx->raw_frame_count == 0) { /* Add Register IO behind begin Picture */ 244176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding for (i = (ctx->ParallelCores - 1); i >= 0; i--) 245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_set_bias(ctx, i); 246437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 247437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 248437b3eda28a4bf098efa80598cab67f190275266Fei Jiang free(pSequenceParams); 249437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_SUCCESS; 250437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 251437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 252437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 253437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* Work done by the followinig funcs in testbench should be done here. 254437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * IMG_C_StartPicture() 255437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * IMG_C_InsertSync() 256437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * APP_H263_SendPictureHeader() 257437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Frame skip must be taken into consideration 258437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * */ 259437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__H263ES_process_picture_param(context_ENC_p ctx, object_buffer_p obj_buffer) 260437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 261437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 262437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAEncPictureParameterBufferH263 *pBuffer; 263437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_p cmdbuf = ctx->obj_context->pnw_cmdbuf; 264437b3eda28a4bf098efa80598cab67f190275266Fei Jiang H263_SOURCE_FORMAT_TYPE SourceFormatType; 265437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int i; 266437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 267437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(obj_buffer->type == VAEncPictureParameterBufferType); 268437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 269437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if ((obj_buffer->num_elements != 1) || 270bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (obj_buffer->size != sizeof(VAEncPictureParameterBufferH263))) { 271437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_ERROR_UNKNOWN; 272437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 273437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 274437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Transfer ownership of VAEncPictureParameterBufferH263 data */ 275437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pBuffer = (VAEncPictureParameterBufferH263 *) obj_buffer->buffer_data; 276437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 277437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->size = 0; 278437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 279437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->ref_surface = SURFACE(pBuffer->reference_picture); 280437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->dest_surface = SURFACE(pBuffer->reconstructed_picture); 281437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->coded_buf = BUFFER(pBuffer->coded_buf); 282437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 28388c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang ctx->RawWidth = pBuffer->picture_width; 28488c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang ctx->RawHeight = pBuffer->picture_height; 285437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 286437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Insert do_header command here */ 287437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((ctx->Width == 128) && (ctx->Height == 96)) 289437b3eda28a4bf098efa80598cab67f190275266Fei Jiang SourceFormatType = _128x96_SubQCIF; 290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if ((ctx->Width == 176) && (ctx->Height == 144)) 291437b3eda28a4bf098efa80598cab67f190275266Fei Jiang SourceFormatType = _176x144_QCIF; 292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if ((ctx->Width == 352) && (ctx->Height == 288)) 293437b3eda28a4bf098efa80598cab67f190275266Fei Jiang SourceFormatType = _352x288_CIF; 294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if ((ctx->Width == 704) && (ctx->Height == 576)) 295437b3eda28a4bf098efa80598cab67f190275266Fei Jiang SourceFormatType = _704x576_4CIF; 296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if ((ctx->Width <= 720) && (ctx->Height <= 576)) 297437b3eda28a4bf098efa80598cab67f190275266Fei Jiang SourceFormatType = 7; 298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else { 299c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Unsupported resolution!\n"); 300437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED; 301437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 302437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 303e968fbfc452194dd51c12901ffa338c312a5e3c7Fei Jiang memset(cmdbuf->header_mem_p + ctx->pic_header_ofs, 304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, 305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HEADER_SIZE); 306437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw__H263_prepare_picture_header(cmdbuf->header_mem_p + ctx->pic_header_ofs, 307437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->obj_context->frame_count, 308437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pBuffer->picture_type, 309437b3eda28a4bf098efa80598cab67f190275266Fei Jiang SourceFormatType, 310437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.FrameRate, 31188c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang ctx->RawWidth, 31288c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang ctx->RawHeight); 313dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 314437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_insert_command_package(ctx->obj_context, 315437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->ParallelCores - 1, /* Send to the last core as this will complete first */ 316437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MTX_CMDID_DO_HEADER, 317437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &cmdbuf->header_mem, 318437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->pic_header_ofs); 319437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 320437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 321437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Prepare START_PICTURE params */ 322437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Actually H263 only use 1 core from DDKv186 */ 323dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = (ctx->ParallelCores - 1); i >= 0; i--) 324437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw_RenderPictureParameter(ctx, i); 325437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 326437b3eda28a4bf098efa80598cab67f190275266Fei Jiang free(pBuffer); 327437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 328437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 329437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 330437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 331437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__H263ES_process_slice_param(context_ENC_p ctx, object_buffer_p obj_buffer) 332437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 333437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Prepare InParams for macros of current slice, insert slice header, insert do slice command */ 334437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAEncSliceParameterBuffer *pBuffer; 335dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_cmdbuf_p cmdbuf = ctx->obj_context->pnw_cmdbuf; 336437b3eda28a4bf098efa80598cab67f190275266Fei Jiang PIC_PARAMS *psPicParams = (PIC_PARAMS *)(cmdbuf->pic_params_p); 337e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned int i; 3384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int slice_param_idx; 339437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 340437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(obj_buffer->type == VAEncSliceParameterBufferType); 341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 342437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Transfer ownership of VAEncPictureParameterBufferH263 data */ 343437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pBuffer = (VAEncSliceParameterBuffer *) obj_buffer->buffer_data; 344437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->size = 0; 345dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /*In case the slice number changes*/ 347dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((ctx->slice_param_cache != NULL) && (obj_buffer->num_elements != ctx->slice_param_num)) { 348c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Slice number changes. Previous value is %d. Now it's %d\n", 349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num, obj_buffer->num_elements); 350dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(ctx->slice_param_cache); 351dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_cache = NULL; 352dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num = 0; 353dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 354dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == ctx->slice_param_cache) { 356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num = obj_buffer->num_elements; 357c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate %d VAEncSliceParameterBuffer cache buffers\n", 2 * ctx->slice_param_num); 358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_cache = calloc(2 * ctx->slice_param_num, sizeof(VAEncSliceParameterBuffer)); 359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == ctx->slice_param_cache) { 360c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Run out of memory!\n"); 361dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(obj_buffer->buffer_data); 362dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_ALLOCATION_FAILED; 363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 3644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 3654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < obj_buffer->num_elements; i++) { 367437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /*Todo list: 368437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *1.Insert Do header command 369437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *2.setup InRowParams 370437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *3.setup Slice params 371437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *4.Insert Do slice command 372437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * */ 373437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned char deblock_idc; 374437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 375437b3eda28a4bf098efa80598cab67f190275266Fei Jiang deblock_idc = pBuffer->slice_flags.bits.disable_deblocking_filter_idc; 376437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 377437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Insert Do Header command, relocation is needed */ 378dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ctx->obj_context->slice_count) { /*First slice of a frame need not slice header*/ 379dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memset(cmdbuf->header_mem_p + ctx->slice_header_ofs 380dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + ctx->obj_context->slice_count * HEADER_SIZE, 381dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, 382dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HEADER_SIZE); 383dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 384dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw__H263_prepare_GOBslice_header( 385e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang cmdbuf->header_mem_p + ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE, 386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->obj_context->slice_count, 387dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->obj_context->frame_count); 388e968fbfc452194dd51c12901ffa338c312a5e3c7Fei Jiang 389437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->LastSliceNum[ctx->SliceToCore] = ctx->obj_context->slice_count; 390437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 391437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_insert_command_package(ctx->obj_context, 392437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->SliceToCore, 393437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MTX_CMDID_DO_HEADER, 394437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &cmdbuf->header_mem, 395437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE); 396437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (0 == ctx->SliceToCore) { 398437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->SliceToCore = ctx->ParallelCores; 399437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 400437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->SliceToCore--; 401437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 402437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((pBuffer->start_row_number == 0) && pBuffer->slice_flags.bits.is_intra) { 405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_reset_encoder_params(ctx); /* originally do in BeginPicture, but beginpicture has no intra info */ 406437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->BelowParamsBufIdx = (ctx->BelowParamsBufIdx + 1) & 0x1; 407437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 408437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 409dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun slice_param_idx = (pBuffer->slice_flags.bits.is_intra ? 0 : 1) * ctx->slice_param_num + i; 410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VAEncSliceParameter_Equal(&ctx->slice_param_cache[slice_param_idx], pBuffer) == 0) { 411dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* cache current param parameters */ 412dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(&ctx->slice_param_cache[slice_param_idx], 413dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer, sizeof(VAEncSliceParameterBuffer)); 414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Setup InParams value*/ 416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_setup_slice_params(ctx, 417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->start_row_number * 16, 418bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang pBuffer->slice_height * 16, 419dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->slice_flags.bits.is_intra, 420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->obj_context->frame_count > 0, 421dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psPicParams->sInParams.SeInitQP); 422dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 423dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Insert do slice command and setup related buffer value */ 425437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw__send_encode_slice_params(ctx, 426437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pBuffer->slice_flags.bits.is_intra, 427437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pBuffer->start_row_number * 16, 428437b3eda28a4bf098efa80598cab67f190275266Fei Jiang deblock_idc, 429437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->obj_context->frame_count, 430bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang pBuffer->slice_height * 16, 431437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->obj_context->slice_count); 432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 433c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Now frame_count/slice_count is %d/%d\n", 434437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->obj_context->frame_count, ctx->obj_context->slice_count); 435437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 436437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->obj_context->slice_count++; 437dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer++; /*Move to the next buffer*/ 438437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 439437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(ctx->obj_context->slice_count < MAX_SLICES_PER_PICTURE); 440437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 441437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(obj_buffer->buffer_data); 443437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_SUCCESS; 445437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 446437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 447437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 448437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 449437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_H263ES_RenderPicture( 450437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context, 451437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_buffer_p *buffers, 452437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int num_buffers) 453437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 454437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int i; 455437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_CONTEXT_H263ES; 456437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 457437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 458c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263ES_RenderPicture\n"); 459437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < num_buffers; i++) { 461437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_buffer_p obj_buffer = buffers[i]; 462437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (obj_buffer->type) { 464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAEncSequenceParameterBufferType: 465c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263_RenderPicture got VAEncSequenceParameterBufferType\n"); 466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw__H263ES_process_sequence_param(ctx, obj_buffer); 467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAEncPictureParameterBufferType: 471c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263_RenderPicture got VAEncPictureParameterBuffer\n"); 472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw__H263ES_process_picture_param(ctx, obj_buffer); 473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 475437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 476437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAEncSliceParameterBufferType: 477c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263_RenderPicture got VAEncSliceParameterBufferType\n"); 478437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw__H263ES_process_slice_param(ctx, obj_buffer); 479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 482437b3eda28a4bf098efa80598cab67f190275266Fei Jiang default: 483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = VA_STATUS_ERROR_UNKNOWN; 484437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 485437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 486dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (vaStatus != VA_STATUS_SUCCESS) { 487437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 488437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 489437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 490437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 491437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 492437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 493437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 495437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_H263ES_EndPicture( 496437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context) 497437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 498437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 499437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_CONTEXT_H263ES; 500437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 501c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263ES_EndPicture\n"); 502437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 503437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw_EndPicture(ctx); 504437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 505437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 506437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 507437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 508437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 509437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstruct format_vtable_s pnw_H263ES_vtable = { 510dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunqueryConfigAttributes: 511dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_H263ES_QueryConfigAttributes, 512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvalidateConfig: 513dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_H263ES_ValidateConfig, 514dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuncreateContext: 515dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_H263ES_CreateContext, 516dc1209519284865899ca8d990b3a2c7dbca8ae08wangkundestroyContext: 517dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_H263ES_DestroyContext, 518dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunbeginPicture: 519dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_H263ES_BeginPicture, 520dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunrenderPicture: 521dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_H263ES_RenderPicture, 522dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunendPicture: 523dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_H263ES_EndPicture 524437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}; 525