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