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.

DM8148 IPNC3.8 LinkApi M3解码后传回Host端的问题



我想将视频解码后的帧数据传回到A8,然后保存为jpg图像(为了实现一个截图功能);

但是在创建穿回到Host的LinkId: SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0 时触发了SIGFPE异常。

有人知道应该怎么修改LinkChain,或者其他的截图方法吗?

以下是我创建LingChain的代码:

void mcfw_mp4_dec_dis_chain_crate()
{
    /* link used */
    gVdecModuleContext.ipcBitsOutHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
    gVdecModuleContext.ipcBitsInRTOSId  = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;
    gVdecModuleContext.decId            = SYSTEM_LINK_ID_VDEC_0;

    gMultiCh_VdecVdisObj.videoDupId     = SYSTEM_VIDEO_LINK_ID_DUP_0;
    gMultiCh_VdecVdisObj.ipcOutVideo2VpssId  = SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0;
    gMultiCh_VdecVdisObj.ipcOutVideo2HostId  = SYSTEM_VIDEO_LINK_ID_IPC_FRAMES_OUT_0;
    gMultiCh_VdecVdisObj.ipcInVpssId    = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0;
    gMultiCh_VdecVdisObj.ipcInHostId    = SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0;

    gVdisModuleContext.swMsId[0]        = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;
    gVdisModuleContext.displayId[0]     = SYSTEM_LINK_ID_DISPLAY_0; // ON AND OFF CHIP HDMI

    /* init link params */
    IpcBitsOutLinkHLOS_CreateParams     ipcBitsOutHostPrm;
    IpcBitsInLinkRTOS_CreateParams      ipcBitsInVideoPrm;
    DecLink_CreateParams                decPrm;

    DupLink_CreateParams                videoDupPrm;
    IpcFramesOutLinkRTOS_CreateParams   ipcOutVideo2VpssPrm;
    IpcFramesOutLinkRTOS_CreateParams   ipcOutVideo2HostPrm;
    IpcFramesInLinkRTOS_CreateParams    ipcInVpssPrm;
    IpcFramesInLinkHLOS_CreateParams    ipcFramesInHostPrm;

    SwMsLink_CreateParams               swMsPrm[VDIS_DEV_MAX];
    DisplayLink_CreateParams            displayPrm[VDIS_DEV_MAX];

    UInt32 i;

    MULTICH_INIT_STRUCT(IpcBitsOutLinkHLOS_CreateParams,ipcBitsOutHostPrm);
    MULTICH_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams,ipcBitsInVideoPrm);
    MULTICH_INIT_STRUCT(DecLink_CreateParams, decPrm);

    MULTICH_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams,ipcOutVideo2VpssPrm);
    MULTICH_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams,ipcOutVideo2HostPrm);
    MULTICH_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams,ipcInVpssPrm);
    MULTICH_INIT_STRUCT(IpcFramesInLinkHLOS_CreateParams,ipcFramesInHostPrm);

    for (i = 0; i < VDIS_DEV_MAX; ++i)
    {
        MULTICH_INIT_STRUCT(DisplayLink_CreateParams,displayPrm[i]);
        MULTICH_INIT_STRUCT(SwMsLink_CreateParams ,swMsPrm[i]);
    }

    /* ipc bits out host link */
    ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink= gVdecModuleContext.ipcBitsInRTOSId;
    ipcBitsOutHostPrm.baseCreateParams.notifyNextLink       = FALSE;
    ipcBitsOutHostPrm.baseCreateParams.notifyPrevLink       = FALSE;
    ipcBitsOutHostPrm.baseCreateParams.noNotifyMode         = TRUE;
    ipcBitsOutHostPrm.baseCreateParams.numOutQue            = 1;
    ipcBitsOutHostPrm.inQueInfo.numCh                       = gVdecModuleContext.vdecConfig.numChn;

    for (i=0; i<ipcBitsOutHostPrm.inQueInfo.numCh; i++)
    {
        ipcBitsOutHostPrm.inQueInfo.chInfo[i].width = gVdecModuleContext.vdecConfig.decChannelParams[i].maxVideoWidth;

        ipcBitsOutHostPrm.inQueInfo.chInfo[i].height = gVdecModuleContext.vdecConfig.decChannelParams[i].maxVideoHeight;

        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

//        ipcBitsOutHostPrm.maxQueueDepth[i] = MAX_BUFFERING_QUEUE_LEN_PER_CH;
//        ipcBitsOutHostPrm.chMaxReqBufSize[i] = (ipcBitsOutHostPrm.inQueInfo.chInfo[i].width * ipcBitsOutHostPrm.inQueInfo.chInfo[i].height);
//        ipcBitsOutHostPrm.totalBitStreamBufferSize [i] = (ipcBitsOutHostPrm.chMaxReqBufSize[i] * BIT_BUF_LENGTH_LIMIT_FACTOR_HD);
    }

    /* ipc bits in video link */
    ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId    = gVdecModuleContext.ipcBitsOutHLOSId;
    ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink  = gVdecModuleContext.decId;
    ipcBitsInVideoPrm.baseCreateParams.noNotifyMode              = TRUE;
    ipcBitsInVideoPrm.baseCreateParams.notifyNextLink            = TRUE;
    ipcBitsInVideoPrm.baseCreateParams.notifyPrevLink            = FALSE;
    ipcBitsInVideoPrm.baseCreateParams.numOutQue                 = 1;

    /* decode link */
    for (i=0; i<ipcBitsOutHostPrm.inQueInfo.numCh; i++)
    {
        if(gVdecModuleContext.vdecConfig.decChannelParams[i].isCodec == VDEC_CHN_H264)
            decPrm.chCreateParams[i].format = IVIDEO_H264HP;
        else if(gVdecModuleContext.vdecConfig.decChannelParams[i].isCodec == VDEC_CHN_MPEG4)
            decPrm.chCreateParams[i].format = IVIDEO_MPEG4ASP;
        else if(gVdecModuleContext.vdecConfig.decChannelParams[i].isCodec == VDEC_CHN_MJPEG)
            decPrm.chCreateParams[i].format = IVIDEO_MJPEG;
//        else if(gVdecModuleContext.vdecConfig.decChannelParams[i].isCodec == VDEC_CHN_MPEG2)
//            decPrm.chCreateParams[i].format = IVIDEO_MPEG2HP;

        decPrm.chCreateParams[i].numBufPerCh = gVdecModuleContext.vdecConfig.decChannelParams[i].numBufPerCh;
        decPrm.chCreateParams[i].profile = IH264VDEC_PROFILE_ANY;
        decPrm.chCreateParams[i].displayDelay = gVdecModuleContext.vdecConfig.decChannelParams[i].displayDelay;
        decPrm.chCreateParams[i].dpbBufSizeInFrames = IH264VDEC_DPB_NUMFRAMES_AUTO;
//        if (gVdecModuleContext.vdecConfig.decChannelParams[i].fieldPicture) {
//            OSA_printf("MULTICH_VDEC_VDIS:INFO ChId[%d] configured for field picture\n",i);
//            decPrm.chCreateParams[i].processCallLevel   = VDEC_FIELDLEVELPROCESSCALL;
//        }
//        else {
//            decPrm.chCreateParams[i].processCallLevel   = VDEC_FRAMELEVELPROCESSCALL;
//        }
        decPrm.chCreateParams[i].targetMaxWidth  = ipcBitsOutHostPrm.inQueInfo.chInfo[i].width;
        decPrm.chCreateParams[i].targetMaxHeight = ipcBitsOutHostPrm.inQueInfo.chInfo[i].height;
        decPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = gVdecModuleContext.vdecConfig.decChannelParams[i].dynamicParam.frameRate;
        decPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = gVdecModuleContext.vdecConfig.decChannelParams[i].dynamicParam.targetBitRate;
//        decPrm.chCreateParams[i].tilerEnable = FALSE;
//        decPrm.chCreateParams[i].enableWaterMarking = gVdecModuleContext.vdecConfig.decChannelParams[i].enableWaterMarking;
    }

    decPrm.inQueParams.prevLinkId       = gVdecModuleContext.ipcBitsInRTOSId;
    decPrm.inQueParams.prevLinkQueId    = 0;
    decPrm.outQueParams.nextLink        = gMultiCh_VdecVdisObj.videoDupId;

    videoDupPrm.inQueParams.prevLinkId = gVdecModuleContext.decId;
    videoDupPrm.inQueParams.prevLinkQueId = 0;
    videoDupPrm.notifyNextLink = TRUE;
    videoDupPrm.numOutQue = 2;
    videoDupPrm.outQueParams[0].nextLink = gMultiCh_VdecVdisObj.ipcOutVideo2VpssId;
    videoDupPrm.outQueParams[1].nextLink = gMultiCh_VdecVdisObj.ipcOutVideo2HostId;

    /* ipc out video link */
    ipcOutVideo2VpssPrm.baseCreateParams.inQueParams.prevLinkId    = gMultiCh_VdecVdisObj.videoDupId;
    ipcOutVideo2VpssPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    ipcOutVideo2VpssPrm.baseCreateParams.outQueParams[0].nextLink  = gMultiCh_VdecVdisObj.ipcInVpssId;
    ipcOutVideo2VpssPrm.baseCreateParams.notifyNextLink            = TRUE;
    ipcOutVideo2VpssPrm.baseCreateParams.notifyPrevLink            = TRUE;
    ipcOutVideo2VpssPrm.baseCreateParams.numOutQue                 = 1;

    /* ipc out video link */
    ipcOutVideo2HostPrm.baseCreateParams.inQueParams.prevLinkId    = gMultiCh_VdecVdisObj.videoDupId;
    ipcOutVideo2HostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    ipcOutVideo2HostPrm.baseCreateParams.outQueParams[0].nextLink  = gMultiCh_VdecVdisObj.ipcInHostId;
    ipcOutVideo2HostPrm.baseCreateParams.notifyNextLink            = TRUE;
    ipcOutVideo2HostPrm.baseCreateParams.notifyPrevLink            = TRUE;
    ipcOutVideo2HostPrm.baseCreateParams.numOutQue                 = 1;

    /* ipc in vpss link */
    ipcInVpssPrm.baseCreateParams.inQueParams.prevLinkId    = gMultiCh_VdecVdisObj.ipcOutVideo2VpssId;
    ipcInVpssPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    ipcInVpssPrm.baseCreateParams.notifyNextLink            = TRUE;
    ipcInVpssPrm.baseCreateParams.notifyPrevLink            = TRUE;
    ipcInVpssPrm.baseCreateParams.numOutQue                 = 1;
    ipcInVpssPrm.baseCreateParams.outQueParams[0].nextLink   =  gVdisModuleContext.swMsId[0];

    /* ipc in host link */
    ipcFramesInHostPrm.cbFxn = NULL;
    ipcFramesInHostPrm.cbCtx = NULL;
    ipcFramesInHostPrm.baseCreateParams.inQueParams.prevLinkId = gMultiCh_VdecVdisObj.ipcOutVideo2HostId;
    ipcFramesInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    ipcFramesInHostPrm.baseCreateParams.notifyNextLink = FALSE;
    ipcFramesInHostPrm.baseCreateParams.notifyPrevLink = FALSE;
    ipcFramesInHostPrm.baseCreateParams.numOutQue = 0;

    /* sw mosaic link */
    swMsPrm[0].numSwMsInst = 1;
    swMsPrm[0].swMsInstId[0]        = SYSTEM_SW_MS_SC_INST_DEIHQ_SC_NO_DEI;
    swMsPrm[0].swMsInstStartWin[0]  = 0;
    swMsPrm[0].swMsInstStartWin[1]  = 10;
    swMsPrm[0].enableProcessTieWithDisplay = TRUE;
    // swMsPrm[0].includeVipScInDrvPath = FALSE;

    VDIS_DEV vdDevId = VDIS_DEV_HDMI;

    swMsPrm[0].inQueParams.prevLinkId     = gMultiCh_VdecVdisObj.ipcInVpssId;
    swMsPrm[0].inQueParams.prevLinkQueId  = 0;
    swMsPrm[0].outQueParams.nextLink      = gVdisModuleContext.displayId[0];
    swMsPrm[0].numOutBuf                  = MULTICH_NUM_SWMS_MAX_BUFFERS;
    swMsPrm[0].maxInputQueLen             = SYSTEM_SW_MS_INVALID_INPUT_QUE_LEN;
    swMsPrm[0].maxOutRes                  = VSYS_STD_1080P_60;
    //    swMsPrm[0].initOutRes                 = gVdisModuleContext.vdisConfig.deviceParams[VDIS_DEV_HDMI].resolution;
    swMsPrm[0].lineSkipMode               = FALSE;
    swMsPrm[0].enableLayoutGridDraw       = gVdisModuleContext.vdisConfig.enableLayoutGridDraw;

    MultiCh_swMsGetDefaultLayoutPrm(vdDevId, &swMsPrm[0], FALSE);    /* both from 0-16 chnl */

    /* display link */
    displayPrm[0].inQueParams[0].prevLinkId    = gVdisModuleContext.swMsId[0];
    displayPrm[0].inQueParams[0].prevLinkQueId = 0;
    displayPrm[0].displayRes                   = VSYS_STD_1080P_60;
    displayPrm[0].numInputQueues               = 1;

    /* create links */
    System_linkCreate(gVdecModuleContext.ipcBitsOutHLOSId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm));
    System_linkCreate(gVdecModuleContext.ipcBitsInRTOSId,&ipcBitsInVideoPrm,sizeof(ipcBitsInVideoPrm));
    System_linkCreate(gVdecModuleContext.decId, &decPrm, sizeof(decPrm));

    System_linkCreate(gMultiCh_VdecVdisObj.videoDupId  , &videoDupPrm, sizeof(videoDupPrm));
    System_linkCreate(gMultiCh_VdecVdisObj.ipcOutVideo2VpssId, &ipcOutVideo2VpssPrm, sizeof(ipcOutVideo2VpssPrm));
    System_linkCreate(gMultiCh_VdecVdisObj.ipcOutVideo2HostId, &ipcOutVideo2HostPrm, sizeof(ipcOutVideo2HostPrm));
    System_linkCreate(gMultiCh_VdecVdisObj.ipcInVpssId  , &ipcInVpssPrm, sizeof(ipcInVpssPrm));

    /* 运行这行代码时发生SIGFPE !!!!!!!! */
    System_linkCreate(gMultiCh_VdecVdisObj.ipcInHostId  , &ipcFramesInHostPrm, sizeof(ipcFramesInHostPrm));

    System_linkCreate(gVdisModuleContext.swMsId[0]  , &swMsPrm[0], sizeof(swMsPrm[0]));
    System_linkCreate(gVdisModuleContext.displayId[0], &displayPrm[0], sizeof(displayPrm[0]));
}