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.

Questions about using selectLink

Other Parts Discussed in Thread: TVP7002

Hello,
I would like to switch captureLink and nullSrcLink dynamically with selectLink into swMs. (capture 2 HD channels and create 2 nullSrc channels.) However, the selectLink can't select nullSrc correctly. (I got green video, frozen video, ...)

I could use selectLink to switch capture source by setting selectPrm.outQueChInfo[0].inChNum[], but it is failed if setting inChNum[] to nullSrc channels... (I am using RDK 3.0.)

Could you give me some clues to solve this problem? Thank you very much in advance. 

Below is my use case of chain creation:

capture --2CH-->
                           |---+ merge --4CH--> select --2CH--> swMs --1CH--> display
nullSrc --2CH-->

Below is my code snap:

// capture link settings
capturePrm.numVipInst = 2 ;

capturePrm.outQueParams[0].nextLink = mergeId ;

capturePrm.tilerEnable = FALSE;
capturePrm.enableSdCrop = FALSE;

for(vipInstId = 0; vipInstId < capturePrm.numVipInst; vipInstId++)
{
pCaptureInstPrm = &capturePrm.vipInst[vipInstId];
pCaptureInstPrm->vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTA+vipInstId*2;
pCaptureInstPrm->videoDecoderId = ( vipInstId==0 ? SYSTEM_DEVICE_VID_DEC_TVP7002_DRV : SYSTEM_DEVICE_VID_DEC_TVP7002_VIP1_DRV );
pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P;
pCaptureInstPrm->standard = SYSTEM_STD_1080P_60;
pCaptureInstPrm->numOutput = 1;

pCaptureOutPrm = &pCaptureInstPrm->outParams[0];
pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV422I_YUYV;
pCaptureOutPrm->scEnable = FALSE;
pCaptureOutPrm->scOutWidth = 0;
pCaptureOutPrm->scOutHeight = 0;
pCaptureOutPrm->outQueId = 0;
}

// nullSrc link settings
nullSrcPrm.outQueParams.nextLink = mergeId ;
nullSrcPrm.timerPeriod = 33 ;
nullSrcPrm.inputInfo.numCh = 2 ;
for( i = 0; i < nullSrcPrm.inputInfo.numCh; i++ )
{
System_LinkChInfo *pChInfo;

pChInfo = &nullSrcPrm.inputInfo.chInfo[i];

pChInfo->dataFormat = SYSTEM_DF_YUV422SP_UV; // SYSTEM_DF_YUV420SP_UV ;
pChInfo->memType = SYSTEM_MT_NONTILEDMEM;
pChInfo->startX = 0;
pChInfo->startY = 0;
pChInfo->width = 1920 ; // 720
pChInfo->height = 1080 ; // 480
pChInfo->pitch[0] = SystemUtils_align(pChInfo->width+pChInfo->startX, SYSTEM_BUFFER_ALIGNMENT);
pChInfo->pitch[1] = pChInfo->pitch[0];
pChInfo->pitch[2] = 0;
pChInfo->scanFormat = SYSTEM_SF_PROGRESSIVE;
}

// merge link settings
mergePrm.inQueParams[0].prevLinkId = captureId ;
mergePrm.inQueParams[0].prevLinkQueId = 0 ;
mergePrm.inQueParams[1].prevLinkId = nullSrcId ;
mergePrm.inQueParams[1].prevLinkQueId = 0 ;

mergePrm.outQueParams.nextLink = selectId ;
mergePrm.notifyNextLink = TRUE ;

// select link settings
SelectLink_CreateParams_Init( &selectPrm );

selectPrm.inQueParams.prevLinkId = mergeId ;
selectPrm.inQueParams.prevLinkQueId = 0 ;

selectPrm.numOutQue = 1;

selectPrm.outQueParams[0].nextLink = swMsId ;

selectPrm.outQueChInfo[0].numOutCh = 2 ;
selectPrm.outQueChInfo[0].outQueId = 0 ;

