17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK 47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,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 * Zeng Li <zeng.li@intel.com> 27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Shengquan Yuan <shengquan.yuan@intel.com> 28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Binglin Chen <binglin.chen@intel.com> 29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * 30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */ 317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h" 337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_surface.h" 347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_cmdbuf.h" 357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "lnc_H263ES.h" 367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "lnc_hostheader.h" 372befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "lnc_hostcode.h" 38f31d5416a60f83e184b0906a7ec77ba021840531hding#include "psb_drv_debug.h" 397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h> 417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdint.h> 427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h> 437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define TOPAZ_H263_MAX_BITRATE 16000000 467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define INIT_CONTEXT_H263ES context_ENC_p ctx = (context_ENC_p) (obj_context->format_data) 487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id )) 497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define BUFFER(id) ((object_buffer_p) object_heap_lookup( &ctx->obj_context->driver_data->buffer_heap, id )) 507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc_H263ES_QueryConfigAttributes( 537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAProfile profile, 547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAEntrypoint entrypoint, 557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAConfigAttrib *attrib_list, 56dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int num_attribs) 577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 59c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_QueryConfigAttributes\n"); 607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* RateControl attributes */ 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < num_attribs; i++) { 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (attrib_list[i].type) { 647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case VAConfigAttribRTFormat: 657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case VAConfigAttribRateControl: 687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang attrib_list[i].value = VA_RC_NONE | VA_RC_CBR | VA_RC_VBR; 697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#if 0 71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VAConfigAttribEncMaxSliceSize: 72dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun attrib_list[i].value = 0; 73dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 742f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#endif 757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED; 777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H263ES_ValidateConfig( 85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_config_p obj_config) 867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 87242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang int i; 88242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang /* Check all attributes */ 89242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang for (i = 0; i < obj_config->attrib_count; i++) { 903f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang switch (obj_config->attrib_list[i].type) { 913f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang case VAConfigAttribRTFormat: 923f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang /* Ignore */ 933f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang break; 943f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang case VAConfigAttribRateControl: 953f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang break; 963f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang default: 973f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED; 983f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang } 993f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang } 100242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang 101242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang return VA_STATUS_SUCCESS; 1027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H263ES_CreateContext( 1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_context_p obj_context, 107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_config_p obj_config) 1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int eRCmode; 1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang context_ENC_p ctx; 1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 114c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_CreateContext\n"); 1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = lnc_CreateContext(obj_context, obj_config);/* alloc context_ENC_s and BO */ 1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS != vaStatus) 1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx = (context_ENC_p) obj_context->format_data; 1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1232f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ctx->max_slice_size = 0; 1242f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang eRCmode = VA_RC_NONE; 1252f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < obj_config->attrib_count; i++) { 1272f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#if 0 128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_config->attrib_list[i].type == VAConfigAttribEncMaxSliceSize) 129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->max_slice_size = obj_config->attrib_list[i].value; 130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (obj_config->attrib_list[i].type == VAConfigAttribRateControl) 131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun eRCmode = obj_config->attrib_list[i].value; 1322f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#else 133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_config->attrib_list[i].type == VAConfigAttribRateControl) 134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun eRCmode = obj_config->attrib_list[i].value; 1352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#endif 1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (eRCmode == VA_RC_VBR) { 1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->eCodec = IMG_CODEC_H263_VBR; 1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.RCEnable = IMG_TRUE; 141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (eRCmode == VA_RC_CBR) { 1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->eCodec = IMG_CODEC_H263_CBR; 1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.RCEnable = IMG_TRUE; 144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (eRCmode == VA_RC_NONE) { 1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->eCodec = IMG_CODEC_H263_NO_RC; 1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.RCEnable = IMG_FALSE; 147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT; 1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->eFormat = IMG_CODEC_PL12; 1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->IPEControl = lnc__get_ipe_control(ctx->eCodec); 1522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 1532f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ctx->OptionalCustomPCF = 0; 154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc_H263ES_DestroyContext( 1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_context_p obj_context) 1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 165c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_DestroyContext\n"); 1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang lnc_DestroyContext(obj_context); 1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H263ES_BeginPicture( 1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_context_p obj_context) 1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_CONTEXT_H263ES; 1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 177c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_BeginPicture\n"); 1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = lnc_BeginPicture(ctx); 1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc__H263ES_process_sequence_param(context_ENC_p ctx, object_buffer_p obj_buffer) 1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * process rate control parameters 1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAEncSequenceParameterBufferH263 *pSequenceParams; 1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(obj_buffer->type == VAEncSequenceParameterBufferType); 1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(obj_buffer->num_elements == 1); 1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(obj_buffer->size == sizeof(VAEncSequenceParameterBufferH263)); 1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((obj_buffer->num_elements != 1) || 197bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (obj_buffer->size != sizeof(VAEncSequenceParameterBufferH263))) { 1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pSequenceParams = (VAEncSequenceParameterBufferH263 *) obj_buffer->buffer_data; 2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->buffer_data = NULL; 2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->size = 0; 2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2052f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if ((ctx->obj_context->frame_count != 0) && 206bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (ctx->sRCParams.BitsPerSecond != pSequenceParams->bits_per_second)) 207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->update_rc_control = 1; 208dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pSequenceParams->bits_per_second > TOPAZ_H263_MAX_BITRATE) { 210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BitsPerSecond = TOPAZ_H263_MAX_BITRATE; 211c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, " bits_per_second(%d) exceeds \ 212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun the maximum bitrate, set it with %d\n", 213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pSequenceParams->bits_per_second, 214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun TOPAZ_H263_MAX_BITRATE); 215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BitsPerSecond = pSequenceParams->bits_per_second; 217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pSequenceParams->initial_qp < 3) 219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pSequenceParams->initial_qp = 3; 2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.FrameRate = pSequenceParams->frame_rate; 2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.InitialQp = pSequenceParams->initial_qp; 2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.MinQP = pSequenceParams->min_qp; 2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.BUSize = 0; /* default 0, and will be set in lnc__setup_busize */ 2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_UINT16 MBRows = 0; 228dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ctx->Height <= 400) 2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MBRows = 1; 2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else if (ctx->Height < 800) 2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MBRows = 2; 2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.Slices = (ctx->Height + 15) >> (4 + (MBRows >> 1)); 2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.IntraFreq = pSequenceParams->intra_period; 2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(pSequenceParams); 2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Work done by the followinig funcs in testbench should be done here. 2437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * IMG_C_StartPicture() 2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * IMG_C_InsertSync() 2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * APP_H263_SendPictureHeader() 2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Frame skip must be taken into consideration 2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * */ 2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc__H263ES_process_picture_param(context_ENC_p ctx, object_buffer_p obj_buffer) 2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus; 2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAEncPictureParameterBufferH263 *pBuffer; 2527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang lnc_cmdbuf_p cmdbuf = ctx->obj_context->lnc_cmdbuf; 2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang H263_SOURCE_FORMAT_TYPE SourceFormatType; 2547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(obj_buffer->type == VAEncPictureParameterBufferType); 2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((obj_buffer->num_elements != 1) || 258bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (obj_buffer->size != sizeof(VAEncPictureParameterBufferH263))) { 2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Transfer ownership of VAEncPictureParameterBufferH263 data */ 2637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pBuffer = (VAEncPictureParameterBufferH263 *) obj_buffer->buffer_data; 2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->buffer_data = NULL; 2657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->size = 0; 2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->ref_surface = SURFACE(pBuffer->reference_picture); 2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->dest_surface = SURFACE(pBuffer->reconstructed_picture); 2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->coded_buf = BUFFER(pBuffer->coded_buf); 2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(ctx->Width == pBuffer->picture_width); 2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(ctx->Height == pBuffer->picture_height); 2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Insert do_header command here */ 2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((ctx->Width == 128) && (ctx->Height == 96)) 2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SourceFormatType = _128x96_SubQCIF; 278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if ((ctx->Width == 176) && (ctx->Height == 144)) 2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SourceFormatType = _176x144_QCIF; 280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if ((ctx->Width == 352) && (ctx->Height == 288)) 2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SourceFormatType = _352x288_CIF; 282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if ((ctx->Width == 704) && (ctx->Height == 576)) 2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SourceFormatType = _704x576_4CIF; 284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if ((ctx->Width <= 720) && (ctx->Height <= 576)) 2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SourceFormatType = 7; 286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else { 287c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Unsupported resolution!\n"); 2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED; 2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* save current cmdbuf write pointer for H263 frameskip redo 2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * for H263, for a skipped frame, picture header/slice header both needn't 2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx_saved_frameskip = cmdbuf->cmd_idx; 2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!(ctx->sRCParams.RCEnable && ctx->sRCParams.FrameSkip)) { 296e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang lnc__H263_prepare_picture_header((IMG_UINT32 *)(cmdbuf->header_mem_p + ctx->pic_header_ofs), 2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->obj_context->frame_count, 2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pBuffer->picture_type, 2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SourceFormatType, 3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.FrameRate, 3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->Width, 3022f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ctx->Height, 303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &ctx->OptionalCustomPCF); 304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_cmdbuf_insert_command(cmdbuf, MTX_CMDID_DO_HEADER, 2, 1); 3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_CMDBUF(cmdbuf->cmd_idx++, ctx->pic_header_ofs, &cmdbuf->header_mem); 3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = lnc_RenderPictureParameter(ctx); 3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(pBuffer); 3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc__H263ES_process_slice_param(context_ENC_p ctx, object_buffer_p obj_buffer) 3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Prepare InParams for macros of current slice, insert slice header, insert do slice command */ 3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAEncSliceParameterBuffer *pBuffer; 320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_cmdbuf_p cmdbuf = ctx->obj_context->lnc_cmdbuf; 3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang PIC_PARAMS *psPicParams = (PIC_PARAMS *)(cmdbuf->pic_params_p); 322e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned int i; 3234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int slice_param_idx; 3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(obj_buffer->type == VAEncSliceParameterBufferType); 326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* do nothing for skip frame if RC enabled */ 3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((ctx->sRCParams.RCEnable && ctx->sRCParams.FrameSkip)) { 329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(obj_buffer->buffer_data); 330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_buffer->buffer_data = NULL; 3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Transfer ownership of VAEncPictureParameterBufferH263 data */ 3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pBuffer = (VAEncSliceParameterBuffer *) obj_buffer->buffer_data; 3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->size = 0; 337dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 338dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (0 == pBuffer->start_row_number) { 339dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pBuffer->slice_flags.bits.is_intra) 340dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun RELOC_PIC_PARAMS(&psPicParams->InParamsBase, ctx->in_params_ofs, cmdbuf->topaz_in_params_I); 341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun RELOC_PIC_PARAMS(&psPicParams->InParamsBase, ctx->in_params_ofs, cmdbuf->topaz_in_params_P); 3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /*In case the slice number changes*/ 346dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((ctx->slice_param_cache != NULL) && (obj_buffer->num_elements != ctx->slice_param_num)) { 347c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Slice number changes. Previous value is %d. Now it's %d\n", 348dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num, obj_buffer->num_elements); 349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(ctx->slice_param_cache); 350dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_cache = NULL; 351dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num = 0; 3524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 3534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 354dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == ctx->slice_param_cache) { 355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num = obj_buffer->num_elements; 356c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate %d VAEncSliceParameterBuffer cache buffers\n", 2 * ctx->slice_param_num); 357dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_cache = calloc(2 * ctx->slice_param_num, sizeof(VAEncSliceParameterBuffer)); 358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == ctx->slice_param_cache) { 359c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Run out of memory!\n"); 360dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(obj_buffer->buffer_data); 361dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_ALLOCATION_FAILED; 362dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 365dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < obj_buffer->num_elements; i++) { 366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*Todo list: 367dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *1.Insert Do header command 368dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *2.setup InRowParams 369dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *3.setup Slice params 370dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *4.Insert Do slice command 371dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * */ 372dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Insert Do Header command, relocation is needed */ 374dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ctx->obj_context->slice_count) { /*First slice of a frame need not slice header*/ 375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc__H263_prepare_GOBslice_header( 376e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (IMG_UINT32 *)(cmdbuf->header_mem_p + ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE), 377dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->obj_context->slice_count, 378dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->obj_context->frame_count); 379dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 380dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_cmdbuf_insert_command(cmdbuf, MTX_CMDID_DO_HEADER, 2, (ctx->obj_context->slice_count << 2) | 2); 3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_CMDBUF(cmdbuf->cmd_idx++, 3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE, 3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang &cmdbuf->header_mem); 3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((ctx->obj_context->frame_count == 0) && (pBuffer->start_row_number == 0) && pBuffer->slice_flags.bits.is_intra) 387dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_reset_encoder_params(ctx); 388dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*The corresponding slice buffer cache*/ 390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun slice_param_idx = (pBuffer->slice_flags.bits.is_intra ? 0 : 1) * ctx->slice_param_num + i; 391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 392dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VAEncSliceParameter_Equal(&ctx->slice_param_cache[slice_param_idx], pBuffer) == 0) { 393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* cache current param parameters */ 394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(&ctx->slice_param_cache[slice_param_idx], 395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer, sizeof(VAEncSliceParameterBuffer)); 396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Setup InParams value*/ 398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_setup_slice_params(ctx, 399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->start_row_number * 16, 400bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang pBuffer->slice_height * 16, 401dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->slice_flags.bits.is_intra, 402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->obj_context->frame_count > 0, 403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psPicParams->sInParams.SeInitQP); 404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 406dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Insert do slice command and setup related buffer value */ 4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang lnc__send_encode_slice_params(ctx, 4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pBuffer->slice_flags.bits.is_intra, 4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pBuffer->start_row_number * 16, 4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0, /* no deblock for H263 */ 4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->obj_context->frame_count, 412bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang pBuffer->slice_height * 16, 4132f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ctx->obj_context->slice_count, 414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->max_slice_size); 415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 416c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Now frame_count/slice_count is %d/%d\n", 4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->obj_context->frame_count, ctx->obj_context->slice_count); 4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->obj_context->slice_count++; 420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer++; /*Move to the next buffer*/ 4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(ctx->obj_context->slice_count < MAX_SLICES_PER_PICTURE); 4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(obj_buffer->buffer_data); 4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->buffer_data = NULL; 4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4302f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiangstatic VAStatus lnc__H263ES_process_misc_param(context_ENC_p ctx, object_buffer_p obj_buffer) 4312f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{ 4322f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang /* Prepare InParams for macros of current slice, insert slice header, insert do slice command */ 4332f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang VAEncMiscParameterBuffer *pBuffer; 4344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo VAEncMiscParameterRateControl *rate_control_param; 4352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang VAEncMiscParameterAIR *air_param; 4362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang VAEncMiscParameterMaxSliceSize *max_slice_size_param; 4372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang VAEncMiscParameterFrameRate *frame_rate_param; 4382f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 4392f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 4402f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 4412f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ASSERT(obj_buffer->type == VAEncMiscParameterBufferType); 4422f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 4434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pBuffer = (VAEncMiscParameterBuffer *) obj_buffer->buffer_data; 4442f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_buffer->size = 0; 4452f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 4462f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang switch (pBuffer->type) { 4472f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case VAEncMiscParameterTypeFrameRate: 448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun frame_rate_param = (VAEncMiscParameterFrameRate *)pBuffer->data; 449c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: frame rate changed to %d\n", 450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun frame_rate_param->framerate); 451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 4522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 4534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case VAEncMiscParameterTypeRateControl: 454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun rate_control_param = (VAEncMiscParameterRateControl *)pBuffer->data; 455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 456c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: bit rate changed to %d\n", 457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun rate_control_param->bits_per_second); 458dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (rate_control_param->bits_per_second == ctx->sRCParams.BitsPerSecond) 460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 462dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->update_rc_control = 1; 463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 464dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (rate_control_param->bits_per_second > TOPAZ_H263_MAX_BITRATE) { 465dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BitsPerSecond = TOPAZ_H263_MAX_BITRATE; 466c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, " bits_per_second(%d) exceeds \ 467dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun the maximum bitrate, set it with %d\n", 468dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun rate_control_param->bits_per_second, 469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun TOPAZ_H263_MAX_BITRATE); 470dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BitsPerSecond = rate_control_param->bits_per_second; 472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 4742f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 4752f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case VAEncMiscParameterTypeMaxSliceSize: 476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun max_slice_size_param = (VAEncMiscParameterMaxSliceSize *)pBuffer->data; 4772f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ctx->max_slice_size == max_slice_size_param->max_slice_size) 479dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 4802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 481c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: max slice size changed to %d\n", 482dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun max_slice_size_param->max_slice_size); 4832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->max_slice_size = max_slice_size_param->max_slice_size; 4852f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 486dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 4872f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 4882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case VAEncMiscParameterTypeAIR: 489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun air_param = (VAEncMiscParameterAIR *)pBuffer->data; 4902f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 491c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: air slice size changed to num_air_mbs %d " 492dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun "air_threshold %d, air_auto %d\n", 493dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun air_param->air_num_mbs, air_param->air_threshold, 494dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun air_param->air_auto); 4952f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->num_air_mbs = air_param->air_num_mbs; 497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->air_threshold = air_param->air_threshold; 498dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->autotune_air_flag = air_param->air_auto; 4992f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 500dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 5012f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 5022f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang default: 503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = VA_STATUS_ERROR_UNKNOWN; 504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DEBUG_FAILURE; 505dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 5062f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 5072f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 508dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(obj_buffer->buffer_data); 5092f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_buffer->buffer_data = NULL; 510dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5112f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang return VA_STATUS_SUCCESS; 5122f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang} 5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H263ES_RenderPicture( 5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_context_p obj_context, 5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p *buffers, 5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int num_buffers) 5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_CONTEXT_H263ES; 5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 523c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_RenderPicture\n"); 5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < num_buffers; i++) { 5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer = buffers[i]; 5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (obj_buffer->type) { 5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case VAEncSequenceParameterBufferType: 530c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263_RenderPicture got VAEncSequenceParameterBufferType\n"); 5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = lnc__H263ES_process_sequence_param(ctx, obj_buffer); 5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE; 5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case VAEncPictureParameterBufferType: 536c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263_RenderPicture got VAEncPictureParameterBuffer\n"); 5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = lnc__H263ES_process_picture_param(ctx, obj_buffer); 5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE; 5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case VAEncSliceParameterBufferType: 542c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263_RenderPicture got VAEncSliceParameterBufferType\n"); 5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = lnc__H263ES_process_slice_param(ctx, obj_buffer); 5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE; 5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VAEncMiscParameterBufferType: 548c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_RenderPicture got VAEncMiscParameterBufferType\n"); 549dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = lnc__H263ES_process_misc_param(ctx, obj_buffer); 550dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DEBUG_FAILURE; 551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 5522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_UNKNOWN; 5557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE; 5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 557dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (vaStatus != VA_STATUS_SUCCESS) { 5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H263ES_EndPicture( 5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_context_p obj_context) 5687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_CONTEXT_H263ES; 5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 572c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_EndPicture\n"); 5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = lnc_EndPicture(ctx); 5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct format_vtable_s lnc_H263ES_vtable = { 581dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunqueryConfigAttributes: 582dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H263ES_QueryConfigAttributes, 583dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvalidateConfig: 584dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H263ES_ValidateConfig, 585dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuncreateContext: 586dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H263ES_CreateContext, 587dc1209519284865899ca8d990b3a2c7dbca8ae08wangkundestroyContext: 588dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H263ES_DestroyContext, 589dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunbeginPicture: 590dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H263ES_BeginPicture, 591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunrenderPicture: 592dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H263ES_RenderPicture, 593dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunendPicture: 594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H263ES_EndPicture 5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}; 596