MBOOL   
EngBufHandlerImpl::
enqueBuffer(MUINT32 const data, IImageBuffer const * pImageBuffer)
{
    Mutex::Autolock _l(mLock);
    //
    MINT32 i, bufQueIdx = mapNode2Dst(data);
    ImgBufQueNode keepImgBufQueNode;
    //
    #if 0
    MY_LOGD("data(0x%08X)",data);
    #endif
    //
    if(bufQueIdx == -1)
    {
        return MFALSE;
    }
    //
    if(bufQueIdx >= 0)
    {
        if(mvBufQueNode[bufQueIdx].size() > 0)
        {
            keepImgBufQueNode = mvBufQueNode[bufQueIdx][0];
        }
        else
        {
            MY_LOGE("mvBufQueNode[%d] size(%d) = 0",
                    bufQueIdx,
                    mvBufQueNode[bufQueIdx].size());
            return MFALSE;
        }
    }
    else
    {
        MY_LOGE("bufQueIdx(%d) < 0",bufQueIdx);
    }
    //
    MUINTPTR keepAddr = (MUINTPTR)(mvBufQueNode[bufQueIdx][0].getImgBuf()->getVirAddr());
    MUINTPTR enqueAddr = (MUINTPTR)(GET_IIMAGEBUFFER_BUF_VA(pImageBuffer, 0));
    //
    #if 0
    MY_LOGD("Addr(0x%08X/0x%08X),Port(%d)",
            keepAddr,
            enqueAddr,
            mvBufQueNode[bufQueIdx][0].getCookieDE());
    #endif
    //
    if(keepAddr == enqueAddr)
    {
        MBOOL isAPClientFromFD = MFALSE;
        sp<IImgBufProvider> bufProvider = NULL;
        IImageBuffer* tempBuffer = const_cast<IImageBuffer*>(pImageBuffer);
        //
        switch(keepImgBufQueNode.getCookieDE())
        {
            case eBuf_Disp:
            {
                bufProvider = mspImgBufProvidersMgr->getDisplayPvdr();
                break;
            }
            case eBuf_Rec:
            {
                bufProvider = mspImgBufProvidersMgr->getRecCBPvdr();
                break;
            }
            case eBuf_AP:
            {
                bufProvider = mspImgBufProvidersMgr->getPrvCBPvdr();
                const_cast<ImgBufQueNode*>(&keepImgBufQueNode)->setCookieDE(0); // 0 for preview
                break;
            }
            case eBuf_Generic:
            {
                bufProvider = mspImgBufProvidersMgr->getGenericBufPvdr();
                break;
            }
            case eBuf_FD:
            {
                bufProvider = mspImgBufProvidersMgr->getFDBufPvdr();
                isAPClientFromFD = MTRUE; 
                break;
            }
            case eBuf_OT:
            {
                bufProvider = mspImgBufProvidersMgr->getOTBufPvdr();
                break;
            }
            default:
            {
                MY_LOGE("unknown port(%d)",keepImgBufQueNode.getCookieDE());
                return MFALSE;
            }
        }
        //
        if (bufProvider == NULL)
        {
            MY_LOGW("bufProvider(%d) is not available, drop it!", keepImgBufQueNode.getCookieDE());
            tempBuffer->unlockBuf(LOG_TAG);
            tempBuffer->decStrong(tempBuffer);
            mvBufQueNode[bufQueIdx].erase(mvBufQueNode[bufQueIdx].begin());
            return MTRUE;
        }
        else
        {
            const_cast<ImgBufQueNode*>(&(keepImgBufQueNode))->setStatus(ImgBufQueNode::eSTATUS_DONE);
            const_cast<ImgBufQueNode*>(&(keepImgBufQueNode))->getImgBuf()->setTimestamp(pImageBuffer->getTimestamp());
            //
            char debugMsg[150];
            sprintf(debugMsg, "buf(%p),heap(%p),VA(0x%08X),BS(%d),Id(%d),TS(%d.%06d),F(0x%08X),S(%dx%d),Str(%d,%d,%d)",
                    pImageBuffer,
                    pImageBuffer->getImageBufferHeap(),
                    GET_IIMAGEBUFFER_BUF_VA(pImageBuffer, 0),
                    (   GET_IIMAGEBUFFER_BUF_SIZE(pImageBuffer, 0)+
                        GET_IIMAGEBUFFER_BUF_SIZE(pImageBuffer, 1)+
                        GET_IIMAGEBUFFER_BUF_SIZE(pImageBuffer, 2)),
                    pImageBuffer->getFD(0),
                    (MUINT32)((pImageBuffer->getTimestamp()/1000)/1000000), 
                    (MUINT32)((pImageBuffer->getTimestamp()/1000)%1000000),
                    pImageBuffer->getImgFormat(),
                    pImageBuffer->getImgSize().w,
                    pImageBuffer->getImgSize().h,
                    GET_IIMAGEBUFFER_BUF_STRIDE_IN_BYTE(pImageBuffer, 0),
                    GET_IIMAGEBUFFER_BUF_STRIDE_IN_BYTE(pImageBuffer, 1),
                    GET_IIMAGEBUFFER_BUF_STRIDE_IN_BYTE(pImageBuffer, 2));
            //
            tempBuffer->unlockBuf(LOG_TAG);
            tempBuffer->decStrong(tempBuffer);
            //
            bufProvider->enqueProvider(keepImgBufQueNode);
            // only dequeue is not from APClient 
            if(isAPClientFromFD)
            {
                // If APClient exists, copy to it
                sp<IImgBufProvider> pBufProvider;
                pBufProvider = mspImgBufProvidersMgr->getAPClientBufPvdr();
                ImgBufQueNode APClientnode; 
                if (pBufProvider != 0 && pBufProvider->dequeProvider(APClientnode))
                {
                    MY_LOGD("APClient size:%d, fdClient size:%d", APClientnode.getImgBuf()->getBufSize() ,  keepImgBufQueNode.getImgBuf()->getBufSize());
                    //if ( APClientnode.getImgBuf()->getBufSize() >= keepImgBufQueNode.getImgBuf()->getBufSize())
                    if (1)
                    {
                           MY_LOGD("APClient addr:0x%x, FDCLient addr:0x%x", APClientnode.getImgBuf()->getVirAddr(), keepImgBufQueNode.getImgBuf()->getVirAddr()); 
                           memcpy(APClientnode.getImgBuf()->getVirAddr(), 
                           keepImgBufQueNode.getImgBuf()->getVirAddr(), 
                           APClientnode.getImgBuf()->getBufSize()); 
                           //keepImgBufQueNode.getImgBuf()->getBufSize());
                           const_cast<ImgBufQueNode*>(&APClientnode)->setStatus(ImgBufQueNode::eSTATUS_DONE);
                    }
                    else 
                    {
                        MY_LOGE("APClient buffer size < FD buffer size");
                        const_cast<ImgBufQueNode*>(&APClientnode)->setStatus(ImgBufQueNode::eSTATUS_CANCEL);
                    }
                    //
                    pBufProvider->enqueProvider(APClientnode);
                }
            }
            //
            mvBufQueNode[bufQueIdx].erase(mvBufQueNode[bufQueIdx].begin());
            //
            #if 1
            MY_LOGD("%s",debugMsg);
            #endif
            //
            return MTRUE;
        }
    }
    else
    {
        MY_LOGE("Addr(0x%X != 0x%X),Port(%d), drop it!",
                keepAddr,
                enqueAddr,
                mvBufQueNode[bufQueIdx][0].getCookieDE());
        return MFALSE;
    }
}
MBOOL   
EngBufHandlerImpl::
dequeBuffer(MUINT32 const data, ImgRequest * pImgReq)
{
    Mutex::Autolock _l(mLock);
    //
    MBOOL isDequeProvider = MFALSE;
    MBOOL doCacheInvalid = MFALSE;
    MINT32 bufQueIdx = mapNode2Dst(data);
    ImgBufQueNode node;
    list<MAP_PORT_INFO>::iterator iterMapPort;
    //
    #if 0
    MY_LOGD("data(0x%08X)",data);
    #endif
    //
    if(bufQueIdx == -1)
    {
        return MFALSE;
    }
    //
    for(iterMapPort = mlMapPort[bufQueIdx].begin(); iterMapPort != mlMapPort[bufQueIdx].end(); iterMapPort++)
    {
        #if 0
        MY_LOGD("bufQueIdx(%d),data(%d,%d),bufType(%d)",
                bufQueIdx,data,
                (*iterMapPort).nodeType,
                (*iterMapPort).bufType);
        #endif
        if(data == (*iterMapPort).nodeType)
        {
            sp<IImgBufProvider> bufProvider = NULL;
            pImgReq->mUsage = NSIoPipe::EPortCapbility_None;
            switch((*iterMapPort).bufType)
            {
                case eBuf_Disp:
                {
                    bufProvider =  mspImgBufProvidersMgr->getDisplayPvdr();
                    pImgReq->mUsage = NSIoPipe::EPortCapbility_Disp;
                    break;
                }
                case eBuf_Rec:
                {
                    bufProvider =  mspImgBufProvidersMgr->getRecCBPvdr();
                    pImgReq->mUsage = NSIoPipe::EPortCapbility_Rcrd;
                    break;
                }
                case eBuf_AP:
                {
                    bufProvider =  mspImgBufProvidersMgr->getPrvCBPvdr();
                    doCacheInvalid = MTRUE;
                    break;
                }
                case eBuf_Generic:
                {
                    bufProvider =  mspImgBufProvidersMgr->getGenericBufPvdr();
                    break;
                }
                case eBuf_FD:
                {
                    bufProvider =  mspImgBufProvidersMgr->getFDBufPvdr();
                    break;
                }
                case eBuf_OT:
                {
                    bufProvider =  mspImgBufProvidersMgr->getOTBufPvdr();
                    break;
                }
                default:
                {
                    MY_LOGE("un-supported bufType(%d)",(*iterMapPort).bufType);
                    return MFALSE;
                }
            }
            //
            if(bufProvider != 0 && bufProvider->dequeProvider(node))
            {
                node.setCookieDE((*iterMapPort).bufType);
                mvBufQueNode[bufQueIdx].push_back(node);
                isDequeProvider = MTRUE;
                break;
            }
        }
    }
    //
    if(isDequeProvider)
    {
        size_t bufStridesInBytes[] = { GET_IIMGBUF_IMG_STRIDE_IN_BYTE(node.getImgBuf(), 0),
                                        GET_IIMGBUF_IMG_STRIDE_IN_BYTE(node.getImgBuf(), 1),
                                        GET_IIMGBUF_IMG_STRIDE_IN_BYTE(node.getImgBuf(), 2)};
        size_t bufBoundaryInBytes[] = {0,0,0};
        IImageBufferAllocator::ImgParam imgParam = IImageBufferAllocator::ImgParam(
                                                        Format::queryImageFormat(node.getImgBuf()->getImgFormat().string()), 
                                                        MSize(
                                                            node.getImgBuf()->getImgWidth(),
                                                            node.getImgBuf()->getImgHeight()), 
                                                        bufStridesInBytes, 
                                                        bufBoundaryInBytes, 
                                                        Format::queryPlaneCount(Format::queryImageFormat(node.getImgBuf()->getImgFormat().string())));
        PortBufInfo_v1 portBufInfo = PortBufInfo_v1(
                                        node.getImgBuf()->getIonFd(),
                                        (MUINTPTR)node.getImgBuf()->getVirAddr(),
                                        0,
                                        node.getImgBuf()->getBufSecu(), 
                                        node.getImgBuf()->getBufCohe());
        //
        sp<ImageBufferHeap> pHeap = ImageBufferHeap::create(
                                                        LOG_TAG,
                                                        imgParam,
                                                        portBufInfo,
                                                        mbEnableIImageBufferLog);
        if(pHeap == 0)
        {
            MY_LOGE("pHeap is NULL");
            return MFALSE;
        }
        //
        IImageBuffer* tempBuffer = pHeap->createImageBuffer();
        tempBuffer->incStrong(tempBuffer);
        tempBuffer->lockBuf(
                        LOG_TAG,
                        eBUFFER_USAGE_HW_CAMERA_READWRITE | eBUFFER_USAGE_SW_READ_OFTEN);

        if( doCacheInvalid )
        {
            if( !tempBuffer->syncCache(eCACHECTRL_INVALID) )
                MY_LOGE("invalid cache failed imgbuf 0x%x", tempBuffer);
        }

        pImgReq->mBuffer = tempBuffer;
        if(mbIsForceRotation)
        {
            pImgReq->mTransform  = mRotationAnagle == 0 ? 0 
                                 : mRotationAnagle == 90 ? eTransform_ROT_90
                                 : mRotationAnagle == 180 ? eTransform_ROT_180 : eTransform_ROT_270;
        }
        else
        {
            pImgReq->mTransform  = node.getRotation() == 0 ? 0 
                                 : node.getRotation() == 90 ? eTransform_ROT_90
                                 : node.getRotation() == 180 ? eTransform_ROT_180 : eTransform_ROT_270;
        }
        //
        #if 0
        MY_LOGD("Node:DE(%d),VA(0x%08X),S(%d),Id(%d)",
                node.getCookieDE(),
                (MUINT32)node.getImgBuf()->getVirAddr(),
                node.getImgBuf()->getBufSize(),
                node.getImgBuf()->getIonFd());
        MY_LOGD("Node:F(%s),W(%d),H(%d),Str(%d,%d,%d),Rot(%d)",
                node.getImgBuf()->getImgFormat().string(),
                node.getImgBuf()->getImgWidth(),
                node.getImgBuf()->getImgHeight(),
                GET_IIMGBUF_IMG_W_STRIDE(node.getImgBuf(), 0),
                GET_IIMGBUF_IMG_W_STRIDE(node.getImgBuf(), 1),
                GET_IIMGBUF_IMG_W_STRIDE(node.getImgBuf(), 2),
                node.getRotation());
        #endif
        //
        #if 1
        MY_LOGD("buf(%p),heap(%p),VA(0x%08X/0x%08X/0x%08X),PA(0x%08X/0x%08X/0x%08X),BS(%d=%d+%d+%d),Id(%d),F(0x%08X),S(%dx%d),Str(%d,%d,%d),R(%d),U(%d)", 
                pImgReq->mBuffer,
                pImgReq->mBuffer->getImageBufferHeap(),
                GET_IIMAGEBUFFER_BUF_VA(pImgReq->mBuffer, 0),
                GET_IIMAGEBUFFER_BUF_VA(pImgReq->mBuffer, 1),
                GET_IIMAGEBUFFER_BUF_VA(pImgReq->mBuffer, 2),
                GET_IIMAGEBUFFER_BUF_PA(pImgReq->mBuffer, 0),
                GET_IIMAGEBUFFER_BUF_PA(pImgReq->mBuffer, 1),
                GET_IIMAGEBUFFER_BUF_PA(pImgReq->mBuffer, 2),
                (   GET_IIMAGEBUFFER_BUF_SIZE(pImgReq->mBuffer, 0)+
                    GET_IIMAGEBUFFER_BUF_SIZE(pImgReq->mBuffer, 1)+
                    GET_IIMAGEBUFFER_BUF_SIZE(pImgReq->mBuffer, 2)),
                GET_IIMAGEBUFFER_BUF_SIZE(pImgReq->mBuffer, 0),
                GET_IIMAGEBUFFER_BUF_SIZE(pImgReq->mBuffer, 1),
                GET_IIMAGEBUFFER_BUF_SIZE(pImgReq->mBuffer, 2),
                pImgReq->mBuffer->getFD(),
                pImgReq->mBuffer->getImgFormat(),
                pImgReq->mBuffer->getImgSize().w,
                pImgReq->mBuffer->getImgSize().h,
                GET_IIMAGEBUFFER_BUF_STRIDE_IN_BYTE(pImgReq->mBuffer, 0),
                GET_IIMAGEBUFFER_BUF_STRIDE_IN_BYTE(pImgReq->mBuffer, 1),
                GET_IIMAGEBUFFER_BUF_STRIDE_IN_BYTE(pImgReq->mBuffer, 2),
                pImgReq->mTransform,
                pImgReq->mUsage);
        #endif
        //
        return MTRUE;
    }
    //
    #if 0
    MY_LOGD("empty data(0x%08X)",data);
    #endif
    return MFALSE;
}