1、在Capture中下面的函数是用来干什么的?
Void CaptureLink_drvMergeData_Yuv422i(CaptureLink_Obj * pObj,UInt32 queId,UInt32 queChId,FVID2_Frame *pFrame)
看了一下内部的实现,还是没有看懂求指教!
2、上面函数中调用的下面的DMA函数是将数据拷贝到DMA中吗?
Utils_dmaCopy2D(&pObj->dmaObj, &pChObj->Dma2DParam_Merge, 1);
Chris Meng:
你好,
你看的是哪个版本的DVR RDK?我看了一下,v3.0以后都没有你说的这两个函数调用了。建议你还是更新一下软件。
Utils_dmaCopy2D利用了EDMA实现了两维的数据复制。
xiaoqing shi:
回复 Chris Meng:
是这个版本的hdvpss_01_00_01_37_patched,
Void CaptureLink_drvMergeData_Yuv422i(CaptureLink_Obj * pObj, UInt32 queId, UInt32 queChId, FVID2_Frame *pFrame){ Int32 status; System_LinkChInfo* pChInfo = &pObj->info.queInfo[queId].chInfo[queChId]; CaptureLink_ChObj *pChObj; pChObj = &pObj->chObj[queId][queChId]; Int32 width, height, pitch0; Int32 startx, starty; width = pChInfo->width; height = pChInfo->height; pitch0 = pChInfo->pitch[0]; startx = pChInfo->startX; starty = pChInfo->startY;
if((width<=0)||(height<=0)||(pitch0<=0)) { Vps_printf("### Cap: width %d, height %d, pitch0 %d\n",\ width, height, pitch0); return; } int *addr; addr=pObj->tmpBufAddr; Vps_printf("—–>pitch0:%d,addr:0x%08x\n",pitch0,addr); addr=pFrame->addr[0][0]; Vps_printf("—–>pFrame->addr[0][0]:0x%08x\n",addr);
pChObj->Dma2DParam_Merge.destAddr[0] = pObj->tmpBufAddr; pChObj->Dma2DParam_Merge.srcAddr[0] = pFrame->addr[0][0]+pitch0; pChObj->Dma2DParam_Merge.width = width; pChObj->Dma2DParam_Merge.height = height/2; pChObj->Dma2DParam_Merge.destPitch[0] = pitch0; pChObj->Dma2DParam_Merge.srcPitch[0] = pitch0*2;
pChObj->Dma2DParam_Merge.dataFormat = FVID2_DF_YUV422I_YUYV; pChObj->Dma2DParam_Merge.srcStartX = startx; pChObj->Dma2DParam_Merge.srcStartY = starty; pChObj->Dma2DParam_Merge.destStartX = startx; pChObj->Dma2DParam_Merge.destStartY = starty/2;
status = Utils_dmaCopy2D(&pObj->dmaObj, &pChObj->Dma2DParam_Merge, 1); UTILS_assert(status==FVID2_SOK);
pChObj->Dma2DParam_Merge.destAddr[0] = pFrame->addr[0][0]+pitch0; pChObj->Dma2DParam_Merge.srcAddr[0] = pFrame->addr[0][0]+pitch0*2; pChObj->Dma2DParam_Merge.width = width; pChObj->Dma2DParam_Merge.height = height/2-1; pChObj->Dma2DParam_Merge.destPitch[0] = pitch0; pChObj->Dma2DParam_Merge.srcPitch[0] = pitch0*2; pChObj->Dma2DParam_Merge.dataFormat = FVID2_DF_YUV422I_YUYV; pChObj->Dma2DParam_Merge.srcStartX = startx; pChObj->Dma2DParam_Merge.srcStartY = starty; pChObj->Dma2DParam_Merge.destStartX = startx; pChObj->Dma2DParam_Merge.destStartY = starty/2; status = Utils_dmaCopy2D(&pObj->dmaObj, &pChObj->Dma2DParam_Merge, 1); UTILS_assert(status==FVID2_SOK);
pChObj->Dma2DParam_Merge.destAddr[0] = pFrame->addr[0][0]+pitch0*height/2; pChObj->Dma2DParam_Merge.srcAddr[0] = pObj->tmpBufAddr; pChObj->Dma2DParam_Merge.width = width; pChObj->Dma2DParam_Merge.height = height/2; pChObj->Dma2DParam_Merge.destPitch[0] = pitch0; pChObj->Dma2DParam_Merge.srcPitch[0] = pitch0;
pChObj->Dma2DParam_Merge.dataFormat = FVID2_DF_YUV422I_YUYV; pChObj->Dma2DParam_Merge.srcStartX = startx; pChObj->Dma2DParam_Merge.srcStartY = starty/2; pChObj->Dma2DParam_Merge.destStartX = startx; pChObj->Dma2DParam_Merge.destStartY = starty;
status = Utils_dmaCopy2D(&pObj->dmaObj, &pChObj->Dma2DParam_Merge, 1); if(status==FVID2_SOK) UTILS_assert(status==FVID2_SOK);}
我计算了一下参数设置如下:
没有搞懂这样做的目的?
Chris Meng:
回复 xiaoqing shi:
你好,
请参考mcfw下的capture link相关代码,而不是hdvpss下面的。
xiaoqing shi:
回复 Chris Meng:
哦!抱歉是MCFW下的写错了,是DVR_RDK ,
请教一下 Utils_dmaCopy2D(&pObj->dmaObj, &pChObj->Dma2DParam_Merge, 1);
函数,就是应用EDMA将Frame从我设置的源地址复制到目的地址是吗?是否是连续传送呢?
另外SRCBIDX和DSTBIDX的作用是什么呢?
TI中文支持网