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);
+
 }