selectPrm.outQueChInfo[0].inChNum[0] = 0 ; // 1: ok, 2: NG 3: NG
selectPrm.outQueChInfo[0].inChNum[1] = 1 ; // 0: ok, 2: NG 3: NG

  • NullSrc data format of pChInfo->dataFormat = SYSTEM_DF_YUV422SP_UV is not supported in swms.Data format should be SYSTEM_DF_YUV422I

  • Hello, Badri

    I will try the solution. Thank you very much for quick response.

    Besides, I'm trying to get/set selectLink setting dynamically via System_linkControl(). I could not get correct outQueChInfo with SELECT_LINK_CMD_GET_OUT_QUE_CH_INFO and I am not sure if my SELECT_LINK_CMD_SET_OUT_QUE_CH_INFO code is correct. Could you help confirm my code? (Sorry, I don't find the sample code in DVR_RDK.)

    SelectLink_OutQueChInfo outQueChInfo[SELECT_LINK_MAX_OUT_QUE];

    System_linkControl( selectId, SELECT_LINK_CMD_GET_OUT_QUE_CH_INFO, &outQueChInfo, sizeof(outQueChInfo[SELECT_LINK_MAX_OUT_QUE]), TRUE);

    // The received data is not correct!

    outQueChInfo[0].numOutCh = 2 ;
    outQueChInfo[0].outQueId = 0 ;

    outQueChInfo[0].inChNum[0] = 2 ; // switch output 0 to channel 2
    outQueChInfo[0].inChNum[1] = 3 ; // switch output 1 to channel 1

    System_linkControl( selectId, SELECT_LINK_CMD_SET_OUT_QUE_CH_INFO, &outQueChInfo, sizeof(outQueChInfo[SELECT_LINK_MAX_OUT_QUE]), TRUE);

  • You should set outQueId before invoking  SELECT_LINK_CMD_GET_OUT_QUE_CH_INFO.i.e Code should be

    outQueChInfo[0].].outQueId = 0

    System_linkControl( selectId, SELECT_LINK_CMD_GET_OUT_QUE_CH_INFO, &(outQueChInfo[0]), sizeof(outQueChInfo[0]), TRUE);

  • Hello, 

    We used DVR RDK 4.0 to try to dynamically switch capture and nullSrc with select link, but still got incorrect result. 

    We could start link/chain by selecting nullSrc (ch2 and ch3). And then, we called select link with SELECT_LINK_CMD_SET_OUT_QUE_CH_INFO, saw swMs' input change message, and got below "green" image. Is there any incorrect data format setting of nullSrc (or capture link)? 

    Note.

    1) If we select capture (ch0 and ch1) in link/chain creating, and then switch to nullSrc in run-time. We got swMs link's assertion.  

    2) SYSTEM_DF_YUV422I_YUYV doesn't work, while SYSTEM_DF_YUV422SP_UV works (in link/chain creation). It doesn't seem to match your suggestion...?

    // capture link

    CaptureLink_VipInstParams *pCaptureInstPrm = NULL ;
    CaptureLink_OutParams *pCaptureOutPrm = NULL ;

    CaptureLink_CreateParams_Init( &capturePrm );

    capturePrm.numVipInst = 2 ;

    capturePrm.outQueParams[0].nextLink = mergeId ;

    capturePrm.tilerEnable = FALSE;
    capturePrm.enableSdCrop = FALSE;

    for(vipInstId = 0; vipInstId < capturePrm.numVipInst; vipInstId++)
    {
    pCaptureInstPrm = &capturePrm.vipInst[vipInstId];
    pCaptureInstPrm->vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTA+vipInstId*2;
    pCaptureInstPrm->videoDecoderId = ( vipInstId==0 ? SYSTEM_DEVICE_VID_DEC_TVP7002_DRV : SYSTEM_DEVICE_VID_DEC_TVP7002_VIP1_DRV );
    pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P;
    pCaptureInstPrm->standard = SYSTEM_STD_1080P_60; // hard-coded
    pCaptureInstPrm->numOutput = 1;

    pCaptureOutPrm = &pCaptureInstPrm->outParams[0];
    pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV422I_YUYV;
    pCaptureOutPrm->scEnable = FALSE;
    pCaptureOutPrm->scOutWidth = 0;
    pCaptureOutPrm->scOutHeight = 0;
    pCaptureOutPrm->outQueId = 0;
    }

    // nullSrc link
    nullSrcPrm.outQueParams.nextLink = mergeId ;
    nullSrcPrm.timerPeriod = 33 ;
    nullSrcPrm.inputInfo.numCh = 2 ;

    for( i = 0; i < nullSrcPrm.inputInfo.numCh; i++ )
    {
    System_LinkChInfo *pChInfo;

    pChInfo = &nullSrcPrm.inputInfo.chInfo[i];

    pChInfo->dataFormat = SYSTEM_DF_YUV422SP_UV ; // SYSTEM_DF_YUV422I_YUYV => SYSTEM_DF_YUV422I_YUYV doesn't work!
    pChInfo->memType = SYSTEM_MT_NONTILEDMEM;
    pChInfo->startX = 0;
    pChInfo->startY = 0;
    pChInfo->width = 1920 ;
    pChInfo->height = 1080 ;
    pChInfo->pitch[0] = SystemUtils_align(pChInfo->width+pChInfo->startX, SYSTEM_BUFFER_ALIGNMENT);
    pChInfo->pitch[1] = pChInfo->pitch[0];
    pChInfo->pitch[2] = 0;
    pChInfo->scanFormat = SYSTEM_SF_PROGRESSIVE;
    }

    // merge link
    mergePrm.numInQue = 2;

    mergePrm.inQueParams[0].prevLinkId = captureId ;
    mergePrm.inQueParams[0].prevLinkQueId = 0 ;
    mergePrm.inQueParams[1].prevLinkId = nullSrcId ;
    mergePrm.inQueParams[1].prevLinkQueId = 0 ;

    mergePrm.outQueParams.nextLink = selectId ;
    mergePrm.notifyNextLink = TRUE ;

    // select link
    SelectLink_CreateParams_Init( &selectPrm );

    selectPrm.inQueParams.prevLinkId = mergeId ;
    selectPrm.inQueParams.prevLinkQueId = 0 ;

    selectPrm.numOutQue = 1;

    selectPrm.outQueParams[0].nextLink = swMsId ;

    selectPrm.outQueChInfo[0].numOutCh = channelNum ;
    selectPrm.outQueChInfo[0].outQueId = 0 ;

    selectPrm.outQueChInfo[0].inChNum[0] = 2 ; // choose first nullSrc
    selectPrm.outQueChInfo[0].inChNum[1] = 3 ; // choose second nullSrc

  • NullSrc data format should be SYSTEM_DF_YUV422I_YUYV. Setting it to SYSTEM_DF_YUV422SP_UV is wrong.

    Check if modifying NullSrc to set rtChannelInfo.isDataTypeChanged to TRUE resolves the SwMs assert.

  • Hello, 

    After change to SYSTEM_DF_YUV422I_YUYV, the chain/link creation hangs up with below message. 

    I can't find rtChannelInfo.isDataTypeChanged. Is this variable in swMs or nullSrc?

    [m3vpss ] 15024: CAPTURE: Create in progress !!!
    [m3vpss ] 15054: CAPTURE: VIP0 PortA capture mode is [16-bit, Non-mux Embedded Sync] !!!
    [m3vpss ] 15261: CAPTURE: VIP1 PortA capture mode is [16-bit, Non-mux Embedded Sync] !!!
    [m3vpss ] UTILS: DMA: Allocated CH (TCC) = 58 (58)
    [m3vpss ] UTILS: DMA: 0 of 4: Allocated PaRAM = 58 (0x49004740)
    [m3vpss ] UTILS: DMA: 1 of 4: Allocated PaRAM = 64 (0x49004800)
    [m3vpss ] UTILS: DMA: 2 of 4: Allocated PaRAM = 65 (0x49004820)
    [m3vpss ] UTILS: DMA: 3 of 4: Allocated PaRAM = 66 (0x49004840)
    [m3vpss ] CAPTURE::HEAPID:0 USED:520
    [m3vpss ] CAPTURE::HEAPID:4 USED:95385600
    [m3vpss ] 15469: CAPTURE: Create Done !!!
    [m3vpss ] 15469: NULL_SRC: Create in progress !!!
    [m3vpss ] 15488: NULL_SRC: Create Done !!!
    [m3vpss ] 15489: MERGE : Create Done !!!
    [m3vpss ] 15490: SELECT: OUT QUE0: OUT CH0: IN CH2: 1920 x 1080, pitch = (1920, 1920) [PROGRESSIVE] [NON-TILED ]
    [m3vpss ] 15490: SELECT: OUT QUE0: OUT CH1: IN CH3: 1920 x 1080, pitch = (1920, 1920) [PROGRESSIVE] [NON-TILED ]
    [m3vpss ] 15490: SELECT : Create Done !!!
    [m3vpss ] 15495: DUP : Create Done !!!
    [m3vpss ] 15496: MERGE : Create Done !!!
    [m3vpss ] 15501: DUP : Create Done !!!
    [m3vpss ] 15501: SWMS: Create in progress !!!
    [m3vpss ] UTILS: DMA: Allocated CH (TCC) = 59 (59)
    [m3vpss ] UTILS: DMA: 0 of 1: Allocated PaRAM = 59 (0x49004760)
    [m3vpss ] SWMS: instance 0, sc id 5, start win 0 end win 17

    [m3vpss ] AVSYNC:WallTime IGNORE Unexpected Discontinuity.PrevTs[15599]/CurTs[152252]
    [m3vpss ] AVSYNC:WallTime IGNORE Unexpected Discontinuity.PrevTs[152252]/CurTs[288535]
    [m3vpss ] 288535: Assertion @ Line: 2555 in links_m3vpss/swMs/swMsLink_drv.c: pDrvObj->fvidHandle != NULL : failed !!!

    Thank you~~~

  • You are setting wrong pitch in NullSrc:

    pChInfo->pitch[0] = SystemUtils_align(pChInfo->width+pChInfo->startX, SYSTEM_BUFFER_ALIGNMENT); pChInfo->pitch[1] = pChInfo->pitch[0];

     

    For YUV422I dataFormat pitch should be 1920 x 2 = 3840