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.

DM8127创建deiLink失败:pObj->fvidHandle != NULL : failed !!!

Other Parts Discussed in Thread: TVP5150

DM8127创建deiLink失败,串口输出报错如下:

 [m3vpss ]  11426: DEI    : Create in progress !!!
 [m3vpss ]  11443: DEI: OUT1:  0: 0xb8a70480, 720 x 480, 4 frames
 [m3vpss ]  11444: Assertion @ Line: 778 in links_m3vpss/dei/deiLink_drv.c: pObj->fvidHandle != NULL : failed !!!

开发包为ipnc-rdk3.5,usecase关键代码如下:

UInt32 gCaptureId;
UInt32 gDupId;
UInt32 gIpcOutVpssId;
UInt32 gIpcInVideoId;
UInt32 gEncId;
UInt32 gIpcBitsOutVideoId;
UInt32 gIpcBitsInHLOSId;
UInt32 gIpcBitsOutHLOSId;
UInt32 gIpcBitsInVideoId;
UInt32 gDecId;
UInt32 gIpcOutVideoId;
UInt32 gIpcFramesInHLOSId;
UInt32 gIpcFramesOutVpssToHostId;
UInt32 gVpssNullId;
UInt32 gHostNullId;
UInt32 gDeiId;

UInt32 gIpcFramesOutHostId;
UInt32 gIpcFramesInVpssFromHostId;

Void MultiCh_createEncA8Dec()
{
    OSA_printf("\n********** ENC A8 DEC USE CASE ********\n");
    OSA_printf("\n********* Entered Encode + Decode usecase - H264 1080p @30fps Encode + H264 1080p @30fps Decode ********\n");

    //*******  Link_CreateParams  ************************************************************//
    UInt32 i;
    Int32 status;

    CaptureLink_CreateParams        capturePrm;
    DeiLink_CreateParams deiPrm;

    IpcFramesOutLinkRTOS_CreateParams  ipcFramesOutVpssToHostPrm;
    IpcFramesInLinkHLOS_CreateParams   ipcFramesInHostPrm;
    IpcFramesOutLinkHLOS_CreateParams  ipcFramesOutHostPrm;
    IpcFramesInLinkRTOS_CreateParams   ipcFramesInVpssFromHostPrm;

    NullLink_CreateParams vpssNullPrm;
    NullLink_CreateParams hostNullPrm;

    MULTICH_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams ,ipcFramesOutVpssToHostPrm);
    MULTICH_INIT_STRUCT(DeiLink_CreateParams, deiPrm);
    MULTICH_INIT_STRUCT(IpcFramesInLinkHLOS_CreateParams  ,ipcFramesInHostPrm);
    MULTICH_INIT_STRUCT(IpcFramesOutLinkHLOS_CreateParams ,ipcFramesOutHostPrm);
    MULTICH_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams  ,ipcFramesInVpssFromHostPrm);

    //*******  Link IDs  ********************************************************************//
    /* Link IDs */
    gCaptureId                = SYSTEM_LINK_ID_CAPTURE;
    gDupId                    = SYSTEM_VPSS_LINK_ID_DUP_0;
    gIpcFramesOutVpssToHostId = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_OUT_1;
    gIpcFramesInHLOSId        = SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0;
    gVpssNullId               = SYSTEM_VPSS_LINK_ID_NULL_0;
    gHostNullId               = SYSTEM_LINK_ID_NULL_0;
    gDeiId              = SYSTEM_LINK_ID_DEI_0;

    gIpcFramesOutHostId          = SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0;
    gIpcFramesInVpssFromHostId = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_IN_0;

    gVcapModuleContext.captureId                = gCaptureId;
    gVcapModuleContext.ipcFramesOutVpssToHostId = gIpcFramesOutVpssToHostId;
    gVcapModuleContext.ipcFramesInHostId        = gIpcFramesInHLOSId;

    //*******  IPC Bits &  DMA  ******************************************************//
    /* Semaphore for IPC Bits */
    OSA_semCreate(&gIpcBitsNotifySem,1,0);

    /* IPC Bits handling thread */
    OSA_thrCreate(&gIpcBitsThObj.hndl,                   // hndl
                  MultiCh_ipcBitsMain,                   // entryFunc
                  IPC_BITS_TSK_PRI,                      // pri
                  IPC_BITS_TSK_STACK_SIZE,               // stackSize
                  NULL);                                 // prm

    /* DMA for memcpy */
    status = OSA_dmaInit();
    if(status == 0)
    {
        status = OSA_dmaOpen(&gDmaHndl,OSA_DMA_MODE_NORMAL,1);
        if (status != 0)
        {
            OSA_printf("%s:OSA_dmaOpen failed - %d\n", __func__, status);
            gDmaHndl.chId = 0xFF;
        }
        else
        {
            OSA_printf("%s:OSA_dmaOpen passed with ch id = %d\n", __func__,gDmaHndl.chId);
        }
    }
    else
    {
        OSA_printf("%s:OSA_dmaInit failed - %d\n", __func__, status);
        gDmaHndl.chId = 0xFF;
    }


    //*******  M3VPSS & M3VIDEO init  **********************************************************//
    MultiCh_detectBoard();

    System_linkControl(SYSTEM_LINK_ID_M3VPSS,
                       SYSTEM_M3VPSS_CMD_RESET_VIDEO_DEVICES, NULL, 0, TRUE);

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


    //*******  capture decoder & link  ************************************************************//
    /* video decoder */
    VCAP_VIDDEC_PARAMS_S modeParams;
    UInt32 numDevices = 1;
    //******no use*************//
    modeParams.videoIfMode = DEVICE_CAPT_VIDEO_IF_MODE_8BIT;
    modeParams.videoDataFormat= SYSTEM_DF_YUV422P;
    modeParams.standard = SYSTEM_STD_D1;
    modeParams.videoCaptureMode = DEVICE_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_EMBEDDED_SYNC;
    modeParams.videoSystem = DEVICE_VIDEO_DECODER_VIDEO_SYSTEM_AUTO_DETECT;
    modeParams.videoAutoDetectTimeout = -1;
    modeParams.videoCropEnable = FALSE;

    OSA_printf("\n********* ----------Config Video Decoder------- ********\n\n");
    Vcap_configVideoDecoder(&modeParams, numDevices);


    /* capture link */
    CaptureLink_CreateParams_Init(&capturePrm);
    capturePrm.numVipInst = 1;
    capturePrm.tilerEnable = FALSE;
    capturePrm.enableSdCrop = FALSE;
    capturePrm.numBufsPerCh = 6;
    capturePrm.numExtraBufs = 0;
    capturePrm.fakeHdMode = FALSE;
    capturePrm.doCropInCapture = FALSE;
    OSA_printf("capturePrm.isPalMode = %d \n", capturePrm.isPalMode);
    capturePrm.isPalMode = Vcap_isPalMode();
    OSA_printf("capturePrm.isPalMode = %d \n", capturePrm.isPalMode);    
    
    CaptureLink_VipInstParams *pCaptureInstPrm;
    CaptureLink_OutParams       *pCaptureOutPrm;
    for(i=0; i<capturePrm.numVipInst; i++)
    {
    pCaptureInstPrm = &capturePrm.vipInst[i];////
    pCaptureInstPrm->vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTA;

    pCaptureInstPrm->videoDecoderId = SYSTEM_DEVICE_VID_DEC_TVP5150_DRV;

    pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P;
    pCaptureInstPrm->standard           = SYSTEM_STD_D1;
    pCaptureInstPrm->numOutput = 1;

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

   }//for(i=0; i<capturePrm.numVipInst; i++)

