MBOOL
GFNode::
onInit()
{
VSDOF_INIT_LOG("+");
VSDOF_INIT_LOG("-");
return MTRUE;
}
MBOOL
GFNode::
onThreadStart()
{
CAM_TRACE_NAME("GFNode::onThreadStart");
VSDOF_INIT_LOG("+");
// create gf_hal for PV/VR
mpGf_Hal = GF_HAL::createInstance(eSTEREO_SCENARIO_PREVIEW);
if(!mpGf_Hal)
{
MY_LOGE("Create GF_HAL fail.");
cleanUp();
}
// init DpStream
mpDpStream = new DpBlitStream();
VSDOF_INIT_LOG("-");
return MTRUE;
}
MBOOL
GFNode::
onData(DataID data, DepthMapRequestPtr& pRequest)
{
VSDOF_LOGD("reqID=%d + data=%d", pRequest->getRequestNo(), data);
MBOOL ret = MFALSE;
//
switch(data)
{
case P2A_TO_GF_DMW_MYS:
case WMF_TO_GF_DMW_MY_S:
mJobQueue.enque(pRequest);
ret = MTRUE;
break;
case WMF_TO_GF_OND:
mJobQueue_Capture.enque(pRequest);
ret = MTRUE;
break;
default:
ret = MFALSE;
break;
}
//
VSDOF_LOGD("-");
return ret;
}
MBOOL
GFNode::
onThreadLoop()
{
DepthMapRequestPtr pRequest;;
//
if( !waitAnyQueue() )
{
return MFALSE;
}
// capture queue first
if( !mJobQueue_Capture.deque(pRequest) )
{
if( !mJobQueue.deque(pRequest) )
{
return MFALSE;
}
}
CAM_TRACE_NAME("GFNode::onThreadLoop");
VSDOF_LOGD("reqID=%d threadLoop",pRequest->getRequestNo());
MBOOL bRet = MTRUE;
if(pRequest->getRequestAttr().opState == eSTATE_CAPTURE)
{
bRet = packDepthWrapper(pRequest);
if(!bRet)
{
MY_LOGE("reqID=%d, packDepthWrapper failed.", pRequest->getRequestNo());
handleData(ERROR_OCCUR_NOTIFY, pRequest);
bRet = MFALSE;
}
else
{
// mark Depth wrapper ready
pRequest->setOutputBufferReady(BID_GF_OUT_DEPTH_WRAPPER);
// notify Depth wrapper done
handleDataAndDump(GF_OUT_DEPTH_WRAPPER, pRequest);//will call onDump()
}
}
else
{
if(!executeAlgo(pRequest))// execute Algo
{
MY_LOGE("reqID=%d, GF executeAlgo failed.", pRequest->getRequestNo());
handleData(ERROR_OCCUR_NOTIFY, pRequest);
bRet = MFALSE;
}
}
// launch onProcessDone
pRequest->getBufferHandler()->onProcessDone(getNodeId());
//
return bRet;
}
MBOOL
DepthMapPipeNode::
handleDataAndDump(DataID id, DepthMapRequestPtr &request)
{
// dump first and then handle data
MBOOL bRet = this->onDump(id, request);
bRet &= this->handleData(id, request);
return bRet;
}
MBOOL
DepthMapPipeNode::
onDump(
DataID id,
DepthMapRequestPtr &pRequest,
DumpConfig* config
)
{
if(!checkToDump(id))
{
VSDOF_LOGD("onDump reqID=%d dataid=%d(%s), checkDump failed!", pRequest->getRequestNo(), id, ID2Name(id));
return MFALSE;
}
MY_LOGD("%s onDump reqID=%d dataid=%d(%s)", getName(), pRequest->getRequestNo(), id, ID2Name(id));
char* fileName = (config != NULL) ? config->fileName : NULL;
char* postfix = (config != NULL) ? config->postfix : NULL;
MBOOL bStridePostfix = (config != NULL) ? config->bStridePostfix : MFALSE;
MUINT iReqIdx = pRequest->getRequestNo();
#ifndef GTEST
// check dump index
if(pRequest->getRequestAttr().opState == eSTATE_NORMAL && (iReqIdx < miDumpStartIdx || iReqIdx >= miDumpStartIdx + miDumpBufSize))
return MTRUE;
#endif
if(mDataIDToBIDMap.indexOfKey(id)<0)
{
MY_LOGD("%s onDump: reqID=%d, cannot find BID map of the data id:%d! Chk BaseBufferConfig.cpp",
getName(), pRequest->getRequestNo(), id);
return MFALSE;
}
const char *dir = (StereoSettingProvider::stereoProfile() == STEREO_SENSOR_PROFILE_FRONT_FRONT) ?
"Front" : "Rear";
// generate file path
char filepath[1024];
if(pRequest->getRequestAttr().opState == eSTATE_NORMAL)
snprintf(filepath, 1024, "/sdcard/vsdof/pv_vr/%s/%d/%s", dir, iReqIdx, getName());
else
snprintf(filepath, 1024, "/sdcard/vsdof/capture/%s/%d/%s", dir, iReqIdx, getName());
// make path
VSDOF_LOGD("makePath: %s", filepath);
makePath(filepath, 0660);
// get the buffer id array for dumping
const Vector<DepthMapBufferID>& vDumpBufferID = mDataIDToBIDMap.valueFor(id);
sp<BaseBufferHandler> pBufferHandler = pRequest->getBufferHandler();
char writepath[1024];
char strideStr[100];
VSDOF_LOGD("dataID:%d buffer id size=%d", id, vDumpBufferID.size());
for(size_t i=0;i<vDumpBufferID.size();++i)
{
const DepthMapBufferID& oriBID = vDumpBufferID.itemAt(i);
DepthMapBufferID BID = mpFlowOption->reMapBufferID(pRequest->getRequestAttr(), oriBID);
VSDOF_LOGD("Dump -- index%d, buffer id=%d", i, BID);
IImageBuffer* pImgBuf;
MBOOL bRet = pBufferHandler->getEnqueBuffer(this->getNodeId(), BID, pImgBuf);
if(!bRet)
{
VSDOF_LOGD("Failed to get enqued buffer, id: %d", BID);
continue;
}
// stride string
if(bStridePostfix)
snprintf(strideStr, 100, "_%d", pImgBuf->getBufStridesInBytes(0));
else
snprintf(strideStr, 100, "");
const char* writeFileName = (fileName != NULL) ? fileName : onDumpBIDToName(BID);
const char* postfixName = (postfix != NULL) ? postfix : "";
if(strchr(postfixName, '.') != NULL)
snprintf(writepath, 1024, "%s/%s_%dx%d%s%s", filepath, writeFileName,
pImgBuf->getImgSize().w, pImgBuf->getImgSize().h, strideStr, postfixName);
else
{
snprintf(writepath, 1024, "%s/%s_%dx%d%s%s.yuv", filepath, writeFileName,
pImgBuf->getImgSize().w, pImgBuf->getImgSize().h, strideStr, postfixName);
}
// sdcard/vsdof/pv_vr/Rear/2/GFNode/BID_GF_OUT_DMBG_240x136.yuv
VSDOF_LOGD("saveToFile: %s", writepath);
pImgBuf->saveToFile(writepath);
}
return MTRUE;
}
MBOOL
DepthMapPipeNode::
handleData(DataID id, DepthMapRequestPtr pReq)
{
#ifdef GTEST_PARTIAL
return CamThreadNode<DepthMapDataHandler>::handleData(id, pReq);
#else
MBOOL bConnect = mpFlowOption->checkConnected(id);
if(bConnect)
{
CamThreadNode<DepthMapDataHandler>::handleData(id, pReq);
return MTRUE;
}
return MFALSE;
#endif
}
MBOOL
GFNode::
executeAlgo(
DepthMapRequestPtr pRequest)
{
MBOOL ret = MFALSE;
VSDOF_LOGD("+ reqId=%d", pRequest->getRequestNo());
// Normal pass
if(!runNormalPass(pRequest))
{
MY_LOGE("GF NormalPass failed!");
goto lbExit;
}
//
ret = MTRUE;
VSDOF_LOGD("- reqId=%d", pRequest->getRequestNo());
CAM_TRACE_END();
lbExit:
return ret;
}
MBOOL GFNode::runNormalPass(DepthMapRequestPtr pRequest)
{
CAM_TRACE_BEGIN("GFNode::runNormalPass");
GF_HAL_IN_DATA sInData;
GF_HAL_OUT_DATA sOutData;
sInData.isCapture = (eSTATE_CAPTURE == pRequest->getRequestAttr().opState);
MINT32 iReqIdx = pRequest->getRequestNo();
if(!requireAlgoDataFromRequest(pRequest, eGF_PASS_NORMAL, sInData, sOutData))
{
MY_LOGE("get algo buffer fail, reqID=%d", iReqIdx);
return MFALSE;
}
//
debugGFParams(sInData, sOutData);
//
pRequest->mTimer.startGFNormal();
//
if(!mpGf_Hal->GFHALRun(sInData, sOutData))//call GF algorithm
{
MY_LOGE("GFHalRun fail, reqID=%d", iReqIdx);
return MFALSE;
}
//
pRequest->mTimer.stopGFNormal();
VSDOF_PRFTIME_LOG("[NormalPass]gf algo processing time(%d ms) reqID=%d",
pRequest->mTimer.getElapsedGFNormal(), iReqIdx);
// mark DMBG ready
pRequest->setOutputBufferReady(BID_GF_OUT_DMBG);
// notify DMBG done
handleDataAndDump(GF_OUT_DMBG, pRequest);//saveToFile()
CAM_TRACE_END();
return MTRUE;
}