/******************************************************************************* * Config CamIO Pipe /floria ********************************************************************************/ int Ts_UT:: main_ts_IOPipe_ZSD(int count) { // int count = 1000; //enque, deque loop iterations printf("[iopipetest] E\n"); //for Enqueue, raw buf MUINT32 u4RawBufSize = (u4SensorWidth * u4SensorHeight * 2 + L1_CACHE_BYTES-1) & ~(L1_CACHE_BYTES-1); //for buffer per frame int BufIdx = BUF_NUM, nCt = BUF_NUM; #ifdef USE_IMAGEBUF_HEAP MUINT32 bufStridesInBytes[3] = {1600, 0, 0}; MINT32 bufBoundaryInBytes[3] = {0, 0, 0}; #endif #if 0 ringbuffer* mpRingImgo = new ringbuffer( 2,//PASS1_FULLRAW PORT_IMGO, 0//fakeResized ? PASS1_RESIZEDRAW : 0 ); #endif MY_LOGD("+"); /*------------------------------ * (1) Create Instance *-----------------------------*/ /* eScenarioID_VSS, eScenarioFmt_RAW */ MUINT mSensorIdx = 0;//0:MAIN const char Name = '1'; MUINT mIspEnquePeriod = 1; prepareSensor();//test IHalSensor printf("[iopipetest] INormalPipe::createInstance\n"); mpCamIO = (INormalPipe*)INormalPipe::createInstance(mSensorIdx, &Name, mIspEnquePeriod); #if 0//camera 3.0, should create INormalPipe_FrmB class instance mpCamIO = (IHalCamIO*)INormalPipe_FrmB::createInstance(mSensorIdx, &Name, mIspEnquePeriod); #endif /*------------------------------ test 3A build pass ------------------------------*/ #if 0 MINT32 handle; MBOOL fgRet = mpCamIO->sendCommand(NSImageio_FrmB::NSIspio_FrmB::EPIPECmd_GET_MODULE_HANDLE, NSImageio_FrmB::NSIspio_FrmB::EModule_AF, (MINT32)&handle, (MINT32)(&("AFMgr::setFlkWinConfig()"))); MINT32 wintmp; IOPIPE_SET_MODUL_REG(handle, CAM_AF_WINX01, wintmp); #endif /*------------------------------ * (2) init *-----------------------------*/ printf("[iopipetest] mpCamIO->init\n"); if(!mpCamIO->init()) { printf("[iopipetest] mpCamIO->init failed!!\n"); } /*------------------------------ * (3). Config pipe + RAW10 *-----------------------------*/ MSize mDstSize; mDstSize.w = u4SensorWidth; mDstSize.h = u4SensorHeight; //prepare sensor config vector<IHalSensor::ConfigParam> vSensorCfg; IHalSensor::ConfigParam sensorCfg = { mSensorIdx, /* index */ mDstSize, /* crop no reference in NormalPipe */ u4Scenario, /* scenarioId */ 0, /* isBypassScenario */ 1, /* isContinuous */ 0, /* iHDROn */ 0, /* framerate */ 0, /* two pixel on */ 0, /* debugmode */ }; vSensorCfg.push_back(sensorCfg); printf("[iopipetest] sensor %dx%d, sce %d, bypass %d, con %d, hdr %d, fps %d, twopxl %d\n", sensorCfg.crop.w, sensorCfg.crop.h, sensorCfg.scenarioId, sensorCfg.isBypassScenario, sensorCfg.isContinuous, sensorCfg.HDRMode, sensorCfg.framerate, sensorCfg.twopixelOn); // vector<portInfo> vPortInfo; // portInfo OutPort( PORT_IMGO, eImgFmt_BAYER10, mDstSize, //dst size 0, //pPortCfg->mCrop, //crop u4SensorWidth, //pPortCfg->mStrideInByte[0], 0, //pPortCfg->mStrideInByte[1], 0, //pPortCfg->mStrideInByte[2], 0, // pureraw MTRUE //packed ); vPortInfo.push_back(OutPort); printf("[iopipetest] config portID(0x%x), fmt(%u), size(%dx%d), crop(%u,%u,%u,%u)\n", OutPort.mPortID, OutPort.mFmt, OutPort.mDstSize.w, OutPort.mDstSize.h, OutPort.mCropRect.p.x, OutPort.mCropRect.p.y, OutPort.mCropRect.s.w, OutPort.mCropRect.s.h); printf("[iopipetest] stride(%u,%u,%u), pureRaw(%u), pack(%d)\n", OutPort.mStride[0], OutPort.mStride[1], OutPort.mStride[2], OutPort.mPureRaw, OutPort.mPureRawPak); // QInitParam halCamIOinitParam( 0, u4Bitdepth, vSensorCfg, vPortInfo); printf("[iopipetest] mpCamIO->configPipe\n"); if(!mpCamIO->configPipe(halCamIOinitParam, eScenarioID_VSS)) { printf("[iopipetest] mpCamIO->configPipe failed!!\n"); goto TEST_EXIT; } /*------------------------------ * (4). Enqueue * 4.1, raw buf *-----------------------------*/ #ifdef _USE_THREAD_QUE_ if(vRawMem.size() > 0) { freeRawMem(); TS_Thread_UnInit(); } nCt--; #else // int nReplace; printf("*****************************************\n"); printf("Buffer per frame(1:y; else:n)\n"); scanf("%d", &nReplace); printf("*****************************************\n"); if(nReplace != 1) { nCt--; } #endif /* * * * * * * * * * * * * buffer per frame * nReplace = 1 * size = BUF_NUM + 1 *(replace buffer) * * * * * * * * * * * * * sequential buffer * nReplace != 1 * size = BUF_NUM *(no replace buffer) * * * * * * * * * * * */ printf("[iopipetest] allocMem: RawBuff\n"); for (int i = 0; i <= nCt; i++) //BUF_NUM=3 { IMEM_BUF_INFO rBuf; rBuf.size = u4RawBufSize; allocMem(rBuf); #ifdef USE_IMAGEBUF_HEAP PortBufInfo_v1 portBufInfo = PortBufInfo_v1( rBuf.memID,rBuf.virtAddr,0,rBuf.bufSecu, rBuf.bufCohe); IImageBufferAllocator::ImgParam imgParam = IImageBufferAllocator::ImgParam((eImgFmt_BAYER10), MSize(1280, 720), bufStridesInBytes, bufBoundaryInBytes, 1); sp<ImageBufferHeap> pHeap = ImageBufferHeap::create( LOG_TAG, imgParam,portBufInfo,MTRUE); IImageBuffer* tempBuffer = pHeap->createImageBuffer(); tempBuffer->incStrong(tempBuffer); tempBuffer->lockBuf(LOG_TAG,eBUFFER_USAGE_HW_CAMERA_READWRITE | eBUFFER_USAGE_SW_READ_OFTEN); // BufInfo rBufInfo; rBufInfo.mPortID = PORT_IMGO; rBufInfo.mBuffer = tempBuffer; rBufInfo.FrameBased.mMagicNum_tuning = 0; rBufInfo.FrameBased.mDstSize = mDstSize; rBufInfo.FrameBased.mCropRect = MRect(MPoint(0, 0), mDstSize);//no crop rRawBuf.mvOut.push_back(rBufInfo); #endif vRawMem.push_back(rBuf); printf("[iopipetest] vRawMem(%d)PA(0x%x)VA(0x%x)\n", i, vRawMem.at(i).phyAddr,vRawMem.at(i).virtAddr); } //for deque for (int i = 0; i <= 0; i++) { IMEM_BUF_INFO rBuf; rBuf.size = u4RawBufSize; allocMem(rBuf); #ifdef USE_IMAGEBUF_HEAP PortBufInfo_v1 portBufInfo = PortBufInfo_v1( rBuf.memID,rBuf.virtAddr,0,rBuf.bufSecu, rBuf.bufCohe); IImageBufferAllocator::ImgParam imgParam = IImageBufferAllocator::ImgParam((eImgFmt_BAYER10), MSize(1280, 720), bufStridesInBytes, bufBoundaryInBytes, 1); sp<ImageBufferHeap> pHeap = ImageBufferHeap::create( LOG_TAG, imgParam,portBufInfo,MTRUE); IImageBuffer* tempBuffer = pHeap->createImageBuffer(); tempBuffer->incStrong(tempBuffer); tempBuffer->lockBuf(LOG_TAG,eBUFFER_USAGE_HW_CAMERA_READWRITE | eBUFFER_USAGE_SW_READ_OFTEN); // BufInfo rBufInfo; rBufInfo.mPortID = PORT_IMGO; rBufInfo.mBuffer = tempBuffer; rDequeBuf.mvOut.push_back(rBufInfo); #endif vDequeMem.push_back(rBuf); printf("[iopipetest] vDequeMem(%d)PA(0x%x)VA(0x%x)\n", i, vDequeMem.at(i).phyAddr, vDequeMem.at(i).virtAddr); } /* enque 3 buffers */ for (int i = 0; i < BUF_NUM; i++) { #if 1 QBufInfo rInBuf; rInBuf.mvOut.clear(); #ifdef USE_IMAGEBUF_HEAP BufInfo rBufInfo(PORT_IMGO, rRawBuf.mvOut.at(i).mBuffer, rRawBuf.mvOut.at(i).mSize, rRawBuf.mvOut.at(i).mVa, rRawBuf.mvOut.at(i).mPa); #else BufInfo rBufInfo(PORT_IMGO, NULL, vRawMem.at(i).size, vRawMem.at(i).virtAddr, vRawMem.at(i).phyAddr); #endif rInBuf.mvOut.push_back(rBufInfo); rInBuf.mvOut.at(0).FrameBased.mMagicNum_tuning = 0; rInBuf.mvOut.at(0).FrameBased.mDstSize = mDstSize; rInBuf.mvOut.at(0).FrameBased.mCropRect = MRect(MPoint(0, 0), mDstSize);//no crop #ifdef USE_IMAGEBUF_HEAP printf("[iopipetest] enque.PA(0x%x)VA(0x%x)buf(0x%x)\n", rInBuf.mvOut.at(0).mBuffer->getBufPA(0), rInBuf.mvOut.at(0).mBuffer->getBufVA(0), rInBuf.mvOut.at(0).mBuffer); #else printf("[iopipetest] enque.PA(0x%x)VA(0x%x)\n", rInBuf.mvOut.at(0).mPa, rInBuf.mvOut.at(0).mVa); #endif printf("[iopipetest] enque(%d)\n", i); if(!mpCamIO->enque(rInBuf)) { printf("[iopipetest] enque failed!!\n"); goto TEST_EXIT; } #else /* * * * * * * * * * * * * * * * * * * * * * * * * * * test: * if enque a buffer,and it's port is not IMGO, * mpCamIO->enque(rRawBuf)will return MFALSE * * * * * * * * * * * * * * * * * * * * * * * * * */ QBufInfo rInBuf; rInBuf.mvOut.clear(); #ifdef USE_IMAGEBUF_HEAP BufInfo rBufInfo2(PORT_IMGO, rRawBuf.mvOut.at(i).mBuffer, rRawBuf.mvOut.at(i).mSize, rRawBuf.mvOut.at(i).mVa, rRawBuf.mvOut.at(i).mPa); #else BufInfo rBufInfo2(PORT_IMG2O, NULL, vRawMem.at(i).size, vRawMem.at(i).virtAddr, vRawMem.at(i).phyAddr); #endif rInBuf.mvOut.push_back(rBufInfo2); printf("[iopipetest] enque(%d)\n", i); if(!mpCamIO->enque(rInBuf)){//try to enque IMGO port printf("[iopipetest] enque(%d) again\n", i); rInBuf.mvOut.clear(); BufInfo rBufInfo(PORT_IMGO, NULL, vRawMem.at(i).size, vRawMem.at(i).virtAddr, vRawMem.at(i).phyAddr); rInBuf.mvOut.push_back(rBufInfo); if(!mpCamIO->enque(rInBuf)) { printf("[iopipetest] enque failed!!\n"); goto TEST_EXIT; } } #endif } /*------------------------------ * (5). start *-----------------------------*/ printf("[iopipetest] mpCamIO->start\n"); if(!mpCamIO->start()) { printf("[iopipetest] mpCamIO->start failed!!\n"); goto TEST_EXIT; } #if 0//for debug // test: wait VSYNC printf("[iopipetest] mpCamIO->irq(VSYNC)\n"); if(!mpCamIO->wait(mSensorIdx, EPipeSignal_SOF)) { printf("[iopipetest] wait VSYNC failed!!\n"); goto TEST_EXIT; } // test: wait pass1 done printf("[iopipetest] mpCamIO->irq(p1done)\n"); if(!mpCamIO->wait(mSensorIdx, EPipeSignal_EOF)) { printf("[iopipetest] wait p1done failed!!\n"); goto TEST_EXIT; } #endif /*------------------------------ * (6). deque/enque loop * --> dequeue * --> enqueue *-----------------------------*/ #ifdef _USE_THREAD_QUE_ TS_Thread_Init(count); #else do { printf("-------------------------------------------\n"); QBufInfo halCamIOOutQBuf; QBufInfo rEnBuf; // halCamIOOutQBuf.mvOut.clear(); #ifdef USE_IMAGEBUF_HEAP BufInfo rDeBufInfo(PORT_IMGO, rDequeBuf.mvOut.at(0).mBuffer, rDequeBuf.mvOut.at(0).mSize, rDequeBuf.mvOut.at(0).mVa, rDequeBuf.mvOut.at(0).mPa); #else BufInfo rDeBufInfo(PORT_IMGO, NULL, vDequeMem.at(0).size, vDequeMem.at(0).virtAddr, vDequeMem.at(0).phyAddr); #endif halCamIOOutQBuf.mvOut.push_back(rDeBufInfo); #ifdef USE_IMAGEBUF_HEAP //do nothing #else printf("[iopipetest] dequeBuf.PA(0x%x)VA(0x%x)size(%d)\n", halCamIOOutQBuf.mvOut.at(0).mPa, halCamIOOutQBuf.mvOut.at(0).mVa, halCamIOOutQBuf.mvOut.size()); #endif // printf("[iopipetest] dequeBuf count(%d)\n", count); if(!mpCamIO->deque(halCamIOOutQBuf)) { printf("[iopipetest] deque failed!!\n"); goto TEST_EXIT; } #ifdef USE_IMAGEBUF_HEAP printf("[iopipetest] dequeBuf.PA(0x%x)VA(0x%x)buf(0x%x)\n", halCamIOOutQBuf.mvOut.at(0).mBuffer->getBufPA(0), halCamIOOutQBuf.mvOut.at(0).mBuffer->getBufVA(0), halCamIOOutQBuf.mvOut.at(0).mBuffer); #else printf("[iopipetest] dequeBuf.PA(0x%x)VA(0x%x)\n", halCamIOOutQBuf.mvOut.at(0).mPa, halCamIOOutQBuf.mvOut.at(0).mVa); #endif /* * * * * * * * * * * * * get ResultMetadata * * * * * * * * * * * */ ResultMetadata result = halCamIOOutQBuf.mvOut.at(0).mMetaData; /* * * * * * * * * * * * * check dummy frame * * * * * * * * * * * */ if(halCamIOOutQBuf.mvOut.at(0).mMetaData.m_bDummyFrame == MTRUE) { printf("[iopipetest] this is a dummy frame\n"); } /* * * * * * * * * * * * * sequential buffer *(no replace buffer) * * * * * * * * * * * */ if(nReplace != 1) { rEnBuf.mvOut.clear(); BufInfo rBufInfo(PORT_IMGO, #ifdef USE_IMAGEBUF_HEAP halCamIOOutQBuf.mvOut.at(0).mBuffer, #else NULL, #endif halCamIOOutQBuf.mvOut.at(0).mSize, halCamIOOutQBuf.mvOut.at(0).mVa, halCamIOOutQBuf.mvOut.at(0).mPa); rEnBuf.mvOut.push_back(rBufInfo); } /* * * * * * * * * * * * * buffer per frame *(replace buffer) * * * * * * * * * * * */ else { rEnBuf.mvOut.clear(); #ifdef USE_IMAGEBUF_HEAP BufInfo rBufInfo(PORT_IMGO, rRawBuf.mvOut.at(BufIdx).mBuffer, rRawBuf.mvOut.at(BufIdx).mSize, rRawBuf.mvOut.at(BufIdx).mVa, rRawBuf.mvOut.at(BufIdx).mPa); #else BufInfo rBufInfo(PORT_IMGO, NULL, vRawMem.at(BufIdx).size, vRawMem.at(BufIdx).virtAddr, vRawMem.at(BufIdx).phyAddr); #endif rEnBuf.mvOut.push_back(rBufInfo); } #ifdef USE_IMAGEBUF_HEAP printf("[iopipetest] enqueBuf.PA(0x%x)VA(0x%x),BufId(%d)\n", rEnBuf.mvOut.at(0).mBuffer->getBufPA(0), rEnBuf.mvOut.at(0).mBuffer->getBufVA(0), BufIdx); #else printf("[iopipetest] enqueBuf.PA(0x%x)VA(0x%x),BufId(%d)\n", rEnBuf.mvOut.at(0).mPa, rEnBuf.mvOut.at(0).mVa, BufIdx); #endif /* * * * * * * * * * * * * setting before enque * * * * * * * * * * * */ rEnBuf.mvOut.at(0).FrameBased.mMagicNum_tuning = 0; rEnBuf.mvOut.at(0).FrameBased.mDstSize = mDstSize; rEnBuf.mvOut.at(0).FrameBased.mCropRect = MRect(MPoint(0, 0), mDstSize);//no crop // printf("[iopipetest] enque count(%d)\n", count); if(!mpCamIO->enque(rEnBuf)) { printf("[iopipetest] enque failed!!\n"); goto TEST_EXIT; } // if(++BufIdx > BUF_NUM) BufIdx = 0; // } while(--count > 0); #endif /*------------------------------ * (7). Stop *-----------------------------*/ printf("[iopipetest] mpCamIO->stop\n"); mpCamIO->stop(); TEST_EXIT: /*------------------------------ * (8). uninit *-----------------------------*/ printf("[iopipetest] mpCamIO->uninit\n"); if( !mpCamIO->uninit() ) { MY_LOGE("uninit failed"); } /*------------------------------ * (9). destory instance *-----------------------------*/ printf("[iopipetest] mpCamIO->destroyInstance\n"); mpCamIO->destroyInstance(&Name); mpCamIO = NULL; printf("[iopipetest] X\n"); return 0; }
/******************************************************************************* * Config CamIO Pipe /floria ********************************************************************************/ int Ts_IT:: startPreview(int count) { MY_LOGD("E"); MUINT32 u4RawBufSize = (u4SensorWidth * u4SensorHeight * 10) / 8; MINT32 ret = 0; u4RawBufSize = ((u4RawBufSize + 0xFFF) & ~0xFFF); //align 4k /*************************************************** * Pass 1 : CamIOPipe ***************************************************/ MY_LOGD("ICamIOPipe::createInstance"); //ICamIOPipe *pCamIOPipe = ICamIOPipe::createInstance(eScenarioID_VSS,//mapScenarioID(meSWScenarioID, ICamIOPipe::ePipeID) mpCamIOPipe = ICamIOPipe::createInstance(eScenarioID_VSS, eScenarioFmt_RAW); if (NULL == mpCamIOPipe) { return 0; } MY_LOGD("Pipe (Name, ID) = (%s, %d)", mpCamIOPipe->getPipeName(), mpCamIOPipe->getPipeId()); MY_LOGD("mpCamIOPipe->init\n"); if (!mpCamIOPipe->init()) { MY_LOGD("mpCamIOPipe->init failed"); return 0; } mpCamIOPipe->setCallbacks(NULL, NULL, NULL); MY_LOGD("setConfigPortInfo"); if (setConfigPortInfo() == MFALSE) { goto TEST_EXIT; } if(vRawMem.size() > 0) { freeRawMem(); TS_Thread_UnInit(); } for (int i = 0; i < BUF_NUM; i++) { IMEM_BUF_INFO rBuf; rBuf.size = u4RawBufSize; allocMem(rBuf); vRawMem.push_back(rBuf); } for (int i = 0; i < BUF_NUM; i++) { #if 1 QBufInfo rOutBufInfo; PortID rPortID(EPortType_Memory, EPortIndex_IMGO, 1); NSImageio::NSIspio::BufInfo rBuf(vRawMem.at(i).size, vRawMem.at(i).virtAddr, vRawMem.at(i).phyAddr, vRawMem.at(i).memID, vRawMem.at(i).bufSecu, vRawMem.at(i).bufCohe); rOutBufInfo.vBufInfo.push_back(rBuf); mpCamIOPipe->enqueOutBuf(rPortID, rOutBufInfo); #else rRawBuf.vBufInfo.clear(); NSCamHW::BufInfo rBufInfo(vRawMem.at(i).size, vRawMem.at(i).virtAddr, vRawMem.at(i).phyAddr, vRawMem.at(i).memID); rRawBuf.vBufInfo.push_back(rBufInfo); MY_LOGD("enqueBuf(%d)", i); if (MFALSE == enqueBuf(NSCamPipe::PortID(NSCamPipe::EPortType_MemoryOut, 0, 1), rRawBuf)) { goto TEST_EXIT; } #endif } /*************************************************** * Pass 2 : PostProc ***************************************************/ mpPostProcPipe = IPostProcPipe::createInstance(eScenarioID_VSS, eScenarioFmt_RAW); if (NULL == mpPostProcPipe) { MY_LOGE("mpPostProcPipe create instance fail\n"); goto TEST_EXIT; } ret = mpPostProcPipe->init(); if (!mpPostProcPipe->init()) { MY_LOGE("mpPostProcPipe init fail\n"); goto TEST_EXIT; } dispoBuf.size = DISPO_WIDTH*DISPO_HEIGHT*2; allocMem(dispoBuf); vidoBuf.size = VIDO_WIDTH*VIDO_HEIGHT*2; allocMem(vidoBuf); ret = mpPostProcPipe->sendCommand((MINT32)NSImageio::NSIspio::EPIPECmd_SET_CQ_CHANNEL, (MINT32)NSImageio::NSIspio::EPIPE_PASS2_CQ1,0,0); ret = mpPostProcPipe->sendCommand((MINT32)NSImageio::NSIspio::EPIPECmd_SET_CONFIG_STAGE, (MINT32)NSImageio::NSIspio::eConfigSettingStage_Init,0,0); ret = mpPostProcPipe->sendCommand((MINT32)NSImageio::NSIspio::EPIPECmd_SET_CONFIG_STAGE, (MINT32)NSImageio::NSIspio::eConfigSettingStage_UpdateTrigger,0,0); start(); TS_Thread_Init(count); if (!mpCamIOPipe->stop()) { MY_LOGE("mpCamIOPipe->stop() fail"); } //MY_LOGD("Preview stop, press to enter to exit"); //getchar(); TEST_EXIT: if (NULL != mpCamIOPipe) { MY_LOGD("pCamIOPipe->uninit"); if (MTRUE != mpCamIOPipe->uninit()) { MY_LOGE("pCamIOPipe->uninit fail"); } MY_LOGD("pCamIOPipe->destroyInstance"); mpCamIOPipe->destroyInstance(); mpCamIOPipe = NULL; } if (NULL != mpPostProcPipe) { if (MTRUE != mpPostProcPipe->uninit()) { MY_LOGE("mpPostProcPipe uninit fail"); } mpPostProcPipe->destroyInstance(); mpPostProcPipe = NULL; } if (dispoBuf.size) { char filename[256]; sprintf(filename, "/data/IT_%dx%d_dispo.yuv", DISPO_WIDTH, DISPO_HEIGHT); saveBufToFile(filename, reinterpret_cast<MUINT8*>(dispoBuf.virtAddr), dispoBuf.size); deallocMem(dispoBuf); } if (vidoBuf.size) { char filename[256]; sprintf(filename, "/data/IT_%dx%d_vidio.yuv", VIDO_WIDTH, VIDO_HEIGHT); saveBufToFile(filename, reinterpret_cast<MUINT8*>(vidoBuf.virtAddr), vidoBuf.size); deallocMem(vidoBuf); } MY_LOGD("X"); return 0; }