天天看點

GF

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;

}

繼續閱讀