1437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK 4437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * 5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a 6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the 7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including 8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish, 9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to 10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to 11f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions: 123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * 13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the 14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions 15f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software. 163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * 17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * 25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors: 26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Elaine Wang <elaine.wang@intel.com> 27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Zeng Li <zeng.li@intel.com> 28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * 29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */ 30437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 31437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_def.h" 32c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h" 33437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_surface.h" 34437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_cmdbuf.h" 35437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_MPEG4ES.h" 36437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_hostcode.h" 37437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_hostheader.h" 38437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 39437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdlib.h> 40437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdint.h> 41437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <string.h> 42437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 43437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 44437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define TOPAZ_MPEG4_MAX_BITRATE 16000000 45437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 46bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define INIT_CONTEXT_MPEG4ES context_ENC_p ctx = (context_ENC_p) obj_context->format_data 47437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id )) 48437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define BUFFER(id) ((object_buffer_p) object_heap_lookup( &ctx->obj_context->driver_data->buffer_heap, id )) 49437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 50437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 51437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 52437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void pnw_MPEG4ES_QueryConfigAttributes( 53cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VAProfile __maybe_unused profile, 54cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VAEntrypoint __maybe_unused entrypoint, 55cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VAConfigAttrib * attrib_list, 56dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int num_attribs) 57437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 58437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int i; 59437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 60c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_QueryConfigAttributes\n"); 61437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 62437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* RateControl attributes */ 63437b3eda28a4bf098efa80598cab67f190275266Fei Jiang for (i = 0; i < num_attribs; i++) { 64437b3eda28a4bf098efa80598cab67f190275266Fei Jiang switch (attrib_list[i].type) { 65437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAConfigAttribRTFormat: 66437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 67dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 68437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAConfigAttribRateControl: 69437b3eda28a4bf098efa80598cab67f190275266Fei Jiang attrib_list[i].value = VA_RC_NONE | VA_RC_CBR | VA_RC_VBR; 70437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 72437b3eda28a4bf098efa80598cab67f190275266Fei Jiang default: 73437b3eda28a4bf098efa80598cab67f190275266Fei Jiang attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED; 74437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 75437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 76437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 78437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return; 79437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 80437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 81437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 82437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG4ES_ValidateConfig( 83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_config_p obj_config) 84437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 85242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang int i; 86242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang /* Check all attributes */ 87242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang for (i = 0; i < obj_config->attrib_count; i++) { 883f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang switch (obj_config->attrib_list[i].type) { 893f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang case VAConfigAttribRTFormat: 903f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang /* Ignore */ 913f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang break; 923f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang case VAConfigAttribRateControl: 933f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang break; 943f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang default: 953f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED; 963f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang } 973f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang } 98242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang 99242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang return VA_STATUS_SUCCESS; 100437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 101437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 102437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 103437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG4ES_CreateContext( 104437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context, 105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_config_p obj_config) 106437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 107437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 108437b3eda28a4bf098efa80598cab67f190275266Fei Jiang context_ENC_p ctx; 109437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int i; 110437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int eRCmode; 111437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 112c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_CreateContext\n"); 113437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 114437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw_CreateContext(obj_context, obj_config, 0); 115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS != vaStatus) 116437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 117437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 118437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx = (context_ENC_p) obj_context->format_data; 119437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 120437b3eda28a4bf098efa80598cab67f190275266Fei Jiang for (i = 0; i < obj_config->attrib_count; i++) { 121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_config->attrib_list[i].type == VAConfigAttribRateControl) 122437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 123437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 124437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 125437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (i >= obj_config->attrib_count) 126437b3eda28a4bf098efa80598cab67f190275266Fei Jiang eRCmode = VA_RC_NONE; 127437b3eda28a4bf098efa80598cab67f190275266Fei Jiang else 128437b3eda28a4bf098efa80598cab67f190275266Fei Jiang eRCmode = obj_config->attrib_list[i].value; 129437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 130437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 131437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (eRCmode == VA_RC_VBR) { 132437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->eCodec = IMG_CODEC_MPEG4_VBR; 133437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.RCEnable = IMG_TRUE; 134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (eRCmode == VA_RC_CBR) { 135437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->eCodec = IMG_CODEC_MPEG4_CBR; 136437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.RCEnable = IMG_TRUE; 137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (eRCmode == VA_RC_NONE) { 138437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->eCodec = IMG_CODEC_MPEG4_NO_RC; 139437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.RCEnable = IMG_FALSE; 140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 141437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT; 142437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->eFormat = IMG_CODEC_PL12; 143437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 144437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->Slices = 1; 145437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->ParallelCores = 1; 146437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 147437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->IPEControl = pnw__get_ipe_control(ctx->eCodec); 148437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (obj_config->profile) { 150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VAProfileMPEG4Simple: 151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->profile_idc = 2; 152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VAProfileMPEG4AdvancedSimple: 154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->profile_idc = 3; 155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->profile_idc = 2; 158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 159437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 160437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 161437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 162437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 163437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 164437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 165437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void pnw_MPEG4ES_DestroyContext( 166437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context) 167437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 168c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_DestroyPicture\n"); 169437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_DestroyContext(obj_context); 171437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 173437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG4ES_BeginPicture( 174437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context) 175437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 176437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_CONTEXT_MPEG4ES; 177437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 178437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 179c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_BeginPicture\n"); 180437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 181437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw_BeginPicture(ctx); 182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 183437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 184437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 185437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 186437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__MPEG4ES_process_sequence_param(context_ENC_p ctx, object_buffer_p obj_buffer) 187437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 188437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 189437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAEncSequenceParameterBufferMPEG4 *seq_params; 190437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_p cmdbuf = ctx->obj_context->pnw_cmdbuf; 191437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MPEG4_PROFILE_TYPE profile; 192e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying int i, vop_time_increment_resolution; 193176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding unsigned frame_size; 194437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 195437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(obj_buffer->type == VAEncSequenceParameterBufferType); 196437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(obj_buffer->num_elements == 1); 197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(obj_buffer->size == sizeof(VAEncSequenceParameterBufferMPEG4)); 198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 199f31d5416a60f83e184b0906a7ec77ba021840531hding //initialize the frame_rate and qp 200f31d5416a60f83e184b0906a7ec77ba021840531hding ctx->sRCParams.InitialQp = 15; 201f31d5416a60f83e184b0906a7ec77ba021840531hding ctx->sRCParams.MinQP = 1; 202f31d5416a60f83e184b0906a7ec77ba021840531hding ctx->sRCParams.FrameRate = 30; 203f31d5416a60f83e184b0906a7ec77ba021840531hding 204437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if ((obj_buffer->num_elements != 1) || 205bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (obj_buffer->size != sizeof(VAEncSequenceParameterBufferMPEG4))) { 206437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_ERROR_UNKNOWN; 207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 208437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 209437b3eda28a4bf098efa80598cab67f190275266Fei Jiang seq_params = (VAEncSequenceParameterBufferMPEG4 *) obj_buffer->buffer_data; 210437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 211437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->size = 0; 212437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (seq_params->bits_per_second > TOPAZ_MPEG4_MAX_BITRATE) { 214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BitsPerSecond = TOPAZ_MPEG4_MAX_BITRATE; 215c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, " bits_per_second(%d) exceeds \ 216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun the maximum bitrate, set it with %d\n", 217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun seq_params->bits_per_second, 218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun TOPAZ_MPEG4_MAX_BITRATE); 219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->sRCParams.BitsPerSecond = seq_params->bits_per_second; 221437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 222e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying ctx->sRCParams.FrameRate = (seq_params->frame_rate < 1) ? 223e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying 1 : ((65535 < seq_params->frame_rate) ? 65535 : seq_params->frame_rate); 224437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.InitialQp = seq_params->initial_qp; 225437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.MinQP = seq_params->min_qp; 226bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang ctx->sRCParams.BUSize = 0; /* default 0, and will be set in pnw__setup_busize */ 227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 228437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.Slices = 1; 229437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.QCPOffset = 0;/* FIXME */ 2305cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang 2315cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang if (ctx->sRCParams.IntraFreq != seq_params->intra_period 2325cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang && ctx->raw_frame_count != 0 2335cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang && ctx->sRCParams.IntraFreq != 0 2345cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang && ((ctx->obj_context->frame_count + 1) % ctx->sRCParams.IntraFreq) != 0 2355cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang && (!ctx->sRCParams.bDisableFrameSkipping)) { 2365cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang drv_debug_msg(VIDEO_DEBUG_ERROR, 2375cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang "Changing intra period value in the middle of a GOP is\n" 2385cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang "not allowed if frame skip isn't disabled.\n" 2395cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang "it can cause I frame been skipped\n"); 2405cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang free(seq_params); 2415cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang return VA_STATUS_ERROR_INVALID_PARAMETER; 2425cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang } 2435cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang else 2445cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang ctx->sRCParams.IntraFreq = seq_params->intra_period; 2455cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang 246437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->sRCParams.IntraFreq = seq_params->intra_period; 247437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 248176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding frame_size = ctx->sRCParams.BitsPerSecond / ctx->sRCParams.FrameRate; 249437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 2502befccec034c13d34746a9e87149889d59ac767bFei Jiang ctx->sRCParams.BufferSize = ctx->sRCParams.BitsPerSecond; 251176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding /* Header buffersize is specified in 16384 units, so ensure conformance 252176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding of parameters. InitialLevel in units of 64, assured by this */ 253176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding 254176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.BufferSize /= 16384; 255176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.BufferSize *= 16384; 256437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 257176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.InitialLevel = (3 * ctx->sRCParams.BufferSize) >> 4; 258176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding /* Aligned with target frame size */ 259176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.InitialLevel += (frame_size / 2); 260176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.InitialLevel /= frame_size; 261176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.InitialLevel *= frame_size; 262176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->sRCParams.InitialDelay = ctx->sRCParams.BufferSize - ctx->sRCParams.InitialLevel; 263176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding ctx->buffer_size = ctx->sRCParams.BufferSize; 264176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding 265176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding if (ctx->raw_frame_count == 0) { /* Add Register IO behind begin Picture */ 266176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding for (i = (ctx->ParallelCores - 1); i >= 0; i--) 267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_set_bias(ctx, i); 268437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 269437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 270437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf = ctx->obj_context->pnw_cmdbuf; 271437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (ctx->profile_idc) { 273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case 2: 274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun profile = SP; 275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case 3: 277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun profile = ASP; 278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun profile = SP; 281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 282437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 284e968fbfc452194dd51c12901ffa338c312a5e3c7Fei Jiang memset(cmdbuf->header_mem_p + ctx->seq_header_ofs, 285dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, 286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HEADER_SIZE); 287e968fbfc452194dd51c12901ffa338c312a5e3c7Fei Jiang 288e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying vop_time_increment_resolution = (seq_params->vop_time_increment_resolution < 1) ? 1 : 289e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying ((65535 < seq_params->vop_time_increment_resolution) ? 65535 : seq_params->vop_time_increment_resolution); 290437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw__MPEG4_prepare_sequence_header( 291437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->header_mem_p + ctx->seq_header_ofs, 292437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 0, /* BFrame? */ 293437b3eda28a4bf098efa80598cab67f190275266Fei Jiang profile, /* sProfile */ 294437b3eda28a4bf098efa80598cab67f190275266Fei Jiang seq_params->profile_and_level_indication, /* */ 295437b3eda28a4bf098efa80598cab67f190275266Fei Jiang seq_params->fixed_vop_time_increment, /*3,*/ /* sFixed_vop_time_increment */ 296437b3eda28a4bf098efa80598cab67f190275266Fei Jiang seq_params->video_object_layer_width,/* Picture_Width_Pixels */ 297437b3eda28a4bf098efa80598cab67f190275266Fei Jiang seq_params->video_object_layer_height, /* Picture_Height_Pixels */ 298437b3eda28a4bf098efa80598cab67f190275266Fei Jiang NULL, 299e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying vop_time_increment_resolution); /* VopTimeResolution */ 300437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 301e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying ctx->MPEG4_vop_time_increment_resolution = vop_time_increment_resolution; 302437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 303437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_insert_command_package(ctx->obj_context, 304437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->ParallelCores - 1, /* Send to the last core as this will complete first */ 305437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MTX_CMDID_DO_HEADER, 306437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &cmdbuf->header_mem, 307437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->seq_header_ofs); 308437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 309437b3eda28a4bf098efa80598cab67f190275266Fei Jiang free(seq_params); 310437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 311437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 312437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 313437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 314437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__MPEG4ES_process_picture_param(context_ENC_p ctx, object_buffer_p obj_buffer) 315437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 316437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 317437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAEncPictureParameterBufferMPEG4 *pBuffer; 318437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_p cmdbuf = ctx->obj_context->pnw_cmdbuf; 319e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned int *pPictureHeaderMem; 320437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MTX_HEADER_PARAMS *psPicHeader; 321437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int i; 3222befccec034c13d34746a9e87149889d59ac767bFei Jiang IMG_BOOL bIsVOPCoded = IMG_TRUE; 323437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 324437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(obj_buffer->type == VAEncPictureParameterBufferType); 325437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((obj_buffer->num_elements != 1) || 327bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (obj_buffer->size != sizeof(VAEncPictureParameterBufferMPEG4))) { 328437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return VA_STATUS_ERROR_UNKNOWN; 329437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 330437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 331437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Transfer ownership of VAEncPictureParameterBufferMPEG4 data */ 332437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pBuffer = (VAEncPictureParameterBufferMPEG4 *) obj_buffer->buffer_data; 333437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 334437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->size = 0; 335437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 336437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->ref_surface = SURFACE(pBuffer->reference_picture); 337437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->dest_surface = SURFACE(pBuffer->reconstructed_picture); 338437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->coded_buf = BUFFER(pBuffer->coded_buf); 339437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 340437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(ctx->Width == pBuffer->picture_width); 341437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(ctx->Height == pBuffer->picture_height); 342437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 3432befccec034c13d34746a9e87149889d59ac767bFei Jiang /*if (ctx->sRCParams.RCEnable && ctx->sRCParams.FrameSkip) 344bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang bIsVOPCoded = IMG_FALSE;*/ 3452befccec034c13d34746a9e87149889d59ac767bFei Jiang 346437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->FCode = 4 - 1; /* 4 is default value of "ui8Search_range" */ 347437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 348e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang pPictureHeaderMem = (unsigned int *)(cmdbuf->header_mem_p + ctx->pic_header_ofs); 349437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psPicHeader = (MTX_HEADER_PARAMS *)pPictureHeaderMem; 350437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 351e968fbfc452194dd51c12901ffa338c312a5e3c7Fei Jiang memset(pPictureHeaderMem, 0, HEADER_SIZE); 352e968fbfc452194dd51c12901ffa338c312a5e3c7Fei Jiang 353e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang pnw__MPEG4_prepare_vop_header((unsigned char *)pPictureHeaderMem, 3542befccec034c13d34746a9e87149889d59ac767bFei Jiang bIsVOPCoded, 355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->vop_time_increment, /* In testbench, this should be FrameNum */ 356437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 4,/* default value is 4,search range */ 357437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pBuffer->picture_type, 358437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->MPEG4_vop_time_increment_resolution/* defaule value */); 359437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 360437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Mark this header as a complex header */ 361437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psPicHeader->Elements |= 0x100; 362dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPictureHeaderMem += ((HEADER_SIZE) >> 3); 363437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 364e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang pnw__MPEG4_prepare_vop_header((unsigned char *)pPictureHeaderMem, 365437b3eda28a4bf098efa80598cab67f190275266Fei Jiang IMG_FALSE, 366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->vop_time_increment, /* In testbench, this should be FrameNum */ 367437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 4,/* default value is 4,search range */ 368437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pBuffer->picture_type, 369437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->MPEG4_vop_time_increment_resolution/* defaule value */); 370437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 371437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_insert_command_package(ctx->obj_context, 372437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->ParallelCores - 1, /* Send to the last core as this will complete first */ 373437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MTX_CMDID_DO_HEADER, 374437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &cmdbuf->header_mem, 375437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->pic_header_ofs); 376437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 377437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Prepare START_PICTURE params */ 378dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = (ctx->ParallelCores - 1); i >= 0; i--) 379437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw_RenderPictureParameter(ctx, i); 380437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 381437b3eda28a4bf098efa80598cab67f190275266Fei Jiang free(pBuffer); 382437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 383437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 384437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 385437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__MPEG4ES_process_slice_param(context_ENC_p ctx, object_buffer_p obj_buffer) 386437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 387437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 388437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAEncSliceParameterBuffer *pBuffer; 389437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_p cmdbuf = ctx->obj_context->pnw_cmdbuf; 390437b3eda28a4bf098efa80598cab67f190275266Fei Jiang PIC_PARAMS *psPicParams = (PIC_PARAMS *)(cmdbuf->pic_params_p); 391e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned int i; 3924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int slice_param_idx; 393437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 394437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(obj_buffer->type == VAEncSliceParameterBufferType); 395437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 396437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pBuffer = (VAEncSliceParameterBuffer *) obj_buffer->buffer_data; 3972befccec034c13d34746a9e87149889d59ac767bFei Jiang 3984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /*In case the slice number changes*/ 399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((ctx->slice_param_cache != NULL) && (obj_buffer->num_elements != ctx->slice_param_num)) { 400c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Slice number changes. Previous value is %d. Now it's %d\n", 401dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num, obj_buffer->num_elements); 402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(ctx->slice_param_cache); 403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_cache = NULL; 404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num = 0; 4054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 4064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == ctx->slice_param_cache) { 408c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate %d VAEncSliceParameterBuffer cache buffers\n", 2 * ctx->slice_param_num); 409dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_num = obj_buffer->num_elements; 410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->slice_param_cache = calloc(2 * ctx->slice_param_num, sizeof(VAEncSliceParameterBuffer)); 411dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == ctx->slice_param_cache) { 412c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Run out of memory!\n"); 413dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(obj_buffer->buffer_data); 414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_ALLOCATION_FAILED; 415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 4174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 419dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < obj_buffer->num_elements; i++) { 420437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 421437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned char deblock_idc; 422437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 423437b3eda28a4bf098efa80598cab67f190275266Fei Jiang deblock_idc = pBuffer->slice_flags.bits.disable_deblocking_filter_idc; 424437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 425437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if ((pBuffer->start_row_number == 0) && pBuffer->slice_flags.bits.is_intra) { 426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_reset_encoder_params(ctx); 427dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->BelowParamsBufIdx = (ctx->BelowParamsBufIdx + 1) & 0x1; 428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*The corresponding slice buffer cache*/ 431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun slice_param_idx = (pBuffer->slice_flags.bits.is_intra ? 0 : 1) * ctx->slice_param_num + i; 432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 433dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VAEncSliceParameter_Equal(&ctx->slice_param_cache[slice_param_idx], pBuffer) == 0) { 434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* cache current param parameters */ 435dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(&ctx->slice_param_cache[slice_param_idx], 436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer, sizeof(VAEncSliceParameterBuffer)); 437dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Setup InParams value*/ 439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_setup_slice_params(ctx, 440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->start_row_number * 16, 441bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang pBuffer->slice_height * 16, 442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->slice_flags.bits.is_intra, 443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx->obj_context->frame_count > 0, 444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psPicParams->sInParams.SeInitQP); 445437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 446437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw__send_encode_slice_params(ctx, 448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->slice_flags.bits.is_intra, 449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer->start_row_number * 16, 450437b3eda28a4bf098efa80598cab67f190275266Fei Jiang deblock_idc, 451437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->obj_context->frame_count, 452bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang pBuffer->slice_height * 16, 453437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->obj_context->slice_count); 454437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 455c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Now frame_count/slice_count is %d/%d\n", 456437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->obj_context->frame_count, ctx->obj_context->slice_count); 457437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 458437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->obj_context->slice_count++; 459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pBuffer++; 460437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(ctx->obj_context->slice_count < MAX_SLICES_PER_PICTURE); 462437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 463437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang free(obj_buffer->buffer_data); 465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 466dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 471437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG4ES_RenderPicture( 472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context, 473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_buffer_p *buffers, 474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int num_buffers) 475437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 476437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_CONTEXT_MPEG4ES; 477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 478437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int i; 479dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 480c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_RenderPicture\n"); 481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 482dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < num_buffers; i++) { 483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_buffer_p obj_buffer = buffers[i]; 484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 485437b3eda28a4bf098efa80598cab67f190275266Fei Jiang switch (obj_buffer->type) { 486437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAEncSequenceParameterBufferType: 487c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_RenderPicture got VAEncSequenceParameterBufferType\n"); 488437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw__MPEG4ES_process_sequence_param(ctx, obj_buffer); 489437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 490437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 491dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 492437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAEncPictureParameterBufferType: 493c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_RenderPicture got VAEncPictureParameterBufferType\n"); 494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw__MPEG4ES_process_picture_param(ctx, obj_buffer); 495437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 496437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 498437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAEncSliceParameterBufferType: 499c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_RenderPicture got VAEncSliceParameterBufferType\n"); 500437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = pnw__MPEG4ES_process_slice_param(ctx, obj_buffer); 501437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 502437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 503437b3eda28a4bf098efa80598cab67f190275266Fei Jiang default: 504437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = VA_STATUS_ERROR_UNKNOWN; 505437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 506437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 507437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 508dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 509437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 510437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 511437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 512437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG4ES_EndPicture( 513437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context) 514437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 515437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_CONTEXT_MPEG4ES; 516437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 517c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_EndPicture\n"); 518437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return pnw_EndPicture(ctx); 519437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 520437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 521437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 522437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstruct format_vtable_s pnw_MPEG4ES_vtable = { 523dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunqueryConfigAttributes: 524dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_MPEG4ES_QueryConfigAttributes, 525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvalidateConfig: 526dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_MPEG4ES_ValidateConfig, 527dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuncreateContext: 528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_MPEG4ES_CreateContext, 529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkundestroyContext: 530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_MPEG4ES_DestroyContext, 531dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunbeginPicture: 532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_MPEG4ES_BeginPicture, 533dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunrenderPicture: 534dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_MPEG4ES_RenderPicture, 535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunendPicture: 536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_MPEG4ES_EndPicture 537437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}; 538