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);
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
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);
你好,
你看的是哪个版本的DVR RDK?我看了一下,v3.0以后都没有你说的这两个函数调用了。建议你还是更新一下软件。
Utils_dmaCopy2D利用了EDMA实现了两维的数据复制。
是这个版本的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);
}
我计算了一下参数设置如下:
没有搞懂这样做的目的?
你好,
请参考mcfw下的capture link相关代码,而不是hdvpss下面的。
哦!抱歉是MCFW下的写错了,是DVR_RDK ,
请教一下 Utils_dmaCopy2D(&pObj->dmaObj, &pChObj->Dma2DParam_Merge, 1);
函数,就是应用EDMA将Frame从我设置的源地址复制到目的地址是吗?是否是连续传送呢?
另外SRCBIDX和DSTBIDX的作用是什么呢?