Ejemplo n.º 1
0
/******************************************************************************
*   Splits a comma delimited string to a List of int Vector.
*   Example string: "(10000,26623),(10000,30000)"
*******************************************************************************/
bool
ParamsManager::
splitRange(String8 const& s8Input, List< Vector<int> >& rOutput)
{
    rOutput.clear();
    //
    if  ( s8Input.isEmpty() )
    {
        MY_LOGW("empty string");
        return  false;
    }
    //
    int endIndex, fromIndex = 1;
    int endIndex_input = s8Input.length()-1;
    if  ( s8Input[0] != '(' || s8Input[endIndex_input] != ')' )
    {
        MY_LOGW("Invalid range list string=%s", s8Input.string());
        return  false;
    }
    //
    do  {
        endIndex = s8Input.find("),(", fromIndex);
        if (endIndex == -1) endIndex = endIndex_input;
        //
        Vector<int> vOut;
        String8 const s8SubString(s8Input.string()+fromIndex, endIndex-fromIndex);
        if  ( splitInt(s8SubString, vOut) ) {
            rOutput.push_back(vOut);
        }
        //
        fromIndex = endIndex + 3;
    } while (endIndex != endIndex_input);
    //
    return  (rOutput.size() > 0);
}
Ejemplo n.º 2
0
//-----------------------------------------------------------------------------
MBOOL
CapBufMgrImp::
dequeBuf(IImageBuffer*& pImageBuffer, MBOOL const isFullSize)
{
    Mutex::Autolock _l(mLock);
    //
    list<IImageBuffer*>::iterator it;
    while(1)
    {
        if(mDequeBufCnt >= mDequeBufMaxNum)
        {
            MY_LOGW("DBC(%d) < DBMN(%d), Wait E",
                    mDequeBufCnt,
                    mDequeBufMaxNum);
            mCondDequeBuf.wait(mLock);
            MY_LOGW("DBC(%d), Wait X",mDequeBufCnt);
        }
        else
        {
            for(it = mlpImgBuf.begin(); it != mlpImgBuf.end(); it++)
            {
                if((*it)->getTimestamp() != 0)
                {
                    break;
                }
            }
            //
            if(it == mlpImgBuf.end())
            {
                MY_LOGW("No buf is ready, Wait E");
                mCond.wait(mLock);
                MY_LOGW("Wait X");
            }
            else
            {
                break;
            }
        }
    }
    //
    mDequeBufCnt++;
    MY_LOGD("(%d),Buf(0x%08X),TS(%d.%06d),DBC(%d)",
            isFullSize,
            (MUINT32)*it,
            (MUINT32)(((*it)->getTimestamp()/1000)/1000000), 
            (MUINT32)(((*it)->getTimestamp()/1000)%1000000),
            mDequeBufCnt);
    //
    pImageBuffer = *it;
    mlpImgBuf.erase(it);
    //
    return MTRUE;
}
/******************************************************************************
*   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;
}
/******************************************************************************
*   It returns false if Processor is Running; call pauseProcessor() firstly
*   before flushProcessor().
*******************************************************************************/
bool
ImgBufQueue::
flushProcessor()
{
    Mutex::Autolock _lock_DONE(mDoneImgBufQueMtx);   //  + lock DONE QUE
    //
    if  ( mbIsProcessorRunning )
    {
        MY_LOGW("IsProcessorRunning=1; please pause it before calling this function.");
        return  false;
    }
    //
    //
    Mutex::Autolock _lock_TODO(mTodoImgBufQueMtx);   //  + lock TODO QUE
    //
    MY_LOGD("TODO Que.size(%d)", mTodoImgBufQue.size());
    for ( List<ImgBufQueNode>::iterator it = mTodoImgBufQue.begin(); it != mTodoImgBufQue.end(); it++ )
    {
        (*it).setStatus(ImgBufQueNode::eSTATUS_CANCEL);
        MY_LOGD_IF(
            ENABLE_LOG_PER_FRAME, 
            "%s: (CookieED/mi4CookieDE)=(%p/%p); Buffer[%s@0x%08X@%d@%s@(%d)%dx%d-%dBit@Timestamp(%lld)]", 
            ImgBufQueNodeStatus2Name((*it).getStatus()), (*it).getCookieED(), (*it).getCookieDE(),  
            (*it)->getBufName(), (*it)->getVirAddr(), (*it)->getBufSize(), (*it)->getImgFormat().string(), 
            (*it)->getImgWidthStride(), (*it)->getImgWidth(), (*it)->getImgHeight(), 
            (*it)->getBitsPerPixel(), (*it)->getTimestamp()
        );
        mDoneImgBufQue.push_back(*it);
    }
    //
    mTodoImgBufQue.clear();
    //
    //
    return  true;
}
Ejemplo n.º 5
0
//-----------------------------------------------------------------------------
MBOOL
ThermalMonitorImp::
exit()
{
    //Mutex::Autolock lock(mLock);
    //
    FUNC_START;
    //
    requestExit();
    //
    mState = STATE_EXIT;
    mCond.broadcast();
    //
    MY_LOGD("join() E");
    status_t status = join();
    if( OK != status )
    {
        MY_LOGW("Not to wait , status[%s(%d)]", ::strerror(-status), -status);
    }
    MY_LOGD("join() X");
    //
    FUNC_END;
    //
    return MTRUE;
}
bool
ImgBufQueue::
dequeProcessor(Vector<ImgBufQueNode>& rvNode)
{
    bool ret = false;
    //
    Mutex::Autolock _lock(mDoneImgBufQueMtx);
    //
    while   ( mDoneImgBufQue.empty() && mbIsProcessorRunning )
    {
        status_t status = mDoneImgBufQueCond.wait(mDoneImgBufQueMtx);
        if  ( NO_ERROR != status )
        {
            MY_LOGW("wait status(%d), Que.size(%d), IsProcessorRunning(%d)", status, mDoneImgBufQue.size(), mbIsProcessorRunning);
        }
    }
    //
    if  ( ! mDoneImgBufQue.empty() )
    {
        //  If the queue is not empty, deque all buffers from the queue.
        ret = true;
        rvNode = mDoneImgBufQue;
        mDoneImgBufQue.clear();
    }
    else
    {
        MY_LOGD_IF(ENABLE_LOG_PER_FRAME, "Empty Que");
        rvNode.clear();
    }
    //
    return ret;
}
Ejemplo n.º 7
0
bool
ParamsManager::
splitInt(String8 const& s8Input, Vector<int>& rOutput)
{
    rOutput.clear();
    //
    if  ( s8Input.isEmpty() )
    {
        MY_LOGW("empty string");
        return  false;
    }
    //
    char const*start = s8Input.string();
    char *end = NULL;
    do {
        int value = ::strtol(start, &end, 10);
        if  ( start == end ) {
            MY_LOGW_IF(0, "no digits in str:%s", s8Input.string());
            return  false;
        }
        rOutput.push_back(value);
        MY_LOGD_IF(0, "%d", value);
        start = end + 1;
    } while ( end && *end );
    //
    return  (rOutput.size() > 0);
}
Ejemplo n.º 8
0
//-----------------------------------------------------------------------------
MBOOL
CapBufMgrImp::
popBuf(IImageBuffer*& pImageBuffer, MBOOL const isFullSize)
{
    Mutex::Autolock _l(mLock);
    //
    if(mlpImgBuf.empty())
    {
        if(mbUse)
        {
            MY_LOGW("buf is empty");
        }
        return MFALSE;
    }
    //
    list<IImageBuffer*>::iterator it = mlpImgBuf.begin();
    //
    MY_LOGD("(%d),Buf(0x%08X),TS(%d.%06d)",
            isFullSize,
            (MUINT32)*it,
            (MUINT32)(((*it)->getTimestamp()/1000)/1000000), 
            (MUINT32)(((*it)->getTimestamp()/1000)%1000000));
    //
    pImageBuffer = *it;
    mlpImgBuf.erase(it);
    //
    return MTRUE;
}
bool
BaseCamAdapter::
sendFrameToObservers(CamFrame*const frame)
{
    bool ret = false;
    //
    if  ( ! frame )
    {
        MY_LOGW("null frame");
        return  false;
    }
    //
    switch  ( frame->mType )
    {
    case CAMERA_MSG_PREVIEW_FRAME:
    case CAMERA_MSG_POSTVIEW_FRAME:
        ret = sendFrameToObservers(frame, mvFrameObservers);
        break;
    default:
        MY_LOGE("Unsupported frame type(0x%x)", frame->mType);
        break;
    }
    //
    return  ret;
}
Ejemplo n.º 10
0
static
MBOOL
impConstructStaticMetadata_by_SymbolName(
    String8 const&  s8Symbol,
    Info const&     rInfo,
    IMetadata&      rMetadata
)
{
    typedef MBOOL (*PFN_T)(
        IMetadata &         metadata,
        Info const&         info
    );
    //
    PFN_T pfn;
    MBOOL ret = MTRUE;
    String8 const s8LibPath = String8::format("libcam.halsensor.so");
    void *handle = ::dlopen(s8LibPath.string(), RTLD_GLOBAL);
    if ( ! handle )
    {
        char const *err_str = ::dlerror();
        MY_LOGW("dlopen library=%s %s", s8LibPath.string(), err_str?err_str:"unknown");
        ret = MFALSE;
        goto lbExit;
    }
    pfn = (PFN_T)::dlsym(handle, s8Symbol.string());
    if  ( ! pfn ) {
        MY_LOGW("%s not found", s8Symbol.string());
        ret = MFALSE;
        goto lbExit;
    }
    //
    ret = pfn(rMetadata, rInfo);
    MY_LOGW_IF(!ret, "%s fail", s8Symbol.string());
    //
lbExit:
    if ( handle )
    {
        ::dlclose(handle);
        handle = NULL;
    }
    return  ret;
}
bool
Feature::
initFeatures_Custom_v1()
{
#warning "[TODO]"
    MY_LOGW("Not implement");
    //  [1] Sensor
    //  [2] Misc
    //  [3] Flashlight
    return  false;
}
Ejemplo n.º 12
0
bool
BaseCamAdapter::
sendFrameToObservers(CamFrame*const frame, FrameObservers_t const& rObservers)
{
    MY_LOGV_IF(ENABLE_LOG_PER_FRAME, "+ frameType(0x%x)", frame->mType);
    //
    cam_frame_callback callback = NULL;
    //
    for (uint_t i = 0; i < rObservers.size(); i++)
    {
        {
            RWLock::AutoRLock _l(mRWLockFrameNotifier);
            //
            if  ( i >= rObservers.size() )
            {
                MY_LOGW("break loop since i(%d) >= rObservers.size(%d)", i, rObservers.size());
                break;
            }
            //
            frame->mCbCookie = rObservers.keyAt(i);
            callback = rObservers.valueAt(i);
        }
        //
        MY_LOGV_IF(ENABLE_LOG_PER_FRAME,
                   "i(%d), (frameType, cookie, callback)=(0x%x, %p, %p)",
                   i, frame->mType, frame->mCbCookie, callback
                  );
        //
        if  ( ! callback )
        {
            MY_LOGW("null callback for frameType(0x%x)", frame->mType);
            continue;
        }
        //
        frame->incRef();
        callback(frame);
    }
    //
    return  true;
}
Ejemplo n.º 13
0
bool
querySensorInfo(int32_t const i4OpenId, String8& rs8SensorName, uint32_t& ru4SensorType, int32_t& ri4SensorFacing)
{
    if  ( i4OpenId == 0xFF )
    {
        rs8SensorName = DLSYM_MODULE_NAME_COMMON_SENSOR_ATV;
        ru4SensorType = NSSensorType::eSensorType_YUV;
        ri4SensorFacing = 0;
        MY_LOGW("ATV sensor...return true");
        return  true;
    }

#if '1'!=MTKCAM_HAVE_SENSOR_HAL     //++++++++++++++++++++++++++++++++++++++++++
    //
    #warning "[FIXME] querySensorInfo()"
    MY_LOGI("not use MTKCAM_HAVE_SENSOR_HAL");
    rs8SensorName = "No_Sensor_Hal";
    ru4SensorType = NSSensorType::eSensorType_RAW;
    return  true;
    //
#else   //MTKCAM_HAVE_SENSOR_HAL    //..........................................
    //
    bool ret = false;
    NSCam::IHalSensorList *pSensorHalList = NSCam::IHalSensorList::get();
    if  (pSensorHalList == NULL)
    {
        MY_LOGE("pSensorHalList::get fail");
        pSensorHalList = NULL;
        return false;
    }
    //
    ri4SensorFacing = pSensorHalList->queryFacingDirection(i4OpenId);
    rs8SensorName = pSensorHalList->queryDriverName(i4OpenId);
    switch  ( pSensorHalList->queryType(i4OpenId) )
    {
    case NSCam::NSSensorType::eYUV:
        ru4SensorType = NSSensorType::eSensorType_YUV;
        break;
    case NSCam::NSSensorType::eRAW:
    default:
        ru4SensorType = NSSensorType::eSensorType_RAW;
        break;
    }
    MY_LOGD("[OpenId:%d] type:%d <%s>", i4OpenId, ru4SensorType, rs8SensorName.string());
    //
    ret = true;
lbExit:
    return ret;
    //
#endif  //MTKCAM_HAVE_SENSOR_HAL    //------------------------------------------
}
bool
ImgBufQueue::
stopProcessor()
{
    Mutex::Autolock _lock(mDoneImgBufQueMtx);
    //
    mbIsProcessorRunning = false;
    mDoneImgBufQueCond.broadcast();
    //
    if  ( ! mDoneImgBufQue.empty() ) {
        MY_LOGW("intent to clear Done Que: size(%d)!=0", mDoneImgBufQue.size());
        mDoneImgBufQue.clear();
    }
    //
    return  true;
}
Ejemplo n.º 15
0
/******************************************************************************
* Send command to camera driver.
*******************************************************************************/
status_t
BaseCamAdapter::
sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
{
    status_t status = NO_ERROR;
    switch  (cmd)
    {
    case CAMERA_CMD_PLAY_RECORDING_SOUND:
        break;
    default:
        MY_LOGW("tid(%d), bad command(0x%x), (arg1, arg2)=(0x%x, 0x%x)", ::gettid(), cmd, arg1, arg2);
        status = INVALID_OPERATION;
        break;
    }
    return  status;
}
Ejemplo n.º 16
0
MBOOL
CamShotImp::
onNotifyCallback(CamShotNotifyInfo const& msg) const
{
    MBOOL   ret = MTRUE;
    //
    if  ( mNotifyCb )
    {
        mNotifyCb(mpCbUser, msg);
        ret = MTRUE;
    }
    else
    {
        MY_LOGW("Notify Callback is NULL");
        ret = MFALSE;
    }
    return  ret;
}
Ejemplo n.º 17
0
MBOOL
CamShotImp::
onDataCallback(CamShotDataInfo const& msg) const
{
    MBOOL   ret = MTRUE;
    //
    if  ( mDataCb )
    {
        mDataCb(mpCbUser, msg);
        ret = MTRUE;
    }
    else
    {
        MY_LOGW("Data Callback is NULL");
        ret = MFALSE;
    }
    return  ret;
}
//-----------------------------------------------------------------------------
MBOOL
ResourceLockImp::
Uninit(void)
{
    MBOOL Result = MTRUE;
    //
    Mutex::Autolock lock(mLock);
    //
    if(mUser <= 0)
    {
        MY_LOGW("No user(%d)",mUser);
        goto EXIT;
    }
    //
    android_atomic_dec(&mUser);
    //
    if(mUser == 0)
    {
        MY_LOGD("Last user(%d)",mUser);
    }
    else
    {
        MY_LOGD("More user(%d)",mUser);
        goto EXIT;
    }
    //
    if(mpResMgr != NULL)
    {
        mpResMgr->Uninit();
        mpResMgr->DestroyInstance();
        mpResMgr = NULL;
    }
    //
    if(mpPipeMgr != NULL)
    {
        mpPipeMgr->Uninit();
        mpPipeMgr->DestroyInstance();
        mpPipeMgr = NULL;    
    }
    //
    EXIT:
    return Result;
}
Ejemplo n.º 19
0
bool
ParamsManager::
isEnabled(char const* key) const
{
    if  ( ! key )
    {
        MY_LOGW("Null key");
        return  false;
    }
    //
    RWLock::AutoRLock _lock(mRWLock);
    char const* p = mParameters.get(key);
    //
    if ( ! p ) {
        MY_LOGD_IF(1, "No %s", key);
        return false;
    }
    //
    return ( ::strcmp(p, CameraParameters::TRUE) != 0 ) ? false : true;
}
Ejemplo n.º 20
0
status_t
MetadataProvider::
impConstructStaticMetadata_by_SymbolName(
    String8 const&      s8Symbol,
    IMetadata &metadata
)
{
typedef status_t (*PFN_T)(
        IMetadata &         metadata,
        Info const&         info
    );
    //
    PFN_T pfn = (PFN_T)::dlsym(RTLD_DEFAULT, s8Symbol.string());
    if  ( ! pfn ) {
        MY_LOGW("%s not found", s8Symbol.string());
        return  NAME_NOT_FOUND;
    }
    //
    status_t const status = pfn(metadata, mInfo);
    MY_LOGW_IF(OK != status, "%s returns status[%s(%d)]", s8Symbol.string(), ::strerror(-status), -status);
    //
    return  status;
}
Ejemplo n.º 21
0
MBOOL
EngBufHandlerImpl::
unmapPort(EBufProvider bufType)
{
    Mutex::Autolock _l(mLock);
    //
    MBOOL isFind= MFALSE;
    MUINT32 i;
    list<MAP_PORT_INFO>::iterator iterMapPort;
    //
    for(i=0; i<EPass2Out_DST_AMOUNT; i++)
    {
        for(iterMapPort = mlMapPort[i].begin(); iterMapPort != mlMapPort[i].end();)
        {
            if((*iterMapPort).bufType == bufType)
            {
                MY_LOGD("bufType(%d),nodeType(%d)",
                        (*iterMapPort).bufType,
                        (*iterMapPort).nodeType);
                iterMapPort = mlMapPort[i].erase(iterMapPort);
                isFind = MTRUE;
                break;
            }
            else
            {
                iterMapPort++;
            }
        }
    }
    //
    if(!isFind)
    {
        MY_LOGW("Can't fin bufType(%d)",bufType);
    }
    //
    return MTRUE;
}
Ejemplo n.º 22
0
MBOOL
StereoNodeImpl::
enquePass2(MUINT32 const data, IImageBuffer* const buf, MUINT32 const ext)
{
    CAM_TRACE_CALL();
    // get output bufffers
    MUINT32 dstCount = 0, dstDataType[MAX_DST_PORT_NUM];
    ImgRequest outRequest[MAX_DST_PORT_NUM];
    IMEM_BUF_INFO feoRequest;
    vector<MUINT32> vDataDst = getDataConnected();
    MSize const srcImgSize = buf->getImgSize();
    MSize const dstImgSize = getAlgoImgSize();
    //
    for(MUINT32 i = 0; i < vDataDst.size(); i++)
    {
        if ( STEREO_FEO != vDataDst[i] )
        {
            ICamBufHandler* pBufHdl = getBufferHandler( vDataDst[i] );
            if( pBufHdl && pBufHdl->dequeBuffer( vDataDst[i], &outRequest[dstCount]) )
            {
                dstDataType[dstCount] = vDataDst[i];
                dstCount++;
            }
            else
            {
                MY_LOGE("no dst buf (0x%x)", vDataDst[i]);
            }
        }
        else
        {
            Mutex::Autolock lock(mLock);
            if( mlFeBufQueue.size() == 0 )
            {
                MY_LOGE("no feo buf");
            }
            else
            {
                feoRequest = mlFeBufQueue.front();
                mlFeBufQueue.pop_front();
                //
                dstDataType[dstCount] = vDataDst[i];
                dstCount++;
            }
        }
    }
    if( dstCount == 0 )
    {
        MY_LOGW("no dst buffer, skip data(%d), buf(0x%x)", data, buf);
        handleReturnBuffer(data, (MUINTPTR)buf);
        return MTRUE;
    }

    QParams enqueParams;
    StaData feoData;

    MUINT32 magicNum = 0;
    MVOID*  pPrivateData = NULL;
    MUINT32 privateDataSize = 0;
    MCropRect p2InCrop;
    MSize feSize = getFEImgSize();

    MINT64 timestamp = 0;
    //input
    {
        IImageBuffer const*  pSrcBuf = buf;
        Input src;
        //
        src.mPortID = mapToPortID(data);
        src.mBuffer = const_cast<IImageBuffer*>(pSrcBuf);
        //
        mpIspSyncCtrlHw->getPass2Info(
                            src.mBuffer,
                            srcImgSize,
                            magicNum,
                            pPrivateData,
                            privateDataSize,
                            p2InCrop);
        //
        enqueParams.mpPrivaData = pPrivateData;
        enqueParams.mFrameNo = magicNum;
        //
        timestamp = pSrcBuf->getTimestamp();

        enqueParams.mvIn.push_back(src);

    }
    //
    MCrpRsInfo crop1;
    crop1.mGroupID      = 1;
    crop1.mCropRect     = p2InCrop;
    crop1.mResizeDst    = dstImgSize;
    //
    MCrpRsInfo crop2;
    crop2.mGroupID      = 2;
    crop2.mCropRect.s   = dstImgSize;

    MY_LOGD("data %d, buf 0x%x,va/pa(0x%x/0x%x),size(%dx%d),crop(%d,%d,%d,%d) # 0x%X, cnt %d; crop1(%d,%d,%d,%d)(%dx%d), crop2(%d,%d,%d,%d)(%dx%d)", 
            data, buf, buf->getBufVA(0), buf->getBufPA(0), buf->getImgSize().w, buf->getImgSize().h,
            p2InCrop.p_integral.x, p2InCrop.p_integral.y, p2InCrop.s.w, p2InCrop.s.h, magicNum, muEnqFrameCnt,
            crop1.mCropRect.p_integral.x, crop1.mCropRect.p_integral.y, crop1.mCropRect.s.w, crop1.mCropRect.s.h, crop1.mResizeDst.w, crop1.mResizeDst.h,
            crop2.mCropRect.p_integral.x, crop2.mCropRect.p_integral.y, crop2.mCropRect.s.w, crop2.mCropRect.s.h, crop2.mResizeDst.w, crop2.mResizeDst.h);
    //
    // output
    for( MUINT32 i = 0 ; i < dstCount ; i++ )
    {
        if(dstDataType[i] != STEREO_FEO)
        {
            IImageBuffer const* pDstBuf = outRequest[i].mBuffer;
            MY_LOGD("data %d, buf 0x%x, va/pa(0x%x/0x%x), size(%dx%d), tans %d", 
                    dstDataType[i], pDstBuf, 
                    pDstBuf->getBufVA(0), pDstBuf->getBufPA(0),
                    pDstBuf->getImgSize().w, pDstBuf->getImgSize().h,
                    outRequest[i].mTransform);

            Output dst;
            dst.mPortID     = mapToPortID(dstDataType[i]);
            dst.mBuffer     = const_cast<IImageBuffer*>(pDstBuf);
            dst.mTransform  = outRequest[i].mTransform;           
            dst.mBuffer->setTimestamp(timestamp);
            //
            enqueParams.mvOut.push_back(dst);
        }
        else
        {
            MINT32 idx = muEnqFrameCnt%BUF_COUNT;
            mpStaParam[idx]->bufInfo.size        = feoRequest.size;
            mpStaParam[idx]->bufInfo.memID       = feoRequest.memID;
            mpStaParam[idx]->bufInfo.virtAddr    = feoRequest.virtAddr;
            mpStaParam[idx]->bufInfo.phyAddr     = feoRequest.phyAddr;
            mpStaParam[idx]->bufInfo.bufSecu     = 0;
            mpStaParam[idx]->bufInfo.bufCohe     = 0;
            mpStaParam[idx]->bufInfo.useNoncache = 0;
            mpStaParam[idx]->w                   = feSize.w;
            mpStaParam[idx]->h                   = feSize.h;
            mpStaParam[idx]->stride              = feSize.w;
            mpStaParam[idx]->port_idx            = FEO.index;
            mpStaParam[idx]->port_type           = FEO.type;
            mpStaParam[idx]->port_inout          = FEO.inout;

/*
            feoData.bufInfo.size        = feoRequest.size;
            feoData.bufInfo.memID       = feoRequest.memID;
            feoData.bufInfo.virtAddr    = feoRequest.virtAddr;
            feoData.bufInfo.phyAddr     = feoRequest.phyAddr;
            feoData.bufInfo.bufSecu     = 0;
            feoData.bufInfo.bufCohe     = 0;
            feoData.bufInfo.useNoncache = 0;
            feoData.w                   = FE_W;
            feoData.h                   = FE_H;
            feoData.stride              = FE_W;
            feoData.port_idx            = FEO.index;
            feoData.port_type           = FEO.type;
            feoData.port_inout          = FEO.inout;

            MY_LOGD("(0x%x)FEO:Size(%d),ID(%d),S(%dx%d,%d),VA(%p)PA(%p),Port(%d/%d/%d)",
                    &feoData,
                    feoData.bufInfo.size,
                    feoData.bufInfo.memID,
                    feoData.w,
                    feoData.h,
                    feoData.stride,
                    feoData.bufInfo.virtAddr,
                    feoData.bufInfo.phyAddr,
                    feoData.port_idx,
                    feoData.port_type,
                    feoData.port_inout);*/

            ModuleInfo feoInfo;
            feoInfo.moduleTag    = (MINT32)(EFeatureModule_STA_FEO);
            feoInfo.moduleStruct = reinterpret_cast<MVOID*>(mpStaParam[idx]);
            enqueParams.mvModuleData.push_back(feoInfo);

            mpSrzParam[idx]->in_w    = crop1.mResizeDst.w;
            mpSrzParam[idx]->in_h    = crop1.mResizeDst.h;
            mpSrzParam[idx]->out_w   = getFEImgSize().w;
            mpSrzParam[idx]->out_h   = getFEImgSize().h;

            ModuleInfo srzInfo;
            srzInfo.moduleTag = (MINT32)(EFeatureModule_SRZ1);
            srzInfo.moduleStruct = reinterpret_cast<MVOID*>(mpSrzParam[idx]);
            enqueParams.mvModuleData.push_back(srzInfo); 

            MY_LOGD("[0x%x]FEO:Size(%d),ID(%d),S(%dx%d,%d),VA(%p)PA(%p),Port(%d/%d/%d);[0x%x]SRZ:in(%dx%d),out(%dx%d)",
                    mpStaParam[idx],
                    mpStaParam[idx]->bufInfo.size, mpStaParam[idx]->bufInfo.memID,
                    mpStaParam[idx]->w, mpStaParam[idx]->h, mpStaParam[idx]->stride,
                    mpStaParam[idx]->bufInfo.virtAddr, mpStaParam[idx]->bufInfo.phyAddr,
                    mpStaParam[idx]->port_idx, mpStaParam[idx]->port_type, mpStaParam[idx]->port_inout,
                    mpSrzParam[idx],
                    mpSrzParam[idx]->in_w, mpSrzParam[idx]->in_h, mpSrzParam[idx]->out_w, mpSrzParam[idx]->out_h);

        }
    }
    //
    enqueParams.mvCropRsInfo.push_back( crop1 ); 
    enqueParams.mvCropRsInfo.push_back( crop2 ); 
    //
    enqueParams.mpfnCallback = pass2CbFunc;
    enqueParams.mpCookie = this;
    //
    if( !mpIspSyncCtrlHw->lockHw(IspSyncControlHw::HW_PASS2) )
    {
        MY_LOGE("isp sync lock pass2 failed");
        return MFALSE;
    }
    //
    CAM_TRACE_FMT_BEGIN("enqP2:%d", muEnqFrameCnt);
    if( !mpPostProcPipe->enque(enqueParams) )
    {
        CAM_TRACE_FMT_END();
        MY_LOGE("enque pass2 failed");
        AEE_ASSERT("ISP pass2 enque fail");

        if( !mpIspSyncCtrlHw->unlockHw(IspSyncControlHw::HW_PASS2) )
        {
            MY_LOGE("isp sync unlock pass2 failed");
        }
        return MFALSE;
    }
    CAM_TRACE_FMT_END();

    muEnqFrameCnt++;

    FUNC_END;
    return MTRUE;
}
Ejemplo n.º 23
0
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;
    }
}
Ejemplo n.º 24
0
bool
RawDumpCmdQueThread::
postCommand(IImageBuffer const * pImgBuffer)
{
    FUNCTION_IN;
    //
    bool ret = true;
    CamProfile profile(__FUNCTION__, "RawDumpCmdQueThread::postCommand");
    //
    {
        Mutex::Autolock _l(mCmdMtx);
        // add frame count for remember what frame it is.
        mFrameCnt++;
        // 
        if (NULL == pImgBuffer)
        {
            MY_LOGD("- Requester stop to dump:  tid(%d), frame_count(%d), Q size(%d)", FREE_MEMORY_THRESHOLD, ::gettid(), mFrameCnt, mCmdQ.size());
            mpCamMsgCbInfo->mNotifyCb(MTK_CAMERA_MSG_EXT_NOTIFY, MTK_CAMERA_MSG_EXT_NOTIFY_RAW_DUMP_STOPPED, 0, mpCamMsgCbInfo->mCbCookie);
            return false;         
        }

        MY_LOGD("+ tid(%d), frame_count (%d), buf_addr(%p), stride(%d), buf_size(%d), free(%d)", 
        	            ::gettid(), mFrameCnt, pImgBuffer->getBufVA(0), pImgBuffer->getBufStridesInBytes(0), pImgBuffer->getBufSizeInBytes(0), 
        	            getFreeMemorySize());

        //
        if (!mCmdQ.empty())
        {
            MY_LOGD("queue is not empty, (%d) is in the head of queue, Q size (%d)", ((*mCmdQ.begin())->getFrameCnt()), mCmdQ.size());
        }
        // check if the memory threshold is enough
        if ( FREE_MEMORY_THRESHOLD > getFreeMemorySize())
        {
            MY_LOGD("- Memory is under:%d: RAW DUMP IS STOPPED:  tid(%d), frame_count(%d), Q size(%d)", FREE_MEMORY_THRESHOLD, ::gettid(), mFrameCnt, mCmdQ.size());
            mpCamMsgCbInfo->mNotifyCb(MTK_CAMERA_MSG_EXT_NOTIFY, MTK_CAMERA_MSG_EXT_NOTIFY_RAW_DUMP_STOPPED, 0, mpCamMsgCbInfo->mCbCookie);
            return false;         
        }
        //         
       MUINT32 u4RealRawSize = pImgBuffer->getBufStridesInBytes(0) * pImgBuffer->getImgSize().h; 
       MUINT8 *pbuf = (MUINT8*) malloc (u4RealRawSize); 
       if (NULL == pbuf)
       {
           MY_LOGW("tid(%d) fail to allocate memory, frame_count (%d), buf_addr(%p), buf_size(%d)",
                            ::gettid(), mFrameCnt, pImgBuffer->getBufVA(0), u4RealRawSize);  
           return false;                	                      
       }
       //
       memcpy(pbuf,(MUINT8*)pImgBuffer->getBufVA(0), u4RealRawSize);
       //            
       sp<RawDumpCmdCookie> cmdCookie(new RawDumpCmdCookie(mFrameCnt, new RawImageBufInfo(pImgBuffer->getImgSize().w,
       	                                                                                                                                  pImgBuffer->getImgSize().h, 
            	                                                                                                                                  pImgBuffer->getBufStridesInBytes(0),
            	                                                                                                                                  (MUINTPTR)pbuf, 
            	                                                                                                                                  u4RealRawSize,
            	                                                                                                                                  pImgBuffer->getTimestamp()
            	                                                                                                                                  )
            	                                                                                                                              , mspParamsMgr->getStr(MtkCameraParameters::KEY_RAW_PATH)));    

        mCmdQ.push_back(cmdCookie);
        mCmdCond.broadcast();
        MY_LOGD("- frame added:  tid(%d),  frame_count(%d), que size(%d)", ::gettid(), mFrameCnt, mCmdQ.size());
    }
    //
    profile.print(); 
    FUNCTION_OUT;
    //
    return ret;
}