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.

RTOS/TDA3: Problem with resizing.

Part Number: TDA3

Tool/software: TI-RTOS

Hello.

I have a usecase with following structure:

[Capture -> IssM2mResizer -> IssM2mSimcop -> Merge -> Sync -> Alg_dmaSwMs -> Display_Video

IssCapture -> IssM2mIsp -> Merge

IssM2mIsp -> Alg_IssAewb

GrpxSrc -> Display_Grpx]

I need to have two images on one screen with same 640*480 size. I need to do a M2m resize (scale down) on one of them and whant to use Resizer for this task.

Video from IssCapture part looks fine, but video from Capture seems like not affected by Resizer at all - I have like 1/4 of full picture in my 640*480 window. I have also tried to crop video from Capture, but crop seems not working. What should I do?

I have a camera with 1080p60 resolution and SYSTEM_DF_YUV420SP_UV on my Capture input.

Thanks.

  • Hi
    Resizer works fine. Can you please share the resizer parameters that you are setting from the usecase?

    Rgds,
    Brijesh
  • Hi Brijesh.

    Sure. Here they are:

    pUcObj->IssM2mResizerPrm.channelParams->numBuffersPerCh = 4U;
    pUcObj->IssM2mResizerPrm.channelParams->enableOut[0U] = 1; // [ISSRSZ_LINK_OUTPUTQUE_IMAGE_RSZ_A] = TRUE
    pUcObj->IssM2mResizerPrm.channelParams->outParams.widthRszA = 640;
    pUcObj->IssM2mResizerPrm.channelParams->outParams.heightRszA = 480; 
    pUcObj->IssM2mResizerPrm.channelParams->outParams.dataFormat = SYSTEM_DF_YUV420SP_UV;

  • Hi Arseniy,

    The parameters look correct, so if you are seeing same output image as input image, it may be that these parameters are getting overwritten somewhere.. Could you please share your usecase file or could you please tell where you are setting these parameters?

    Rgds,
    Brijesh
  • Thanks for help.
    I guess, there might be a problem related to simcop configuration or ldc table related to Capture, but i cannot find it.

    chains_DoubleSyncMosaic.c
    #include "chains_DoubleSyncMosaic_priv.h"
    #include <src/include/chains_common.h>
    #include <src/rtos/iss/include/iss_sensors.h>
    #include <src/rtos/iss/include/iss_utils.h>
    #include <src/rtos/iss/include/app_util_iss.h>
    #include <include/link_api/displayLink.h>
    
    #define RWIDTH      (640)
    #define RHEIGHT     (480)
    
    #define HR 			(2)
    #define VR 			(2)
    
    #define OutWidth  	(1920)	//1440 | 1280
    #define OutHeight	(1080)	//1080 | 720
    
    
    #define NumbCh 		(1)
    
    typedef struct {
    
        chains_DoubleSyncMosaicObj    ucObj;
    
    	IssM2mSimcopLink_ConfigParams   simcopConfig;
    	
    	vpsissldcConfig_t               ldcCfg;
    	vpsissvtnfConfig_t              vtnfCfg;
    	
    	vpsissRszInstConfig_t	rszCfg;
    	vpsissRszInputConfig_t  cropCfg;
    
    	Bool               bypassVtnf;
    	Bool               bypassLdc;
    	
    	Chains_DisplayType displayType;
        UInt32             captureOutWidth;
        UInt32             captureOutHeight;
        UInt32             displayWidth;
        UInt32             displayHeight;
    
    	UInt32			   ActiveChId;
    
    	IssM2mSimcopLink_OperatingMode  simcopMode;
    
        Chains_Ctrl        *chainsCfg;
    
    	AppUtils_Obj	   appSensInfo;
    
    } chains_DoubleSyncMosaicAppObj;
    
    char DoubleSyncMosaic_runTimeMenu[] = {
    "\r\n "
    "\r\n ================================"
    "\r\n DoubleSyncMosaic Run-time Menu"
    "\r\n ================================"
    "\r\n "
    "\r\n b: Exit"
    "\r\n "
    "\r\n p: Print Statistics"
    "\r\n "
    "\r\n Enter Choice: "
    "\r\n "
    };
    
    Void chains_DoubleSyncMosaic_SetDmaSwMsParams(AlgorithmLink_DmaSwMsCreateParams *pPrm, UInt32 numCh, UInt32 winWidth, UInt32 winHeight, UInt32 outWidth, UInt32 outHeight)
    {
        UInt32 algId, winId;
        UInt32 useLocalEdma;
        AlgorithmLink_DmaSwMsLayoutWinInfo *pWinInfo;
    
        useLocalEdma = FALSE;
        algId = ALGORITHM_LINK_IPU_ALG_DMA_SWMS;
    
        pPrm->baseClassCreate.algId   = algId;
    
        pPrm->numOutBuf               = 4U;
    
        pPrm->useLocalEdma            = useLocalEdma;
        pPrm->initLayoutParams.numWin = numCh;
    
        pPrm->maxOutBufWidth     = outWidth;
        pPrm->maxOutBufHeight    = outHeight;
    
        for(winId=0; winId<pPrm->initLayoutParams.numWin; winId++)
        {
            pWinInfo = &pPrm->initLayoutParams.winInfo[winId];
            pWinInfo->chId = winId;
            pWinInfo->inStartX = 0;
            pWinInfo->inStartY = 0;
    
            switch(winId)
            {
                default:
                case 0:
    				pWinInfo->width  = 640;
    				pWinInfo->height = 480;
                    pWinInfo->outStartX = 100;
                    pWinInfo->outStartY = 100;			
                    break;
                case 1:
    				pWinInfo->width = 640;
    				pWinInfo->height = 480;
                    pWinInfo->outStartX = winWidth+500;
                    pWinInfo->outStartY = 100;				
                    break;
            }
        }
    
        pPrm->initLayoutParams.outBufWidth  = pPrm->maxOutBufWidth;
        pPrm->initLayoutParams.outBufHeight = pPrm->maxOutBufHeight;
    }
    
    Void chains_DoubleSyncMosaic_SetIspConfig(chains_DoubleSyncMosaicAppObj *pObj)
    {     
    	appSetDefaultIspParams(&pObj->appSensInfo);
    	appSetIspParamsFromDCC(&pObj->appSensInfo);
    }
    
    Void chains_DoubleSyncMosaic_SetSimcopConfig(chains_DoubleSyncMosaicAppObj *pObj) 
    {
    	pObj->ucObj.IssM2mSimcopPrm.channelParams[0].overrideInFrmSize=FALSE;
    	
    	IssM2mSimcopLink_ConfigParams_Init(&pObj->simcopConfig);
    	pObj->simcopConfig.ldcConfig = &pObj->ldcCfg;
    	pObj->simcopConfig.vtnfConfig = &pObj->vtnfCfg;
    
    	IssUtils_InitSimcopConfig(&pObj->simcopConfig, pObj->bypassLdc, pObj->bypassVtnf);
    
    	IssUtils_SetimcopLdcVtnfRtConfig(&pObj->ldcCfg, &pObj->vtnfCfg, pObj->bypassLdc, pObj->bypassVtnf);   
    
    	Vps_printf("chNum: %u, ldcFrameH: %u, ldcFrameW: %u, Address: %u, DSF: %d, LineOffset: %u, ldcValid: %u, VtnfValid: %u, BackMap: %u", 
    	pObj->simcopConfig.chNum, 
    	pObj->simcopConfig.ldcConfig->inputFrameHeight,
    	pObj->simcopConfig.ldcConfig->inputFrameWidth,
    	pObj->simcopConfig.ldcConfig->lutCfg.address,
    	pObj->simcopConfig.ldcConfig->lutCfg.downScaleFactor, pObj->simcopConfig.ldcConfig->lutCfg.lineOffset,
    	pObj->simcopConfig.ldcConfig->isAdvCfgValid, pObj->simcopConfig.vtnfConfig->isAdvCfgValid, 
    	pObj->simcopConfig.ldcConfig->enableBackMapping);
    
    	/* MUST be called after link create and before link start */
    	System_linkControl(
    		pObj->ucObj.IssM2mSimcopLinkID,
    		ISSM2MSIMCOP_LINK_CMD_SET_SIMCOPCONFIG,
    		&pObj->simcopConfig,
    		sizeof(pObj->simcopConfig),
    		TRUE);
    }
    
    Void chains_DoubleSyncMosaic_setMuxes(chains_DoubleSyncMosaicAppObj *pObj)
    {
    	/* Setup PinMux */
    	ChainsPlatform_SetPinMux(pObj->chainsCfg->sensorName);
    
    	/* Init Board Mux */
    	ChainsBoard_SetBoardMux(pObj->chainsCfg->sensorName);
    }
    
    Void chains_DoubleSyncMosaic_SetSyncPrm( SyncLink_CreateParams *pSP)
    {
        pSP->syncDelta       = 35U; // round up 1 / 27.0 
        pSP->syncThreshold   = pSP->syncDelta * 2U;
        pSP->syncDelta       = 35U; // round up 1 / 27.0 
        pSP->syncThreshold   = pSP->syncDelta * 2U;
    } 
    
    Void chains_DoubleSyncMosaic_SetDisplayPrm(DisplayLink_CreateParams *pDispName, Chains_DisplayType displayType, 
    UInt32 displayWidth, UInt32 displayHeight, 
    UInt32 captureWidth, UInt32 captureHeight)
    {
    	UInt32 dispWidth, dispHeight;	
    		
    	if ((displayType == CHAINS_DISPLAY_TYPE_SDTV_NTSC) ||
    		(displayType == CHAINS_DISPLAY_TYPE_SDTV_PAL))
    	{
    		pDispName->displayScanFormat = SYSTEM_SF_INTERLACED;
    	}
    
    	dispWidth  = 1920; //captureWidth
    	dispHeight = 1080; //displayHeight
    
    	pDispName->rtParams.tarWidth = dispWidth;
    	pDispName->rtParams.tarHeight = dispHeight;
    	pDispName->rtParams.posX = 0;
    	pDispName->rtParams.posY = 0;
    	pDispName->displayId = DISPLAY_LINK_INST_DSS_VID1;
    }
    
    void chains_DoubleSyncMosaic_RszConfig(chains_DoubleSyncMosaicObj *pUcObj)
    {
    	//IssRszLink_CreateParams
    	pUcObj->IssM2mResizerPrm.channelParams->numBuffersPerCh = 4U;
    	pUcObj->IssM2mResizerPrm.channelParams->enableOut[0U] = 1; //ISSRSZ_LINK_OUTPUTQUE_IMAGE_RSZ_A = TRUE
    	pUcObj->IssM2mResizerPrm.channelParams->outParams.widthRszA = RWIDTH;
    	pUcObj->IssM2mResizerPrm.channelParams->outParams.heightRszA = RHEIGHT;
    	pUcObj->IssM2mResizerPrm.channelParams->outParams.dataFormat = SYSTEM_DF_YUV420SP_UV; //SYSTEM_DF_BAYER_RAW | SYSTEM_DF_YUV420SP_UV | SYSTEM_DF_YUV422I_UYVY
    	Vps_printf("IssM2mResizerPrm passed");
    }
    
    Void chains_DoubleSyncMosaic_SetAppPrms(chains_DoubleSyncMosaicObj *pUcObj, Void *appObj) 
    {
        chains_DoubleSyncMosaicAppObj *pObj = (chains_DoubleSyncMosaicAppObj*)appObj;
    	
        pObj->captureOutWidth  = OutWidth;
        pObj->captureOutHeight = OutHeight;
    
        ChainsCommon_GetDisplayWidthHeight(
            pObj->chainsCfg->displayType,
            &pObj->displayWidth,
            &pObj->displayHeight
            );
    
        ChainsCommon_SingleCam_SetCapturePrms(&pUcObj->CapturePrm,
                OutWidth,
                OutHeight,
                pObj->captureOutWidth,
                pObj->captureOutHeight,
                pObj->chainsCfg->captureSrc
                );
    		
        pUcObj->CapturePrm.vipInst[0].numBufs = 4; 			//5
    
        pUcObj->CapturePrm.memAllocInfo.memSize =
           (OutWidth * OutHeight *
            pUcObj->CapturePrm.vipInst[0].numBufs * 3) / 2; //12441600=8294400*1.5
    
        pUcObj->CapturePrm.memAllocInfo.memAddr =
            (UInt32)Utils_memAlloc(
                    UTILS_HEAPID_DDR_CACHED_SR,
                    pUcObj->CapturePrm.memAllocInfo.memSize,
                    128);
    				
        UTILS_assert(pUcObj->CapturePrm.memAllocInfo.memAddr!=NULL);
    
    	/* Initialize Simcop Pointers */
    	pObj->simcopConfig.ldcConfig = &pObj->ldcCfg;
    	pObj->simcopConfig.vtnfConfig = &pObj->vtnfCfg;
    
    	/* Create the sensor now */
    	strncpy(pObj->appSensInfo.sensorName, pObj->chainsCfg->sensorName,
    		ISS_SENSORS_MAX_NAME);
    	
    	pObj->appSensInfo.numCh = NumbCh;
    	pObj->appSensInfo.ispOpMode = pObj->chainsCfg->ispOpMode;
    	pObj->appSensInfo.simcopOpMode = pObj->simcopMode;
    	appCreateISSSensor(&pObj->appSensInfo);
    
    	appInitIssCaptParams(&pObj->appSensInfo, pUcObj->IssCaptureLinkID, &pUcObj->IssCapturePrm);
    	appInitIssIspParams(&pObj->appSensInfo, pUcObj->IssM2mIspLinkID, &pUcObj->IssM2mIspPrm);
    	appInitIssSimcopParams(&pObj->appSensInfo, pUcObj->IssM2mSimcopLinkID, &pUcObj->IssM2mSimcopPrm);
    	appInitIssAewbParams(&pObj->appSensInfo, pUcObj->Alg_IssAewbLinkID, &pUcObj->Alg_IssAewbPrm);	
    	
    	//IssIspLink_CreateParams
    	pUcObj->IssM2mIspPrm.channelParams[0].enableOut[ISSM2MISP_LINK_OUTPUTQUE_IMAGE_RSZ_B] = 0;
    	pUcObj->IssM2mIspPrm.channelParams[1].enableOut[ISSM2MISP_LINK_OUTPUTQUE_IMAGE_RSZ_B] = 0;
    	pUcObj->IssM2mIspPrm.channelParams[2].enableOut[ISSM2MISP_LINK_OUTPUTQUE_IMAGE_RSZ_B] = 0;
    	pUcObj->IssM2mIspPrm.channelParams[3].enableOut[ISSM2MISP_LINK_OUTPUTQUE_IMAGE_RSZ_B] = 0;
    	pUcObj->IssM2mIspPrm.channelParams[0U].outParams.widthRszA  = RWIDTH;
    	pUcObj->IssM2mIspPrm.channelParams[0U].outParams.heightRszA = RHEIGHT;
    	pUcObj->IssM2mIspPrm.channelParams[0U].outParams.dataFormat = SYSTEM_DF_YUV420SP_UV;
    
    	pObj->captureOutWidth  = pUcObj->IssCapturePrm.outParams[0U].width;
    	pObj->captureOutHeight = pUcObj->IssCapturePrm.outParams[0U].height;
    
        ChainsCommon_SetGrpxSrcPrms(&pUcObj->GrpxSrcPrm, pObj->displayWidth, pObj->displayHeight);
    
        pUcObj->GrpxSrcPrm.grpxBufInfo.dataFormat = SYSTEM_DF_BGRA16_4444;
    																			
    	chains_DoubleSyncMosaic_SetDmaSwMsParams(&pUcObj->Alg_dmaSwMsPrm, 2, RWIDTH, RHEIGHT, pObj->displayWidth, pObj->displayHeight);
    
        ChainsCommon_SetDisplayPrms(&pUcObj->Display_VideoPrm, &pUcObj->Display_GrpxPrm, pObj->chainsCfg->displayType, pObj->displayWidth, pObj->displayHeight);
    
    	chains_DoubleSyncMosaic_SetDisplayPrm(&pUcObj->Display_VideoPrm, pObj->chainsCfg->displayType, pObj->displayWidth, pObj->displayHeight, RWIDTH, RHEIGHT);
    
        chains_DoubleSyncMosaic_SetSyncPrm(&pUcObj->SyncPrm);
    
        ChainsCommon_StartDisplayCtrl( pObj->chainsCfg->displayType, pObj->displayWidth, pObj->displayHeight);	
    }
    
    Void chains_DoubleSyncMosaic_StartApp(chains_DoubleSyncMosaicAppObj *pObj)
    {
    	chains_DoubleSyncMosaic_SetIspConfig(pObj);
    	
    	chains_DoubleSyncMosaic_RszConfig(&pObj->ucObj);
    
    	chains_DoubleSyncMosaic_SetSimcopConfig(pObj);
    
    	chains_DoubleSyncMosaic_setMuxes(pObj);
    
    	appStartIssSensorSerDes(&pObj->appSensInfo);	
    	
    	ChainsCommon_StartDisplayDevice(pObj->chainsCfg->displayType);
    
        ChainsCommon_StartCaptureDevice(pObj->chainsCfg->captureSrc, pObj->captureOutWidth, pObj->captureOutHeight);
    
        chains_DoubleSyncMosaic_Start(&pObj->ucObj);
    
        Chains_prfLoadCalcEnable(TRUE, FALSE, FALSE);
    }
    
    Void chains_DoubleSyncMosaic_StopAndDeleteApp(chains_DoubleSyncMosaicAppObj *pObj) 
    {
    	chains_DoubleSyncMosaic_Stop(&pObj->ucObj);
        chains_DoubleSyncMosaic_Delete(&pObj->ucObj);
    }
    
    Void chains_DoubleSyncMosaic(Chains_Ctrl *chainsCfg)
    {
        char ch;	
    	UInt32 done = FALSE;
        chains_DoubleSyncMosaicAppObj chainsObj;	
    	chainsObj.chainsCfg = chainsCfg;
    	
    	chains_DoubleSyncMosaic_Create(&chainsObj.ucObj, &chainsObj);
    	chains_DoubleSyncMosaic_StartApp(&chainsObj);
    	
        while(!done)
        {
            Vps_printf(DoubleSyncMosaic_runTimeMenu);
    
            ch = Chains_readChar();
    
            switch(ch)
            {
                case 'b':
                    done = TRUE;
                    break;
                case 'p':
    				ChainsCommon_PrintStatistics();
    				chains_DoubleSyncMosaic_printStatistics(&chainsObj.ucObj);
    				break;			
            }
        }
    	chains_DoubleSyncMosaic_StopAndDeleteApp(&chainsObj);	
    }
    
    

  • I think i know the problem,

    Can you move call to chains_DoubleSyncMosaic_RszConfig from chains_DoubleSyncMosaic_StartApp to chains_DoubleSyncMosaic_SetAppPrms, Just before call to ChainsCommon_SetGrpxSrcPrms.

    Essentially these parameters are set at create time.. But you are trying to set at start time.. which will not get set..

    So call this function after ISP parameters are initialized in appInitIssIspParams.

    Rgds,
    Brijesh