专家您好:
我设计了一个dvrrdk下的视频采集的例子,想把采集的数据直接保存在A8上,但遇到一些问题向您请教。我建了三个link,capturelink、vpss上的ipcframeoutlink和a8上的ipcframeinlink。通过a8上的ipcframeinlink读取数据时我应该先用Vsys_allocBuf申请内存块并把这些内存块用IpcFramesInLink_putEmptyVideoFrames放入系统内存中,还是不做上述操作直接用IpcFramesInLink_getFullVideoFrames和IpcFramesInLink_putEmptyVideoFrames来读取数据。我发现如做Vsys_allocBuf申请内存块操作,将它们用IpcFramesInLink_putEmptyVideoFrames函数放入系统内存时出现内存访问异常错误。如不做,在只做IpcFramesInLink_getFullVideoFrames和IpcFramesInLink_putEmptyVideoFrames时没问题,如要访问IpcFramesInLink_getFullVideoFrames 获得的内存缓冲区,则读取虚拟地址时会出错。另外,上面的操作我是在启动所有link后在一个无限循环中做的,而没有在回调函数中做,这样是否有问题。上述问题困扰我好几天了, 希望您不吝赐教!
Chris Meng:
Wang Lishi,
应该在采集侧申请buffer,然后通过ipcframeout把指针传递给ARM。
在ARM侧你提到了有转换地址的错误,能否告知一下你是如何转换地址的?
lishi wang上面的操作我是在启动所有link后在一个无限循环中做的,而没有在回调函数中做
不是很明白你的做法,建议参考现有use case的做法来做。
user4029446:
回复 Chris Meng:
谢谢您的答复。请问在采集侧申请buffer是不是不要在ARM端调用Vsys_allocBuf申请内存,而在VPSS端调用Vsys_allocBuf申请内存,那不是要改VPSS上的代码了吗?我记得这通常是不建议做的。对于第二个问题,我没有做什么转换地址操作,只是IpcFramesInLink_getFullVideoFrames后,在buflist结构里frame[i].addr[0][0]指向的缓冲区取数据,然后就错误了。
Chris Meng:
回复 user4029446:
lishi wang对于第二个问题,我没有做什么转换地址操作,只是IpcFramesInLink_getFullVideoFrames后,在buflist结构里frame[i].addr[0][0]指向的缓冲区取数据,然后就错误了。
在A8上要做实地址到虚拟地址的转换,Linux的user space访问的是虚拟地址。
Chris Meng:
回复 user4029446:
lishi wang请问在采集侧申请buffer是不是不要在ARM端调用Vsys_allocBuf申请内存,而在VPSS端调用Vsys_allocBuf申请内存,那不是要改VPSS上的代码了吗?
在captureLink_drv.c里面有申请buffer的代码,请参考以下CaptureLink_drvAllocAndQueueFrames里面的Utils_tilerFrameAlloc/Utils_memFrameAlloc函数。