Add ISV support to fugu

Fix ISV FRC video jiters of 24 fps input.
Support YV12 input format.

BZ: 229540
Bug: 17383204

Change-Id: Ic61a520966cc815eca7735207d455e2233659fd6
Signed-off-by: Xigui Wang <xigui.wang@intel.com>
diff --git a/ISV/base/isv_bufmanager.cpp b/ISV/base/isv_bufmanager.cpp
index f0fdc42..205268b 100644
--- a/ISV/base/isv_bufmanager.cpp
+++ b/ISV/base/isv_bufmanager.cpp
@@ -18,7 +18,9 @@
 #include <media/hardware/HardwareAPI.h>
 #include <system/graphics.h>
 #include "isv_bufmanager.h"
+#ifndef TARGET_VPP_USE_GEN
 #include "hal_public.h"
+#endif
 
 //#define LOG_NDEBUG 0
 #undef LOG_TAG
@@ -33,7 +35,7 @@
     }
 }
 
-status_t ISVBuffer::initBufferInfo()
+status_t ISVBuffer::initBufferInfo(uint32_t hackFormat)
 {
     if (mType == ISV_BUFFER_METADATA) {
         VideoDecoderOutputMetaData *metaData =
@@ -45,7 +47,7 @@
         }
 
         if (mGrallocHandle != 0) {
-            if ((uint32_t)metaData->pHandle != mGrallocHandle) {
+            if ((unsigned long)metaData->pHandle != mGrallocHandle) {
                 if (STATUS_OK != mWorker->freeSurface(&mSurface)) {
                     ALOGE("%s: free surface %d failed.", __func__, mSurface);
                     return UNKNOWN_ERROR;
@@ -53,7 +55,7 @@
             } else
                 return OK;
         }
-        mGrallocHandle = (uint32_t)metaData->pHandle;
+        mGrallocHandle = (unsigned long)metaData->pHandle;
     } else {
         if (mSurface != -1)
             return OK;
@@ -68,7 +70,7 @@
     int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, (hw_module_t const**)&pGralloc);
     if (!pGralloc) err = -1;
     if (0 == err)
-        err = pGralloc->perform(pGralloc, INTEL_UFO_GRALLOC_MODULE_PERFORM_GET_BO_INFO, handle, &info);
+        err = pGralloc->perform(pGralloc, INTEL_UFO_GRALLOC_MODULE_PERFORM_GET_BO_INFO, mGrallocHandle, &info);
 
     if (0 != err)
     {
@@ -81,15 +83,8 @@
 #else
     IMG_native_handle_t* grallocHandle = (IMG_native_handle_t*)mGrallocHandle;
     mStride = grallocHandle->iWidth;
-    mColorFormat = grallocHandle->iFormat;
+    mColorFormat = (hackFormat != 0) ? hackFormat : grallocHandle->iFormat;
 #endif
-
-    //FIXME: currently, VSP doesn't support YV12 format very well, so diable ISV temporarily
-    if (mColorFormat == HAL_PIXEL_FORMAT_YV12) {
-        ALOGI("%s: VSP doesn't support YV12 very well, so disable ISV", __func__);
-        return BAD_TYPE;
-    }
-
     if (mWorker == NULL) {
         ALOGE("%s: mWorker == NULL!!", __func__);
         return UNKNOWN_ERROR;
@@ -119,12 +114,12 @@
     return OK;
 }
 
-status_t ISVBufferManager::freeBuffer(uint32_t handle)
+status_t ISVBufferManager::freeBuffer(unsigned long handle)
 {
     Mutex::Autolock autoLock(mBufferLock);
     for (uint32_t i = 0; i < mBuffers.size(); i++) {
         ISVBuffer* isvBuffer = mBuffers.itemAt(i);
-        if (isvBuffer->getHandle() == (uint32_t)handle) {
+        if (isvBuffer->getHandle() == handle) {
             delete isvBuffer;
             mBuffers.removeAt(i);
             ALOGD_IF(ISV_BUFFER_MANAGER_DEBUG, "%s: remove handle 0x%08x, and then mBuffers.size() %d", __func__,
@@ -137,7 +132,7 @@
     return UNKNOWN_ERROR;
 }
 
-status_t ISVBufferManager::useBuffer(uint32_t handle)
+status_t ISVBufferManager::useBuffer(unsigned long handle)
 {
     Mutex::Autolock autoLock(mBufferLock);
     if (handle == 0 || mBuffers.size() >= mBuffers.capacity())
@@ -145,7 +140,7 @@
 
     for (uint32_t i = 0; i < mBuffers.size(); i++) {
         ISVBuffer* isvBuffer = mBuffers.itemAt(i);
-        if (isvBuffer->getHandle() == (uint32_t)handle) {
+        if (isvBuffer->getHandle() == handle) {
             ALOGE("%s: this buffer 0x%08x has already been registered", __func__, handle);
             return UNKNOWN_ERROR;
         }
@@ -168,14 +163,14 @@
 
     for (uint32_t i = 0; i < mBuffers.size(); i++) {
         ISVBuffer* isvBuffer = mBuffers.itemAt(i);
-        if (isvBuffer->getHandle() == (uint32_t)nativeBuffer->handle) {
+        if (isvBuffer->getHandle() == (unsigned long)nativeBuffer->handle) {
             ALOGE("%s: this buffer 0x%08x has already been registered", __func__, nativeBuffer->handle);
             return UNKNOWN_ERROR;
         }
     }
 
     ISVBuffer* isvBuffer = new ISVBuffer(mWorker,
-            (uint32_t)nativeBuffer->handle, (uint32_t)nativeBuffer->handle,
+            (unsigned long)nativeBuffer->handle, (unsigned long)nativeBuffer->handle,
             nativeBuffer->width, nativeBuffer->height,
             nativeBuffer->stride, nativeBuffer->format,
             mMetaDataMode ? ISVBuffer::ISV_BUFFER_METADATA : ISVBuffer::ISV_BUFFER_GRALLOC);
@@ -186,13 +181,14 @@
     return OK;
 }
 
-ISVBuffer* ISVBufferManager::mapBuffer(uint32_t handle)
+ISVBuffer* ISVBufferManager::mapBuffer(unsigned long handle)
 {
     Mutex::Autolock autoLock(mBufferLock);
     for (uint32_t i = 0; i < mBuffers.size(); i++) {
         ISVBuffer* isvBuffer = mBuffers.itemAt(i);
-        if (isvBuffer->getHandle() == (uint32_t)handle)
+        if (isvBuffer->getHandle() == handle)
             return isvBuffer;
     }
     return NULL;
 }
+
diff --git a/ISV/base/isv_processor.cpp b/ISV/base/isv_processor.cpp
index 1bff29d..ff0df7f 100644
--- a/ISV/base/isv_processor.cpp
+++ b/ISV/base/isv_processor.cpp
@@ -27,7 +27,7 @@
 
 using namespace android;
 
-#define MAX_RETRY_NUM   8
+#define MAX_RETRY_NUM   10
 
 ISVProcessor::ISVProcessor(bool canCallJava,
         sp<ISVBufferManager> bufferManager,
@@ -43,7 +43,6 @@
     mInputProcIdx(0),
     mNumTaskInProcesing(0),
     mNumRetry(0),
-    mLastTimeStamp(0),
     mError(false),
     mbFlush(false),
     mbBypass(false),
@@ -73,6 +72,7 @@
     mFilterParam.srcHeight = mFilterParam.dstHeight = height;
     mOutputBuffers.clear();
     mInputBuffers.clear();
+    mTimeWindow.clear();
 }
 
 ISVProcessor::~ISVProcessor() {
@@ -153,7 +153,11 @@
     for (i = 0; i < needFillNum; i++) {
         //fetch the render buffer from the top of output buffer queue
         outputBuffer = mOutputBuffers.itemAt(i);
-        uint32_t fillHandle = reinterpret_cast<uint32_t>(outputBuffer->pBuffer);
+        if (!outputBuffer) {
+            ALOGE("%s: failed to fetch output buffer for sync.", __func__);
+            return false;
+        }
+        unsigned long fillHandle = reinterpret_cast<unsigned long>(outputBuffer->pBuffer);
         ISVBuffer* fillBuf = mBufferManager->mapBuffer(fillHandle);
         fillBufList->push_back(fillBuf);
     }
@@ -202,10 +206,15 @@
         for(uint32_t i = 0; i < fillBufNum; i++) {
             outputBuffer = mOutputBuffers.itemAt(i);
             if (fillBufNum > 1) {
-                if(mFilterParam.frameRate == 15)
-                    outputBuffer->nTimeStamp = timeUs - 1000000ll * (fillBufNum - i - 1) / 30;
+                if (mFilterParam.frameRate == 24) {
+                    if (fillBufNum == 2) {
+                        outputBuffer->nTimeStamp = timeUs + 1000000ll * (i + 1) / 60 - 1000000ll * 1 / 24;
+                    } else if (fillBufNum == 3) {
+                        outputBuffer->nTimeStamp = timeUs + 1000000ll * (i + 3) / 60 - 1000000ll * 2 / 24;
+                    }
+                }
                 else
-                    outputBuffer->nTimeStamp = timeUs - 1000000ll * (fillBufNum - i - 1) / 60;
+                    outputBuffer->nTimeStamp = timeUs - 1000000ll * (fillBufNum - i - 1) / (mFilterParam.frameRate * 2);
             }
 
             //return filled buffers for rendering
@@ -233,6 +242,12 @@
     OMX_BUFFERHEADERTYPE *outputBuffer;
     OMX_BUFFERHEADERTYPE *inputBuffer;
 
+    if (mbFlush) {
+        *inputBuf = NULL;
+        *procBufNum = 0;
+        return true;
+    }
+
     int32_t procBufCount = mISVWorker->getProcBufCount();
     if ((procBufCount == 0) || (procBufCount > 4)) {
        return false;
@@ -243,14 +258,13 @@
         ALOGD_IF(ISV_COMPONENT_LOCK_DEBUG, "%s: acqiring mInputLock", __func__);
         Mutex::Autolock autoLock(mInputLock);
         ALOGD_IF(ISV_COMPONENT_LOCK_DEBUG, "%s: acqired mInputLock", __func__);
-        if (mbFlush) {
-            procBufCount = 1;
-            *inputBuf = NULL;
-        } else {
-            inputBuffer = mInputBuffers.itemAt(mInputProcIdx);
-            uint32_t inputHandle = reinterpret_cast<uint32_t>(inputBuffer->pBuffer);
-            *inputBuf = mBufferManager->mapBuffer(inputHandle);
+        inputBuffer = mInputBuffers.itemAt(mInputProcIdx);
+        if (!inputBuffer) {
+            ALOGE("%s: failed to get input buffer for processing.", __func__);
+            return false;
         }
+        unsigned long inputHandle = reinterpret_cast<unsigned long>(inputBuffer->pBuffer);
+        *inputBuf = mBufferManager->mapBuffer(inputHandle);
         ALOGD_IF(ISV_COMPONENT_LOCK_DEBUG, "%s: releasing mInputLock", __func__);
     }
 
@@ -259,16 +273,14 @@
         ALOGD_IF(ISV_COMPONENT_LOCK_DEBUG, "%s: acqiring mOutputLock", __func__);
         Mutex::Autolock autoLock(mOutputLock);
         ALOGD_IF(ISV_COMPONENT_LOCK_DEBUG, "%s: acqired mOutputLock", __func__);
-        if (mbFlush) {
-            outputBuffer = mOutputBuffers.itemAt(0);
-            uint32_t outputHandle = reinterpret_cast<uint32_t>(outputBuffer->pBuffer);
-            procBufList->push_back(mBufferManager->mapBuffer(outputHandle));
-        } else {
-            for (int32_t i = 0; i < procBufCount; i++) {
-                outputBuffer = mOutputBuffers.itemAt(mOutputProcIdx + i);
-                uint32_t outputHandle = reinterpret_cast<uint32_t>(outputBuffer->pBuffer);
-                procBufList->push_back(mBufferManager->mapBuffer(outputHandle));
+        for (int32_t i = 0; i < procBufCount; i++) {
+            outputBuffer = mOutputBuffers.itemAt(mOutputProcIdx + i);
+            if (!outputBuffer) {
+                ALOGE("%s: failed to get output buffer for processing.", __func__);
+                return false;
             }
+            unsigned long outputHandle = reinterpret_cast<unsigned long>(outputBuffer->pBuffer);
+            procBufList->push_back(mBufferManager->mapBuffer(outputHandle));
         }
         *procBufNum = procBufCount;
         ALOGD_IF(ISV_COMPONENT_LOCK_DEBUG, "%s: releasing mOutputLock", __func__);
@@ -306,7 +318,7 @@
 {
     ALOGD_IF(ISV_THREAD_DEBUG, "%s: mISVWorker->getProcBufCount() return %d", __func__,
             mISVWorker->getProcBufCount());
-    if (mInputProcIdx < mInputBuffers.size()
+    if (mInputProcIdx < mInputBuffers.size() 
             && (mOutputBuffers.size() - mOutputProcIdx) >= mISVWorker->getProcBufCount())
        return true;
     else
@@ -335,22 +347,22 @@
             if (!mbFlush)
                 flags = mInputBuffers[mInputProcIdx]->nFlags;
             status_t ret = mISVWorker->process(inputBuf, procBufList, procBufNum, mbFlush, flags);
-            // for seek and EOS
-            if (mbFlush) {
-                mISVWorker->reset();
-                flush();
-
-                mNumTaskInProcesing = 0;
-                mInputProcIdx = 0;
-                mOutputProcIdx = 0;
-
-                mbFlush = false;
-
-                Mutex::Autolock endLock(mEndLock);
-                mEndCond.signal();
-                return true;
-            }
             if (ret == STATUS_OK) {
+                // for seek and EOS
+                if (mbFlush) {
+                    mISVWorker->reset();
+                    flush();
+
+                    mNumTaskInProcesing = 0;
+                    mInputProcIdx = 0;
+                    mOutputProcIdx = 0;
+
+                    mbFlush = false;
+
+                    Mutex::Autolock endLock(mEndLock);
+                    mEndCond.signal();
+                    return true;
+                }
                 mNumTaskInProcesing++;
                 updateFirmwareInputBufStatus(procBufNum);
             } else {
@@ -393,29 +405,56 @@
     return (fps == 15 || fps == 24 || fps == 25 || fps == 30 || fps == 50 || fps == 60) ? true : false;
 }
 
+status_t ISVProcessor::configFRC(uint32_t fps)
+{
+    if (isFrameRateValid(fps)) {
+        if (fps == 50 || fps == 60) {
+            ALOGD_IF(ISV_THREAD_DEBUG, "%s: %d fps don't need do FRC, so disable FRC", __func__, fps);
+            mFilters &= ~FilterFrameRateConversion;
+            mFilterParam.frcRate = FRC_RATE_1X;
+        } else {
+            mFilterParam.frameRate = fps;
+            mFilterParam.frcRate = mISVProfile->getFRCRate(mFilterParam.frameRate);
+            ALOGD_IF(ISV_THREAD_DEBUG, "%s: fps is set to %d, frc rate is %d", __func__,
+                    mFilterParam.frameRate, mFilterParam.frcRate);
+        }
+        return OK;
+    }
+
+    return UNKNOWN_ERROR;
+}
+
+status_t ISVProcessor::calculateFps(int64_t timeStamp, uint32_t* fps)
+{
+    int32_t i = 0;
+    *fps = 0;
+
+    mTimeWindow.push_back(timeStamp);
+    if (mTimeWindow.size() > WINDOW_SIZE) {
+        mTimeWindow.removeAt(0);
+    }
+    else if (mTimeWindow.size() < WINDOW_SIZE)
+        return NOT_ENOUGH_DATA;
+
+    int64_t delta = mTimeWindow[WINDOW_SIZE-1] - mTimeWindow[0];
+    if (delta == 0)
+        return NOT_ENOUGH_DATA;
+
+    *fps = ceil(1.0 / delta * 1E6 * (WINDOW_SIZE-1));
+    return OK;
+}
+
 status_t ISVProcessor::configFilters(OMX_BUFFERHEADERTYPE* buffer)
 {
     if ((mFilters & FilterFrameRateConversion) != 0) {
         if (!isFrameRateValid(mFilterParam.frameRate)) {
             if (mNumRetry++ < MAX_RETRY_NUM) {
-                int64_t deltaTime = buffer->nTimeStamp - mLastTimeStamp;
-                mLastTimeStamp = buffer->nTimeStamp;
-                if (deltaTime != 0)
-                    mFilterParam.frameRate = ceil(1.0 / deltaTime * 1E6);
-                if (!isFrameRateValid(mFilterParam.frameRate)) {
+                uint32_t fps = 0;
+                if (OK != calculateFps(buffer->nTimeStamp, &fps))
                     return NOT_ENOUGH_DATA;
-                } else {
-                    if (mFilterParam.frameRate == 50 || mFilterParam.frameRate == 60) {
-                        ALOGD_IF(ISV_THREAD_DEBUG, "%s: %d fps don't need do FRC, so disable FRC", __func__,
-                                mFilterParam.frameRate);
-                        mFilters &= ~FilterFrameRateConversion;
-                        mFilterParam.frcRate = FRC_RATE_1X;
-                    } else {
-                        mFilterParam.frcRate = mISVProfile->getFRCRate(mFilterParam.frameRate);
-                        ALOGD_IF(ISV_THREAD_DEBUG, "%s: calculate fps is %d, frc rate is %d", __func__,
-                                mFilterParam.frameRate, mFilterParam.frcRate);
-                    }
-                }
+
+                if (OK != configFRC(fps))
+                    return NOT_ENOUGH_DATA;
             } else {
                 ALOGD_IF(ISV_THREAD_DEBUG, "%s: exceed max retry to get a valid frame rate(%d), disable FRC", __func__,
                         mFilterParam.frameRate);
diff --git a/ISV/base/isv_worker.cpp b/ISV/base/isv_worker.cpp
index bee3536..3f699a5 100644
--- a/ISV/base/isv_worker.cpp
+++ b/ISV/base/isv_worker.cpp
@@ -215,7 +215,7 @@
 }
 
 status_t ISVWorker::allocSurface(uint32_t* width, uint32_t* height,
-        uint32_t stride, uint32_t format, uint32_t handle, int32_t* surfaceId)
+        uint32_t stride, uint32_t format, unsigned long handle, int32_t* surfaceId)
 {
     if (mWidth == 0 || mHeight == 0) {
         ALOGE("%s: isv worker has not been initialized.", __func__);
@@ -356,13 +356,13 @@
 
 status_t ISVWorker::setupFilters() {
     ALOGV("setupFilters");
-    VAProcFilterParameterBuffer deblock, denoise, sharpen;
+    VAProcFilterParameterBuffer deblock, denoise, sharpen, stde;
     VAProcFilterParameterBufferDeinterlacing deint;
     VAProcFilterParameterBufferColorBalance color[COLOR_NUM];
     VAProcFilterParameterBufferFrameRateConversion frc;
-    VABufferID deblockId, denoiseId, deintId, sharpenId, colorId, frcId;
+    VABufferID deblockId, denoiseId, deintId, sharpenId, colorId, frcId, stdeId;
     uint32_t numCaps;
-    VAProcFilterCap deblockCaps, denoiseCaps, sharpenCaps, frcCaps;
+    VAProcFilterCap deblockCaps, denoiseCaps, sharpenCaps, frcCaps, stdeCaps;
     VAProcFilterCapDeinterlacing deinterlacingCaps[VAProcDeinterlacingCount];
     VAProcFilterCapColorBalance colorCaps[COLOR_NUM];
     VAStatus vaStatus;
@@ -479,7 +479,7 @@
                     char propValueString[PROPERTY_VALUE_MAX];
 
                     // placeholder for vpg driver: can't support sharpness factor auto adjust, so leave config to user.
-                    property_get("vpp.filter.sharpen.factor", propValueString, "10.0");
+                    property_get("vpp.filter.sharpen.factor", propValueString, "8.0");
                     sharpen.value = atof(propValueString);
                     sharpen.value = (sharpen.value < 0.0f) ? 0.0f : sharpen.value;
                     sharpen.value = (sharpen.value > 64.0f) ? 64.0f : sharpen.value;
@@ -593,8 +593,38 @@
                     mFilterFrc = frcId;
                 }
                 break;
+            case VAProcFilterSkinToneEnhancement:
+                if((mFilters & FilterSkinToneEnhancement) != 0) {
+                    // check filter caps
+                    numCaps = 1;
+                    vaStatus = vaQueryVideoProcFilterCaps(mVADisplay, mVAContext,
+                            VAProcFilterSkinToneEnhancement,
+                            &stdeCaps,
+                            &numCaps);
+                    CHECK_VASTATUS("vaQueryVideoProcFilterCaps for skintone");
+                    // create parameter buffer
+                    stde.type = VAProcFilterSkinToneEnhancement;
+#ifdef TARGET_VPP_USE_GEN
+                    char propValueString[PROPERTY_VALUE_MAX];
+
+                    // placeholder for vpg driver: can't support skintone factor auto adjust, so leave config to user.
+                    property_get("vpp.filter.skintone.factor", propValueString, "8.0");
+                    stde.value = atof(propValueString);
+                    stde.value = (stde.value < 0.0f) ? 0.0f : stde.value;
+                    stde.value = (stde.value > 8.0f) ? 8.0f : stde.value;
+#else
+                    stde.value = stdeCaps.range.default_value;
+#endif
+                    vaStatus = vaCreateBuffer(mVADisplay, mVAContext,
+                        VAProcFilterParameterBufferType, sizeof(stde), 1,
+                        &stde, &stdeId);
+                    CHECK_VASTATUS("vaCreateBuffer for skintone");
+                    mFilterBuffers[mNumFilterBuffers] = stdeId;
+                    mNumFilterBuffers++;
+                }
+                break;
             default:
-                ALOGE("Not supported filter\n");
+                ALOGW("%s: Not supported filter 0x%08x", __func__, supportedFilters[i]);
                 break;
         }
     }
@@ -641,34 +671,36 @@
     VABufferID pipelineId;
     VAProcPipelineParameterBuffer *pipeline;
     VAProcFilterParameterBufferFrameRateConversion *frc;
-    VAStatus vaStatus;
-    uint32_t i;
+    VAStatus vaStatus = STATUS_OK;
+    uint32_t i = 0;
 
-    if (mFilters == 0) {
-        ALOGE("%s: filters have not been initialized.", __func__);
-        return STATUS_ERROR;
-    }
-
-    if (outputCount < 1) {
-       ALOGE("invalid outputCount");
-       return STATUS_ERROR;
-    }
-
-    if (inputBuffer == NULL)
+    if (isEOS) {
+        if (mInputIndex == 0) {
+            ALOGV("%s: don't need to flush VSP", __func__);
+            return STATUS_OK;
+        }
         input = VA_INVALID_SURFACE;
-    else
-        input = inputBuffer->getSurface();
-
-    if (input == VA_INVALID_SURFACE && !isEOS) {
-        ALOGE("invalid input buffer");
-        return STATUS_ERROR;
-    }
-    for (i = 0; i < outputCount; i++) {
-        output[i] = outputBuffer[i]->getSurface();
-        if (output[i] == VA_INVALID_SURFACE) {
-            ALOGE("invalid output buffer");
+        outputCount = 1;
+        output[0] = mPrevOutput;
+    } else {
+        if (!inputBuffer || outputBuffer.size() != outputCount) {
+            ALOGE("%s: invalid input/output buffer", __func__);
             return STATUS_ERROR;
         }
+
+        if (outputCount < 1 || outputCount > 4) {
+            ALOGE("%s: invalid outputCount", __func__);
+            return STATUS_ERROR;
+        }
+
+        input = inputBuffer->getSurface();
+        for (i = 0; i < outputCount; i++) {
+            output[i] = outputBuffer[i]->getSurface();
+            if (output[i] == VA_INVALID_SURFACE) {
+                ALOGE("invalid output buffer");
+                return STATUS_ERROR;
+            }
+        }
     }
 
     // reference frames setting
@@ -779,7 +811,7 @@
     ALOGV("before vaEndPicture");
     vaStatus = vaEndPicture(mVADisplay, mVAContext);
     CHECK_VASTATUS("vaEndPicture");
-
+    
     if (isEOS) {
         vaStatus = vaSyncSurface(mVADisplay, mPrevOutput);
         CHECK_VASTATUS("vaSyncSurface");
@@ -900,9 +932,11 @@
 
 status_t ISVWorker::reset() {
     status_t ret;
-    ALOGI("reset");
-    ALOGI("======mVPPInputCount=%d, mVPPRenderCount=%d======",
-            mInputIndex, mOutputCount);
+    ALOGV("reset");
+    if (mOutputCount > 0) {
+        ALOGI("======mVPPInputCount=%d, mVPPRenderCount=%d======",
+                mInputIndex, mOutputCount);
+    }
     mInputIndex = 0;
     mOutputIndex = 0;
     mOutputCount = 0;
@@ -1003,3 +1037,4 @@
     fclose(ofile);
     return STATUS_OK;
 }
+
diff --git a/ISV/include/isv_bufmanager.h b/ISV/include/isv_bufmanager.h
index 3a0df06..cc50909 100644
--- a/ISV/include/isv_bufmanager.h
+++ b/ISV/include/isv_bufmanager.h
@@ -63,7 +63,7 @@
 
 public:
     ISVBuffer(sp<ISVWorker> worker,
-            uint32_t buffer, uint32_t grallocHandle,
+            unsigned long buffer, unsigned long grallocHandle,
             uint32_t width, uint32_t height,
             uint32_t stride, uint32_t colorFormat,
             ISV_BUFFERTYPE type)
@@ -78,7 +78,7 @@
         mSurface(-1) {}
 
     ISVBuffer(sp<ISVWorker> worker,
-            uint32_t buffer,
+            unsigned long buffer,
             ISV_BUFFERTYPE type)
         :mWorker(worker),
         mBuffer(buffer),
@@ -93,17 +93,18 @@
     ~ISVBuffer();
 
     // init buffer info
-    status_t initBufferInfo();
+    // FIXME: hackFormat is for VP9, should be removed in future
+    status_t initBufferInfo(uint32_t hackFormat);
 
     // get va surface
-    uint32_t getSurface() { return mSurface; }
+    int32_t getSurface() { return mSurface; }
     // get buffer handle
-    uint32_t getHandle() { return mBuffer; }
+    unsigned long getHandle() { return mBuffer; }
 
 private:
     sp<ISVWorker> mWorker;
-    uint32_t mBuffer;
-    uint32_t mGrallocHandle;
+    unsigned long mBuffer;
+    unsigned long mGrallocHandle;
     uint32_t mWidth;
     uint32_t mHeight;
     uint32_t mStride;
@@ -125,11 +126,11 @@
 
     // register/unregister ISVBuffers to mBuffers
     status_t useBuffer(const sp<ANativeWindowBuffer> nativeBuffer);
-    status_t useBuffer(uint32_t handle);
-    status_t freeBuffer(uint32_t handle);
+    status_t useBuffer(unsigned long handle);
+    status_t freeBuffer(unsigned long handle);
 
     // Map to ISVBuffer
-    ISVBuffer* mapBuffer(uint32_t handle);
+    ISVBuffer* mapBuffer(unsigned long handle);
     // set isv worker
     void setWorker(sp<ISVWorker> worker) { mWorker = worker; }
     void setMetaDataMode(bool metaDataMode) { mMetaDataMode = metaDataMode; }
diff --git a/ISV/include/isv_omxcomponent.h b/ISV/include/isv_omxcomponent.h
index f3e2146..e8f0c05 100644
--- a/ISV/include/isv_omxcomponent.h
+++ b/ISV/include/isv_omxcomponent.h
@@ -31,14 +31,16 @@
 
 #define ISV_COMPONENT_DEBUG 0
 
-#define MIN_INPUT_NUM           (6)    // forward reference frame number is 3 for merrifield/moorefield
+#ifdef TARGET_VPP_USE_GEN
+#define MIN_INPUT_NUM           (3)
+#define MIN_OUTPUT_NUM          (3)
+#else
+#define MIN_INPUT_NUM           (4)    // forward reference frame number is 3 for merrifield/moorefield
 #define MIN_OUTPUT_NUM          (10)   // 2.5FRC need hold 2 + 3 + 2 + 3= 10 buffers, without FRC we set to 6
-#define DECODE_EXTRA_NUM        (9)    //?? i don't know
-#define MIN_ISV_BUFFER_NUM      ((MIN_OUTPUT_NUM) + (MIN_INPUT_NUM) + (DECODE_EXTRA_NUM))
+#endif
+#define MIN_ISV_BUFFER_NUM      ((MIN_OUTPUT_NUM) + (MIN_INPUT_NUM))
 #define UNDEQUEUED_NUM          (4)   // display system hold 4 buffers
 
-#define SKIP_FRAME_NUM          (30)
-
 using namespace android;
 class ISVComponent;
 
@@ -268,11 +270,11 @@
     int32_t mNumISVBuffers;
     int32_t mNumDecoderBuffers;
     int32_t mNumDecoderBuffersBak;
-    int64_t mNumBypassFrames;
     uint32_t mWidth;
     uint32_t mHeight;
     uint32_t mUseAndroidNativeBufferIndex;
     uint32_t mStoreMetaDataInBuffersIndex;
+    uint32_t mHackFormat;
 
     bool mUseAndroidNativeBuffer;
     bool mUseAndroidNativeBuffer2;
diff --git a/ISV/include/isv_processor.h b/ISV/include/isv_processor.h
index 1b0b07c..9ea4e4c 100644
--- a/ISV/include/isv_processor.h
+++ b/ISV/include/isv_processor.h
@@ -62,6 +62,8 @@
     void stop();
     bool isReadytoRun();
 
+    //configure FRC factor
+    status_t configFRC(uint32_t fps);
     //add output buffer into mOutputBuffers
     void addOutput(OMX_BUFFERHEADERTYPE* output);
     //add intput buffer into mInputBuffers
@@ -82,6 +84,8 @@
     void flush();
     //return whether this fps is valid
     inline bool isFrameRateValid(uint32_t fps);
+    //auto calculate fps if the framework doesn't set the correct fps
+    status_t calculateFps(int64_t timeStamp, uint32_t* fps);
     //config vpp filters
     status_t configFilters(OMX_BUFFERHEADERTYPE* buffer);
 
@@ -103,6 +107,8 @@
     Mutex mInputLock; // to protect access to mFillBuffers
     uint32_t mInputProcIdx;
 
+    const static uint32_t WINDOW_SIZE = 4;  // must >= 2
+    Vector<int64_t>mTimeWindow;
     // conditon for thread running
     Mutex mLock;
     Condition mRunCond;
@@ -113,7 +119,6 @@
 
     uint32_t mNumTaskInProcesing;
     uint32_t mNumRetry;
-    int64_t mLastTimeStamp;
     bool mError;
     bool mbFlush;
     bool mbBypass;
diff --git a/ISV/include/isv_profile.h b/ISV/include/isv_profile.h
index a79dbb5..d9a04fd 100644
--- a/ISV/include/isv_profile.h
+++ b/ISV/include/isv_profile.h
@@ -108,6 +108,7 @@
     uint32_t getResolution(const char * name);
     void getConfigData(const char *name, const char **atts);
     void handleFilterParameter(const char *name, const char **atts);
+    void handleCommonParameter(const char *name, const char **atts);
 
     /* dump the config data */
     void dumpConfigData();
@@ -131,6 +132,12 @@
     uint32_t mWidth;
     uint32_t mHeight;
 
+    /* The default value of VPP/FRC.
+     * They will be read from config xml file.
+     */
+    int32_t mDefaultVPPStatus;
+    int32_t mDefaultFRCStatus;
+
     /* the filters' status according to resolution
      * bit 0  used for ProcFilterNone
      * bit 1  used for ProcFilterNoiseReduction
diff --git a/ISV/include/isv_worker.h b/ISV/include/isv_worker.h
index 3eb97c6..2efee2a 100644
--- a/ISV/include/isv_worker.h
+++ b/ISV/include/isv_worker.h
@@ -37,7 +37,7 @@
  */
 #define OMX_BUFFERFLAG_TFF 0x00010000
 
-/* interlaced frame flag: This flag is set to indicate the buffer contains a
+/* interlaced frame flag: This flag is set to indicate the buffer contains a 
  * top and bottom field and display ordering is bottom field first.
  * @ingroup buf
  */
@@ -123,7 +123,7 @@
 
         // alloc/free VA surface
         status_t allocSurface(uint32_t* width, uint32_t* height,
-                uint32_t stride, uint32_t format, uint32_t handle, int32_t* surfaceId);
+                uint32_t stride, uint32_t format, unsigned long handle, int32_t* surfaceId);
         status_t freeSurface(int32_t* surfaceId);
 
         ISVWorker();
diff --git a/ISV/omx/isv_omxcomponent.cpp b/ISV/omx/isv_omxcomponent.cpp
index 300cdf3..cb96c54 100644
--- a/ISV/omx/isv_omxcomponent.cpp
+++ b/ISV/omx/isv_omxcomponent.cpp
@@ -21,6 +21,7 @@
 #include <media/hardware/HardwareAPI.h>
 #include "isv_profile.h"
 #include <OMX_IndexExt.h>
+#include <hal_public.h>
 
 //#define LOG_NDEBUG 0
 #undef LOG_TAG
@@ -59,11 +60,11 @@
         mNumISVBuffers(MIN_ISV_BUFFER_NUM),
         mNumDecoderBuffers(0),
         mNumDecoderBuffersBak(0),
-        mNumBypassFrames(SKIP_FRAME_NUM),
         mWidth(0),
         mHeight(0),
         mUseAndroidNativeBufferIndex(0),
         mStoreMetaDataInBuffersIndex(0),
+        mHackFormat(0),
         mUseAndroidNativeBuffer(false),
         mUseAndroidNativeBuffer2(false),
         mVPPEnabled(false),
@@ -102,7 +103,7 @@
     g_isv_components.push_back(static_cast<ISVComponent*>(this));
 
     mVPPOn = ISVProfile::isFRCOn() || ISVProfile::isVPPOn();
-    ALOGI("%s: mVPPOn=%d", __func__, mVPPOn);
+    ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: mVPPOn %d", __func__, mVPPOn);
 
     if (mISVBufferManager == NULL) {
         mISVBufferManager = new ISVBufferManager();
@@ -112,7 +113,7 @@
 
 ISVComponent::~ISVComponent()
 {
-    ALOGI("%s", __func__);
+    ALOGD_IF(ISV_COMPONENT_DEBUG, "%s", __func__);
     if (mpISVCallBacks) {
         free(mpISVCallBacks);
         mpISVCallBacks = NULL;
@@ -167,7 +168,7 @@
         if (mProcThread != NULL) {
             mProcThread->stop();
             mProcThread = NULL;
-            ALOGI("%s: delete ISV processor ", __func__);
+            ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: delete ISV processor ", __func__);
         }
     }
     pthread_mutex_unlock(&ProcThreadInstanceLock);
@@ -255,6 +256,15 @@
             ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: orignal bufferCountActual %d, bufferCountMin %d",  __func__, def->nBufferCountActual, def->nBufferCountMin);
             def->nBufferCountActual += mNumISVBuffers;
             def->nBufferCountMin += mNumISVBuffers;
+#ifndef TARGET_VPP_USE_GEN
+            //FIXME: THIS IS A HACK!! Request NV12 buffer for YV12 format
+            //because VSP only support NV12 output
+            OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def->format.video;
+            if (video_def->eColorFormat == VA_FOURCC_YV12) {
+                mHackFormat = HAL_PIXEL_FORMAT_YV12;
+                video_def->eColorFormat = (OMX_COLOR_FORMATTYPE)HAL_PIXEL_FORMAT_NV12_VED;
+            }
+#endif
         }
     }
 
@@ -267,7 +277,7 @@
     OMX_IN  OMX_PTR pComponentParameterStructure)
 {
     GET_ISVOMX_COMPONENT(hComponent);
-
+ 
     return pComp->ISV_SetParameter(nIndex, pComponentParameterStructure);
 }
 
@@ -283,6 +293,23 @@
         if (*def == ISV_AUTO) {
             mVPPEnabled = true;
             ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: mVPPEnabled -->true", __func__);
+#ifndef TARGET_VPP_USE_GEN
+            if (mVPPOn) {
+                uint32_t number = MIN_INPUT_NUM + MIN_OUTPUT_NUM;
+                OMX_INDEXTYPE index;
+                status_t error =
+                    OMX_GetExtensionIndex(
+                            mComponent,
+                            (OMX_STRING)"OMX.Intel.index.vppBufferNum",
+                            &index);
+                if (error == OK) {
+                    error = OMX_SetParameter(mComponent, index, (OMX_PTR)&number);
+                } else {
+                    // ingore this error
+                    ALOGW("Get vpp number index failed");
+                }
+            }
+#endif
         } else if (*def == ISV_DISABLE)
             mVPPEnabled = false;
         return OMX_ErrorNone;
@@ -314,20 +341,16 @@
                     ALOGE("%s: failed to set ISV buffer count, set VPPEnabled -->false", __func__);
                     mVPPEnabled = false;
                 }
-                ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: video frame width %d, height %d",  __func__,
+                ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: video frame width %d, height %d",  __func__, 
                         video_def->nFrameWidth, video_def->nFrameHeight);
             }
-#if 0
+
             if (def->nPortIndex == kPortIndexInput) {
                 OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def->format.video;
-                mFilterParam.frameRate = video_def->xFramerate;
 
-                if (mISVProfile != NULL && mFilterParam.frameRate != 0) {
-                    mFilterParam.frcRate = mISVProfile->getFRCRate(mFilterParam.frameRate);
-                }
-                ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: frame rate is set to %d",  __func__, mFilterParam.frameRate);
+                if (mProcThread != NULL)
+                    mProcThread->configFRC(video_def->xFramerate);
             }
-#endif
         }
 
         if (mUseAndroidNativeBuffer
@@ -392,18 +415,6 @@
 {
     ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: nIndex 0x%08x", __func__, nIndex);
 
-    if (nIndex == static_cast<OMX_INDEXTYPE>(OMX_IndexConfigAutoFramerateConversion)) {
-        OMX_CONFIG_BOOLEANTYPE *config = static_cast<OMX_CONFIG_BOOLEANTYPE*>(pComponentConfigStructure);
-        if (config->bEnabled) {
-            mVPPEnabled = true;
-            ALOGI("%s: mVPPEnabled=true", __func__);
-        } else {
-            mVPPEnabled = false;
-            ALOGI("%s: mVPPEnabled=false", __func__);
-        }
-        return OMX_ErrorNone;
-    }
-
     return OMX_SetConfig(mComponent, nIndex, pComponentConfigStructure);
 }
 
@@ -498,7 +509,7 @@
             && nPortIndex == kPortIndexOutput
             /*&& mUseAndroidNativeBuffer2*/) {
         if (mISVBufferManager != NULL) {
-            if (OK != mISVBufferManager->useBuffer(reinterpret_cast<uint32_t>(pBuffer))) {
+            if (OK != mISVBufferManager->useBuffer(reinterpret_cast<unsigned long>(pBuffer))) {
                 ALOGE("%s: failed to register graphic buffers to ISV, set mVPPEnabled -->false", __func__);
                 mVPPEnabled = false;
             } else
@@ -555,7 +566,7 @@
             && mVPPEnabled
             && mVPPOn
             && nPortIndex == kPortIndexOutput) {
-        if (mISVBufferManager != NULL && OK != mISVBufferManager->freeBuffer(reinterpret_cast<uint32_t>(pBuffer->pBuffer)))
+        if (mISVBufferManager != NULL && OK != mISVBufferManager->freeBuffer(reinterpret_cast<unsigned long>(pBuffer->pBuffer)))
             ALOGW("%s: pBuffer %p has not been registered into ISV", __func__, pBuffer);
     }
     return err;
@@ -595,14 +606,14 @@
         return OMX_FillThisBuffer(mComponent, pBuffer);
 
     if (mISVBufferManager != NULL) {
-        ISVBuffer* isvBuffer = mISVBufferManager->mapBuffer(reinterpret_cast<uint32_t>(pBuffer->pBuffer));
+        ISVBuffer* isvBuffer = mISVBufferManager->mapBuffer(reinterpret_cast<unsigned long>(pBuffer->pBuffer));
         if (isvBuffer == NULL) {
             ALOGE("%s: failed to map ISVBuffer, set mVPPEnabled -->false", __func__);
             mVPPEnabled = false;
             return OMX_FillThisBuffer(mComponent, pBuffer);
         }
 
-        if (OK != isvBuffer->initBufferInfo()) {
+        if (OK != isvBuffer->initBufferInfo(mHackFormat)) {
             ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: isvBuffer %p failed to initBufferInfo", __func__, isvBuffer);
             mVPPEnabled = false;
             return OMX_FillThisBuffer(mComponent, pBuffer);
@@ -647,7 +658,7 @@
         return OMX_ErrorUndefined;
     }
 
-    if(!mVPPEnabled || !mVPPOn || mVPPFlushing || mNumBypassFrames-- > 0) {
+    if(!mVPPEnabled || !mVPPOn || mVPPFlushing || pBuffer->nFilledLen == 0) {
         ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: FillBufferDone pBuffer %p, timeStamp %.2f ms", __func__, pBuffer, pBuffer->nTimeStamp/1E3);
         return mpCallBacks->FillBufferDone(&mBaseComponent, pAppData, pBuffer);
     }
@@ -845,3 +856,4 @@
 
     return err;
 }
+
diff --git a/ISV/omx/isv_omxcore.cpp b/ISV/omx/isv_omxcore.cpp
index 35e7a87..5f6933b 100644
--- a/ISV/omx/isv_omxcore.cpp
+++ b/ISV/omx/isv_omxcore.cpp
@@ -98,7 +98,6 @@
             } else {
                 pthread_mutex_unlock(&g_module_lock);
                 ALOGW("OMX IL core not found");
-                return OMX_ErrorUndefined; // Do we need to return error message
             }
         }
         g_initialized = 1;
@@ -170,7 +169,6 @@
     struct list *entry;
     OMX_ERRORTYPE ret;
     OMX_HANDLETYPE tempHandle;
-
     ALOGD_IF(ISV_CORE_DEBUG, "%s: enter, try to get %s", __func__, cComponentName);
     pthread_mutex_lock(&g_module_lock);
 
@@ -202,7 +200,6 @@
         if(omx_res == OMX_ErrorNone) {
             pISVComponent->setComponent(static_cast<OMX_COMPONENTTYPE*>(tempHandle), &g_cores[i]);
             g_isv_components.push_back(pISVComponent);
-
             *pHandle = pISVComponent->getBaseComponent();
 
             ALOGD_IF(ISV_CORE_DEBUG, "%s: found component %s, pHandle %p", __func__, cComponentName, *pHandle);
@@ -214,7 +211,7 @@
 
     delete pISVComponent;
     pISVComponent = NULL;
-    ALOGE("%s(): exit failure, %s not found", __func__, cComponentName);
+    ALOGD_IF(ISV_CORE_DEBUG, "%s(): exit failure, %s not found", __func__, cComponentName);
     return OMX_ErrorInvalidComponent;
 }
 
@@ -224,7 +221,6 @@
     OMX_ERRORTYPE ret;
 
     ALOGD_IF(ISV_CORE_DEBUG, "%s: enter, try to free component hanle %p", __func__, hComponent);
-
     pthread_mutex_lock(&g_module_lock);
 
     for (OMX_U32 i = 0; i < g_isv_components.size(); i++) {
@@ -304,7 +300,6 @@
                     const_cast<OMX_STRING>(compName), &numRoles2, array);
 
             *pNumRoles = numRoles;
-
             for (OMX_U32 i = 0; i < numRoles; i++) {
                 if (i < numRoles-1)
                     roles[i+1] = roles[i] + OMX_MAX_STRINGNAME_SIZE;
@@ -328,3 +323,4 @@
     ALOGE("%s: invalid component", __func__);
     return OMX_ErrorInvalidComponent;
 }
+
diff --git a/ISV/profile/isv_profile.cpp b/ISV/profile/isv_profile.cpp
index 9cf91c9..52752b9 100644
--- a/ISV/profile/isv_profile.cpp
+++ b/ISV/profile/isv_profile.cpp
@@ -18,8 +18,6 @@
 #include <string.h>
 #include <stdio.h>
 #include <utils/Log.h>
-#include <cutils/properties.h>
-
 #include "isv_profile.h"
 
 #undef LOG_TAG
@@ -27,6 +25,8 @@
 
 #define QCIF_AREA (176 * 144)
 
+#define DEFAULT_XML_FILE "/etc/video_isv_profile.xml"
+
 using namespace android;
 static const char StatusOn[][5] = {"1frc", "1vpp"};
 
@@ -39,6 +39,9 @@
 
     mCurrentFilter = 0;
     mCurrentFrcTab = 0;
+    mDefaultVPPStatus = 0;
+    mDefaultFRCStatus = 0;
+
     mStatus = 0;
 
     memset(mConfigs, 0, sizeof(ISVConfig) * ProcFilterCount);
@@ -87,27 +90,13 @@
 bool ISVProfile::isVPPOn()
 {
     int32_t status = getGlobalStatus();
-    if (status == -1) {
-        char value[PROPERTY_VALUE_MAX];
-        if (property_get("persist.intel.isv.vpp", value, NULL) &&
-                (!strcmp("1", value) || !strcasecmp("true", value))) {
-            status = VPP_COMMON_ON;
-        }
-    }
-    return (status & VPP_COMMON_ON);
+    return (status != -1) ? (((status & VPP_COMMON_ON) != 0) ? true : false) : false;
 }
 
 bool ISVProfile::isFRCOn()
 {
     int32_t status = getGlobalStatus();
-    if (status == -1) {
-        char value[PROPERTY_VALUE_MAX];
-        if (property_get("persist.intel.isv.frc", value, NULL) &&
-                (!strcmp("1", value) || !strcasecmp("true", value))) {
-            status = VPP_FRC_ON;
-        }
-    }
-    return (status & VPP_FRC_ON);
+    return (status != -1) ? (((status & VPP_FRC_ON) != 0) ? true : false) : false;
 }
 
 void ISVProfile::updateFilterStatus() {
@@ -251,7 +240,11 @@
             ALOGE("\"FRCRate\" element is only for ProcFilterFrameRateConversion\n");
         }
     } else if (strcmp(name, "parameter") == 0) {
+        /* <parameter /> */
         handleFilterParameter(name, atts);
+    } else if (strcmp(name, "Parameter") == 0) {
+        /* <Parameter /> */
+        handleCommonParameter(name, atts);
     } else
         ALOGE("Couldn't handle this element %s!\n", name);
 }
@@ -272,6 +265,23 @@
 
 }
 
+void ISVProfile::handleCommonParameter(const char *name, const char **atts)
+{
+    int attIndex = 0;
+
+    if (strcmp(atts[attIndex], "name") || strcmp(atts[attIndex + 2], "value")) {
+        ALOGE("\"%s\" or \"%s\" couldn't match the %s format\n", atts[attIndex], atts[attIndex + 2], name);
+        return;
+    }
+
+    /* The default status of VPP */
+    if (strcmp(atts[attIndex + 1], "DefaultVPPStatus") == 0)
+        mDefaultVPPStatus = atoi(atts[attIndex + 3]);
+    /* The default status of FRC */
+    else if (strcmp(atts[attIndex + 1], "DefaultFRCStatus") == 0)
+        mDefaultFRCStatus = atoi(atts[attIndex + 3]);
+}
+
 void ISVProfile::startElement(void *userData, const char *name, const char **atts)
 {
     ISVProfile *profile = (ISVProfile *)userData;
@@ -293,11 +303,9 @@
     void *pBuf = NULL;
     FILE *fp = NULL;
 
-    static const char *defaultXmlFile = "/etc/video_isv_profile.xml";
-
-    fp = ::fopen(defaultXmlFile, "r");
+    fp = ::fopen(DEFAULT_XML_FILE, "r");
     if (NULL == fp) {
-        ALOGE("@%s, line:%d, couldn't open profile %s", __func__, __LINE__, defaultXmlFile);
+        ALOGE("@%s, line:%d, couldn't open profile %s", __func__, __LINE__, DEFAULT_XML_FILE);
         return;
     }
 
@@ -344,21 +352,49 @@
     char path[80];
     int userId = 0;
     int32_t status = 0;
+    FILE *setting_handle, *config_handle;
 
     snprintf(path, 80, "/data/user/%d/com.intel.vpp/shared_prefs/vpp_settings.xml", userId);
     ALOGI("%s: %s",__func__, path);
-    FILE *handle = fopen(path, "r");
-    if(handle == NULL) {
+    setting_handle = fopen(path, "r");
+    if(setting_handle == NULL) {
         ALOGE("%s: failed to open file %s\n", __func__, path);
-        return -1;
+
+        /* Read the Filter config file to get default value */
+        config_handle = fopen(DEFAULT_XML_FILE, "r");
+        if (config_handle == NULL) {
+            ALOGE("%s: failed to open file %s\n", __func__, DEFAULT_XML_FILE);
+            return -1;
+        }
+
+        char xml_buf[MAX_BUF_SIZE + 1] = {0};
+        memset(xml_buf, 0, MAX_BUF_SIZE);
+        if (fread(xml_buf, 1, MAX_BUF_SIZE, config_handle) <= 0) {
+            ALOGE("%s: failed to read config xml file!\n", __func__);
+            fclose(config_handle);
+            return -1;
+        }
+        xml_buf[MAX_BUF_SIZE] = '\0';
+
+        if (strstr(xml_buf, "name=\"DefaultVPPStatus\" value=\"1\"") != NULL)
+            status |= VPP_COMMON_ON;
+        if (strstr(xml_buf, "name=\"DefaultFRCStatus\" value=\"1\"") != NULL)
+            status |= VPP_FRC_ON;
+
+        ALOGI("%s: using the default status: VPP=%d, FRC=%d\n", __func__,
+            ((status & VPP_COMMON_ON) == 0) ? 0 : 1,
+            ((status & VPP_FRC_ON) == 0) ? 0: 1);
+
+        fclose(config_handle);
+        return status;
     }
 
     const int MAXLEN = 1024;
     char buf[MAXLEN] = {0};
     memset(buf, 0 ,MAXLEN);
-    if(fread(buf, 1, MAXLEN, handle) <= 0) {
+    if(fread(buf, 1, MAXLEN, setting_handle) <= 0) {
         ALOGE("%s: failed to read vpp config file %d", __func__, userId);
-        fclose(handle);
+        fclose(setting_handle);
         return -1;
     }
     buf[MAXLEN - 1] = '\0';
@@ -369,7 +405,7 @@
     if(strstr(buf, StatusOn[1]) != NULL)
         status |= VPP_COMMON_ON;
 
-    fclose(handle);
+    fclose(setting_handle);
     return status;
 }
 
@@ -408,7 +444,7 @@
         if (mConfigs[i].paraSize) {
             ALOGI("\t\t parameters: ");
             for(j = 0; j < mConfigs[i].paraSize; j++)
-                ALOGI("%s=%f,", mConfigs[i].paraTables[j].name, mConfigs[i].paraTables[j].value);
+                ALOGE("%s=%f,", mConfigs[i].paraTables[j].name, mConfigs[i].paraTables[j].value);
             ALOGI("\n");
         }
     }
@@ -419,4 +455,9 @@
             break;
         ALOGI("input_fps=%d, rate=%s\n", mFrcRates[i].input_fps, rateNames[mFrcRates[i].rate]);
     }
+
+    ALOGI("========== common parameter configs:===========\n");
+    ALOGI("mDefaultVPPStatus=%d\n", mDefaultVPPStatus);
+    ALOGI("mDefaultFRCStatus=%d\n", mDefaultFRCStatus);
+
 }