blob: 796e0a05c8c9de4455a5c68b35c4b49aca85cb20 [file] [log] [blame]
/*
* Copyright (C) 2019 MediaTek Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "MtkCam/P1NodeConnectLMV"
//
#include <memory>
#include "mtkcam/pipeline/hwnode/p1/P1ConnectLMV.h"
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
namespace NSCam {
namespace v3 {
namespace NSP1Node {
//
#define SUPPORT_LMV (1)
#define FORCE_EIS_ON (SUPPORT_LMV && (0))
#define FORCE_3DNR_ON (1)
#if 1
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// P1ConnectLMV Implementation
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/******************************************************************************
*
******************************************************************************/
MBOOL
P1ConnectLMV::support(void) {
#if SUPPORT_LMV
return MTRUE;
#else
return MFALSE;
#endif
}
/******************************************************************************
*
******************************************************************************/
MINT32
P1ConnectLMV::getOpenId(void) {
return mOpenId;
}
/******************************************************************************
*
******************************************************************************/
MBOOL
P1ConnectLMV::init(MUINT32 eisMode,
const MUINT32 eisFactor,
MSize sensorSize,
MSize rrzoSize) {
uninit();
//
std::lock_guard<std::mutex> autoLock(mLock);
mEisMode = eisMode;
mIsCalibration =
/*EIS_MODE_IS_CALIBRATION_ENABLED(mEisMode) ? MTRUE : */ MFALSE;
MY_LOGD("mEisMode=0x%x, mIsCalibration=%d", mEisMode, mIsCalibration);
P1_TRACE_S_BEGIN(SLG_S, "P1Connect:LMV-init");
mpLMV = LMVHal::CreateInstance(LOG_TAG, mOpenId);
if (mpLMV == NULL) {
MY_LOGE("LMVHal::CreateInstance fail");
return MFALSE;
}
mpLMV->Init(eisFactor, sensorSize, rrzoSize);
IHalSensorList* sensorList = GET_HalSensorList();
if (sensorList == NULL) {
MY_LOGE("Get-SensorList fail");
return MFALSE;
}
mConfigData.sensorType = sensorList->queryType(mOpenId);
P1_TRACE_C_END(SLG_S); // "P1Connect:LMV-init"
return MTRUE;
}
/******************************************************************************
*
******************************************************************************/
MBOOL
P1ConnectLMV::uninit(void) {
std::lock_guard<std::mutex> autoLock(mLock);
P1_TRACE_S_BEGIN(SLG_S, "P1Connect:LMV-uninit");
if (mpLMV) {
mpLMV->Uninit();
mpLMV = NULL;
}
//
P1_TRACE_C_END(SLG_S); // "P1Connect:LMV-uninit"
return MFALSE;
}
/******************************************************************************
*
******************************************************************************/
MVOID
P1ConnectLMV::config(std::vector<std::shared_ptr<IImageBuffer>> buffers) {
MY_LOGD("config+");
std::lock_guard<std::mutex> autoLock(mLock);
if ((mpLMV != NULL) && (mpLMV->GetLMVSupportInfo(mOpenId))) {
P1_TRACE_S_BEGIN(SLG_S, "P1Connect:LMV-ConfigLMV");
mConfigData.lmvBuffers = buffers;
mpLMV->ConfigLMV(mConfigData);
P1_TRACE_C_END(SLG_S); // "P1Connect:LMV-ConfigLMV"
}
MY_LOGD("config-");
}
/******************************************************************************
*
******************************************************************************/
MVOID
P1ConnectLMV::enableSensor(void) {}
/******************************************************************************
*
******************************************************************************/
MVOID
P1ConnectLMV::enableOIS(std::shared_ptr<IHal3A_T> p3A) {
std::lock_guard<std::mutex> autoLock(mLock);
if (EIS_MODE_IS_CALIBRATION_ENABLED(mEisMode) && mpLMV && p3A) {
// Enable OIS
MY_LOGD("[LMVHal] mEisMode:%d => Enable OIS ", mEisMode);
P1_TRACE_S_BEGIN(SLG_R, "P1Connect:LMV-SetEnableOIS");
p3A->send3ACtrl(NS3Av3::E3ACtrl_SetEnableOIS, 1, 0);
P1_TRACE_C_END(SLG_R); // "P1Connect:LMV-SetEnableOIS"
mEisMode = EIS_MODE_OFF;
}
}
/******************************************************************************
*
******************************************************************************/
MVOID
P1ConnectLMV::getBuf(std::shared_ptr<IImageBuffer>* rEISOBuf) {
std::lock_guard<std::mutex> autoLock(mLock);
P1_TRACE_S_BEGIN(SLG_I, "P1Connect:LMV-GetBufLMV");
mpLMV->GetBufLMV(rEISOBuf);
P1_TRACE_C_END(SLG_I); // "P1Connect:LMV-GetBufLMV"
if (rEISOBuf == NULL) {
MY_LOGE("LMVHal::GetBufLMV fail");
}
}
/******************************************************************************
*
******************************************************************************/
MBOOL
P1ConnectLMV::isEISOn(IMetadata* const inApp) {
if (inApp == NULL) {
return MFALSE;
}
MUINT8 eisMode = MTK_CONTROL_VIDEO_STABILIZATION_MODE_OFF;
MINT32 adveisMode = MTK_EIS_FEATURE_EIS_MODE_OFF;
if (!tryGetMetadata<MUINT8>(inApp, MTK_CONTROL_VIDEO_STABILIZATION_MODE,
&eisMode)) {
MY_LOGD("no MTK_CONTROL_VIDEO_STABILIZATION_MODE");
}
if (!tryGetMetadata<MINT32>(inApp, MTK_EIS_FEATURE_EIS_MODE, &adveisMode)) {
MY_LOGD("no MTK_EIS_FEATURE_EIS_MODE");
}
#if FORCE_EIS_ON
eisMode = MTK_CONTROL_VIDEO_STABILIZATION_MODE_ON;
#endif
return (eisMode == MTK_CONTROL_VIDEO_STABILIZATION_MODE_ON ||
adveisMode == MTK_EIS_FEATURE_EIS_MODE_ON);
}
/******************************************************************************
*
******************************************************************************/
MBOOL
P1ConnectLMV::is3DNROn(IMetadata* const inApp, IMetadata* const inHal) {
if (inApp == NULL) {
return MFALSE;
}
MINT32 e3DnrMode = MTK_NR_FEATURE_3DNR_MODE_OFF;
if (!tryGetMetadata<MINT32>(inApp, MTK_NR_FEATURE_3DNR_MODE, &e3DnrMode)) {
MY_LOGD("no MTK_NR_FEATURE_3DNR_MODE");
}
MINT32 eHal3DnrMode = MTK_NR_FEATURE_3DNR_MODE_ON;
if (!tryGetMetadata<MINT32>(inHal, MTK_DUALZOOM_3DNR_MODE, &eHal3DnrMode)) {
// Only valid for dual cam. On single cam, we don't care HAL meta,
// and can assume HAL is "ON" on single cam.
eHal3DnrMode = MTK_NR_FEATURE_3DNR_MODE_ON;
MY_LOGD("no MTK_NR_FEATURE_3DNR_MODE in HAL");
}
#if FORCE_3DNR_ON
e3DnrMode = MTK_NR_FEATURE_3DNR_MODE_ON;
eHal3DnrMode = MTK_NR_FEATURE_3DNR_MODE_ON;
#endif
return (e3DnrMode == MTK_NR_FEATURE_3DNR_MODE_ON &&
eHal3DnrMode == MTK_NR_FEATURE_3DNR_MODE_ON);
}
/******************************************************************************
*
******************************************************************************/
MBOOL
P1ConnectLMV::checkSwitchOut(IMetadata* const inHAL) {
if (inHAL == NULL) {
return MFALSE;
}
MBOOL result = MFALSE;
//
#if 1 // #if 0 /* for forced disable UNI_SWITCH_OUT */
MINT32 needSwitchOut = 0;
if (tryGetMetadata<MINT32>(inHAL, MTK_LMV_SEND_SWITCH_OUT, &needSwitchOut)) {
if (needSwitchOut == 1) {
result = MTRUE;
}
}
#endif
//
return result;
}
/******************************************************************************
*
******************************************************************************/
MVOID
P1ConnectLMV::adjustCropInfo(IMetadata* pAppMetadata,
IMetadata* pHalMetadata,
MRect* p_cropRect_control,
MSize sensorParam_Size,
MBOOL bEnableFrameSync,
MBOOL bIsStereoCamMode) {
std::lock_guard<std::mutex> autoLock(mLock);
MRect& cropRect_control = *p_cropRect_control;
MY_LOGD("control" P1_RECT_STR "sensor" P1_SIZE_STR,
P1_RECT_VAR(cropRect_control), P1_SIZE_VAR(sensorParam_Size));
if (mpLMV) {
MSize videoSize = MSize(0, 0);
MBOOL isEisOn = false;
MRect const requestRect = MRect(cropRect_control);
MSize const sensorSize = MSize(sensorParam_Size);
MSize FovMargin = MSize(0, 0);
MPoint const requestCenter =
MPoint((requestRect.p.x + (requestRect.s.w >> 1)),
(requestRect.p.y + (requestRect.s.h >> 1)));
isEisOn = isEISOn(pAppMetadata);
if (!tryGetMetadata<MSize>(pHalMetadata, MTK_EIS_VIDEO_SIZE, &videoSize)) {
MY_LOGD("cannot get MTK_EIS_VIDEO_SIZE");
}
MY_LOGD("FOVMargin : %dx%d", FovMargin.w, FovMargin.h);
cropRect_control.s = mpLMV->QueryMinSize(isEisOn, sensorSize, videoSize,
requestRect.size(), FovMargin);
MY_LOGD("Sensor(%dx%d) Video(%dx%d) REQ(%dx%d) LMV(%dx%d)", sensorSize.w,
sensorSize.h, videoSize.w, videoSize.h, requestRect.size().w,
requestRect.size().h, cropRect_control.s.w, cropRect_control.s.h);
if (isEisOn && (bEnableFrameSync || bIsStereoCamMode)) {
cropRect_control = MRect(requestRect);
MY_LOGD(
"EIS minimun size not supported in dual cam mode (%d,%d) "
"request_ctrl" P1_RECT_STR,
bEnableFrameSync, bIsStereoCamMode, P1_RECT_VAR(cropRect_control));
}
if (cropRect_control.s.w != requestRect.size().w) {
MSize::value_type half_len = ((cropRect_control.s.w + 1) >> 1);
MY_LOGD(
"Check_X_W half_len(%d) requestCenter.x(%d).w(%d) "
"CenterX(%d) SensorW(%d)",
half_len, cropRect_control.p.x, cropRect_control.s.w, requestCenter.x,
sensorSize.w);
if (requestCenter.x < half_len) {
cropRect_control.p.x = 0;
} else if ((requestCenter.x + half_len) > sensorSize.w) {
cropRect_control.p.x = sensorSize.w - cropRect_control.s.w;
} else {
cropRect_control.p.x = requestCenter.x - half_len;
}
}
if (cropRect_control.s.h != requestRect.size().h) {
MSize::value_type half_len = ((cropRect_control.s.h + 1) >> 1);
MY_LOGD(
"Check_Y_H half_len(%d) requestCenter.y(%d).h(%d) "
"CenterY(%d) SensorH(%d)",
half_len, cropRect_control.p.y, cropRect_control.s.h, requestCenter.y,
sensorSize.h);
if (requestCenter.y < half_len) {
cropRect_control.p.y = 0;
} else if ((requestCenter.y + half_len) > sensorSize.h) {
cropRect_control.p.y = sensorSize.h - cropRect_control.s.h;
} else {
cropRect_control.p.y = requestCenter.y - half_len;
}
}
MY_LOGD("final_control" P1_RECT_STR, P1_RECT_VAR(cropRect_control));
}
}
/******************************************************************************
*
******************************************************************************/
MVOID
P1ConnectLMV::processDequeFrame(
NSCam::NSIoPipe::NSCamIOPipe::QBufInfo* pBufInfo) {
MY_LOGD("processDequeFrame+");
std::lock_guard<std::mutex> autoLock(mLock);
// call LMV notify function
if (mpLMV) {
mpLMV->NotifyLMV(pBufInfo);
}
MY_LOGD("processDequeFrame-");
}
/******************************************************************************
*
******************************************************************************/
MVOID
P1ConnectLMV::processDropFrame(std::shared_ptr<NSCam::IImageBuffer>* spBuf) {
MY_LOGD("processDropFrame+");
std::lock_guard<std::mutex> autoLock(mLock);
if (*spBuf != NULL && mpLMV) {
mpLMV->NotifyLMV(*spBuf);
}
}
/******************************************************************************
*
******************************************************************************/
MVOID
P1ConnectLMV::processResult(MBOOL isBinEn,
MBOOL isConfigEis,
MBOOL isConfigRrz,
IMetadata* pInAPP,
IMetadata* pInHAL,
NS3Av3::MetaSet_T* result3A,
std::shared_ptr<IHal3A_T> p3A,
MINT32 const currMagicNum,
MUINT32 const currSofIdx,
MUINT32 const lastSofIdx,
MUINT32 const uniSwitchState,
QBufInfo const& deqBuf,
MUINT32 const bufIdxEis,
MUINT32 const bufIdxRrz,
IMetadata* rOutputLMV) {
MINT64 exposureTime = 0;
MY_LOGD("processResult+");
#if 1 // for EISO related processing
if ((isConfigEis && (bufIdxEis < deqBuf.mvOut.size())) && pInAPP != NULL) {
if (1) {
MUINT8 cap_mode = 0;
if (!tryGetMetadata<MUINT8>(pInAPP, MTK_CONTROL_CAPTURE_INTENT,
&cap_mode)) {
MY_LOGW("no MTK_CONTROL_CAPTURE_INTENT");
}
if (!tryGetMetadata<MINT64>(&(result3A->appMeta),
MTK_SENSOR_EXPOSURE_TIME, &exposureTime)) {
MY_LOGW("no MTK_SENSOR_EXPOSURE_TIME");
}
processLMV(isBinEn, p3A, currMagicNum, currSofIdx, lastSofIdx, deqBuf,
bufIdxEis, cap_mode, exposureTime, rOutputLMV);
}
} else if ((isConfigRrz && (bufIdxRrz < deqBuf.mvOut.size())) &&
pInAPP != NULL) {
if (isEISOn(pInAPP) && (EIS_MODE_IS_EIS_30_ENABLED(mEisMode) ||
EIS_MODE_IS_EIS_25_ENABLED(mEisMode) ||
EIS_MODE_IS_EIS_22_ENABLED(mEisMode))) {
MINT32 iExpTime, ihwTS, ilwTS;
MUINT32 k;
const MINT64 aTimestamp = deqBuf.mvOut[bufIdxRrz].mMetaData.mTimeStamp;
if (!tryGetMetadata<MINT64>(&(result3A->appMeta),
MTK_SENSOR_EXPOSURE_TIME, &exposureTime)) {
MY_LOGW("no MTK_SENSOR_EXPOSURE_TIME");
}
iExpTime = exposureTime / ((MINT64)1000); // (ns to us) << frame duration
ihwTS = (aTimestamp >> 32) & 0xFFFFFFFF; // High word
ilwTS = (aTimestamp & 0xFFFFFFFF); // Low word
IMetadata::IEntry entry(MTK_EIS_REGION);
for (k = 0; k < LMV_REGION_INDEX_EXPTIME; k++) {
entry.push_back(0, Type2Type<MINT32>());
}
/* Store required data for Advanced EIS */
entry.push_back(iExpTime, Type2Type<MINT32>());
entry.push_back(ihwTS, Type2Type<MINT32>());
entry.push_back(ilwTS, Type2Type<MINT32>());
entry.push_back(0, Type2Type<MINT32>()); // MAX_GMV
entry.push_back(isBinEn, Type2Type<MBOOL>());
rOutputLMV->update(MTK_EIS_REGION, entry);
MY_LOGD("[LMVHal] eisMode: %d, iExpTime: %d, BinEn: %d", mEisMode,
iExpTime, isBinEn);
}
}
#endif
//
if (uniSwitchState != UNI_SWITCH_STATE_NONE) {
IMetadata::IEntry entry(MTK_LMV_SWITCH_OUT_RESULT);
MINT32 lmv_result = P1NODE_METADATA_INVALID_VALUE;
switch (uniSwitchState) {
case UNI_SWITCH_STATE_ACT_ACCEPT:
lmv_result = MTK_LMV_RESULT_OK;
break;
case UNI_SWITCH_STATE_ACT_IGNORE:
lmv_result = MTK_LMV_RESULT_FAILED;
break;
case UNI_SWITCH_STATE_ACT_REJECT:
lmv_result = MTK_LMV_RESULT_SWITCHING;
break;
default:
MY_LOGW("UNI SwitchOut REQ not act:%d at (%d)", currMagicNum,
uniSwitchState);
break;
}
if (lmv_result >= MTK_LMV_RESULT_OK) {
entry.push_back(lmv_result, Type2Type<MINT32>());
rOutputLMV->update(MTK_LMV_SWITCH_OUT_RESULT, entry);
}
MY_LOGD("UNI SwitchOut END (%d) state:%d lmv_result=(%d)", currMagicNum,
uniSwitchState, lmv_result);
}
MY_LOGD("LMV (bin%d eis%d rrz%d) node(%d) sof(%d/%d) uni(%d) ", isBinEn,
isConfigEis, isConfigRrz, currMagicNum, currSofIdx, lastSofIdx,
uniSwitchState);
}
/******************************************************************************
*
******************************************************************************/
MVOID
P1ConnectLMV::processLMV(MBOOL isBinEn,
std::shared_ptr<IHal3A_T> p3A,
MINT32 const currMagicNum,
MUINT32 const currSofIdx,
MUINT32 const lastSofIdx,
QBufInfo const& deqBuf,
MUINT32 const deqBufIdx,
MUINT8 captureIntent,
MINT64 exposureTime,
IMetadata* rOutputLMV) {
std::lock_guard<std::mutex> autoLock(mLock);
if (deqBuf.mvOut.size() == 0 || deqBuf.mvOut.size() < deqBufIdx) {
MY_LOGW("DeQ Buf is invalid (%d<%zu), result count (%d)",
rOutputLMV->count(), deqBuf.mvOut.size(), deqBufIdx);
return;
}
if (mpLMV == NULL) {
MY_LOGW("LMV not ready (%d)", currMagicNum);
return;
}
mpLMV->DoLMVCalc(deqBuf);
MBOOL isLastSkipped = CHECK_LAST_FRAME_SKIPPED(lastSofIdx, currSofIdx);
MUINT32 X_INT, Y_INT, X_FLOAT, Y_FLOAT, WIDTH, HEIGHT, ISFROMRRZ;
MINT32 GMV_X, GMV_Y, MVtoCenterX, MVtoCenterY, iExpTime, ihwTS, ilwTS;
MUINT32 ConfX, ConfY;
MUINT32 MAX_GMV;
EIS_STATISTIC_STRUCT lmvData;
memset(&lmvData, 0, sizeof(lmvData));
const MINT64 aTimestamp = deqBuf.mvOut[deqBufIdx].mMetaData.mTimeStamp;
MBOOL isLmvValid = MFALSE;
if (deqBuf.mvOut[deqBufIdx].mSize > 0) {
isLmvValid = MTRUE;
} else {
isLmvValid = MFALSE;
}
IMetadata::IEntry validityEntry(MTK_LMV_VALIDITY);
validityEntry.push_back((isLmvValid ? 1 : 0), Type2Type<MINT32>());
rOutputLMV->update(MTK_LMV_VALIDITY, validityEntry);
if (isLmvValid) {
P1_TRACE_S_BEGIN(SLG_I, "P1Connect:LMV-Result");
mpLMV->GetLMVResult(&X_INT, &X_FLOAT, &Y_INT, &Y_FLOAT, &WIDTH, &HEIGHT,
&MVtoCenterX, &MVtoCenterY, &ISFROMRRZ);
mpLMV->GetGmv(&GMV_X, &GMV_Y, &ConfX, &ConfY, &MAX_GMV);
mpLMV->GetLMVStatistic(&lmvData);
P1_TRACE_C_END(SLG_I); // "P1Connect:LMV-Result"
}
{
IMetadata::Memory eisStatistic;
eisStatistic.resize(sizeof(EIS_STATISTIC_STRUCT));
memcpy(eisStatistic.editArray(), &lmvData, sizeof(EIS_STATISTIC_STRUCT));
IMetadata::IEntry lmvDataEntry(MTK_EIS_LMV_DATA);
lmvDataEntry.push_back(eisStatistic, Type2Type<IMetadata::Memory>());
rOutputLMV->update(lmvDataEntry.tag(), lmvDataEntry);
}
iExpTime = exposureTime / ((MINT64)1000); // (ns to us) << frame duration
ihwTS = (aTimestamp >> 32) & 0xFFFFFFFF; // High word
ilwTS = (aTimestamp & 0xFFFFFFFF); // Low word
/* Store required data for EIS 1.2 */
IMetadata::IEntry entry(MTK_EIS_REGION);
if (isLmvValid) {
entry.push_back(X_INT, Type2Type<MINT32>());
entry.push_back(X_FLOAT, Type2Type<MINT32>());
entry.push_back(Y_INT, Type2Type<MINT32>());
entry.push_back(Y_FLOAT, Type2Type<MINT32>());
entry.push_back(WIDTH, Type2Type<MINT32>());
entry.push_back(HEIGHT, Type2Type<MINT32>());
entry.push_back(MVtoCenterX, Type2Type<MINT32>());
entry.push_back(MVtoCenterY, Type2Type<MINT32>());
entry.push_back(ISFROMRRZ, Type2Type<MINT32>());
entry.push_back(GMV_X, Type2Type<MINT32>());
entry.push_back(GMV_Y, Type2Type<MINT32>());
entry.push_back(ConfX, Type2Type<MINT32>());
entry.push_back(ConfY, Type2Type<MINT32>());
entry.push_back(iExpTime, Type2Type<MINT32>());
entry.push_back(ihwTS, Type2Type<MINT32>());
entry.push_back(ilwTS, Type2Type<MINT32>());
entry.push_back(MAX_GMV, Type2Type<MINT32>());
entry.push_back(isBinEn, Type2Type<MBOOL>());
MY_LOGD("EIS: %d, %d, %" PRId64
", %d, %p, "
"Bin:%d, Mnum:%d, SofId:@%d,%d. "
"%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",
mEisMode, captureIntent, exposureTime, deqBufIdx, (void*)p3A.get(),
isBinEn, currMagicNum, currSofIdx, lastSofIdx, X_INT, X_FLOAT,
Y_INT, Y_FLOAT, WIDTH, HEIGHT, MVtoCenterX, MVtoCenterY, GMV_X,
GMV_Y, ConfX, ConfY, isLastSkipped, MAX_GMV, isBinEn);
mLMVLastData =
LMVData(X_INT, X_FLOAT, Y_INT, Y_FLOAT, WIDTH, HEIGHT, MVtoCenterX,
MVtoCenterY, ISFROMRRZ, GMV_X, GMV_Y, ConfX, ConfY, iExpTime,
ihwTS, ilwTS, MAX_GMV, isBinEn);
} else {
MY_LOGD("Invalid LMV. Use latest result");
entry.push_back(mLMVLastData.cmv_x_int, Type2Type<MINT32>());
entry.push_back(mLMVLastData.cmv_x_float, Type2Type<MINT32>());
entry.push_back(mLMVLastData.cmv_y_int, Type2Type<MINT32>());
entry.push_back(mLMVLastData.cmv_y_float, Type2Type<MINT32>());
entry.push_back(mLMVLastData.width, Type2Type<MINT32>());
entry.push_back(mLMVLastData.height, Type2Type<MINT32>());
entry.push_back(mLMVLastData.cmv_x_center, Type2Type<MINT32>());
entry.push_back(mLMVLastData.cmv_y_center, Type2Type<MINT32>());
entry.push_back(mLMVLastData.isFromRRZ, Type2Type<MINT32>());
entry.push_back(mLMVLastData.gmv_x, Type2Type<MINT32>());
entry.push_back(mLMVLastData.gmv_y, Type2Type<MINT32>());
entry.push_back(mLMVLastData.conf_x, Type2Type<MINT32>());
entry.push_back(mLMVLastData.conf_y, Type2Type<MINT32>());
entry.push_back(mLMVLastData.expTime, Type2Type<MINT32>());
entry.push_back(mLMVLastData.hwTs, Type2Type<MINT32>());
entry.push_back(mLMVLastData.lwTs, Type2Type<MINT32>());
entry.push_back(mLMVLastData.maxGMV, Type2Type<MINT32>());
entry.push_back(mLMVLastData.isFrontBin, Type2Type<MBOOL>());
}
rOutputLMV->update(MTK_EIS_REGION, entry);
}
#endif
}; // namespace NSP1Node
}; // namespace v3
}; // namespace NSCam