/****************************************************************************** * REPEAT:[ dequeProvider() -> enqueProvider() ] * dequeProvider() returns false immediately if empty. *******************************************************************************/ bool ImgBufQueue:: enqueProvider(ImgBufQueNode const& rNode) { if ( ! rNode ) { MY_LOGW("buffer is NULL"); return false; } // Mutex::Autolock _lock(mDoneImgBufQueMtx); // MY_LOGV_IF( ENABLE_LOG_PER_FRAME, "+ Que.size(%d); (CookieED/CookieDE)=(%p,%p) %s; Buffer[%s@0x%08X@%d@%s@(%d)%dx%d@%d@Timestamp(%lld)]", mDoneImgBufQue.size(), rNode.getCookieED(), rNode.getCookieDE(), ImgBufQueNodeStatus2Name(rNode.getStatus()), rNode->getBufName(), rNode->getVirAddr(), rNode->getBufSize(), rNode->getImgFormat().string(), rNode->getImgWidthStride(), rNode->getImgWidth(), rNode->getImgHeight(), rNode->getBitsPerPixel(), rNode->getTimestamp() ); // mDoneImgBufQue.push_back(rNode); mDoneImgBufQueCond.broadcast(); // return true; }
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; } }
bool PreviewBufMgr:: enqueBuffer(ImgBufQueNode const& node) { // (1) set DONE tag into package const_cast<ImgBufQueNode*>(&node)->setStatus(ImgBufQueNode::eSTATUS_DONE); // (2) choose the correct "client" switch (node.getCookieDE()) { case eBuf_Pass1: { if (mspHwBufPvdr != 0) { mspHwBufPvdr->enque(node.getImgBuf()); } } break; // case eBuf_Disp: { sp<IImgBufProvider> bufProvider = mspImgBufProvidersMgr->getDisplayPvdr(); if (bufProvider != 0) { bufProvider->enqueProvider(node); } } break; // case eBuf_AP: { sp<IImgBufProvider> bufProvider; { bufProvider = mspImgBufProvidersMgr->getPrvCBPvdr(); if ( bufProvider != 0 ) { const_cast<ImgBufQueNode*>(&node)->setCookieDE(0); // 0 for preview bufProvider->enqueProvider(node); } // If fd exists, copy to it bufProvider = mspImgBufProvidersMgr->getFDBufPvdr(); ImgBufQueNode FDnode; if (bufProvider != 0 && bufProvider->dequeProvider(FDnode)) { if ( FDnode.getImgBuf()->getBufSize() >= node.getImgBuf()->getBufSize()) { memcpy(FDnode.getImgBuf()->getVirAddr(), node.getImgBuf()->getVirAddr(), node.getImgBuf()->getBufSize()); const_cast<ImgBufQueNode*>(&FDnode)->setStatus(ImgBufQueNode::eSTATUS_DONE); } else { MY_LOGE("fd buffer size < ap buffer size"); const_cast<ImgBufQueNode*>(&FDnode)->setStatus(ImgBufQueNode::eSTATUS_CANCEL); } // bufProvider->enqueProvider(FDnode); } } } break; // case eBuf_FD: { sp<IImgBufProvider> bufProvider = mspImgBufProvidersMgr->getFDBufPvdr(); if (bufProvider != 0) { bufProvider->enqueProvider(node); } } break; // case eBuf_Generic: { sp<IImgBufProvider> bufProvider = mspImgBufProvidersMgr->getGenericBufPvdr(); if (bufProvider != 0) { bufProvider->enqueProvider(node); } } break; // default: MY_LOGE("unknown port(%d)!!", node.getCookieDE()); break; } return true; }
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; }