Hi,
I am trying to read YUV frames from USB camera and display on the screen through VPSS. I have written one custom link to read the data from USB camera and the chain looks as below, ( I modified the capturedisplay use case to validate my test case)
V4L2Link -> ipcFramesOut (A8) -> ipcFramesIn (VPSS) -> display
Once I start the usecase, i could able to see the video till 1000 frames and getting assert in the following place "IpcFramesOutLink_processFrameBufs()
{
.......................
status =^M
OSA_queGet(&pObj->listElemQue, (Int32 *) & pListElem,^M
OSA_TIMEOUT_NONE);^M
OSA_assert (status == OSA_SOK)^M
...........
}
when we explored, we found that there is no valid buffers from the emptylist from the function and causing the issue,
IpcFramesOutLink_releaseFrameBufs()
{
....
"pListElem = ListMP_getHead(pObj->listMPInHndl);
if (pListElem != NULL) { ... }
...
}
I have attached our usecase for your reference. Any help would make us move further.
Note : Directly we are calling the "IpcFramesOutLink_putFullVideoFrames" and "IpcFramesOutLink_getEmptyVideoFrames" to send and receive the buffers from V4L2 link to ipcFramesOut link.
/** ================================================================== * @file multich_Stream_CaptureDisplay.c * * @path ipnc_mcfw/mcfw/src_linux/mcfw_api/usecases/ * * @desc This File contains. * =================================================================== * Copyright (c) Texas Instruments Inc 2011, 2012 * * Use of this software is controlled by the terms and conditions found * in the license agreement under which this software has been supplied * ===================================================================*/ /*------------------------------ TRIPLE OUT <1080p + D1 + MJPEG> ---------------------------------- Capture RSZA RSZB 1080P60 D130 (YUV420) (YUV420) | | (0)-DUP0-(1) (0)-DUP1-(1) | | | | HDMI DISPLAY NULL1 TVOUT NULL0 ------------------------------------------------------------------------------------------*/ #include "mcfw/src_linux/mcfw_api/usecases/multich_common.h" #include "mcfw/src_linux/mcfw_api/usecases/multich_ipcbits.h" #include "demos/mcfw_api_demos/multich_usecase/ti_mcfw_ipnc_main.h" /* ============================================================================= * Externs * ============================================================================= */ /* ============================================================================= * Use case code * ============================================================================= */ #define NUM_DUP_LINK (3) #define HDMIDIS_DUP_IDX (0) #define TVOUT_DUP_IDX (1) #define RAW_DUP_IDX (2) /* =================================================================== * @func MultiCh_createStreamCaptureDisplay * * @desc Function does the following * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <argument name> * Description of usage * <argument name> * Description of usage * * @outputs <argument name> * Description of usage * * @return Return value of this function if any * ================================================================== */ UInt32 gIpcFramesOutHLOSId; UInt32 gIpcFramesInVpssId; UInt32 gDisplayId; UInt32 gMergeId; Void v4l2_createStreamCaptureDisplay() { //v4l2camLink_CreateParams v4l2cameraHostrm; //HOST-A8----------> //IpcBitsOutLinkHLOS_CreateParams ipcFramesOutHostPrm; //HOST-A8----------> //IpcBitsInLinkRTOS_CreateParams ipcFramesInVpssPrm; //---------->VPSS-M3 IpcFramesOutLinkHLOS_CreateParams ipcFramesOutHostPrm; IpcFramesInLinkRTOS_CreateParams ipcFramesInVpssPrm; //SwMsLink_CreateParams swMsPrm; DisplayLink_CreateParams displayPrm; //Int32 status; ////////////////////////////////////////////////////////////// OSA_printf("\n********** raviraj UVC - display usecase ********\n"); //gVdisModuleContext.ipcFramesOutHostId = SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0; //gVdisModuleContext.ipcFramesInVpssFromHostId = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_IN_0; /* IPC structures init */ MULTICH_INIT_STRUCT(IpcFramesOutLinkHLOS_CreateParams,ipcFramesOutHostPrm); MULTICH_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams,ipcFramesInVpssPrm); OSA_printf("\n********** UVC - display usecase ********\n"); MultiCh_detectBoard(); System_linkControl(SYSTEM_LINK_ID_M3VPSS,SYSTEM_M3VPSS_CMD_RESET_VIDEO_DEVICES, NULL, 0, TRUE); /* Link IDs */ OSA_printf("raviraj : CREATING LINK ID'S\n"); gIpcFramesOutHLOSId = SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0; gIpcFramesInVpssId = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_IN_0; //gSwMsId = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0; gDisplayId = SYSTEM_LINK_ID_DISPLAY_0; /* IPC BITS OUT HLOS Link */ OSA_printf("raviraj : SETTING A8 LINK TO VPSS LINK\n"); ipcFramesOutHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcFramesOutHostPrm.baseCreateParams.numOutQue = 1; ipcFramesOutHostPrm.baseCreateParams.inputFrameRate = 10;//30 ipcFramesOutHostPrm.baseCreateParams.outputFrameRate = 10;//30 ipcFramesOutHostPrm.baseCreateParams.outQueParams[0].nextLink = gIpcFramesInVpssId; ipcFramesOutHostPrm.baseCreateParams.notifyNextLink = FALSE; // SARA TRUE ipcFramesOutHostPrm.baseCreateParams.notifyPrevLink = FALSE; ipcFramesOutHostPrm.baseCreateParams.noNotifyMode = TRUE ; // SARA FALSE ipcFramesOutHostPrm.inQueInfo.numCh = 1; ipcFramesOutHostPrm.inQueInfo.chInfo[0].startX = 0; ipcFramesOutHostPrm.inQueInfo.chInfo[0].startY = 0; ipcFramesOutHostPrm.inQueInfo.chInfo[0].height = 480;//640; ipcFramesOutHostPrm.inQueInfo.chInfo[0].width = 640;//480; ipcFramesOutHostPrm.inQueInfo.chInfo[0].pitch[0] = 1280; ipcFramesOutHostPrm.inQueInfo.chInfo[0].pitch[1] = 1280; ipcFramesOutHostPrm.inQueInfo.chInfo[0].pitch[2] = 1280; ipcFramesOutHostPrm.inQueInfo.chInfo[0].bufType = SYSTEM_BUF_TYPE_VIDFRAME; ipcFramesOutHostPrm.inQueInfo.chInfo[0].codingformat = -1; ipcFramesOutHostPrm.inQueInfo.chInfo[0].memType = SYSTEM_MT_NONTILEDMEM; ipcFramesOutHostPrm.inQueInfo.chInfo[0].dataFormat = SYSTEM_DF_YUV422I_YUYV; ipcFramesOutHostPrm.inQueInfo.chInfo[0].scanFormat = SYSTEM_SF_PROGRESSIVE;//SYSTEM_SF_INTERLACED;// ipcFramesInVpssPrm.baseCreateParams.inQueParams.prevLinkId = gIpcFramesOutHLOSId; ipcFramesInVpssPrm.baseCreateParams.inQueParams.prevLinkQueId = 0; ipcFramesInVpssPrm.baseCreateParams.inputFrameRate = 10;//30; ipcFramesInVpssPrm.baseCreateParams.noNotifyMode = TRUE; ipcFramesInVpssPrm.baseCreateParams.notifyNextLink = TRUE; ipcFramesInVpssPrm.baseCreateParams.notifyPrevLink = FALSE ; // TRUE; ipcFramesInVpssPrm.baseCreateParams.numOutQue = 1; ipcFramesInVpssPrm.baseCreateParams.outQueParams[0].nextLink = gDisplayId; ipcFramesInVpssPrm.baseCreateParams.outputFrameRate = 10;//30; /* DISPLAY Link */ MULTICH_INIT_STRUCT(DisplayLink_CreateParams,displayPrm); //displayPrm.inQueParams[0].prevLinkId = gSwMsId; displayPrm.inQueParams[0].prevLinkId = gIpcFramesInVpssId; displayPrm.inQueParams[0].prevLinkQueId = 0; displayPrm.displayRes = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_HDMI].resolution; displayPrm.displayId = DISPLAY_LINK_DISPLAY_SC2; displayPrm.numInputQueues = 1; displayPrm.activeQueue = 0; displayPrm.forceFieldSeparatedInputMode = FALSE; /* Link creation */ System_linkCreate(SYSTEM_HOST_LINK_ID_V4L2,NULL,0); System_linkCreate(gIpcFramesOutHLOSId,&ipcFramesOutHostPrm,sizeof(ipcFramesOutHostPrm)); System_linkCreate(gIpcFramesInVpssId,&ipcFramesInVpssPrm,sizeof(ipcFramesInVpssPrm)); //System_linkCreate(gSwMsId,&swMsPrm,sizeof(SwMsLink_CreateParams)); //OSA_printf("raviraj ::: MOSAIC : SW MOSAIC LINK CREATED\n"); System_linkCreate(gDisplayId,&displayPrm,sizeof(DisplayLink_CreateParams)); OSA_printf("raviraj : DISPLAY LINK CREATED\n"); OSA_printf("raviraj : USECASE SETUP DONE\n"); } /* =================================================================== * @func MultiCh_deleteStreamCaptureDisplay * * @desc Function does the following * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <argument name> * Description of usage * <argument name> * Description of usage * * @outputs <argument name> * Description of usage * * @return Return value of this function if any * ================================================================== */ Void v4l2_deleteStreamCaptureDisplay() { System_linkDelete(gDisplayId); // System_linkDelete(gSwMsId); System_linkDelete(gMergeId); System_linkDelete(gIpcFramesInVpssId); System_linkDelete(gIpcFramesOutHLOSId); /* Print the HWI, SWI and all tasks load */ /* Reset the accumulated timer ticks */ MultiCh_prfLoadCalcEnable(FALSE, TRUE, FALSE); }