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.

dm816x dei performance

Hi.

I'm developing DM816x transcoding device using DVRRDK_2.00.00.23

My usecase is 30fps 4 HD input to 30fps 4 various resolution each. ( 480p, 360p, 270p, 180p)

My chain looks like this.

VDEC(4ch HD) -> DUP-| -> DEI_1 - |-> NSF(422only) -> MERGE -> ENC

                                      | -> DEI_2->|

 

When I used dm8168 rev1.1 chip, there was no problem.

But, after changing to dm8167 rev2.0, fps drops to about 25 fps.

After a few days of debugging, I found that the problem results from DEI. DEI can't process enough frames in time.

My test chain is

VDEC(4ch HD) -> DUP-| -> DEI_1 - |-> SNK

                                      | -> DEI_2->|

Is this problem due to revision change or difference between dm8168 and dm8167?

 

  • There is an issue with DEI performance when operating in DEI bypass mode in DM 8168 PG2.0. The fix requires a change in HDVPSS driver.The fix is part of RDK 3.5 release. Can you migrate to RDK 3.5 release ?

  • hi Badri,

    Thanks for reply.

    I migrated to RDK 3.5 and dei performance issue disappeared.

    But, in RDK 3.5, if i enable tiler in declink, i just get all green image.

    With tiler disabled, all works fine.

    Is this OK? or Am I missing something?

  • Badri Narayanan said:

    There is an issue with DEI performance when operating in DEI bypass mode in DM 8168 PG2.0. The fix requires a change in HDVPSS driver.The fix is part of RDK 3.5 release.

     
    hi Badri,
     
    By your speaking, does it also happen in DM8168 PG2.1 when I use rdk3.0?
    if yes, If our application is based on rdk 3.0, which files in kernel are need to be patched for me?
  • There should be no issue with enabling tiler in RDK 3.5.Pls share the logs of Vsys_printDetailedStatistics and your usecase file.It looks like some configuration issue

  • Hi. Badri.

    This is my usecase

     enableTiler = TRUE;

     numDecChannel = 4;
     numEncChannel = 24;
     numDuplicator = 1;
     numResizer    = 3;

     iConf.numChannels = numDecChannel;

     for(i=0; i<numDecChannel;i++)
     {
      iConf.inputChInfo[i].width  = pChConf->Input[i].width;
      iConf.inputChInfo[i].height = pChConf->Input[i].height;
     }

     iConf.cbFxns.receiver = pChConf->cbFxns.receiver;
     iConf.cbFxns.sender   = pChConf->cbFxns.sender;
     iConf.priv_data       = pChConf->priv_data;

     Chains_ipcBitsInit(&iConf);

     CHAINS_INIT_STRUCT(IpcBitsOutLinkHLOS_CreateParams,ipcBitsOutHostPrm);
     CHAINS_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams, ipcBitsInVideoPrm);
     CHAINS_INIT_STRUCT(DecLink_CreateParams,           decPrm);
     CHAINS_INIT_STRUCT(IpcLink_CreateParams,           ipcOutVideoPrm);
     CHAINS_INIT_STRUCT(IpcLink_CreateParams,           ipcInVpssPrm);
     for(i=0; i<DEI_LINK_OBJ_MAX; i++)
      CHAINS_INIT_STRUCT(DeiLink_CreateParams,           deiPrm[i]);

     CHAINS_INIT_STRUCT(IpcLink_CreateParams,           ipcOutVpssPrm);
     CHAINS_INIT_STRUCT(IpcLink_CreateParams,           ipcInVideoPrm);
     CHAINS_INIT_STRUCT(EncLink_CreateParams,           encPrm);
     CHAINS_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutVideoPrm);
     CHAINS_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams, ipcBitsInHostPrm);

     pConfig->ipcBitsOutHostId = ipcBitsOutHostId  = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
     pConfig->ipcBitsInVideoId = ipcBitsInVideoId  = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;
     pConfig->decId            = decId             = SYSTEM_LINK_ID_VDEC_0;
     pConfig->ipcOutVideoId    = ipcOutVideoId     = SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0;
     pConfig->ipcInVpssId      = ipcInVpssId       = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0;
     pConfig->dupId[0]         = dupId[0]          = SYSTEM_VPSS_LINK_ID_DUP_0;
     pConfig->dupId[1]         = dupId[1]          = SYSTEM_VPSS_LINK_ID_DUP_1;
     pConfig->dupId[2]         = dupId[2]          = SYSTEM_VPSS_LINK_ID_DUP_2;
     pConfig->dupId[3]         = dupId[3]          = SYSTEM_VPSS_LINK_ID_DUP_3;
     for(i=0;i<DEI_LINK_OBJ_MAX;i++)
      pConfig->deiId[i] = deiId[i] = SYSTEM_LINK_ID_DEI_HQ_0 + i;

     pConfig->nsfId[0]         = nsfId[0]          = SYSTEM_LINK_ID_NSF_0;
     pConfig->nsfId[1]         = nsfId[1]          = SYSTEM_LINK_ID_NSF_1;
     pConfig->merge420Id       = merge420Id        = SYSTEM_VPSS_LINK_ID_MERGE_0;
     pConfig->merge422Id       = merge422Id        = SYSTEM_VPSS_LINK_ID_MERGE_1;
     pConfig->mergeOutId       = mergeOutId        = SYSTEM_VPSS_LINK_ID_MERGE_2;
     pConfig->mergeInId[0]     = mergeInId[0]      = SYSTEM_VPSS_LINK_ID_MERGE_3;
     pConfig->mergeInId[1]     = mergeInId[1]      = SYSTEM_VPSS_LINK_ID_MERGE_4;
     pConfig->ipcOutVpssId     = ipcOutVpssId      = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
     pConfig->ipcInVideoId     = ipcInVideoId      = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
     pConfig->encId            = encId             = SYSTEM_LINK_ID_VENC_0;
     pConfig->ipcBitsOutVideoId= ipcBitsOutVideoId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0;
     pConfig->ipcBitsInHostId  = ipcBitsInHostId   = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;

     System_linkControl(
       SYSTEM_LINK_ID_M3VIDEO,
       SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL,
       &systemVid_encDecIvaChMapTbl,
       sizeof(SystemVideo_Ivahd2ChMap_Tbl),
       TRUE
       );

     ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInVideoId;
     ipcBitsOutHostPrm.baseCreateParams.notifyNextLink           = FALSE;
     ipcBitsOutHostPrm.baseCreateParams.notifyPrevLink           = FALSE;
     ipcBitsOutHostPrm.baseCreateParams.noNotifyMode             = TRUE;

     ipcBitsOutHostPrm.baseCreateParams.numOutQue                = 1;
     ipcBitsOutHostPrm.inQueInfo.numCh                           = numDecChannel;

     for(i=0; i<ipcBitsOutHostPrm.inQueInfo.numCh; i++)
     {
      ipcBitsOutHostPrm.inQueInfo.chInfo[i].width  = 1280;
      ipcBitsOutHostPrm.inQueInfo.chInfo[i].height = 720;

      ipcBitsOutHostPrm.inQueInfo.chInfo[i].scanFormat = SYSTEM_SF_PROGRESSIVE;

      ipcBitsOutHostPrm.inQueInfo.chInfo[i].bufType        = 0; // NOT USED
      ipcBitsOutHostPrm.inQueInfo.chInfo[i].codingformat   = 0; // NOT USED
      ipcBitsOutHostPrm.inQueInfo.chInfo[i].dataFormat     = 0; // NOT USED
      ipcBitsOutHostPrm.inQueInfo.chInfo[i].memType        = 0; // NOT USED
      ipcBitsOutHostPrm.inQueInfo.chInfo[i].startX         = 0; // NOT USED
      ipcBitsOutHostPrm.inQueInfo.chInfo[i].startY         = 0; // NOT USED
      ipcBitsOutHostPrm.inQueInfo.chInfo[i].pitch[0]       = 0; // NOT USED
      ipcBitsOutHostPrm.inQueInfo.chInfo[i].pitch[1]       = 0; // NOT USED
      ipcBitsOutHostPrm.inQueInfo.chInfo[i].pitch[2]       = 0; // NOT USED
     }

     ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId    = ipcBitsOutHostId;
     ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
     ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink  = decId;
     ipcBitsInVideoPrm.baseCreateParams.noNotifyMode              = TRUE;
     ipcBitsInVideoPrm.baseCreateParams.notifyNextLink            = TRUE;
     ipcBitsInVideoPrm.baseCreateParams.notifyPrevLink            = FALSE;
     ipcBitsInVideoPrm.baseCreateParams.numOutQue                 = 1;

     for (i=0; i<numDecChannel; i++) {
      if(!strcasecmp(pChConf->Input[i].codec, "h264"))
      {
       decPrm.chCreateParams[i].format          = IVIDEO_H264HP;
       decPrm.chCreateParams[i].profile         = IH264VDEC_PROFILE_ANY;
      }
      else if(!strcasecmp(pChConf->Input[i].codec, "mpeg"))
      {
       decPrm.chCreateParams[i].format          = IVIDEO_MPEG4ASP;
       decPrm.chCreateParams[i].profile         = 0;
      }
      else if(!strcasecmp(pChConf->Input[i].codec, "jpeg"))
      {
       decPrm.chCreateParams[i].format          = IVIDEO_MJPEG;
       decPrm.chCreateParams[i].profile         = 0;
      }

      decPrm.chCreateParams[i].numBufPerCh = 6;
      decPrm.chCreateParams[i].targetMaxWidth  = 1280;
      decPrm.chCreateParams[i].targetMaxHeight = 720;
      decPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = 30;
      decPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = (2 * 1000 * 1000);
      decPrm.chCreateParams[i].tilerEnable     = TRUE; // If set this to FALSE, everything is ok. If TRUE, output images are all green.
     }
     decPrm.inQueParams.prevLinkId    = ipcBitsInVideoId;
     decPrm.inQueParams.prevLinkQueId = 0;
     decPrm.outQueParams.nextLink     = ipcOutVideoId;

     ipcOutVideoPrm.inQueParams.prevLinkId    = decId;
     ipcOutVideoPrm.inQueParams.prevLinkQueId = 0;
     ipcOutVideoPrm.numOutQue                 = 1;
     ipcOutVideoPrm.outQueParams[0].nextLink  = ipcInVpssId;
     ipcOutVideoPrm.notifyNextLink            = TRUE;
     ipcOutVideoPrm.notifyPrevLink            = TRUE;
     ipcOutVideoPrm.noNotifyMode              = FALSE;

     ipcInVpssPrm.inQueParams.prevLinkId      = ipcOutVideoId;
     ipcInVpssPrm.inQueParams.prevLinkQueId   = 0;
     ipcInVpssPrm.notifyNextLink              = TRUE;
     ipcInVpssPrm.notifyPrevLink              = TRUE;
     ipcInVpssPrm.noNotifyMode                = FALSE;

     ipcInVpssPrm.numOutQue                   = 1;
     ipcInVpssPrm.outQueParams[0].nextLink    = dupId[0];

     dupPrm[0].inQueParams.prevLinkId            = ipcInVpssId;
     dupPrm[0].inQueParams.prevLinkQueId         = 0;
     dupPrm[0].numOutQue                         = 3;
     dupPrm[0].outQueParams[0].nextLink          = deiId[0];
     dupPrm[0].outQueParams[1].nextLink          = deiId[1];
     dupPrm[0].outQueParams[2].nextLink          = deiId[2];
     dupPrm[0].notifyNextLink                    = TRUE;
       

     // Assign Resizer
     for(i=0;i<3;i++)
      SetDei(&deiPrm[i], i, dupId[0], i, merge420Id, merge422Id, pChConf);

     merge420Prm.numInQue = 3;
     merge422Prm.numInQue = 3;

     for(i=0;i<merge420Prm.numInQue;i++)
     {
      merge420Prm.inQueParams[i].prevLinkId        = deiId[i];
      merge420Prm.inQueParams[i].prevLinkQueId     = DEI_LINK_OUT_QUE_VIP_SC;
     }

     merge420Prm.outQueParams.nextLink          = mergeOutId;
     merge420Prm.notifyNextLink                 = TRUE;

     for(i=0;i<merge422Prm.numInQue;i++)
     {
      merge422Prm.inQueParams[i].prevLinkId      = deiId[i];
      merge422Prm.inQueParams[i].prevLinkQueId   = DEI_LINK_OUT_QUE_DEI_SC;
     }
     merge422Prm.outQueParams.nextLink          = nsfId[NSF_CONVERTER];
     merge422Prm.notifyNextLink                 = TRUE;

     // Change 422 to 420
     nsfPrm[NSF_CONVERTER].numBufsPerCh                     = 6;
     nsfPrm[NSF_CONVERTER].inQueParams.prevLinkId           = merge422Id;
     nsfPrm[NSF_CONVERTER].inQueParams.prevLinkQueId        = 0;
     nsfPrm[NSF_CONVERTER].bypassNsf                        = TRUE;
     nsfPrm[NSF_CONVERTER].tilerEnable                      = enableTiler;
     nsfPrm[NSF_CONVERTER].numOutQue                        = 1;
     nsfPrm[NSF_CONVERTER].outQueParams[0].nextLink         = mergeOutId;
     nsfPrm[NSF_CONVERTER].inputFrameRate = 30;
     nsfPrm[NSF_CONVERTER].outputFrameRate = 30;

     // Merge All
     mergeOutPrm.numInQue                     = 2;
     mergeOutPrm.inQueParams[0].prevLinkId    = merge420Id;
     mergeOutPrm.inQueParams[0].prevLinkQueId = 0;
     mergeOutPrm.inQueParams[1].prevLinkId    = nsfId[NSF_CONVERTER];
     mergeOutPrm.inQueParams[1].prevLinkQueId = 0;
     mergeOutPrm.outQueParams.nextLink        = ipcOutVpssId;
     mergeOutPrm.notifyNextLink               = TRUE;

     ipcOutVpssPrm.inQueParams.prevLinkId    = mergeOutId;
     ipcOutVpssPrm.inQueParams.prevLinkQueId = 0;
     ipcOutVpssPrm.numOutQue                 = 1;
     ipcOutVpssPrm.outQueParams[0].nextLink  = ipcInVideoId;
     ipcOutVpssPrm.notifyNextLink            = FALSE;
     ipcOutVpssPrm.notifyPrevLink            = TRUE;
     ipcOutVpssPrm.noNotifyMode              = TRUE;

     ipcInVideoPrm.inQueParams.prevLinkId    = ipcOutVpssId;
     ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
     ipcInVideoPrm.numOutQue                 = 1;
     ipcInVideoPrm.outQueParams[0].nextLink  = encId;
     ipcInVideoPrm.notifyNextLink            = TRUE;
     ipcInVideoPrm.notifyPrevLink            = FALSE;
     ipcInVideoPrm.noNotifyMode              = TRUE;

     encPrm.numBufPerCh[0] = 4;
     encPrm.numBufPerCh[1] = 4;
     encPrm.numBufPerCh[2] = 4;
     encPrm.numBufPerCh[3] = 4;

     for (i=0; i<numEncChannel;i++) {
      if(pChConf->EncSet[i].profile==0) // BASELINE
      {
       encPrm.chCreateParams[i].format     = IVIDEO_H264BP;
       encPrm.chCreateParams[i].profile    = IH264_BASELINE_PROFILE;
      }
      else if(pChConf->EncSet[i].profile==1) // Main
      {
       encPrm.chCreateParams[i].format     = IVIDEO_H264MP;
       encPrm.chCreateParams[i].profile    = IH264_MAIN_PROFILE;
      }
      else
      {
       encPrm.chCreateParams[i].format     = IVIDEO_H264HP;
       encPrm.chCreateParams[i].profile    = IH264_HIGH_PROFILE;
      }

      encPrm.chCreateParams[i].dataLayout = IVIDEO_FIELD_SEPARATED;
      encPrm.chCreateParams[i].fieldMergeEncodeEnable  = FALSE;
      encPrm.chCreateParams[i].encodingPreset = XDM_USER_DEFINED;
      encPrm.chCreateParams[i].maxBitRate = -1;
      encPrm.chCreateParams[i].enableAnalyticinfo = pChConf->EncSet[i].enable_motion;
      encPrm.chCreateParams[i].rateControlPreset = IH264_RATECONTROL_PRC_LOW_DELAY;
      encPrm.chCreateParams[i].defaultDynamicParams.inputFrameRate = 30;
      if(pChConf->EncSet[i].gop)
       encPrm.chCreateParams[i].defaultDynamicParams.intraFrameInterval = pChConf->EncSet[i].gop;
      else
       encPrm.chCreateParams[i].defaultDynamicParams.intraFrameInterval = 30;
      if(pChConf->EncSet[i].bps)
       encPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = pChConf->EncSet[i].bps;
      else
       encPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = 2*1000*1000;

      encPrm.chCreateParams[i].defaultDynamicParams.interFrameInterval = 1;
      encPrm.chCreateParams[i].defaultDynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;

      encPrm.chCreateParams[i].defaultDynamicParams.rcAlg          = IH264_RATECONTROL_PRC_LOW_DELAY;
      encPrm.chCreateParams[i].defaultDynamicParams.qpMin          = 10;
      encPrm.chCreateParams[i].defaultDynamicParams.qpMax          = 40;
      encPrm.chCreateParams[i].defaultDynamicParams.qpInit         = -1;
      encPrm.chCreateParams[i].defaultDynamicParams.vbrDuration    = 8;
      encPrm.chCreateParams[i].defaultDynamicParams.vbrSensitivity = 0;
     }
     encPrm.inQueParams.prevLinkId   = ipcInVideoId;
     encPrm.inQueParams.prevLinkQueId= 0;
     encPrm.outQueParams.nextLink = ipcBitsOutVideoId;

     ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = encId;
     ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
     ipcBitsOutVideoPrm.baseCreateParams.numOutQue                 = 1;
     ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInHostId;

     Chains_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutVideoPrm, TRUE);

     ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId = ipcBitsOutVideoId;
     ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
     Chains_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm);

     System_linkCreate(ipcBitsOutHostId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm));

     System_linkCreate(ipcBitsInVideoId,&ipcBitsInVideoPrm,sizeof(ipcBitsInVideoPrm));

     System_linkCreate(decId, &decPrm, sizeof(decPrm));


     System_linkCreate(ipcOutVideoId, &ipcOutVideoPrm, sizeof(ipcOutVideoPrm));
     System_linkCreate(ipcInVpssId  , &ipcInVpssPrm  , sizeof(ipcInVpssPrm)  );

     for(i=0;i<numDuplicator;i++)
      System_linkCreate(dupId[i]  , &dupPrm[i]    , sizeof(dupPrm[i]));

     for(i=0;i<numResizer;i++)
      System_linkCreate(deiId[i], &deiPrm[i], sizeof(deiPrm[i]));

     System_linkCreate(merge420Id   , &merge420Prm  , sizeof(merge420Prm));
     System_linkCreate(merge422Id   , &merge422Prm  , sizeof(merge422Prm));
     System_linkCreate(nsfId[NSF_CONVERTER]     , &nsfPrm[NSF_CONVERTER]       , sizeof(nsfPrm[NSF_CONVERTER]));
     System_linkCreate(mergeOutId   , &mergeOutPrm  , sizeof(mergeOutPrm));
     System_linkCreate(ipcOutVpssId , &ipcOutVpssPrm , sizeof(ipcOutVpssPrm) );
     System_linkCreate(ipcInVideoId , &ipcInVideoPrm , sizeof(ipcInVideoPrm) );

     System_linkCreate(encId, &encPrm, sizeof(encPrm));
     System_linkCreate(ipcBitsOutVideoId, &ipcBitsOutVideoPrm, sizeof(ipcBitsOutVideoPrm));
     System_linkCreate(ipcBitsInHostId, &ipcBitsInHostPrm, sizeof(ipcBitsInHostPrm));

     Chains_memPrintHeapStatus();

     System_linkStart(encId);
     System_linkStart(nsfId[NSF_CONVERTER]);
     
     for(i=0;i<numResizer;i++)
      System_linkStart(deiId[i]);

     System_linkStart(decId);
     System_linkStart(ipcBitsInVideoId);
     System_linkStart(ipcBitsOutHostId);

     

    Void SetDei(DeiLink_CreateParams* prm, UInt32 i, UInt32 prevLinkId, UInt32 prevLinkQueId, UInt32 merge420Id, UInt32 merge422Id, INOUT_CONF *pChConf)
    {
     DeiLink_CreateParams_Init(prm);
     Int32 ch;
     prm->inQueParams.prevLinkId    = prevLinkId;
     prm->inQueParams.prevLinkQueId = prevLinkQueId;
     prm->comprEnable               = FALSE;
     prm->setVipScYuv422Format      = FALSE;
     prm->enableDeiForceBypass      = TRUE;

     if(pChConf->Output[i].scaleMode==DEI_SCALE_MODE_RATIO)
     {
      // 420 OUT
      prm->inputFrameRate[DEI_LINK_OUT_QUE_VIP_SC] = 30;
      prm->outputFrameRate[DEI_LINK_OUT_QUE_VIP_SC] = 30;

      for(ch=0;ch<DEI_LINK_MAX_CH;ch++)
      {
       prm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][ch].scaleMode = DEI_SCALE_MODE_RATIO;
       prm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][ch].ratio.widthRatio.numerator    = pChConf->Output[i].scaleFactor[0].widthRatio.numerator;
       prm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][ch].ratio.widthRatio.denominator  = pChConf->Output[i].scaleFactor[0].widthRatio.denominator;
       prm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][ch].ratio.heightRatio.numerator   = pChConf->Output[i].scaleFactor[0].heightRatio.numerator;
       prm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][ch].ratio.heightRatio.denominator = pChConf->Output[i].scaleFactor[0].heightRatio.denominator;
      }

      prm->outQueParams[DEI_LINK_OUT_QUE_VIP_SC].nextLink = merge420Id;
      prm->enableOut[DEI_LINK_OUT_QUE_VIP_SC]            = TRUE;
      prm->tilerEnable[DEI_LINK_OUT_QUE_VIP_SC]          = TRUE;
      prm->generateBlankOut[DEI_LINK_OUT_QUE_VIP_SC]     = FALSE;

      // 422 OUT
      prm->inputFrameRate[DEI_LINK_OUT_QUE_DEI_SC] = 30;
      prm->outputFrameRate[DEI_LINK_OUT_QUE_DEI_SC] = 30;
      for(ch=0;ch<DEI_LINK_MAX_CH;ch++)
      {
       prm->outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][ch].scaleMode = DEI_SCALE_MODE_RATIO;
       prm->outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][ch].ratio.widthRatio.numerator    = pChConf->Output[i].scaleFactor[1].widthRatio.numerator;
       prm->outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][ch].ratio.widthRatio.denominator  = pChConf->Output[i].scaleFactor[1].widthRatio.denominator;
       prm->outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][ch].ratio.heightRatio.numerator   = pChConf->Output[i].scaleFactor[1].heightRatio.numerator;
       prm->outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][ch].ratio.heightRatio.denominator = pChConf->Output[i].scaleFactor[1].heightRatio.denominator;
      }
      prm->outQueParams[DEI_LINK_OUT_QUE_DEI_SC].nextLink = merge422Id;
      prm->enableOut[DEI_LINK_OUT_QUE_DEI_SC]            = TRUE;
      prm->tilerEnable[DEI_LINK_OUT_QUE_DEI_SC]          = TRUE;
      prm->generateBlankOut[DEI_LINK_OUT_QUE_DEI_SC]     = FALSE;

      prm->enableOut[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT] = FALSE;
      prm->enableOut[DEI_LINK_OUT_QUE_DEI_SC_SECONDARY_OUT] = FALSE;
      prm->enableOut[DEI_LINK_OUT_QUE_DEI_SC_TERTIARY_OUT]  = FALSE;
     }
     else
     {
      prm->inputFrameRate[DEI_LINK_OUT_QUE_VIP_SC] = 30;
      prm->outputFrameRate[DEI_LINK_OUT_QUE_VIP_SC] = 30;
      for(ch=0;ch<DEI_LINK_MAX_CH;ch++)
      {
       prm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][ch].scaleMode = DEI_SCALE_MODE_ABSOLUTE;
       prm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][ch].absoluteResolution.outWidth   = pChConf->Output[i].scaleFactor[0].outWidth;
       prm->outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][ch].absoluteResolution.outHeight  = pChConf->Output[i].scaleFactor[0].outHeight;
      }
      prm->outQueParams[DEI_LINK_OUT_QUE_VIP_SC].nextLink = merge420Id;
      prm->enableOut[DEI_LINK_OUT_QUE_VIP_SC]            = TRUE;
      prm->tilerEnable[DEI_LINK_OUT_QUE_VIP_SC]          = TRUE;
      prm->generateBlankOut[DEI_LINK_OUT_QUE_VIP_SC]     = FALSE;

      prm->inputFrameRate[DEI_LINK_OUT_QUE_DEI_SC] = 30;
      prm->outputFrameRate[DEI_LINK_OUT_QUE_DEI_SC] = 30;
      for(ch=0;ch<DEI_LINK_MAX_CH;ch++)
      {
       prm->outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][ch].scaleMode = DEI_SCALE_MODE_ABSOLUTE;
       prm->outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][ch].absoluteResolution.outWidth   = pChConf->Output[i].scaleFactor[1].outWidth;
       prm->outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][ch].absoluteResolution.outHeight  = pChConf->Output[i].scaleFactor[1].outHeight;
      }
      prm->outQueParams[DEI_LINK_OUT_QUE_DEI_SC].nextLink = merge422Id;
      prm->enableOut[DEI_LINK_OUT_QUE_DEI_SC]            = TRUE;
      prm->tilerEnable[DEI_LINK_OUT_QUE_DEI_SC]          = TRUE;
      prm->generateBlankOut[DEI_LINK_OUT_QUE_DEI_SC]     = FALSE;

      prm->enableOut[DEI_LINK_OUT_QUE_VIP_SC_SECONDARY_OUT] = FALSE;
      prm->enableOut[DEI_LINK_OUT_QUE_DEI_SC_SECONDARY_OUT] = FALSE;
      prm->enableOut[DEI_LINK_OUT_QUE_DEI_SC_TERTIARY_OUT]  = FALSE;
     }
    }

     

  • Your usecase looks correct. I think there is a bug in decLink where the memType (Tiler/non-tiled) is not being populated correctly by decLink.

    Can you try modifying as below (new code in bold) and check if the green screen issue is resolved:Note that change below is for h264. Same change should be done for mpeg4 and mjpeg if you have tiler enabled for those codecs as well.

    /dvr_rdk/mcfw/src_bios6/links_m3video/iva_dec/decLink_h264.c

    {
                            UTILS_assert(pFrameInfo != NULL);
                            pFrameInfo->rtChInfo.width =
                                displayBufs->activeFrameRegion.bottomRight.x -
                                displayBufs->activeFrameRegion.topLeft.x;
                            pFrameInfo->rtChInfo.height =
                                displayBufs->activeFrameRegion.bottomRight.y -
                                displayBufs->activeFrameRegion.topLeft.y;
                            pFrameInfo->rtChInfo.pitch[0] = displayBufs->imagePitch[0];
                            pFrameInfo->rtChInfo.pitch[1] = displayBufs->imagePitch[1];
                            pFrameInfo->rtChInfo.startX =
                                displayBufs->activeFrameRegion.topLeft.x;
                            pFrameInfo->rtChInfo.startY =
                                displayBufs->activeFrameRegion.topLeft.y;
                            pFrameInfo->isDataTypeChange = TRUE;
                            if (pChObj->algObj.algCreateParams.tilerEnable)
                            {
                                pFrameInfo->rtChInfo.memType = VPS_VPDMA_MT_TILEDMEM;
                            }
                            else
                            {
                                pFrameInfo->rtChInfo.memType = VPS_VPDMA_MT_NONTILEDMEM;
                            }
                            pFrameInfo->rtChInfoUpdate = TRUE;
                        } 

  • After applying this modification, everything is OK.

    Thanks.