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.

DVRRDK 串Link Demo



大家好,我在使用DM8168 RDK想实现一个简单的Demo,HostFrameOut->VideoFrameIn->VideoFrameOut->HostFrameIn的数据流简单示例,我只是配置1路输入,create、start没有报错,我试着利用IpcFramesOutLink_putFullVideoFrames向HostFrameOut送数据的时候就报出断言错误
[m3video]  43096: Assertion @ Line: 421 in links_common/ipcFramesIn/ipcFramesIn
Link_tsk.c: dst->channelNum < pObj->info.queInfo[0].numCh : failed !!!
我查了这块代码,打印了这两个值都是0,我理解这个是通过ListMP_getHead获取到的,而对应的push应该是在host(a8)上执行,我查了代码在src_linux IpcFramesOutLink_copyFrameInfo函数中打印了相应的值是0,1,所以就不知道哪里出问题了,代码不长,希望给看一下,或者有谁写过最简单的能调过的借鉴一下,HostBitsOut->VideoBitsIn->VideoDec->VideoFrameOut->HostFrameIn这样的串联也行,我只需要配置1路,只是做验证的!求帮助啊,实在是着急用...

Void Chains_multiChFrameToFrame(Chains_Ctrl *chainsCfg)
{

    IpcFramesInLinkHLOS_CreateParams ipcFramesInHostPrm;
    IpcFramesOutLinkRTOS_CreateParams     ipcFramesOutVideoPrm;
    IpcFramesOutLinkHLOS_CreateParams   ipcFramesOutHostPrm;
    IpcFramesInLinkRTOS_CreateParams     ipcFramesInVideoPrm;
    
    UInt32 ipcFrameOutHostId = SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0;
    UInt32 ipcFrameInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_FRAMES_IN_0;
    UInt32 ipcFrameInHostId = SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0;
    UInt32 ipcFrameOutVideoId = SYSTEM_VIDEO_LINK_ID_IPC_FRAMES_OUT_0;

    int i = 0;
    
    //初始化组件参数
    CHAINS_INIT_STRUCT(IpcFramesOutLinkHLOS_CreateParams,ipcFramesOutHostPrm);
    CHAINS_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams,ipcFramesInVideoPrm);
    CHAINS_INIT_STRUCT(IpcFramesInLinkHLOS_CreateParams,ipcFramesInHostPrm);
    CHAINS_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams,ipcFramesOutVideoPrm);
    
    System_linkControl(
        SYSTEM_LINK_ID_M3VIDEO,
        SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL,
        &systemVid_encDecIvaChMapTbl,
        sizeof(SystemVideo_Ivahd2ChMap_Tbl),
        TRUE
    );
    
    UInt32 numFrames=FRAME_NUM;
    IpcFramesBufObj frameObj[FRAME_NUM];
    int frameSize = MCFW_IPCBITS_GET_YUV420_FRAME_SIZE(FRAME_WIDTH,FRAME_HEIGHT);
    Vsys_AllocBufInfo bufInfo;
    memset(frameObj,0,sizeof(IpcFramesBufObj) * numFrames);
    for (i = 0; i < numFrames;i++)
    {
        int status = Vsys_allocBuf(0,frameSize,128,&bufInfo);
        if (ERROR_NONE == status)
        {
            frameObj[i].bufPhy  = (UInt32)bufInfo.physAddr;
            frameObj[i].bufVirt = bufInfo.virtAddr;
            frameObj[i].maxWidth = FRAME_WIDTH;
            frameObj[i].maxHeight = FRAME_HEIGHT;
            frameObj[i].curWidth = FRAME_WIDTH;
            frameObj[i].curHeight = FRAME_HEIGHT;
            frameObj[i].numCh     = 6;
            frameObj[i].refCnt    = 0;
            printf("AllocBuf phyAddr 0x%x VirtAddr 0x%x\n",bufInfo.physAddr,bufInfo.virtAddr);
        }
        else
        {
            printf("allocBuf error\n");
            break;
        }
    }

    //配置FRAMEHOST
    ipcFramesOutHostPrm.baseCreateParams.inQueParams.prevLinkId = SYSTEM_LINK_ID_INVALID;
    ipcFramesOutHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    ipcFramesOutHostPrm.baseCreateParams.numOutQue = 1;
    ipcFramesOutHostPrm.baseCreateParams.numChPerOutQue[0] = 1;
    ipcFramesOutHostPrm.baseCreateParams.outQueParams[0].nextLink = ipcFrameInVideoId;
    

    //ipcFramesOutHostPrm.inQueInfo.numCh
    ipcFramesOutHostPrm.baseCreateParams.noNotifyMode = FALSE;
    ipcFramesOutHostPrm.baseCreateParams.notifyNextLink =TRUE;
    ipcFramesOutHostPrm.baseCreateParams.notifyPrevLink = FALSE;
    // ipcFramesOutHostPrm.inQueInfo = *inQueInfo;
    ipcFramesOutHostPrm.inQueInfo.numCh = 1;//gVdecModuleContext.vdecConfig.numChn;
    for (i=0; i<=ipcFramesOutHostPrm.inQueInfo.numCh; i++)
    {
        ipcFramesOutHostPrm.inQueInfo.chInfo[i].dataFormat = SYSTEM_DF_YUV420SP_UV;
        ipcFramesOutHostPrm.inQueInfo.chInfo[i].memType    = SYSTEM_MT_TILEDMEM;
        ipcFramesOutHostPrm.inQueInfo.chInfo[i].width      = FRAME_WIDTH;
        ipcFramesOutHostPrm.inQueInfo.chInfo[i].height     = FRAME_HEIGHT;
        ipcFramesOutHostPrm.inQueInfo.chInfo[i].scanFormat = SYSTEM_SF_PROGRESSIVE;
        
        ipcFramesOutHostPrm.inQueInfo.chInfo[i].pitch[0]   = SystemUtils_align(
            ipcFramesOutHostPrm.inQueInfo.chInfo[i].width+ipcFramesOutHostPrm.inQueInfo.chInfo[i].startX,
            SYSTEM_BUFFER_ALIGNMENT);
        ipcFramesOutHostPrm.inQueInfo.chInfo[i].pitch[1]   = ipcFramesOutHostPrm.inQueInfo.chInfo[i].pitch[0];
        ipcFramesOutHostPrm.inQueInfo.chInfo[i].pitch[2]   = 0;
        
        
    }
    //配置VIDEOIN
    ipcFramesInVideoPrm.baseCreateParams.inQueParams.prevLinkId = ipcFrameOutHostId;
    ipcFramesInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    ipcFramesInVideoPrm.baseCreateParams.numOutQue = 1;
    ipcFramesInVideoPrm.baseCreateParams.outQueParams[0].nextLink = ipcFrameOutVideoId;

    ipcFramesInVideoPrm.baseCreateParams.noNotifyMode = FALSE;
       ipcFramesInVideoPrm.baseCreateParams.notifyNextLink = TRUE;
        ipcFramesInVideoPrm.baseCreateParams.notifyPrevLink = TRUE;
    

    //配置VIDEOOUT
    ipcFramesOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = ipcFrameInVideoId;
    ipcFramesOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    ipcFramesOutVideoPrm.baseCreateParams.numOutQue = 1;
    ipcFramesOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = ipcFrameInHostId;
    
    ipcFramesOutVideoPrm.baseCreateParams.noNotifyMode = FALSE;
        ipcFramesOutVideoPrm.baseCreateParams.notifyNextLink = TRUE;
        ipcFramesOutVideoPrm.baseCreateParams.notifyPrevLink = TRUE;

    

    

    //配置HostIn
    ipcFramesInHostPrm.baseCreateParams.inQueParams.prevLinkId = ipcFrameOutVideoId;
    ipcFramesInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
        ipcFramesInHostPrm.baseCreateParams.outQueParams[0].nextLink = SYSTEM_LINK_ID_INVALID;
    
    ipcFramesInHostPrm.cbFxn = ipcFramesInCbFxn;
    ipcFramesInHostPrm.cbCtx = NULL;
    ipcFramesInHostPrm.exportOnlyPhyAddr = TRUE;
    
    ipcFramesInHostPrm.baseCreateParams.noNotifyMode = FALSE;
        ipcFramesInHostPrm.baseCreateParams.notifyNextLink = FALSE;
        ipcFramesInHostPrm.baseCreateParams.notifyPrevLink = TRUE;

    

    System_linkCreate(ipcFrameInVideoId, &ipcFramesInVideoPrm, sizeof(ipcFramesInVideoPrm));
    System_linkCreate(ipcFrameOutHostId, &ipcFramesOutHostPrm, sizeof(ipcFramesOutHostPrm));    
    
    System_linkCreate(ipcFrameInHostId, &ipcFramesInHostPrm, sizeof(ipcFramesInHostPrm));
    System_linkCreate(ipcFrameOutVideoId, &ipcFramesOutVideoPrm, sizeof(ipcFramesOutVideoPrm));    
    usleep(1000000);

    System_linkStart(ipcFrameInHostId);
    System_linkStart(ipcFrameOutVideoId);
    System_linkStart(ipcFrameInVideoId);
    System_linkStart(ipcFrameOutHostId);
    usleep(1000000);
    printf("Ok,all run!\n");

    VIDFrame_BufList frameList;
    VIDFrame_BufList bufList;
    //frameList.numFrames =numFrames;
    for(i=0;i<numFrames;i++)
    {    
        frameList.numFrames =1;
        frameList.frames[0].addr[0][0] =  frameObj[i].bufVirt;
        frameList.frames[0].phyAddr[0][0] =   (Ptr)frameObj[i].bufPhy;
        frameList.frames[0].frameWidth =  frameObj[i].curWidth;
        frameList.frames[0].frameHeight =  frameObj[i].curHeight;
        frameList.frames[0].fid =  0;

        frameList.frames[0].channelNum = 0;
        frameList.frames[0].timeStamp  = 0;
        printf("tes111111111111111\n");
        IpcFramesOutLink_putFullVideoFrames(SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0,
            &frameList);    
        printf("test============\n");
        break;
        Int status;
re:
        status =  IpcFramesOutLink_getEmptyVideoFrames(SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0,
                                                       &bufList);
        if (bufList.numFrames)
           {
               printf("emptyVideoFrame %d!\n",bufList.numFrames);
               continue;
              ///  status = IpcFramesInLink_putEmptyVideoFrames(SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0,
             //                                                &bufList);
             //   OSA_assert(0 == status);
           }
        else
        {
            usleep(4000);
             goto re;
        }
    }    
    
 

    while(1)
    {            
        char ch = Chains_menuRunTime();
        if(ch=='0')
            break;
        if(ch=='i')           
        {
            
        }        
    }
    

    System_linkStop(ipcFrameInHostId);
    System_linkStop(ipcFrameOutVideoId);
    System_linkStop(ipcFrameInVideoId);
    System_linkStop(ipcFrameOutHostId);

    
    System_linkDelete(ipcFrameInHostId);
    System_linkDelete(ipcFrameOutVideoId);
    System_linkDelete(ipcFrameInVideoId);
    System_linkDelete(ipcFrameOutHostId);    
    // System_linkDelete(ipcInVpssId  );
    // System_linkDelete(snkId);

    // Print the HWI, SWI and all tasks load
    // Reset the accumulated timer ticks
    //Chains_prfLoadCalcEnable(FALSE, TRUE, FALSE);
    //Utils_encdecHdvicpPrfPrint();
    //Chains_ipcBitsExit();

}