#ifdef YUV_FRAMES_TO_A8_ENCDEC

    /* Dei link params *///dei
    #if 1
        DeiLink_CreateParams_Init(&deiPrm);

        deiPrm.enableOut[0] = TRUE;
        deiPrm.tilerEnable = FALSE;
        deiPrm.comprEnable = FALSE;
        deiPrm.setVipScYuv422Format = FALSE;
        deiPrm.enableDeiForceBypass  = FALSE;
        deiPrm.inputDeiFrameRate = 50u;
        deiPrm.outputDeiFrameRate = 50u;

        deiPrm.outScaleFactor[0][0].scaleMode = DEI_SCALE_MODE_RATIO;
        deiPrm.outScaleFactor[0][0].ratio.widthRatio.numerator = 1;
        deiPrm.outScaleFactor[0][0].ratio.widthRatio.denominator = 1;
        deiPrm.outScaleFactor[0][0].ratio.heightRatio.numerator = 1;
        deiPrm.outScaleFactor[0][0].ratio.heightRatio.denominator = 1;
        Int32 chId;
        for (chId=1; chId < DEI_LINK_MAX_CH; chId++)
            deiPrm.outScaleFactor[0][chId] = deiPrm.outScaleFactor[0][0];
    #endif

    /* Set ipcFramesOutVpss link info */
    #if 1
    //ipcFramesOutVpssToHostPrm.baseCreateParams.noNotifyMode = FALSE;
    ipcFramesOutVpssToHostPrm.baseCreateParams.noNotifyMode = TRUE;
    ipcFramesOutVpssToHostPrm.baseCreateParams.notifyNextLink = FALSE;
    ipcFramesOutVpssToHostPrm.baseCreateParams.notifyPrevLink = TRUE;
    ipcFramesOutVpssToHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    #endif

    /* Set ipcFramesOutVpss & null link info */
    #if 1
    ipcFramesInHostPrm.baseCreateParams.noNotifyMode = TRUE;
    ipcFramesInHostPrm.baseCreateParams.notifyNextLink = FALSE;
    ipcFramesInHostPrm.baseCreateParams.notifyPrevLink = FALSE;
    ipcFramesInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    ipcFramesInHostPrm.exportOnlyPhyAddr = TRUE;
    ipcFramesInHostPrm.cbCtx = &gVcapModuleContext;
    ipcFramesInHostPrm.cbFxn = Vcap_ipcFramesInCbFxn;

        hostNullPrm.numInQue = 1;
        hostNullPrm.inQueParams[0].prevLinkQueId = 0;
    #endif

    /* Set ipcFramesOutHost & ipcFramesInVpssFromHost */
    #if 1
    ipcFramesOutHostPrm.baseCreateParams.noNotifyMode = TRUE;
    ipcFramesOutHostPrm.baseCreateParams.notifyNextLink = FALSE;
    ipcFramesOutHostPrm.baseCreateParams.notifyPrevLink = FALSE;
    ipcFramesOutHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;

    ipcFramesInVpssFromHostPrm.baseCreateParams.noNotifyMode = TRUE;
    ipcFramesInVpssFromHostPrm.baseCreateParams.notifyNextLink = TRUE;
    ipcFramesInVpssFromHostPrm.baseCreateParams.notifyPrevLink = FALSE;
    ipcFramesInVpssFromHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    #endif

    /* Set chain */
    #if 1
        capturePrm.outQueParams[0].nextLink = gDeiId;
        deiPrm.inQueParams.prevLinkId = gCaptureId;
        deiPrm.outQueParams[0].nextLink = gIpcFramesOutVpssToHostId;
        ipcFramesOutVpssToHostPrm.baseCreateParams.inQueParams.prevLinkId = gDeiId;
        ipcFramesOutVpssToHostPrm.baseCreateParams.outQueParams[0].nextLink = gVcapModuleContext.ipcFramesInHostId;
        ipcFramesInHostPrm.baseCreateParams.inQueParams.prevLinkId = gVcapModuleContext.ipcFramesOutVpssToHostId;
        ipcFramesInHostPrm.baseCreateParams.outQueParams[0].nextLink = gHostNullId;
        hostNullPrm.inQueParams[0].prevLinkId = gVcapModuleContext.ipcFramesInHostId;
    #endif

