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();

}
  • - -期待楼主搞通 我也是最近才玩8168。。只跑过mcfw和link的demo。。。看了点东西 还没自己弄过呢。。果断跟随

    还有楼主。。你在用的时候 会用到ccs么

  • 烧写Uboot的时候用到过,从sd卡烧写uboot失败有错误,只能通过ccs烧写,其他的没用过...
  • 楼主你调好了么。。我也想弄个最简单的自己的写的源码 可是不会编译。。。。。求指导  

    楼主留个q呗

  • sorry,没有调好,帮不上忙了...

  • hi, SYSTEM_VIDEO_LINK_ID_IPC_FRAMES_IN_0  这个link id 在 system_linkId.h没有定义吧, 是不是你新增加的link id

  •    仁兄,你的这个问题解决没,我也遇到你同样的问题,搞了好久也不行,我的应用场景是capture通过VpassFramesOut 到A8,然后A8通过HostFramesOut到encode,也是出现你同样的错误.如果解决了,能否共享一下,谢谢!

  • 你好,这个问题你解决了没?我也遇到了同样的问题,解决了希望你能共享一下经验

  • 我看到系统头文件中没有SYSTEM_VIDEO_LINK_ID_IPC_FRAMES_IN_0,是楼主自定义的吧?我用的是SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0和SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0,执行起来没问题,不过就是在ipcBitsOutHost link中填充数据归还buffer后,ipcBitsInVideo link老是获取不到buffer,查代码也是ListMP_getHead返回为空造成,还在查原因。

  • 您好!

              请问您的问题解决了吗?是什么导致的呢?

    谢谢!