主题中讨论的其他器件:TVP7002
大家好、
我正在尝试使用 VDIS_getEmptyVideoFrames()捕获已显示的视频帧;
但是帧缓冲区列表正是这 一(VDIS_getEmptyVideoFrames())函数的一部分。
以下是我的用例:
{
CaptureLink_CreateParams CapturePrm;
DisplayLink_CreateParams displayPrm;
CaptureLink_VipInstParams *pCaptureInstPrm;
CaptureLink_OutParams *pCaptureOutPrm;
静态 SwMsLink_CreateParams swMsPrm;
MergeLink_CreateParams mergePrm;
uint32 mergerId;
IpcFramesOutLinkHLS_CreateParams ipcFramesOutHostPrm;
IpcFramesInLinkRTOS_CreateParams ipcFramesInVpssFromHostPrm;
MULTICH_INIT_STRUCT (IpcFramesOutLinkHLS_CreateParams、ipcFramesOutHostPrm);
MULTICH_INIT_STRUCT (IpcFramesInLinkRTOS_CreateParams 、ipcFramesInVpssFromHostPrm);
osa_printf ("Vias 播放_create\n");
MultiCh_detectBoard();
MULTICH_INIT_STRUCT (DisplayLink_CreateParams、displayPrm);
System_linkControl (system_link_ID_M3VPSS、
System_M3VPSS_CMD_RESET_VIDEO 器件、
null、
0、
对
);
/*初始化链接 ID*/
gVcapModuleContext.captureId = system_link_ID_capture;
gVdisModuleContext.displayId[VDIS_DEV_HDMI]= system_link_ID_display_0;
mergerId = system_vPSS_link_ID_merge_0;
gVdisModuleContext.swMsId[0] = system_link_ID_SW_MS_MULTI_INST_0;
gVdisModuleContext.ipcFramesOutHostId = system_host_link_ID_IPC_FRAS_OUT_0;
gVdisModuleContext.ipcFramesInVpssFromHostId = SYSTEM_VPSS_LINK_ID_IPC_FRAS_IN_0;
/*Capture Link 参数*/
CaptureLink_CreateParams_Init (&capturePrm);
capturePrm.numVipInst = 1;//vipInstId;
CapturePrm.outQueParams[0].nextLink = mergerId;
CapturePrm.outQueParams[1].nextLink = mergerId;
CapturePrm.tilerEnable = false;
pCaptureInstPrm =&capturePrm.vipInst[0];
pCaptureInstPrm->vipInstId = system_capture_INST_VIP0_Porta;//+vipInstId;
pCaptureInstPrm->videoDecoderId = system_device_VID_DEC_TVP7002_DRV;
pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P;
//pCaptureInstPrm->inDataFormat = SYSTEM_DF_RGB24_888;
pCaptureInstPrm->标准 = SYSTEM_STD_SXGA+ 60;
//pCaptureInstPrm->标准 = SYSTEM_STD_720p_60;
//pCaptureInstPrm->标准 = SYSTEM_STD_1080p_60;
//pCaptureInstPrm->标准 = SYSTEM_STD_1080i_60;
pCaptureInstPrm->numOutput = 2;
pCaptureOutPrm =&pCaptureInstPrm->outParams[0];
pCaptureOutPrm->dataFormat = system_DF_YUV420SP_UV;//system_DF_RGB24_888;//
//pCaptureOutPrm->scEnable = true;//false;
// pCaptureOutPrm->scOutWidth = 1500;//1280;//340;//1920;
//pCaptureOutPrm->scOutHeight = 1080;//1040;//340;//1080;
pCaptureOutPrm->outQueId = 0;
pCaptureOutPrm =&pCaptureInstPrm->outParams[1];
pCaptureOutPrm->dataFormat = system_DF_YUV420SP_UV;//system_DF_RGB24_888;//
//pCaptureOutPrm->scEnable = true;
//pCaptureOutPrm->scOutWidth = 1500;//1280;//340;//1920;//1280;
//pCaptureOutPrm->scOutHeight = 1080;//1040;//340;//1024;
pCaptureOutPrm->outQueId = 1;
mergePrm.numInQue = 2;
mergePrm.inQueParams[0].prevLinkId = gVcapModuleContext.captureId;
mergePrm.inQueParams[0].prevLinkQueId = 0;
mergePrm.inQueParams[1].prevLinkId = gVcapModuleContext.captureId;
mergePrm.inQueParams[1].prevLinkQueId = 1;
mergePrm.outQueParams.nextLink = gVdisModuleContext.swMsId[0];
mergePrm.notifyNextLink = true;
/*用于裁剪的软件 Mosaic。*/
swMsPrm.numSwMsInst = 1;
swMsPrm.swMsInstId[0] = system_sw_ms_sc_INST_VIP1_SC;
swMsPrm.inQueParams.prevLinkId = mergerId;
swMsPrm.inQueParams.prevLinkQueId = 0;
swMsPrm.outQueParams.nextLink = gVdisModuleContext.displayId[VDIS_DEV_HDMI];
swMsPrm.maxInputQueLen = system_sw_ms_default_input_que_LEN + 4;
swMsPrm.maxOutRes = VSYS_STD_1080p_60;
swMsPrm.lineSkipMode = false;
swMsPrm.enableLayoutGridDraw = false;
swMsPrm.enableOutputDup = true;
swMsPrm.enableProcessTieWithDisplay = true;
vias _播放_配件(&swMsPrm、start_x、start_y、cROP_HEIGHT、cROP_width、 接头、CAP_RES);
/* IPC 初始化*///未测试
ipcFramesOutHostPrm.baseCreateParams.noNotifyMode = true;
ipcFramesOutHostPrm.baseCreateParams.notifyNextLink = false;
ipcFramesOutHostPrm.baseCreateParams.notifyPrevLink = false;
ipcFramesOutHostPrm.baseCreateParams.inQueParams.prevLinkId = system_link_ID_invalid;
ipcFramesOutHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcFramesOutHostPrm.baseCreateParams.outQueueParams[0].nextLink = gVdisModuleContext.ipcFramesInVpssFromHostId;
ipcFramesInVpssFromHostPrm.baseCreateParams.noNotifyMode = true;
ipcFramesInVpssFromHostPrm.baseCreateParams.notifyNextLink = true;
ipcFramesInVpssFromHostPrm.baseCreateParams.notifyPrevLink = false;
ipcFramesInVpssFromHostPrm.baseCreateParams.inQueParams.prevLinkId = gVdisModuleContext.ipcFramesOutHostId;
ipcFramesInVpssFromHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcFramesInVpssFromHostPrm.baseCreateParams.outQueueParams[0].nextLink = gVdisModuleContext.displayId[VDIS_DEV_HDMI];
/*显示链接参数*/
MULTICH_INIT_STRUCT (DisplayLink_CreateParams、displayPrm);
displayPrm.inQueParams[0].prevLinkId = gVdisModuleContext.swMsId[0];
displayPrm.inQueParams[0].prevLinkQueId = 0;
displayPrm.displayRes = system_STD_1080p_60;
displayPrm.displayId = display_link_display_sc1;//辅助视频路径(支持全高清/标清)
/*创建链接*/
System_linkCreate (gVcapModuleContext.captureId、&capturePrm、sizeof (capturePrm));
System_linkCreate (mergerId、&mergePrm、sizeof (mergePrm));
System_linkCreate (gVdisModuleContext.swMsId[0]、&swMsPrm、sizeof (swMsPrm));
/*IPC 链接*/
System_linkCreate (gVdisModuleContext.ipcFramesOutHostId、&ipcFramesOutHostPrm、sizeof (ipcFramesOutHostPrm));
System_linkCreate (gVdisModuleContext.ipcFramesInVpssFromHostId、&ipcFramesInVpssFromHostPrm、sizeof (ipcFramesInVpssFromHostPrm));
System_linkCreate (gVdisModuleContext.displayId[VDIS_DEV_HDMI]、&displayPrm、sizeof (displayPrm));
MultiCh_memPrintHeapStatus();
}
下面是我的帧捕获函数
void Capture_FRAME ()
{
VIDEO_FRAMEBUF_LIST_S bufList;
INT 状态;
uint32 frameSize = 0、frameId;
VIDEO_FRAMEBUF_LIST_S * pFrameBufList;
VIDEO_FRAMEBUF_S * pBuf;
uint32 pMemVirtAddr;
pMemVirtAddr = 0;
uint32 writeDataSize;
文件*fp=NULL;
osa_printf ("MCFW_IPCFRAMES:%s:已输入..."、__func__);
fp = fopen ("VIAS.YUV"、"WB");
状态= VDIS_getEmptyVideoFrames (&bufList、0);
OSA_ASSERT (0 = STATUS);
pFrameBufList =&bufList;
osa_printf ("numframes =%d"、pFrameBufList->numFrames);<--- 这个正在打印0,没有帧被分配到缓冲区。
for (frameId=0;frameId < pFrameBufList->numFrames;frameId++)
{
pBuf =&pFrameBufList->frameId];
帧大小=(pBuf->frameWidth * pBuf->frameHeight)<<1;
app_mmap ((uint32)(pBuf->phyAddr[0][0])、frameSize、&pMemVirtAddr);
writeDataSize = fwrite ((ptr) pMemVirtAddr、1、frameSize、FP);
if (writeDataSize!=帧大小)
{
fclose (FP);
osa_printf ("关闭文件\n");
app_unmapMem();
中断;
}
app_unmapMem();
}
fclose (FP);
}
您能不能看看出现了什么问题。
谢谢
Kailash