#endif

    //*******  link create  ************************************************************//
    System_linkCreate(gCaptureId,&capturePrm,sizeof(CaptureLink_CreateParams));
    System_linkControl(gCaptureId,CAPTURE_LINK_CMD_DETECT_VIDEO,NULL,0,TRUE);

    System_linkCreate(gDupId,&dupPrm,sizeof(DupLink_CreateParams));

#ifdef YUV_FRAMES_TO_A8_ENCDEC

    System_linkCreate(gDeiId, &deiPrm, sizeof(DeiLink_CreateParams));

    OSA_printf("YUV_FRAMES_TO_A8_ENCDEC: before ipcFramesOutVpssToHost linkCreate ... \n\n");
    System_linkCreate(gVcapModuleContext.ipcFramesOutVpssToHostId, &ipcFramesOutVpssToHostPrm, sizeof(ipcFramesOutVpssToHostPrm));

    OSA_printf("YUV_FRAMES_TO_A8_ENCDEC: before ipcFramesInHostPrm linkCreate ... \n\n");
    System_linkCreate(gVcapModuleContext.ipcFramesInHostId, &ipcFramesInHostPrm, sizeof(ipcFramesInHostPrm));
    
    OSA_printf("YUV_FRAMES_TO_A8_ENCDEC: before framesProducerLinkInfo ... \n\n");    
    System_LinkInfo framesProducerLinkInfo;
    System_linkGetInfo(gVcapModuleContext.ipcFramesInHostId,&framesProducerLinkInfo);
    OSA_assert(framesProducerLinkInfo.numQue == 1);

#endif


    System_linkCreate(gVpssNullId, &vpssNullPrm, sizeof(vpssNullPrm));
    System_linkCreate(gHostNullId, &hostNullPrm, sizeof(hostNullPrm));               

    OSA_printf("USECASE SETUP DONE\n");
}

为什么deiLink会创建不成功能?哪里的参数设置有问题吗?

  • 补充一下:上述的chain,在不加入dei之前是可以成功收到视频数据的
  • 你好,

    你创建的DEI LINK使用的是哪个SC,是否和现有的use case使用的SC有冲突?或者的是数据通路是否有冲突?

    为什么要使用DEI link呢?你的输入是隔行的?

  • 谢谢您的回复!

    输入是tvp5150的解码信号,是隔行的,后来查到是deiLink的ID弄错了,两个地方赋值,最后的值为SYSTEM_LINK_ID_DEI_HQ_0,改为

    SYSTEM_LINK_ID_DEI_0就可以了。