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 337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h" 347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_surface.h" 357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_cmdbuf.h" 367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "lnc_hostcode.h" 377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "lnc_H264ES.h" 387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "lnc_hostheader.h" 39f31d5416a60f83e184b0906a7ec77ba021840531hding#include "va/va_enc_h264.h" 40f31d5416a60f83e184b0906a7ec77ba021840531hding#include "psb_drv_debug.h" 417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h> 437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdint.h> 447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h> 45bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#include <limits.h> 467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 48437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define TOPAZ_H264_MAX_BITRATE 14000000 /* FIXME ?? */ 49dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#define WORST_CASE_SLICE_HEADER_SIZE 200 507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 51bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define INIT_CONTEXT_H264ES context_ENC_p ctx = (context_ENC_p) obj_context->format_data 527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id )) 537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define BUFFER(id) ((object_buffer_p) object_heap_lookup( &ctx->obj_context->driver_data->buffer_heap, id )) 547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5554752e65b02b1a84c491e3f9c964046faeea306eKun Wang 567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc_H264ES_QueryConfigAttributes( 587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAProfile profile, 597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAEntrypoint entrypoint, 607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAConfigAttrib *attrib_list, 61dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int num_attribs) 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 65c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264ES_QueryConfigAttributes\n"); 667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* RateControl attributes */ 687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < num_attribs; i++) { 697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (attrib_list[i].type) { 707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case VAConfigAttribRTFormat: 717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 72dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case VAConfigAttribRateControl: 742f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang attrib_list[i].value = VA_RC_NONE | VA_RC_CBR | VA_RC_VBR | VA_RC_VCM; 757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 762f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#if 0 77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VAConfigAttribEncMaxSliceSize: 78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun attrib_list[i].value = 0; 79dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#endif 817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED; 837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H264ES_ValidateConfig( 90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_config_p obj_config) 917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 92242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang int i; 93242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang /* Check all attributes */ 94242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang for (i = 0; i < obj_config->attrib_count; i++) { 953f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang switch (obj_config->attrib_list[i].type) { 963f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang case VAConfigAttribRTFormat: 973f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang /* Ignore */ 983f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang break; 993f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang case VAConfigAttribRateControl: 1003f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang break; 1013f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang default: 1023f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED; 1033f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang } 1043f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang } 105242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang 106242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang return VA_STATUS_SUCCESS; 1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H264ES_CreateContext( 1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_context_p obj_context, 112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_config_p obj_config) 1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang context_ENC_p ctx; 1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 1172f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang unsigned int eRCmode = 0; 1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 119c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264ES_CreateContext\n"); 1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = lnc_CreateContext(obj_context, obj_config); 1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS != vaStatus) 1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx = (context_ENC_p) obj_context->format_data; 1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1282f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ctx->max_slice_size = 0; 129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->delta_change = 1; 1302f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang eRCMode = VA_RC_NONE; 131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < obj_config->attrib_count; i++) { 1322f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#if 0 133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_config->attrib_list[i].type == VAConfigAttribEncMaxSliceSize) 134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->max_slice_size = obj_config->attrib_list[i].value; 135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (obj_config->attrib_list[i].type == VAConfigAttribRateControl) 136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun eRCmode = obj_config->attrib_list[i].value; 1372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#else 138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_config->attrib_list[i].type == VAConfigAttribRateControl) 139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun eRCmode = obj_config->attrib_list[i].value; 1402f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#endif 1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 143c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264ES_CreateContext: max slice size %d\n", ctx->max_slice_size); 1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (eRCmode == VA_RC_VBR) { 1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->eCodec = IMG_CODEC_H264_VBR; 1477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.RCEnable = IMG_TRUE; 148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (eRCmode == VA_RC_CBR) { 1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->eCodec = IMG_CODEC_H264_CBR; 1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.RCEnable = IMG_TRUE; 151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (eRCmode == VA_RC_VCM) { 1522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ctx->eCodec = IMG_CODEC_H264_VCM; 1532f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ctx->sRCParams.RCEnable = IMG_TRUE; 154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (eRCmode == VA_RC_NONE) { 1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->eCodec = IMG_CODEC_H264_NO_RC; 1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.RCEnable = IMG_FALSE; 157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT; 159bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang ctx->eFormat = IMG_CODEC_PL12; /* use default */ 1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->IPEControl = lnc__get_ipe_control(ctx->eCodec); 162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->idr_pic_id = 1; 163dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (obj_config->profile) { 165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VAProfileH264Baseline: 166dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->profile_idc = 5; 167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VAProfileH264Main: 169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->profile_idc = 6; 170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->profile_idc = 6; 173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc_H264ES_DestroyContext( 1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_context_p obj_context) 1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang struct coded_buf_aux_info *p_aux_info; 1842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang INIT_CONTEXT_H264ES; 185c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264ES_DestroyPicture\n"); 1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (ctx->p_coded_buf_info != NULL) { 188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_aux_info = ctx->p_coded_buf_info->next; 189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(ctx->p_coded_buf_info); 190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->p_coded_buf_info = p_aux_info; 1912f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang lnc_DestroyContext(obj_context); 1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H264ES_BeginPicture( 1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_context_p obj_context) 1977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_CONTEXT_H264ES; 1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 201c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264ES_BeginPicture\n"); 2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = lnc_BeginPicture(ctx); 2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc__H264ES_process_sequence_param(context_ENC_p ctx, object_buffer_p obj_buffer) 2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAEncSequenceParameterBufferH264 *pSequenceParams; 211dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_cmdbuf_p cmdbuf = ctx->obj_context->lnc_cmdbuf; 2127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang H264_VUI_PARAMS VUI_Params; 2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang H264_CROP_PARAMS sCrop; 214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun char hardcoded_qp[4]; 2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(obj_buffer->type == VAEncSequenceParameterBufferType); 2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(obj_buffer->num_elements == 1); 2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(obj_buffer->size == sizeof(VAEncSequenceParameterBufferH264)); 2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((obj_buffer->num_elements != 1) || 221bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (obj_buffer->size != sizeof(VAEncSequenceParameterBufferH264))) { 2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->obj_context->frame_count = 0; 226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pSequenceParams = (VAEncSequenceParameterBufferH264 *) obj_buffer->buffer_data; 2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->buffer_data = NULL; 2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->size = 0; 2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2312f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if ((ctx->obj_context->frame_count != 0) && 232bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (ctx->sRCParams.BitsPerSecond != pSequenceParams->bits_per_second)) 233dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->update_rc_control = 1; 2342f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 2352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang /* a new sequence and IDR need reset frame_count */ 2362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ctx->obj_context->frame_count = 0; 2372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 238dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pSequenceParams->bits_per_second > TOPAZ_H264_MAX_BITRATE) { 239dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BitsPerSecond = TOPAZ_H264_MAX_BITRATE; 240c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, " bits_per_second(%d) exceeds \ 241dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun the maximum bitrate, set it with %d\n", 242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pSequenceParams->bits_per_second, 243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun TOPAZ_H264_MAX_BITRATE); 244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BitsPerSecond = pSequenceParams->bits_per_second; 2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.Slices = 1; 248dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->sRCParams.IntraFreq = pSequenceParams->intra_period; 250643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang if (ctx->sRCParams.IntraFreq == 0) 251643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang ctx->sRCParams.IntraFreq = 1000; 252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 253643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang ctx->sRCParams.IDRFreq = pSequenceParams->intra_idr_period; 254c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "IntraFreq: %d\n, intra_idr_period: %d\n", 255dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.IntraFreq, ctx->sRCParams.IDRFreq); 2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 257dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VUI_Params.Time_Scale = ctx->sRCParams.FrameRate * 2; 258dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VUI_Params.bit_rate_value_minus1 = ctx->sRCParams.BitsPerSecond / 64 - 1; 259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VUI_Params.cbp_size_value_minus1 = ctx->sRCParams.BufferSize / 64 - 1; 2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VUI_Params.CBR = 1; 2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VUI_Params.initial_cpb_removal_delay_length_minus1 = 0; 2627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VUI_Params.cpb_removal_delay_length_minus1 = 0; 2637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VUI_Params.dpb_output_delay_length_minus1 = 0; 2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VUI_Params.time_offset_length = 0; 2657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sCrop.bClip = IMG_FALSE; 2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sCrop.LeftCropOffset = 0; 2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sCrop.RightCropOffset = 0; 2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sCrop.TopCropOffset = 0; 2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sCrop.BottomCropOffset = 0; 2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ctx->RawHeight & 0xf) { 273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sCrop.bClip = IMG_TRUE; 274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sCrop.BottomCropOffset = (((ctx->RawHeight + 0xf) & (~0xf)) - ctx->RawHeight) / 2; 2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ctx->RawWidth & 0xf) { 2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sCrop.bClip = IMG_TRUE; 278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sCrop.RightCropOffset = (((ctx->RawWidth + 0xf) & (~0xf)) - ctx->RawWidth) / 2; 2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2802befccec034c13d34746a9e87149889d59ac767bFei Jiang 2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* sequence header is always inserted */ 282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ctx->eCodec == IMG_CODEC_H264_NO_RC) 283643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang VUI_Params.CBR = 0; 2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 285e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang lnc__H264_prepare_sequence_header((IMG_UINT32 *)(cmdbuf->header_mem_p + ctx->seq_header_ofs), pSequenceParams->max_num_ref_frames, 286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pSequenceParams->picture_width_in_mbs, 287dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pSequenceParams->picture_height_in_mbs, 288f31d5416a60f83e184b0906a7ec77ba021840531hding pSequenceParams->vui_parameters_present_flag, 289f31d5416a60f83e184b0906a7ec77ba021840531hding pSequenceParams->vui_parameters_present_flag ? (&VUI_Params) : NULL, 290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &sCrop, 2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pSequenceParams->level_idc, ctx->profile_idc); 2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang lnc_cmdbuf_insert_command(cmdbuf, MTX_CMDID_DO_HEADER, 2, 0); /* sequence header */ 2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_CMDBUF(cmdbuf->cmd_idx++, ctx->seq_header_ofs, &cmdbuf->header_mem); 295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (0 != ctx->sRCParams.IDRFreq) { 297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == ctx->save_seq_header_p) { 298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->save_seq_header_p = malloc(HEADER_SIZE); 299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == ctx->save_seq_header_p) { 300c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Ran out of memory!\n"); 301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(pSequenceParams); 302dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_ALLOCATION_FAILED; 303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 304e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang memcpy((unsigned char *)ctx->save_seq_header_p, 305e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (unsigned char *)(cmdbuf->header_mem_p + ctx->seq_header_ofs), 306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HEADER_SIZE); 307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(pSequenceParams); 3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc__H264ES_process_picture_param(context_ENC_p ctx, object_buffer_p obj_buffer) 3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus; 3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAEncPictureParameterBufferH264 *pBuffer; 3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang lnc_cmdbuf_p cmdbuf = ctx->obj_context->lnc_cmdbuf; 3192f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang struct coded_buf_aux_info *p_aux_info; 3204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int need_sps = 0; 321dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(obj_buffer->type == VAEncPictureParameterBufferType); 3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((obj_buffer->num_elements != 1) || 325bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (obj_buffer->size != sizeof(VAEncPictureParameterBufferH264))) { 3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Transfer ownership of VAEncPictureParameterBufferH264 data */ 3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pBuffer = (VAEncPictureParameterBufferH264 *) obj_buffer->buffer_data; 3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->buffer_data = NULL; 3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->size = 0; 3337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 334f31d5416a60f83e184b0906a7ec77ba021840531hding ctx->ref_surface = SURFACE(pBuffer->ReferenceFrames[0].picture_id); 335f31d5416a60f83e184b0906a7ec77ba021840531hding ctx->dest_surface = SURFACE(pBuffer->CurrPic.picture_id); 3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->coded_buf = BUFFER(pBuffer->coded_buf); 3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 338f31d5416a60f83e184b0906a7ec77ba021840531hding //ASSERT(ctx->Width == pBuffer->picture_width); 339f31d5416a60f83e184b0906a7ec77ba021840531hding //ASSERT(ctx->Height == pBuffer->picture_height); 3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((ctx->sRCParams.IntraFreq != 0) && (ctx->sRCParams.IDRFreq != 0)) { /* period IDR is desired */ 342643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang unsigned int is_intra = 0; 343643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang unsigned int intra_cnt = 0; 344643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 345643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang ctx->force_idr_h264 = 0; 346dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 347643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang if ((ctx->obj_context->frame_count % ctx->sRCParams.IntraFreq) == 0) { 348643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang is_intra = 1; /* suppose current frame is I frame */ 349643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang intra_cnt = ctx->obj_context->frame_count / ctx->sRCParams.IntraFreq; 350643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 351643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 352dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* current frame is I frame (suppose), and an IDR frame is desired*/ 353643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang if ((is_intra) && ((intra_cnt % ctx->sRCParams.IDRFreq) == 0)) { 354643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang ctx->force_idr_h264 = 1; 355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*When two consecutive access units in decoding order are both IDR access 356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * units, the value of idr_pic_id in the slices of the first such IDR 357dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * access unit shall differ from the idr_pic_id in the second such IDR 358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * access unit. We set it with 1 or 0 alternately.*/ 359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->idr_pic_id = 1 - ctx->idr_pic_id; 3604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 3614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* it is periodic IDR in the middle of one sequence encoding, need SPS */ 3624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (ctx->obj_context->frame_count > 0) 3634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo need_sps = 1; 364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 365643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang ctx->obj_context->frame_count = 0; 366643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 367643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 368dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* For H264, PicHeader only needed in the first picture*/ 3702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (!ctx->obj_context->frame_count) { 3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf = ctx->obj_context->lnc_cmdbuf; 3724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 3734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (need_sps) { 3744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* reuse the previous SPS */ 375c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "TOPAZ: insert a SPS before IDR frame\n"); 376e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang memcpy((unsigned char *)(cmdbuf->header_mem_p + ctx->seq_header_ofs), 377e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (unsigned char *)ctx->save_seq_header_p, 378dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HEADER_SIZE); 379dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo lnc_cmdbuf_insert_command(cmdbuf, MTX_CMDID_DO_HEADER, 2, 0); /* sequence header */ 3814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_CMDBUF(cmdbuf->cmd_idx++, ctx->seq_header_ofs, &cmdbuf->header_mem); 3824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 3834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 384e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang lnc__H264_prepare_picture_header((IMG_UINT32 *)(cmdbuf->header_mem_p + ctx->pic_header_ofs)); 385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_cmdbuf_insert_command(cmdbuf, MTX_CMDID_DO_HEADER, 2, 1);/* picture header */ 3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_CMDBUF(cmdbuf->cmd_idx++, ctx->pic_header_ofs, &cmdbuf->header_mem); 3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3902f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang /*Record if EOSEQ or EOSTREAM should be appended to the coded buffer.*/ 391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (0 != pBuffer->last_picture) { 392c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "It's the last picture in sequence or stream." 393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun " Will append EOSEQ/EOSTREAM to the coded buffer.\n"); 394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_aux_info = calloc(1, sizeof(struct coded_buf_aux_info)); 395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == p_aux_info) { 396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(pBuffer); 397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_ALLOCATION_FAILED; 398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_aux_info->buf = ctx->coded_buf; 400dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_aux_info->aux_flag = pBuffer->last_picture; 401dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL != ctx->p_coded_buf_info) 402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_aux_info->next = ctx->p_coded_buf_info; 403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_aux_info->next = NULL; 405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 406dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->p_coded_buf_info = p_aux_info; 4072f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 4082f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = lnc_RenderPictureParameter(ctx); 4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(pBuffer); 4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc__H264ES_process_slice_param(context_ENC_p ctx, object_buffer_p obj_buffer) 4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Prepare InParams for macros of current slice, insert slice header, insert do slice command */ 4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAEncSliceParameterBuffer *pBuffer; 4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang lnc_cmdbuf_p cmdbuf = ctx->obj_context->lnc_cmdbuf; 4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int MBSkipRun, FirstMBAddress; 4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang PIC_PARAMS *psPicParams = (PIC_PARAMS *)(cmdbuf->pic_params_p); 422e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned int i; 4234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int slice_param_idx; 4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(obj_buffer->type == VAEncSliceParameterBufferType); 4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf = ctx->obj_context->lnc_cmdbuf; 428e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang psPicParams = (PIC_PARAMS *)cmdbuf->pic_params_p; 4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Transfer ownership of VAEncPictureParameterBufferH264 data */ 4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pBuffer = (VAEncSliceParameterBuffer *) obj_buffer->buffer_data; 4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->size = 0; 4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* save current cmdbuf write pointer for H264 frameskip redo 4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * for H264, only slice header need to repatch 4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx_saved_frameskip = cmdbuf->cmd_idx; 438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (0 == pBuffer->start_row_number) { 440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pBuffer->slice_flags.bits.is_intra) 441dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun RELOC_PIC_PARAMS(&psPicParams->InParamsBase, ctx->in_params_ofs, cmdbuf->topaz_in_params_I); 442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun RELOC_PIC_PARAMS(&psPicParams->InParamsBase, ctx->in_params_ofs, cmdbuf->topaz_in_params_P); 4447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /*In case the slice number changes*/ 447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((ctx->slice_param_cache != NULL) && (obj_buffer->num_elements != ctx->slice_param_num)) { 448c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Slice number changes. Previous value is %d. Now it's %d\n", 449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num, obj_buffer->num_elements); 450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(ctx->slice_param_cache); 451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_cache = NULL; 452dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num = 0; 453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == ctx->slice_param_cache) { 456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num = obj_buffer->num_elements; 457c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate %d VAEncSliceParameterBuffer cache buffers\n", 2 * ctx->slice_param_num); 458dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_cache = calloc(2 * ctx->slice_param_num, sizeof(VAEncSliceParameterBuffer)); 459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == ctx->slice_param_cache) { 460c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Run out of memory!\n"); 461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(obj_buffer->buffer_data); 462dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_ALLOCATION_FAILED; 463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 4644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 4654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 466dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < obj_buffer->num_elements; i++) { 4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*Todo list: 4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *1.Insert Do header command 4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *2.setup InRowParams 4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *3.setup Slice params 4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *4.Insert Do slice command 4727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * */ 473643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang int deblock_on, force_idr = 0; 4747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((pBuffer->slice_height == 0) || (pBuffer->start_row_number >= ctx->Height)) { 476c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "slice number is %d, but it seems the last %d buffers are empty\n", 4774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo obj_buffer->num_elements, obj_buffer->num_elements - i); 478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(obj_buffer->buffer_data); 4794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo obj_buffer->buffer_data = NULL; 4804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return VA_STATUS_SUCCESS; 4814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 4824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 483643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang /* set to INTRA frame */ 4842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (ctx->force_idr_h264 || (ctx->obj_context->frame_count == 0)) { 485643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang force_idr = 1; 486643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang pBuffer->slice_flags.bits.is_intra = 1; 487643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((pBuffer->slice_flags.bits.disable_deblocking_filter_idc == 0) 490bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang || (pBuffer->slice_flags.bits.disable_deblocking_filter_idc == 2)) 4917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang deblock_on = IMG_TRUE; 4927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 4937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang deblock_on = IMG_FALSE; 494dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 495dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ctx->sRCParams.RCEnable && ctx->sRCParams.FrameSkip) 4967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MBSkipRun = (ctx->Width * ctx->Height) / 256; 497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 498dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MBSkipRun = 0; 4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 500dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun FirstMBAddress = (pBuffer->start_row_number * ctx->Width) / 16; 5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Insert Do Header command, relocation is needed */ 502e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang lnc__H264_prepare_slice_header((IMG_UINT32 *)(cmdbuf->header_mem_p + ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE), 503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->slice_flags.bits.is_intra, 504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->slice_flags.bits.disable_deblocking_filter_idc, 5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->obj_context->frame_count, 5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang FirstMBAddress, 507dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MBSkipRun, force_idr, 508dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->slice_flags.bits.uses_long_term_ref, 509dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->slice_flags.bits.is_long_term_ref, 510dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->idr_pic_id); 5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_cmdbuf_insert_command(cmdbuf, MTX_CMDID_DO_HEADER, 2, (ctx->obj_context->slice_count << 2) | 2); 5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_CMDBUF(cmdbuf->cmd_idx++, 5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE, 5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang &cmdbuf->header_mem); 5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!(ctx->sRCParams.RCEnable && ctx->sRCParams.FrameSkip)) { 518dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((ctx->obj_context->frame_count == 0) && (pBuffer->start_row_number == 0) && pBuffer->slice_flags.bits.is_intra) 5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang lnc_reset_encoder_params(ctx); 5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 521dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*The corresponding slice buffer cache*/ 522dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun slice_param_idx = (pBuffer->slice_flags.bits.is_intra ? 0 : 1) * ctx->slice_param_num + i; 523dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 524dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VAEncSliceParameter_Equal(&ctx->slice_param_cache[slice_param_idx], pBuffer) == 0) { 525c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cache slice%d's parameter buffer at index %d\n", i, slice_param_idx); 526dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 527dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* cache current param parameters */ 528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(&ctx->slice_param_cache[slice_param_idx], 529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer, sizeof(VAEncSliceParameterBuffer)); 530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 531dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Setup InParams value*/ 532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_setup_slice_params(ctx, 533dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->start_row_number * 16, 534bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang pBuffer->slice_height * 16, 535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->slice_flags.bits.is_intra, 536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->obj_context->frame_count > 0, 537dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psPicParams->sInParams.SeInitQP); 538dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 540dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Insert do slice command and setup related buffer value */ 5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang lnc__send_encode_slice_params(ctx, 5427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pBuffer->slice_flags.bits.is_intra, 5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pBuffer->start_row_number * 16, 5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang deblock_on, 5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->obj_context->frame_count, 546bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang pBuffer->slice_height * 16, 547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->obj_context->slice_count, ctx->max_slice_size); 548dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 549c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Now frame_count/slice_count is %d/%d\n", 5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->obj_context->frame_count, ctx->obj_context->slice_count); 5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ctx->obj_context->slice_count++; 5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pBuffer++; /* Move to the next buffer */ 5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(ctx->obj_context->slice_count < MAX_SLICES_PER_PICTURE); 5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 558dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(obj_buffer->buffer_data); 5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->buffer_data = NULL; 560dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5642f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiangstatic VAStatus lnc__H264ES_process_misc_param(context_ENC_p ctx, object_buffer_p obj_buffer) 5652f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{ 5662f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang /* Prepare InParams for macros of current slice, insert slice header, insert do slice command */ 5672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang VAEncMiscParameterBuffer *pBuffer; 5684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo VAEncMiscParameterRateControl *rate_control_param; 5692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang VAEncMiscParameterAIR *air_param; 5702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang VAEncMiscParameterMaxSliceSize *max_slice_size_param; 5712f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang VAEncMiscParameterFrameRate *frame_rate_param; 572dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int bit_rate; 573dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun char hardcoded_qp[4]; 5742f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 5752f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 5762f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 5772f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ASSERT(obj_buffer->type == VAEncMiscParameterBufferType); 5782f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 5792f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang /* Transfer ownership of VAEncMiscParameterBuffer data */ 5802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pBuffer = (VAEncMiscParameterBuffer *) obj_buffer->buffer_data; 5812f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_buffer->size = 0; 5822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 583f31d5416a60f83e184b0906a7ec77ba021840531hding //initialize the frame_rate and qp 584f31d5416a60f83e184b0906a7ec77ba021840531hding rate_control_param->initial_qp=26; 585f31d5416a60f83e184b0906a7ec77ba021840531hding rate_control_param->min_qp=3; 586f31d5416a60f83e184b0906a7ec77ba021840531hding frame_rate_param->framerate=30; 587f31d5416a60f83e184b0906a7ec77ba021840531hding 5882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang switch (pBuffer->type) { 5892f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case VAEncMiscParameterTypeFrameRate: 590dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun frame_rate_param = (VAEncMiscParameterFrameRate *)pBuffer->data; 591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 592dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (frame_rate_param->framerate > 65535) { 593dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 595dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 596dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 597c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: frame rate changed to %d\n", __FUNCTION__, 598dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun frame_rate_param->framerate); 599dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 600dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ctx->sRCParams.FrameRate == frame_rate_param->framerate) 601dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 602dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 603dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.FrameRate = frame_rate_param->framerate; 604dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BitsPerSecond += ctx->delta_change; 605dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->delta_change *= -1; 606dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->update_rc_control = 1; 607dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 608dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 6092f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 6104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case VAEncMiscParameterTypeRateControl: 611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun rate_control_param = (VAEncMiscParameterRateControl *)pBuffer->data; 612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_parse_config("PSB_VIDEO_IQP", hardcoded_qp) == 0) 614dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun rate_control_param->initial_qp = atoi(hardcoded_qp); 615dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 616dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_parse_config("PSB_VIDEO_MQP", hardcoded_qp) == 0) 617dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun rate_control_param->min_qp = atoi(hardcoded_qp); 618dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 619dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (rate_control_param->initial_qp > 65535 || 620bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang rate_control_param->min_qp > 65535 || 621bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang rate_control_param->target_percentage > 65535) { 622dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 623dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 624dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 625dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 626c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Rate control parameter initial_qp=%d, min_qp=%d\n", 627dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun rate_control_param->initial_qp, 628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun rate_control_param->min_qp); 629dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 630dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (rate_control_param->bits_per_second > TOPAZ_H264_MAX_BITRATE) { 631dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun bit_rate = TOPAZ_H264_MAX_BITRATE; 632c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, " bits_per_second(%d) exceeds \ 633dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun the maximum bitrate, set it with %d\n", 634dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun rate_control_param->bits_per_second, 635dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun TOPAZ_H264_MAX_BITRATE); 636dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun bit_rate = rate_control_param->bits_per_second; 638dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 639dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 640c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "rate control changed to %d\n", 641dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun rate_control_param->bits_per_second); 642dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 643dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((rate_control_param->bits_per_second == ctx->sRCParams.BitsPerSecond) && 644bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (ctx->sRCParams.VCMBitrateMargin == rate_control_param->target_percentage * 128 / 100) && 645bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (ctx->sRCParams.BufferSize == ctx->sRCParams.BitsPerSecond / 1000 * rate_control_param->window_size) && 646bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (ctx->sRCParams.MinQP == rate_control_param->min_qp) && 647bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (ctx->sRCParams.InitialQp == rate_control_param->initial_qp)) 648dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 649dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 650dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->update_rc_control = 1; 651dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 652dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (rate_control_param->target_percentage != 0) 653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.VCMBitrateMargin = rate_control_param->target_percentage * 128 / 100; 654dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (rate_control_param->window_size != 0) 655dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BufferSize = ctx->sRCParams.BitsPerSecond * rate_control_param->window_size / 1000; 656dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (rate_control_param->initial_qp != 0) 657dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.InitialQp = rate_control_param->initial_qp; 658dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (rate_control_param->min_qp != 0) 659dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.MinQP = rate_control_param->min_qp; 660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 661dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((bit_rate == ctx->sRCParams.BitsPerSecond) || (bit_rate == 0)) { 662dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BitsPerSecond += ctx->delta_change; 663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->delta_change *= -1; 664dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 665dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BitsPerSecond = bit_rate; 666dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 668dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 6692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 6702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case VAEncMiscParameterTypeMaxSliceSize: 671dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun max_slice_size_param = (VAEncMiscParameterMaxSliceSize *)pBuffer->data; 6722f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 673bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (max_slice_size_param->max_slice_size > INT_MAX || 674bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (max_slice_size_param->max_slice_size != 0 && 675bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang max_slice_size_param->max_slice_size < WORST_CASE_SLICE_HEADER_SIZE)) { 676dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 677dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 678dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 679dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6803f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang if (max_slice_size_param->max_slice_size != 0) 6813f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang max_slice_size_param->max_slice_size -= WORST_CASE_SLICE_HEADER_SIZE; 6822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 683dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ctx->max_slice_size == max_slice_size_param->max_slice_size) 684dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 685dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 686c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Max slice size changed to %d\n", 687dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun max_slice_size_param->max_slice_size); 6882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->max_slice_size = max_slice_size_param->max_slice_size; 6902f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 691dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 6922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 6932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case VAEncMiscParameterTypeAIR: 694dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun air_param = (VAEncMiscParameterAIR *)pBuffer->data; 695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 696dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (air_param->air_num_mbs > 65535 || 697bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang air_param->air_threshold > 65535) { 698dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 699dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 700dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 7012f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 702c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "air slice size changed to num_air_mbs %d " 703dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun "air_threshold %d, air_auto %d\n", 704dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun air_param->air_num_mbs, air_param->air_threshold, 705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun air_param->air_auto); 7062f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 707dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (((ctx->Height * ctx->Width) >> 8) < air_param->air_num_mbs) 708dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun air_param->air_num_mbs = ((ctx->Height * ctx->Width) >> 8); 709dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (air_param->air_threshold == 0) 710c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: air threshold is set to zero\n", 711dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun __FUNCTION__); 712dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->num_air_mbs = air_param->air_num_mbs; 713dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->air_threshold = air_param->air_threshold; 714dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->autotune_air_flag = air_param->air_auto; 7152f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 716dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 7172f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 7182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang default: 719dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = VA_STATUS_ERROR_UNKNOWN; 720dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DEBUG_FAILURE; 721dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 7222f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 7232f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 724dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(obj_buffer->buffer_data); 7252f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_buffer->buffer_data = NULL; 726dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return vaStatus; 7282f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang} 7292f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 7307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H264ES_RenderPicture( 7317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_context_p obj_context, 7327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p *buffers, 7337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int num_buffers) 7347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 7357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_CONTEXT_H264ES; 7367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 7377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 738dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 739c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264ES_RenderPicture\n"); 7407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 741dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < num_buffers; i++) { 7427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer = buffers[i]; 7437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 744dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (obj_buffer->type) { 7457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case VAEncSequenceParameterBufferType: 746c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264_RenderPicture got VAEncSequenceParameterBufferType\n"); 7477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = lnc__H264ES_process_sequence_param(ctx, obj_buffer); 7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE; 7497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case VAEncPictureParameterBufferType: 752c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264_RenderPicture got VAEncPictureParameterBuffer\n"); 7537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = lnc__H264ES_process_picture_param(ctx, obj_buffer); 7547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE; 7557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case VAEncSliceParameterBufferType: 758c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264_RenderPicture got VAEncSliceParameterBufferType\n"); 7597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = lnc__H264ES_process_slice_param(ctx, obj_buffer); 7607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE; 7617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 763dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VAEncMiscParameterBufferType: 764c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264_RenderPicture got VAEncMiscParameterBufferType\n"); 765dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = lnc__H264ES_process_misc_param(ctx, obj_buffer); 766dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DEBUG_FAILURE; 767dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 7682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 7697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 7707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_UNKNOWN; 7717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE; 7727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 773dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (vaStatus != VA_STATUS_SUCCESS) { 7747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 7797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 7807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H264ES_EndPicture( 7827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_context_p obj_context) 7837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 7847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_CONTEXT_H264ES; 7857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 7867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 787c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264ES_EndPicture\n"); 7887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = lnc_EndPicture(ctx); 7907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 7927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 7937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct format_vtable_s lnc_H264ES_vtable = { 796dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunqueryConfigAttributes: 797dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H264ES_QueryConfigAttributes, 798dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvalidateConfig: 799dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H264ES_ValidateConfig, 800dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuncreateContext: 801dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H264ES_CreateContext, 802dc1209519284865899ca8d990b3a2c7dbca8ae08wangkundestroyContext: 803dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H264ES_DestroyContext, 804dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunbeginPicture: 805dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H264ES_BeginPicture, 806dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunrenderPicture: 807dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H264ES_RenderPicture, 808dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunendPicture: 809dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H264ES_EndPicture 8107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}; 8112f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 8124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic inline void lnc_H264_append_EOSEQ(unsigned char *p_buf, unsigned int *p_size) 8132f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{ 8142f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang /*nal_ref_idc should be 0 and nal_ref_idc should be 10 for End of Sequence RBSP*/ 8152f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang const unsigned char EOSEQ[] = {0x00, 0x00, 0x00, 0x01, 0xa}; 816c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Append %d bytes of End of Sequence RBSP at offset %d\n", 817dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sizeof(EOSEQ), *p_size); 818c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Previous 4 bytes: %x %x %x %x\n", *(p_buf - 3), *(p_buf - 2), *(p_buf - 1), *(p_buf)); 8192f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang p_buf += *p_size; 8202f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang memcpy(p_buf, &EOSEQ[0], sizeof(EOSEQ)); 821c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "After 4 bytes: %x %x %x %x\n", *(p_buf + 1), *(p_buf + 2), *(p_buf + 3), *(p_buf + 4)); 8222f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang *p_size += sizeof(EOSEQ); 8232f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang} 8242f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 8254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic inline void lnc_H264_append_EOSTREAM(unsigned char *p_buf, unsigned int *p_size) 8262f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{ 8272f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang /*nal_ref_idc should be 0 and nal_ref_idc should be 11 for End of Stream RBSP*/ 8282f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang const unsigned char EOSTREAM[] = {0x00, 0x00, 0x00, 0x01, 0xb}; 829c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Append %d bytes of End of Stream RBSP.\n", 830dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sizeof(EOSTREAM)); 8312f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang p_buf += *p_size; 8322f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang memcpy(p_buf, EOSTREAM, sizeof(EOSTREAM)); 8332f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang *p_size += sizeof(EOSTREAM); 8342f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang} 8352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 8362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei JiangVAStatus lnc_H264_append_aux_info(object_context_p obj_context, 837dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_buffer_p obj_buffer, 838dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *buf, 839dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int *p_size) 8402f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{ 8412f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang INIT_CONTEXT_H264ES; 8422f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang struct coded_buf_aux_info *p_aux_info; 8432f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang struct coded_buf_aux_info *p_prev_aux_info; 8442f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 845dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == ctx->p_coded_buf_info || 846bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (ctx->eCodec != IMG_CODEC_H264_VBR 847bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang && ctx->eCodec != IMG_CODEC_H264_CBR 848bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang && ctx->eCodec != IMG_CODEC_H264_NO_RC)) 849dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_SUCCESS; 8502f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 8512f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ASSERT(obj_buffer); 8522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ASSERT(buf); 8532f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ASSERT(p_size); 8542f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 8552f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang p_aux_info = ctx->p_coded_buf_info; 8562f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang p_prev_aux_info = ctx->p_coded_buf_info; 857dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (p_aux_info != NULL) { 858dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*Check if we need to append NAL to this coded buffer*/ 859dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (p_aux_info->buf == obj_buffer) 860dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 861dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_prev_aux_info = p_aux_info; 862dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_aux_info = p_aux_info->next; 8632f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 8642f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 865dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL != p_aux_info) { 866c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "coded_buf_aux_info 0x%08x\n", p_aux_info->aux_flag); 867dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (0 != (p_aux_info->aux_flag & CODED_BUFFER_EOSEQ_FLAG)) 868dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H264_append_EOSEQ(buf, p_size); 8692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 870dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (0 != (p_aux_info->aux_flag & CODED_BUFFER_EOSTREAM_FLAG)) 871dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H264_append_EOSTREAM(buf, p_size); 8722f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 873dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (p_aux_info == ctx->p_coded_buf_info) 874dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->p_coded_buf_info = p_aux_info->next; 875dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 876dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_prev_aux_info->next = p_aux_info->next; 8772f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 878dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(p_aux_info); 8792f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 8802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang return VA_STATUS_SUCCESS; 8812f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang} 882