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