125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang/* 225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Copyright (C) 2012 Intel Corporation. All rights reserved. 325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * 425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Licensed under the Apache License, Version 2.0 (the "License"); 525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * you may not use this file except in compliance with the License. 625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * You may obtain a copy of the License at 725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * 825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * http://www.apache.org/licenses/LICENSE-2.0 925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * 1025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Unless required by applicable law or agreed to in writing, software 1125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * distributed under the License is distributed on an "AS IS" BASIS, 1225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * See the License for the specific language governing permissions and 1425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * limitations under the License. 1525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * 1625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang */ 1725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <cutils/properties.h> 1825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <system/graphics.h> 1925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include "isv_worker.h" 2025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifndef TARGET_VPP_USE_GEN 2125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <hal_public.h> 2225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#else 2325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <ufo/graphics.h> 2425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif 2525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 2625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang//#define LOG_NDEBUG 0 2725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#undef LOG_TAG 2825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define LOG_TAG "isv-omxil" 2925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 3025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define CHECK_VASTATUS(str) \ 3125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang do { \ 3225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (vaStatus != VA_STATUS_SUCCESS) { \ 3325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("%s failed\n", str); \ 3425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR;} \ 3525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang }while(0); 3625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 3725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangenum STRENGTH { 3825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang STRENGTH_LOW = 0, 3925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang STRENGTH_MEDIUM, 4025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang STRENGTH_HIGH 4125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang}; 4225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 4325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define DENOISE_DEBLOCK_STRENGTH STRENGTH_MEDIUM 4425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define COLOR_STRENGTH STRENGTH_MEDIUM 4525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifdef TARGET_VPP_USE_GEN 4625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define COLOR_NUM 4 4725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#else 4825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define COLOR_NUM 2 4925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif 5025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 5125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define MAX_FRC_OUTPUT 4 /*for frcx4*/ 5225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 5325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangusing namespace android; 5425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 5525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui WangISVWorker::ISVWorker() 5625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang :mNumForwardReferences(0), 5725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mVAContext(VA_INVALID_ID), 5825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mWidth(0), mHeight(0), 5925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mDisplay(NULL), mVADisplay(NULL), 6025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mVAConfig(VA_INVALID_ID), 6125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mForwardReferences(NULL), 6225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mPrevInput(0), mPrevOutput(0), 6325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mNumFilterBuffers(0), 6425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterFrc(VA_INVALID_ID), mFilters(0), 6525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mInputIndex(0), mOutputIndex(0), 6625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mOutputCount(0) { 6725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang memset(&mFilterBuffers, VA_INVALID_ID, VAProcFilterCount * sizeof(VABufferID)); 6825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang memset(&mFilterParam, 0, sizeof(mFilterParam)); 6925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 7025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 7125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangbool ISVWorker::isSupport() const { 7225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang bool support = false; 7325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 7425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang int num_entrypoints = vaMaxNumEntrypoints(mVADisplay); 7525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAEntrypoint * entrypoints = (VAEntrypoint *)malloc(num_entrypoints * sizeof(VAEntrypoint)); 7625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (entrypoints == NULL) { 7725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("failed to malloc entrypoints array\n"); 7825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return false; 7925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 8025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 8125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // check if it contains VPP entry point VAEntrypointVideoProc 8225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAStatus vaStatus = vaQueryConfigEntrypoints(mVADisplay, VAProfileNone, entrypoints, &num_entrypoints); 8325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (vaStatus != VA_STATUS_SUCCESS) { 8425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("vaQueryConfigEntrypoints failed"); 8525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return false; 8625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 8725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (int i = 0; !support && i < num_entrypoints; i++) { 8825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang support = entrypoints[i] == VAEntrypointVideoProc; 8925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 9025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang free(entrypoints); 9125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang entrypoints = NULL; 9225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 9325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return support; 9425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 9525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 9625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wanguint32_t ISVWorker::getProcBufCount() { 9725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return getOutputBufCount(mInputIndex); 9825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 9925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 10025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wanguint32_t ISVWorker::getFillBufCount() { 10125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return getOutputBufCount(mOutputIndex); 10225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 10325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 10425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wanguint32_t ISVWorker::getOutputBufCount(uint32_t index) { 10525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t bufCount = 1; 10625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (((mFilters & FilterFrameRateConversion) != 0) 10725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang && index > 0) 10825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang bufCount = mFilterParam.frcRate - (((mFilterParam.frcRate == FRC_RATE_2_5X) ? (index & 1): 0)); 10925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return bufCount; 11025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 11125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 11225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 11325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatus_t ISVWorker::init(uint32_t width, uint32_t height) { 11425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("init"); 11525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 11625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mDisplay != NULL) { 11725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("VA is particially started"); 11825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 11925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 12025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mDisplay = new Display; 12125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *mDisplay = ANDROID_DISPLAY_HANDLE; 12225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 12325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mVADisplay = vaGetDisplay(mDisplay); 12425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mVADisplay == NULL) { 12525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("vaGetDisplay failed"); 12625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 12725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 12825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 12925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang int majorVersion, minorVersion; 13025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAStatus vaStatus = vaInitialize(mVADisplay, &majorVersion, &minorVersion); 13125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaInitialize"); 13225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 13325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Check if VPP entry point is supported 13425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (!isSupport()) { 13525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("VPP is not supported on current platform"); 13625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_NOT_SUPPORT; 13725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 13825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 13925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Find out the format for the target 14025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAConfigAttrib attrib; 14125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang attrib.type = VAConfigAttribRTFormat; 14225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaGetConfigAttributes(mVADisplay, VAProfileNone, VAEntrypointVideoProc, &attrib, 1); 14325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaGetConfigAttributes"); 14425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 14525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if ((attrib.value & VA_RT_FORMAT_YUV420) == 0) { 14625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("attribute is %x vs wanted %x", attrib.value, VA_RT_FORMAT_YUV420); 14725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_NOT_SUPPORT; 14825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 14925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 15025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("ready to create config"); 15125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Create the configuration 15225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaCreateConfig(mVADisplay, VAProfileNone, VAEntrypointVideoProc, &attrib, 1, &mVAConfig); 15325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaCreateConfig"); 15425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 15525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 15625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Create Context 15725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("ready to create context"); 15825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mWidth = width; 15925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mHeight = height; 16025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaCreateContext(mVADisplay, mVAConfig, mWidth, mHeight, 0, NULL, 0, &mVAContext); 16125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaCreateContext"); 16225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 16325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("VA has been successfully started"); 16425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_OK; 16525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 16625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 16725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatus_t ISVWorker::deinit() { 16825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang { 16925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang Mutex::Autolock autoLock(mPipelineBufferLock); 17025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang while (!mPipelineBuffers.isEmpty()) { 17125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VABufferID pipelineBuffer = mPipelineBuffers.itemAt(0); 17225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (VA_STATUS_SUCCESS != vaDestroyBuffer(mVADisplay, pipelineBuffer)) 17325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGW("%s: failed to destroy va buffer id %d", __func__, pipelineBuffer); 17425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mPipelineBuffers.removeAt(0); 17525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 17625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 17725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 17825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mNumFilterBuffers != 0) { 17925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (uint32_t i = 0; i < mNumFilterBuffers; i++) { 18025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if(VA_STATUS_SUCCESS != vaDestroyBuffer(mVADisplay, mFilterBuffers[i])) 18125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGW("%s: failed to destroy va buffer id %d", __func__, mFilterBuffers[i]); 18225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 18325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mNumFilterBuffers = 0; 18425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang memset(&mFilterBuffers, VA_INVALID_ID, VAProcFilterCount * sizeof(VABufferID)); 18525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterFrc = VA_INVALID_ID; 18625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 18725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 18825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mForwardReferences != NULL) { 18925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang free(mForwardReferences); 19025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mForwardReferences = NULL; 19125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mNumForwardReferences = 0; 19225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 19325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 19425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mVAContext != VA_INVALID_ID) { 19525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaDestroyContext(mVADisplay, mVAContext); 19625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mVAContext = VA_INVALID_ID; 19725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 19825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 19925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mVAConfig != VA_INVALID_ID) { 20025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaDestroyConfig(mVADisplay, mVAConfig); 20125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mVAConfig = VA_INVALID_ID; 20225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 20325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 20425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mVADisplay) { 20525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaTerminate(mVADisplay); 20625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mVADisplay = NULL; 20725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 20825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 20925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mDisplay) { 21025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang delete mDisplay; 21125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mDisplay = NULL; 21225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 21325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 21425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_OK; 21525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 21625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 21725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatus_t ISVWorker::allocSurface(uint32_t* width, uint32_t* height, 218d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang uint32_t stride, uint32_t format, unsigned long handle, int32_t* surfaceId) 21925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 22025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mWidth == 0 || mHeight == 0) { 22125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("%s: isv worker has not been initialized.", __func__); 22225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 22325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 22425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 22525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifndef TARGET_VPP_USE_GEN 22625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *width = mWidth; 22725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *height = mHeight; 22825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif 22925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Create VASurfaces 23025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VASurfaceAttrib attribs[3]; 23125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VASurfaceAttribExternalBuffers vaExtBuf; 23225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 23325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang memset(&vaExtBuf, 0, sizeof(VASurfaceAttribExternalBuffers)); 23425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang switch(format) { 235aeb7b876641a50941ccd4ce270aa20a97f4d8420Austin Hu case HAL_PIXEL_FORMAT_YV12: 23625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.pixel_format = VA_FOURCC_YV12; 23725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.num_planes = 3; 23825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.pitches[0] = stride; 23925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.pitches[1] = stride / 2; 24025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.pitches[2] = stride / 2; 24125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.pitches[3] = 0; 24225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.offsets[0] = 0; 24325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.offsets[1] = stride * *height; 24425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.offsets[2] = vaExtBuf.offsets[1] + (stride / 2) * (*height / 2); 24525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.offsets[3] = 0; 24625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 247aeb7b876641a50941ccd4ce270aa20a97f4d8420Austin Hu case HAL_PIXEL_FORMAT_INTEL_YV12: 248aeb7b876641a50941ccd4ce270aa20a97f4d8420Austin Hu vaExtBuf.pixel_format = VA_FOURCC_YV12; 249aeb7b876641a50941ccd4ce270aa20a97f4d8420Austin Hu vaExtBuf.num_planes = 3; 250aeb7b876641a50941ccd4ce270aa20a97f4d8420Austin Hu vaExtBuf.pitches[0] = stride; 251aeb7b876641a50941ccd4ce270aa20a97f4d8420Austin Hu vaExtBuf.pitches[1] = stride / 2; 252aeb7b876641a50941ccd4ce270aa20a97f4d8420Austin Hu vaExtBuf.pitches[2] = stride / 2; 253aeb7b876641a50941ccd4ce270aa20a97f4d8420Austin Hu vaExtBuf.pitches[3] = 0; 254aeb7b876641a50941ccd4ce270aa20a97f4d8420Austin Hu vaExtBuf.offsets[0] = 0; 255aeb7b876641a50941ccd4ce270aa20a97f4d8420Austin Hu // The height of HAL_PIXEL_FORMAT_INTEL_YV12 gralloc buffer has been aligned with 32 pixels. 256aeb7b876641a50941ccd4ce270aa20a97f4d8420Austin Hu vaExtBuf.offsets[1] = stride * ((*height + 31) & ~31); 257aeb7b876641a50941ccd4ce270aa20a97f4d8420Austin Hu vaExtBuf.offsets[2] = vaExtBuf.offsets[1] + (stride / 2) * (((*height + 31) & ~31) / 2); 258aeb7b876641a50941ccd4ce270aa20a97f4d8420Austin Hu vaExtBuf.offsets[3] = 0; 259aeb7b876641a50941ccd4ce270aa20a97f4d8420Austin Hu break; 26025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifdef TARGET_VPP_USE_GEN 26125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case HAL_PIXEL_FORMAT_NV12_Y_TILED_INTEL: 26225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case HAL_PIXEL_FORMAT_NV12_X_TILED_INTEL: 26325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang //it will be removed in future, it indicate the same format with HAL_PIXEL_FORMAT_NV12_Y_TILED_INTEL 26425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case HAL_PIXEL_FORMAT_YUV420PackedSemiPlanar_Tiled_INTEL: 26525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#else 26625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case HAL_PIXEL_FORMAT_NV12_VED: 26725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case HAL_PIXEL_FORMAT_NV12_VEDT: 26825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif 26925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.pixel_format = VA_FOURCC_NV12; 27025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.num_planes = 2; 27125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.pitches[0] = stride; 27225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.pitches[1] = stride; 27325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.pitches[2] = 0; 27425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.pitches[3] = 0; 27525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.offsets[0] = 0; 27625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.offsets[1] = stride * *height; 27725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.offsets[2] = 0; 27825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.offsets[3] = 0; 27925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 28025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang default: 28125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("%s: can't support this format 0x%08x", __func__, format); 28225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 28325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 28425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.width = *width; 28525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.height = *height; 28625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.data_size = stride * *height * 1.5; 28725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.num_buffers = 1; 28825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifndef TARGET_VPP_USE_GEN 28925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (format == HAL_PIXEL_FORMAT_NV12_VEDT) { 29025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("set TILING flag"); 29125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.flags |= VA_SURFACE_EXTBUF_DESC_ENABLE_TILING; 29225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 29325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif 29425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.flags |= VA_SURFACE_ATTRIB_MEM_TYPE_ANDROID_GRALLOC; 29525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.buffers = (long unsigned int*)&handle; 29625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 29725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang attribs[0].type = (VASurfaceAttribType)VASurfaceAttribMemoryType; 29825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang attribs[0].flags = VA_SURFACE_ATTRIB_SETTABLE; 29925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang attribs[0].value.type = VAGenericValueTypeInteger; 30025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang attribs[0].value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_ANDROID_GRALLOC; 30125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 30225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang attribs[1].type = (VASurfaceAttribType)VASurfaceAttribExternalBufferDescriptor; 30325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang attribs[1].flags = VA_SURFACE_ATTRIB_SETTABLE; 30425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang attribs[1].value.type = VAGenericValueTypePointer; 30525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang attribs[1].value.value.p = &vaExtBuf; 30625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 30725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang attribs[2].type = (VASurfaceAttribType)VASurfaceAttribUsageHint; 30825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang attribs[2].flags = VA_SURFACE_ATTRIB_SETTABLE; 30925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang attribs[2].value.type = VAGenericValueTypeInteger; 31025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang attribs[2].value.value.i = VA_SURFACE_ATTRIB_USAGE_HINT_VPP_READ; 31125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 31225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("%s: Ext buffer: width %d, height %d, data_size %d, pitch %d", __func__, 31325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.width, vaExtBuf.height, vaExtBuf.data_size, vaExtBuf.pitches[0]); 31425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAStatus vaStatus = vaCreateSurfaces(mVADisplay, VA_RT_FORMAT_YUV420, vaExtBuf.width, 31525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaExtBuf.height, (VASurfaceID*)surfaceId, 1, attribs, 3); 31625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaCreateSurfaces"); 31725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 31825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return (vaStatus == VA_STATUS_SUCCESS) ? STATUS_OK : STATUS_ERROR; 31925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 32025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 32125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatus_t ISVWorker::freeSurface(int32_t* surfaceId) 32225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 32325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAStatus vaStatus = VA_STATUS_SUCCESS; 32425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaDestroySurfaces(mVADisplay, (VASurfaceID*)surfaceId, 1); 32525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaDestroySurfaces"); 32625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 32725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return (vaStatus == VA_STATUS_SUCCESS) ? STATUS_OK : STATUS_ERROR; 32825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 32925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 33025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatus_t ISVWorker::configFilters(uint32_t filters, 33125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang const FilterParam* filterParam) 33225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 33325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t ret = STATUS_OK; 33425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 33525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (!filterParam) { 33625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("%s: invalid filterParam", __func__); 33725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 33825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 33925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 34025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (filters != 0) { 34125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterParam.srcWidth = filterParam->srcWidth; 34225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterParam.srcHeight = filterParam->srcHeight; 34325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterParam.dstWidth = filterParam->dstWidth; 34425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterParam.dstHeight = filterParam->dstHeight; 34525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterParam.frameRate = filterParam->frameRate; 34625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterParam.frcRate = filterParam->frcRate; 34725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 34825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 34925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mFilters != filters) { 35025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilters = filters; 35125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGI("%s: mFilters 0x%x, fps %d, frc rate %d", __func__, mFilters, mFilterParam.frameRate, mFilterParam.frcRate); 35225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ret = setupFilters(); 35325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 35425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 35525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return ret; 35625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 35725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 35825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangbool ISVWorker::isFpsSupport(int32_t fps, int32_t *fpsSet, int32_t fpsSetCnt) { 35925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang bool ret = false; 36025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (int32_t i = 0; i < fpsSetCnt; i++) { 36125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (fps == fpsSet[i]) { 36225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ret = true; 36325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 36425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 36525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 36625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 36725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return ret; 36825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 36925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 37025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatus_t ISVWorker::setupFilters() { 37125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("setupFilters"); 372d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang VAProcFilterParameterBuffer deblock, denoise, sharpen, stde; 37325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterParameterBufferDeinterlacing deint; 37425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterParameterBufferColorBalance color[COLOR_NUM]; 37525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterParameterBufferFrameRateConversion frc; 376d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang VABufferID deblockId, denoiseId, deintId, sharpenId, colorId, frcId, stdeId; 37725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t numCaps; 378d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang VAProcFilterCap deblockCaps, denoiseCaps, sharpenCaps, frcCaps, stdeCaps; 37925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterCapDeinterlacing deinterlacingCaps[VAProcDeinterlacingCount]; 38025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterCapColorBalance colorCaps[COLOR_NUM]; 38125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAStatus vaStatus; 38225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t numSupportedFilters = VAProcFilterCount; 38325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterType supportedFilters[VAProcFilterCount]; 38425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 38525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mNumFilterBuffers != 0) { 38625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (uint32_t i = 0; i < mNumFilterBuffers; i++) { 38725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (VA_STATUS_SUCCESS != vaDestroyBuffer(mVADisplay, mFilterBuffers[i])) 38825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGW("%s: failed to destroy va buffer %d", __func__, mFilterBuffers[i]); 38925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang //return STATUS_ERROR; 39025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 39125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang memset(&mFilterBuffers, VA_INVALID_ID, VAProcFilterCount * sizeof(VABufferID)); 39225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterFrc = VA_INVALID_ID; 39325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mNumFilterBuffers = 0; 39425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 39525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 39625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // query supported filters 39725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaQueryVideoProcFilters(mVADisplay, mVAContext, supportedFilters, &numSupportedFilters); 39825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaQueryVideoProcFilters"); 39925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 40025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // create filter buffer for each filter 40125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (uint32_t i = 0; i < numSupportedFilters; i++) { 40225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang switch (supportedFilters[i]) { 40325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case VAProcFilterDeblocking: 40425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if ((mFilters & FilterDeblocking) != 0) { 40525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // check filter caps 40625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang numCaps = 1; 40725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaQueryVideoProcFilterCaps(mVADisplay, mVAContext, 40825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterDeblocking, 40925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &deblockCaps, 41025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &numCaps); 41125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaQueryVideoProcFilterCaps for deblocking"); 41225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // create parameter buffer 41325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang deblock.type = VAProcFilterDeblocking; 41425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang deblock.value = deblockCaps.range.min_value + DENOISE_DEBLOCK_STRENGTH * deblockCaps.range.step; 41525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaCreateBuffer(mVADisplay, mVAContext, 41625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterParameterBufferType, sizeof(deblock), 1, 41725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &deblock, &deblockId); 41825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaCreateBuffer for deblocking"); 41925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterBuffers[mNumFilterBuffers] = deblockId; 42025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mNumFilterBuffers++; 42125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 42225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 42325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case VAProcFilterNoiseReduction: 42425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if((mFilters & FilterNoiseReduction) != 0) { 42525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // check filter caps 42625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang numCaps = 1; 42725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaQueryVideoProcFilterCaps(mVADisplay, mVAContext, 42825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterNoiseReduction, 42925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &denoiseCaps, 43025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &numCaps); 43125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaQueryVideoProcFilterCaps for denoising"); 43225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // create parameter buffer 43325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang denoise.type = VAProcFilterNoiseReduction; 43425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifdef TARGET_VPP_USE_GEN 43525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang char propValueString[PROPERTY_VALUE_MAX]; 43625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 43725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // placeholder for vpg driver: can't support denoise factor auto adjust, so leave config to user. 43825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang property_get("vpp.filter.denoise.factor", propValueString, "64.0"); 43925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang denoise.value = atof(propValueString); 44025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang denoise.value = (denoise.value < 0.0f) ? 0.0f : denoise.value; 44125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang denoise.value = (denoise.value > 64.0f) ? 64.0f : denoise.value; 44225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#else 44325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang denoise.value = denoiseCaps.range.min_value + DENOISE_DEBLOCK_STRENGTH * denoiseCaps.range.step; 44425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif 44525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaCreateBuffer(mVADisplay, mVAContext, 44625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterParameterBufferType, sizeof(denoise), 1, 44725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &denoise, &denoiseId); 44825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaCreateBuffer for denoising"); 44925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterBuffers[mNumFilterBuffers] = denoiseId; 45025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mNumFilterBuffers++; 45125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 45225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 45325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case VAProcFilterDeinterlacing: 45425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if ((mFilters & FilterDeinterlacing) != 0) { 45525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang numCaps = VAProcDeinterlacingCount; 45625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaQueryVideoProcFilterCaps(mVADisplay, mVAContext, 45725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterDeinterlacing, 45825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &deinterlacingCaps[0], 45925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &numCaps); 46025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaQueryVideoProcFilterCaps for deinterlacing"); 46125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (uint32_t i = 0; i < numCaps; i++) 46225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang { 46325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterCapDeinterlacing * const cap = &deinterlacingCaps[i]; 46425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (cap->type != VAProcDeinterlacingBob) // desired Deinterlacing Type 46525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang continue; 46625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 46725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang deint.type = VAProcFilterDeinterlacing; 46825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang deint.algorithm = VAProcDeinterlacingBob; 46925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaCreateBuffer(mVADisplay, 47025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mVAContext, 47125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterParameterBufferType, 47225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang sizeof(deint), 1, 47325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &deint, &deintId); 47425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaCreateBuffer for deinterlacing"); 47525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterBuffers[mNumFilterBuffers] = deintId; 47625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mNumFilterBuffers++; 47725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 47825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 47925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 48025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case VAProcFilterSharpening: 48125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if((mFilters & FilterSharpening) != 0) { 48225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // check filter caps 48325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang numCaps = 1; 48425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaQueryVideoProcFilterCaps(mVADisplay, mVAContext, 48525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterSharpening, 48625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &sharpenCaps, 48725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &numCaps); 48825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaQueryVideoProcFilterCaps for sharpening"); 48925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // create parameter buffer 49025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang sharpen.type = VAProcFilterSharpening; 49125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifdef TARGET_VPP_USE_GEN 49225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang char propValueString[PROPERTY_VALUE_MAX]; 49325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 49425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // placeholder for vpg driver: can't support sharpness factor auto adjust, so leave config to user. 495d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang property_get("vpp.filter.sharpen.factor", propValueString, "8.0"); 49625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang sharpen.value = atof(propValueString); 49725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang sharpen.value = (sharpen.value < 0.0f) ? 0.0f : sharpen.value; 49825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang sharpen.value = (sharpen.value > 64.0f) ? 64.0f : sharpen.value; 49925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#else 50025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang sharpen.value = sharpenCaps.range.default_value; 50125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif 50225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaCreateBuffer(mVADisplay, mVAContext, 50325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterParameterBufferType, sizeof(sharpen), 1, 50425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &sharpen, &sharpenId); 50525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaCreateBuffer for sharpening"); 50625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterBuffers[mNumFilterBuffers] = sharpenId; 50725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mNumFilterBuffers++; 50825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 50925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 51025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case VAProcFilterColorBalance: 51125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if((mFilters & FilterColorBalance) != 0) { 51225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t featureCount = 0; 51325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // check filter caps 51425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // FIXME: it's not used at all! 51525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang numCaps = COLOR_NUM; 51625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaQueryVideoProcFilterCaps(mVADisplay, mVAContext, 51725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterColorBalance, 51825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang colorCaps, 51925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &numCaps); 52025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaQueryVideoProcFilterCaps for color balance"); 52125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // create parameter buffer 52225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (uint32_t i = 0; i < numCaps; i++) { 52325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (colorCaps[i].type == VAProcColorBalanceAutoSaturation) { 52425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[i].type = VAProcFilterColorBalance; 52525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[i].attrib = VAProcColorBalanceAutoSaturation; 52625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[i].value = colorCaps[i].range.min_value + COLOR_STRENGTH * colorCaps[i].range.step; 52725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang featureCount++; 52825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 52925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang else if (colorCaps[i].type == VAProcColorBalanceAutoBrightness) { 53025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[i].type = VAProcFilterColorBalance; 53125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[i].attrib = VAProcColorBalanceAutoBrightness; 53225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[i].value = colorCaps[i].range.min_value + COLOR_STRENGTH * colorCaps[i].range.step; 53325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang featureCount++; 53425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 53525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 53625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifdef TARGET_VPP_USE_GEN 53725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang //TODO: VPG need to support check input value by colorCaps. 53825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang enum {kHue = 0, kSaturation, kBrightness, kContrast}; 53925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang char propValueString[PROPERTY_VALUE_MAX]; 54025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kHue].type = VAProcFilterColorBalance; 54125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kHue].attrib = VAProcColorBalanceHue; 54225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 54325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // placeholder for vpg driver: can't support auto color balance, so leave config to user. 54425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang property_get("vpp.filter.procamp.hue", propValueString, "179.0"); 54525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kHue].value = atof(propValueString); 54625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kHue].value = (color[kHue].value < -180.0f) ? -180.0f : color[kHue].value; 54725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kHue].value = (color[kHue].value > 180.0f) ? 180.0f : color[kHue].value; 54825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang featureCount++; 54925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 55025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kSaturation].type = VAProcFilterColorBalance; 55125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kSaturation].attrib = VAProcColorBalanceSaturation; 55225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang property_get("vpp.filter.procamp.saturation", propValueString, "1.0"); 55325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kSaturation].value = atof(propValueString); 55425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kSaturation].value = (color[kSaturation].value < 0.0f) ? 0.0f : color[kSaturation].value; 55525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kSaturation].value = (color[kSaturation].value > 10.0f) ? 10.0f : color[kSaturation].value; 55625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang featureCount++; 55725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 55825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kBrightness].type = VAProcFilterColorBalance; 55925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kBrightness].attrib = VAProcColorBalanceBrightness; 56025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang property_get("vpp.filter.procamp.brightness", propValueString, "0.0"); 56125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kBrightness].value = atof(propValueString); 56225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kBrightness].value = (color[kBrightness].value < -100.0f) ? -100.0f : color[kBrightness].value; 56325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kBrightness].value = (color[kBrightness].value > 100.0f) ? 100.0f : color[kBrightness].value; 56425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang featureCount++; 56525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 56625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kContrast].type = VAProcFilterColorBalance; 56725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kContrast].attrib = VAProcColorBalanceContrast; 56825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang property_get("vpp.filter.procamp.contrast", propValueString, "1.0"); 56925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kContrast].value = atof(propValueString); 57025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kContrast].value = (color[kContrast].value < 0.0f) ? 0.0f : color[kContrast].value; 57125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color[kContrast].value = (color[kContrast].value > 10.0f) ? 10.0f : color[kContrast].value; 57225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang featureCount++; 57325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif 57425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaCreateBuffer(mVADisplay, mVAContext, 57525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterParameterBufferType, sizeof(*color), featureCount, 57625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang color, &colorId); 57725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaCreateBuffer for color balance"); 57825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterBuffers[mNumFilterBuffers] = colorId; 57925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mNumFilterBuffers++; 58025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 58125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 58225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case VAProcFilterFrameRateConversion: 58325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if((mFilters & FilterFrameRateConversion) != 0) { 58425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang frc.type = VAProcFilterFrameRateConversion; 58525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang frc.input_fps = mFilterParam.frameRate; 58625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang switch (mFilterParam.frcRate){ 58725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case FRC_RATE_1X: 58825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang frc.output_fps = frc.input_fps; 58925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 59025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case FRC_RATE_2X: 59125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang frc.output_fps = frc.input_fps * 2; 59225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 59325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case FRC_RATE_2_5X: 59425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang frc.output_fps = frc.input_fps * 5/2; 59525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 59625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang case FRC_RATE_4X: 59725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang frc.output_fps = frc.input_fps * 4; 59825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 59925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 60025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaCreateBuffer(mVADisplay, mVAContext, 60125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterParameterBufferType, sizeof(frc), 1, 60225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &frc, &frcId); 60325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaCreateBuffer for frc"); 60425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterBuffers[mNumFilterBuffers] = frcId; 60525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mNumFilterBuffers++; 60625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterFrc = frcId; 60725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 60825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 609d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang case VAProcFilterSkinToneEnhancement: 610d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang if((mFilters & FilterSkinToneEnhancement) != 0) { 611d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang // check filter caps 612d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang numCaps = 1; 613d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang vaStatus = vaQueryVideoProcFilterCaps(mVADisplay, mVAContext, 614d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang VAProcFilterSkinToneEnhancement, 615d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang &stdeCaps, 616d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang &numCaps); 617d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang CHECK_VASTATUS("vaQueryVideoProcFilterCaps for skintone"); 618d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang // create parameter buffer 619d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang stde.type = VAProcFilterSkinToneEnhancement; 620d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang#ifdef TARGET_VPP_USE_GEN 621d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang char propValueString[PROPERTY_VALUE_MAX]; 622d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang 623d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang // placeholder for vpg driver: can't support skintone factor auto adjust, so leave config to user. 624d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang property_get("vpp.filter.skintone.factor", propValueString, "8.0"); 625d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang stde.value = atof(propValueString); 626d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang stde.value = (stde.value < 0.0f) ? 0.0f : stde.value; 627d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang stde.value = (stde.value > 8.0f) ? 8.0f : stde.value; 628d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang#else 629d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang stde.value = stdeCaps.range.default_value; 630d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang#endif 631d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang vaStatus = vaCreateBuffer(mVADisplay, mVAContext, 632d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang VAProcFilterParameterBufferType, sizeof(stde), 1, 633d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang &stde, &stdeId); 634d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang CHECK_VASTATUS("vaCreateBuffer for skintone"); 635d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang mFilterBuffers[mNumFilterBuffers] = stdeId; 636d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang mNumFilterBuffers++; 637d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang } 638d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang break; 63925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang default: 640d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang ALOGW("%s: Not supported filter 0x%08x", __func__, supportedFilters[i]); 64125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 64225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 64325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 64425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 64525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return setupPipelineCaps(); 64625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 64725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 64825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatus_t ISVWorker::setupPipelineCaps() { 64925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("setupPipelineCaps"); 65025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang //TODO color standards 65125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcPipelineCaps pipelineCaps; 65225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAStatus vaStatus; 65325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipelineCaps.input_color_standards = in_color_standards; 65425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipelineCaps.num_input_color_standards = VAProcColorStandardCount; 65525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipelineCaps.output_color_standards = out_color_standards; 65625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipelineCaps.num_output_color_standards = VAProcColorStandardCount; 65725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 65825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaQueryVideoProcPipelineCaps(mVADisplay, mVAContext, 65925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterBuffers, mNumFilterBuffers, 66025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &pipelineCaps); 66125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaQueryVideoProcPipelineCaps"); 66225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 66325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mForwardReferences != NULL) { 66425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang free(mForwardReferences); 66525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mForwardReferences = NULL; 66625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mNumForwardReferences = 0; 66725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 66825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 66925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mNumForwardReferences = pipelineCaps.num_forward_references; 67025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mNumForwardReferences > 0) { 67125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mForwardReferences = (VASurfaceID*)malloc(mNumForwardReferences * sizeof(VASurfaceID)); 67225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mForwardReferences == NULL) 67325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ALLOCATION_ERROR; 67425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang memset(mForwardReferences, 0, mNumForwardReferences * sizeof(VASurfaceID)); 67525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 67625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_OK; 67725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 67825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 67925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatus_t ISVWorker::process(ISVBuffer* inputBuffer, Vector<ISVBuffer*> outputBuffer, 68025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t outputCount, bool isEOS, uint32_t flags) { 68125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("process: outputCount=%d, mInputIndex=%d", outputCount, mInputIndex); 68225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VASurfaceID input; 68325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VASurfaceID output[MAX_FRC_OUTPUT]; 68425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VABufferID pipelineId; 68525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcPipelineParameterBuffer *pipeline; 68625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcFilterParameterBufferFrameRateConversion *frc; 687d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang VAStatus vaStatus = STATUS_OK; 688d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang uint32_t i = 0; 68925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 690d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang if (isEOS) { 691d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang if (mInputIndex == 0) { 692d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang ALOGV("%s: don't need to flush VSP", __func__); 693d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang return STATUS_OK; 694d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang } 69525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang input = VA_INVALID_SURFACE; 696d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang outputCount = 1; 697d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang output[0] = mPrevOutput; 698d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang } else { 699d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang if (!inputBuffer || outputBuffer.size() != outputCount) { 700d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang ALOGE("%s: invalid input/output buffer", __func__); 701d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang return STATUS_ERROR; 702d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang } 70325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 704d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang if (outputCount < 1 || outputCount > 4) { 705d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang ALOGE("%s: invalid outputCount", __func__); 70625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 70725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 708d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang 709d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang input = inputBuffer->getSurface(); 710d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang for (i = 0; i < outputCount; i++) { 711d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang output[i] = outputBuffer[i]->getSurface(); 712d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang if (output[i] == VA_INVALID_SURFACE) { 713d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang ALOGE("invalid output buffer"); 714d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang return STATUS_ERROR; 715d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang } 716d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang } 71725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 71825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 71925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // reference frames setting 72025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mNumForwardReferences > 0) { 72125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang /* add previous frame into reference array*/ 72225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (i = 1; i < mNumForwardReferences; i++) { 72325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mForwardReferences[i - 1] = mForwardReferences[i]; 72425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 72525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 72625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang //make last reference to input 72725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mForwardReferences[mNumForwardReferences - 1] = mPrevInput; 72825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 72925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 73025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mPrevInput = input; 73125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 73225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // create pipeline parameter buffer 73325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaCreateBuffer(mVADisplay, 73425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mVAContext, 73525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcPipelineParameterBufferType, 73625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang sizeof(VAProcPipelineParameterBuffer), 73725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 1, 73825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang NULL, 73925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &pipelineId); 74025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaCreateBuffer for VAProcPipelineParameterBufferType"); 74125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 74225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("before vaBeginPicture"); 74325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaBeginPicture(mVADisplay, mVAContext, output[0]); 74425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaBeginPicture"); 74525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 74625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // map pipeline paramter buffer 74725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaMapBuffer(mVADisplay, pipelineId, (void**)&pipeline); 74825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaMapBuffer for pipeline parameter buffer"); 74925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 75025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // frc pamameter setting 75125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if ((mFilters & FilterFrameRateConversion) != 0) { 75225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaMapBuffer(mVADisplay, mFilterFrc, (void **)&frc); 75325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaMapBuffer for frc parameter buffer"); 75425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (isEOS) 75525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang frc->num_output_frames = 0; 75625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang else 75725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang frc->num_output_frames = outputCount - 1; 75825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang frc->output_frames = output + 1; 75925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 76025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 76125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // pipeline parameter setting 76225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VARectangle dst_region; 76325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang dst_region.x = 0; 76425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang dst_region.y = 0; 76525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang dst_region.width = mFilterParam.dstWidth; 76625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang dst_region.height = mFilterParam.dstHeight; 76725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 76825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VARectangle src_region; 76925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang src_region.x = 0; 77025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang src_region.y = 0; 77125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang src_region.width = mFilterParam.srcWidth; 77225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang src_region.height = mFilterParam.srcHeight; 77325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 77425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (isEOS) { 77525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->surface = 0; 77625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->pipeline_flags = VA_PIPELINE_FLAG_END; 77725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 77825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang else { 77925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->surface = input; 78025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->pipeline_flags = 0; 78125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 78225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifdef TARGET_VPP_USE_GEN 78325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->surface_region = &src_region; 78425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->output_region = &dst_region; 78525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->surface_color_standard = VAProcColorStandardBT601; 78625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->output_color_standard = VAProcColorStandardBT601; 78725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#else 78825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->surface_region = NULL; 78925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->output_region = NULL;//&output_region; 79025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->surface_color_standard = VAProcColorStandardNone; 79125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->output_color_standard = VAProcColorStandardNone; 79225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang /* real rotate state will be decided in psb video */ 79325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->rotation_state = 0; 79425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif 79525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang /* FIXME: set more meaningful background color */ 79625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->output_background_color = 0; 79725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->filters = mFilterBuffers; 79825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->num_filters = mNumFilterBuffers; 79925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->forward_references = mForwardReferences; 80025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->num_forward_references = mNumForwardReferences; 80125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->backward_references = NULL; 80225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->num_backward_references = 0; 80325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 80425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang //currently, we only transfer TOP field to frame, no frame rate change. 80525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (flags & (OMX_BUFFERFLAG_TFF | OMX_BUFFERFLAG_BFF)) { 80625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->filter_flags = VA_TOP_FIELD; 80725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } else { 80825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pipeline->filter_flags = VA_FRAME_PICTURE; 80925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 81025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 81125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if ((mFilters & FilterFrameRateConversion) != 0) { 81225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaUnmapBuffer(mVADisplay, mFilterFrc); 81325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaUnmapBuffer for frc parameter buffer"); 81425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 81525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 81625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaUnmapBuffer(mVADisplay, pipelineId); 81725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaUnmapBuffer for pipeline parameter buffer"); 81825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 81925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("before vaRenderPicture"); 82025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Send parameter to driver 82125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaRenderPicture(mVADisplay, mVAContext, &pipelineId, 1); 82225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaRenderPicture"); 82325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 82425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("before vaEndPicture"); 82525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaEndPicture(mVADisplay, mVAContext); 82625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaEndPicture"); 827d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang 82825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (isEOS) { 82925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaSyncSurface(mVADisplay, mPrevOutput); 83025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaSyncSurface"); 83125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (VA_STATUS_SUCCESS != vaDestroyBuffer(mVADisplay, pipelineId)) { 83225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("%s: failed to destroy va buffer %d", __func__, pipelineId); 83325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 83425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 83525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_OK; 83625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 83725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 83825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mPrevOutput = output[0]; 83925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mInputIndex++; 84025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 84125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang Mutex::Autolock autoLock(mPipelineBufferLock); 84225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mPipelineBuffers.push_back(pipelineId); 84325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 84425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("process, exit"); 84525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_OK; 84625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 84725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 84825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatus_t ISVWorker::fill(Vector<ISVBuffer*> outputBuffer, uint32_t outputCount) { 84925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("fill, outputCount=%d, mOutputIndex=%d",outputCount, mOutputIndex); 85025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // get output surface 85125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VASurfaceID output[MAX_FRC_OUTPUT]; 85225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAStatus vaStatus; 85325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VASurfaceStatus surStatus; 85425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 85525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (outputCount < 1) 85625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 85725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // map GraphicBuffer to VASurface 85825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (uint32_t i = 0; i < outputCount; i++) { 85925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 86025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang output[i] = outputBuffer[i]->getSurface(); 86125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (output[i] == VA_INVALID_SURFACE) { 86225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("invalid output buffer"); 86325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 86425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 86525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang //FIXME: only enable sync mode 86625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#if 0 86725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaQuerySurfaceStatus(mVADisplay, output[i],&surStatus); 86825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaQuerySurfaceStatus"); 86925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (surStatus == VASurfaceRendering) { 87025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("Rendering %d", i); 87125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang /* The behavior of driver is: all output of one process task are return in one interruption. 87225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang The whole outputs of one FRC task are all ready or none of them is ready. 87325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang If the behavior changed, it hurts the performance. 87425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang */ 87525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (0 != i) { 87625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGW("*****Driver behavior changed. The performance is hurt."); 87725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGW("Please check driver behavior: all output of one task return in one interruption."); 87825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 87925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = STATUS_DATA_RENDERING; 88025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang break; 88125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 88225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 88325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if ((surStatus != VASurfaceRendering) && (surStatus != VASurfaceReady)) { 88425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("surface statu Error %d", surStatus); 88525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = STATUS_ERROR; 88625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 88725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif 88825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaSyncSurface(mVADisplay, output[i]); 88925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaSyncSurface"); 89025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = STATUS_OK; 89125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mOutputCount++; 89225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang //dumpYUVFrameData(output[i]); 89325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 89425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 89525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang { 89625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang Mutex::Autolock autoLock(mPipelineBufferLock); 89725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (vaStatus == STATUS_OK) { 89825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VABufferID pipelineBuffer = mPipelineBuffers.itemAt(0); 89925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (VA_STATUS_SUCCESS != vaDestroyBuffer(mVADisplay, pipelineBuffer)) { 90025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("%s: failed to destroy va buffer %d", __func__, pipelineBuffer); 90125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 90225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 90325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mPipelineBuffers.removeAt(0); 90425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mOutputIndex++; 90525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 90625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 90725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 90825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("fill, exit"); 90925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return vaStatus; 91025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 91125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 91225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang// Debug only 91325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define FRAME_OUTPUT_FILE_NV12 "/storage/sdcard0/vpp_output.nv12" 91425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatus_t ISVWorker::dumpYUVFrameData(VASurfaceID surfaceID) { 91525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t ret; 91625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (surfaceID == VA_INVALID_SURFACE) 91725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 91825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 91925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAStatus vaStatus; 92025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAImage image; 92125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang unsigned char *data_ptr; 92225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 92325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaDeriveImage(mVADisplay, 92425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang surfaceID, 92525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &image); 92625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaDeriveImage"); 92725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 92825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaMapBuffer(mVADisplay, image.buf, (void **)&data_ptr); 92925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaMapBuffer"); 93025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 93125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ret = writeNV12(mFilterParam.srcWidth, mFilterParam.srcHeight, data_ptr, image.pitches[0], image.pitches[1]); 93225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (ret != STATUS_OK) { 93325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("writeNV12 error"); 93425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 93525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 93625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 93725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaUnmapBuffer(mVADisplay, image.buf); 93825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaUnMapBuffer"); 93925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 94025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaStatus = vaDestroyImage(mVADisplay,image.image_id); 94125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaDestroyImage"); 94225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 94325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_OK; 94425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 94525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 94625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatus_t ISVWorker::reset() { 94725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t ret; 948d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang ALOGV("reset"); 949d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang if (mOutputCount > 0) { 950d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang ALOGI("======mVPPInputCount=%d, mVPPRenderCount=%d======", 951d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang mInputIndex, mOutputCount); 952d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang } 95325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mInputIndex = 0; 95425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mOutputIndex = 0; 95525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mOutputCount = 0; 95625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 95725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang { 95825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang Mutex::Autolock autoLock(mPipelineBufferLock); 95925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang while (!mPipelineBuffers.isEmpty()) { 96025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VABufferID pipelineBuffer = mPipelineBuffers.itemAt(0); 96125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (VA_STATUS_SUCCESS != vaDestroyBuffer(mVADisplay, pipelineBuffer)) { 96225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("%s: failed to destroy va buffer %d", __func__, pipelineBuffer); 96325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 96425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 96525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mPipelineBuffers.removeAt(0); 96625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 96725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 96825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 96925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mNumFilterBuffers != 0) { 97025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (uint32_t i = 0; i < mNumFilterBuffers; i++) { 97125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (VA_STATUS_SUCCESS != vaDestroyBuffer(mVADisplay, mFilterBuffers[i])) 97225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGW("%s: failed to destroy va buffer %d", __func__, mFilterBuffers[i]); 97325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang //return STATUS_ERROR; 97425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 97525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mNumFilterBuffers = 0; 97625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang memset(&mFilterBuffers, VA_INVALID_ID, VAProcFilterCount * sizeof(VABufferID)); 97725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mFilterFrc = VA_INVALID_ID; 97825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 97925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 98025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // we need to clear the cache for reference surfaces 98125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mForwardReferences != NULL) { 98225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang free(mForwardReferences); 98325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mForwardReferences = NULL; 98425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mNumForwardReferences = 0; 98525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 98625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 98725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (mVAContext != VA_INVALID_ID) { 98825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang vaDestroyContext(mVADisplay, mVAContext); 98925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang mVAContext = VA_INVALID_ID; 99025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 99125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAStatus vaStatus = vaCreateContext(mVADisplay, mVAConfig, mWidth, mHeight, 0, NULL, 0, &mVAContext); 99225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang CHECK_VASTATUS("vaCreateContext"); 99325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 99425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return setupFilters(); 99525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 99625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 99725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wanguint32_t ISVWorker::getVppOutputFps() { 99825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t outputFps; 99925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang //mFilterParam.frcRate is 1 if FRC is disabled or input FPS is not changed by VPP. 100025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (FRC_RATE_2_5X == mFilterParam.frcRate) { 100125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang outputFps = mFilterParam.frameRate * 5 / 2; 100225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } else { 100325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang outputFps = mFilterParam.frameRate * mFilterParam.frcRate; 100425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 100525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 100625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("vpp is on in settings %d %d %d", outputFps, mFilterParam.frameRate, mFilterParam.frcRate); 100725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return outputFps; 100825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 100925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 101025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 101125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatus_t ISVWorker::writeNV12(int width, int height, unsigned char *out_buf, int y_pitch, int uv_pitch) { 101225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang size_t result; 101325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang int frame_size; 101425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang unsigned char *y_start, *uv_start; 101525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang int h; 101625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 101725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang FILE *ofile = fopen(FRAME_OUTPUT_FILE_NV12, "ab"); 101825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if(ofile == NULL) { 101925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("Open %s failed!", FRAME_OUTPUT_FILE_NV12); 102025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 102125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 102225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 102325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (out_buf == NULL) 102425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang { 102525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang fclose(ofile); 102625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 102725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 102825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if ((width % 2) || (height % 2)) 102925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang { 103025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang fclose(ofile); 103125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_ERROR; 103225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 103325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Set frame size 103425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang frame_size = height * width * 3/2; 103525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 103625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang /* write y */ 103725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang y_start = out_buf; 103825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (h = 0; h < height; ++h) { 103925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang result = fwrite(y_start, sizeof(unsigned char), width, ofile); 104025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang y_start += y_pitch; 104125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 104225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 104325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang /* write uv */ 104425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uv_start = out_buf + uv_pitch * height; 104525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (h = 0; h < height / 2; ++h) { 104625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang result = fwrite(uv_start, sizeof(unsigned char), width, ofile); 104725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uv_start += uv_pitch; 104825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 104925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Close file 105025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang fclose(ofile); 105125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return STATUS_OK; 105225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 1053d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang 1054