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.

DVR RDK multichannel Decoder use case: Link API

Hi,

   I am working to get multichannel decoder use case in DVR RDK using Link API's. And I have few issues.

Here is the use case code.

#include <demos/link_api_demos/common/chains.h>
#include <demos/link_api_demos/video_chains/system_chain.h>


/**
                       FILE (H264)
                          |
                          |
                    IPC_BITS_OUT_A8 (BitStream)
                          |
                    IPC_BITS_IN_M3 (BitStream)
                          |
                         DEC
                          |
                   IPC_FRAMES_OUT_M3 (Frames)
                          |
                    IPC_FRAMES_IN_A8 (Frames)
                          |
                          |
                        FILE (YUV)
*/
#define SRC_NUM_CH 16
#define NUM_BUF_PER_CH 8
static SystemVideo_Ivahd2ChMap_Tbl systemVid_encDecIvaChMapTbl =
{
    .isPopulated = 1,
    .ivaMap[0] =
    {
        .EncNumCh  = 0,
        .EncChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        .DecNumCh  = 16,
        .DecChList = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 , 14, 15},
    },
    .ivaMap[1] =
    {
        .EncNumCh  = 0,
        .EncChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        .DecNumCh  = 0,
        .DecChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0},
    },
    .ivaMap[2] =
    {
        .EncNumCh  = 0,
        .EncChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        .DecNumCh  = 0,
        .DecChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    },
};


Void Chains_multiChEncDecLoopBack(Chains_Ctrl *chainsCfg)
{
    IpcBitsOutLinkHLOS_CreateParams   ipcBitsOutHostPrm;
    IpcBitsInLinkRTOS_CreateParams    ipcBitsInVideoPrm;


    DecLink_CreateParams     decPrm;

    IpcFramesOutLinkRTOS_CreateParams   ipcFramesOutVideoPrm;
    IpcFramesInLinkHLOS_CreateParams  ipcFramesInHostPrm;


    Int i;
    Bool isProgressive;
    System_LinkInfo bitsProducerLinkInfo;

    UInt32 decId;
    UInt32 ipcFramesOutVideoId, ipcFramesInHostId;
    UInt32 ipcBitsInVideoId, ipcBitsOutHostId;
    char ch;

    iChains_ipcBitsInit();
    CHAINS_INIT_STRUCT(IpcBitsOutLinkHLOS_CreateParams,ipcBitsOutHostPrm);
    CHAINS_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams,ipcBitsInVideoPrm);

    CHAINS_INIT_STRUCT(DecLink_CreateParams, decPrm);

    CHAINS_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams,ipcFramesOutVideoPrm);
    CHAINS_INIT_STRUCT(IpcFramesInLinkHLOS_CreateParams,ipcFramesInHostPrm);

    ipcBitsOutHostId  = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
    ipcBitsInVideoId  = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;

    decId  = SYSTEM_LINK_ID_VDEC_0;

    ipcFramesOutVideoId = SYSTEM_VIDEO_LINK_ID_IPC_FRAMES_OUT_0;
    ipcFramesInHostId   = SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0;

    decPrm.tilerEnable = FALSE;
    isProgressive = TRUE;

    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 = SRC_NUM_CH;
    ipcBitsOutHostPrm.bufPoolPerCh = TRUE;

    for (i=0; i<SRC_NUM_CH; i++)
    {
        ipcBitsOutHostPrm.inQueInfo.chInfo[i].width = 720;
        ipcBitsOutHostPrm.inQueInfo.chInfo[i].height = 576;
        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.numBufPerCh[i] = NUM_BUF_PER_CH;
    }

/* IPC Host to IPC Video*/
    ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId    = ipcBitsOutHostId;
    ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink  = decId;
    ipcBitsInVideoPrm.baseCreateParams.noNotifyMode              = TRUE;
    ipcBitsInVideoPrm.baseCreateParams.notifyNextLink            = FALSE;
    ipcBitsInVideoPrm.baseCreateParams.notifyPrevLink            = TRUE;
    ipcBitsInVideoPrm.baseCreateParams.numOutQue                 = 1;

/* IPC Video to DEC*/
    for (i=0; i<SRC_NUM_CH; i++) {
        decPrm.chCreateParams[i].format          = IVIDEO_H264HP;
        decPrm.chCreateParams[i].profile         = IH264VDEC_PROFILE_ANY;
        decPrm.chCreateParams[i].targetMaxWidth  = 720;
        decPrm.chCreateParams[i].targetMaxHeight = 576;
        if (isProgressive)
            decPrm.chCreateParams[i].fieldMergeDecodeEnable  = FALSE;
        else
            decPrm.chCreateParams[i].fieldMergeDecodeEnable  = TRUE;
        decPrm.chCreateParams[i].numBufPerCh = NUM_BUF_PER_CH;
        decPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = 25;
        decPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = (2 * 1000 * 1000);
    }
    decPrm.inQueParams.prevLinkId = ipcBitsInVideoId;
    decPrm.inQueParams.prevLinkQueId = 0;
    decPrm.outQueParams.nextLink     = ipcFramesOutVideoId;

  /*DEC to IPC Video Frame out*/

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

/*IPC  Frame video out to Host IN*/
    ipcFramesInHostPrm.baseCreateParams.noNotifyMode = TRUE;
    ipcFramesInHostPrm.baseCreateParams.notifyNextLink = FALSE;
    ipcFramesInHostPrm.baseCreateParams.notifyPrevLink = FALSE;
    ipcFramesInHostPrm.baseCreateParams.inQueParams.prevLinkId = ipcFramesOutVideoId;
    ipcFramesInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    ipcFramesInHostPrm.baseCreateParams.outQueParams[0].nextLink = SYSTEM_LINK_ID_INVALID;


    System_linkCreate(ipcBitsOutHostId,&ipcBitsOutHostPrm,sizeof(ipcBitsOutHostPrm));
    System_linkCreate(ipcBitsInVideoId,&ipcBitsInVideoPrm,sizeof(ipcBitsInVideoPrm));
    System_linkCreate(decId, &decPrm, sizeof(decPrm));
    sleep(2);
    System_linkCreate(ipcFramesOutVideoId, &ipcFramesOutVideoPrm, sizeof(ipcFramesOutVideoPrm));
    System_linkCreate(ipcFramesInHostId, &ipcFramesInHostPrm, sizeof(ipcFramesInHostPrm));

    printf("SYSTEM INFO >>> FILE - DEC - FILE Links Created\n");

    Chains_memPrintHeapStatus();

    {

        System_linkStart(ipcFramesInHostId);
        System_linkStart(ipcFramesOutVideoId);
        System_linkStart(decId);
        System_linkStart(ipcBitsInVideoId);
        System_linkStart(ipcBitsOutHostId);

        /* Start taking CPU load just before starting of links */
        Chains_prfLoadCalcEnable(TRUE, FALSE, FALSE);

        while(1)
        {
            ch = Chains_menuRunTime();
            if(ch=='0')
                break;
            if(ch=='i')
                System_linkControl(decId, DEC_LINK_CMD_PRINT_IVAHD_STATISTICS, NULL, 0, TRUE);
            if(ch=='d')
                System_linkControl(decId, DEC_LINK_CMD_PRINT_STATISTICS, NULL, 0, TRUE);
            if(ch=='D')
                   System_linkControl(decId, DEC_LINK_CMD_PRINT_BUFFER_STATISTICS, NULL, 0, TRUE);
            if(ch=='b')
                System_linkControl(ipcBitsOutHostId, IPCBITSOUT_LINK_CMD_PRINT_BUFFER_STATISTICS, NULL, 0, TRUE);
        }
        iChains_ipcBitsStop();
        System_linkStop(ipcBitsOutHostId);
        System_linkStop(ipcBitsInVideoId);
        System_linkStop(decId);
    }

    System_linkDelete(ipcBitsOutHostId);
    System_linkDelete(ipcBitsInVideoId);
    System_linkDelete(decId);
    System_linkDelete(ipcFramesOutVideoId);
    System_linkDelete(ipcFramesInHostId);
    /* Print the HWI, SWI and all tasks load */
    /* Reset the accumulated timer ticks */
    Chains_prfLoadCalcEnable(FALSE, TRUE, FALSE);
    //Utils_encdecHdvicpPrfPrint();
    iChains_ipcBitsExit();
}

I used the following technique to copy the data from file to IPC

----------------------------------------------

    reqInfo.numBufs = 16;
    reqInfo.reqType = IPC_BITSOUTHLOS_BITBUFREQTYPE_CHID;

    for (i = 0; i< 16; i++) /*request 16 empty buffer*/
        reqInfo.u[i].chNum = i;

    IpcBitsOutLink_getEmptyVideoBitStreamBufs(ipcBitsInLinkId, &emptyBufList, &reqInfo);
    iChains_ipcBitsReadBitsFromFile(&emptyBufList, maxDataSize);
    IpcBitsOutLink_putFullVideoBitStreamBufs(ipcBitsInLinkId, &emptyBufList);

    sleep(1)

-----------------------------------------------

Since I declared only 8 buff per channel, Only 8 times I am able to transfer data from file to IPC_BITS_IN. The buffers are not consumed by decoder component.

Stat Prints:-

Enter Choice:  [m3video]
 [m3video]  *** Decode Statistics ***
 [m3video]  36754: DEC: Rcvd from prev = 0, Returned to prev = 0
 [m3video] DEC Out  BufExt Q Status
 [m3video] Empty Q 0 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 1 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 2 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 3 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 4 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 5 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 6 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 7 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 8 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 9 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 10 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 11 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 12 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 13 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 14 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Empty Q 15 -> count 8, wrPtr 8, rdPtr 0
 [m3video] Full Q -> count 0, wrPtr 0, rdPtr 0

---------------

Enter Choice:  [m3video]
 [m3video]  *** DECODE Statistics ***
 [m3video]
 [m3video]  Elasped Time           : 17 secs
 [m3video]
 [m3video]
 [m3video]  CH  | In Recv In User  Out
 [m3video]  Num | FPS     Skip FPS FPS
 [m3video]  -----------------------------------
 [m3video]    0 |       0        0   0
 [m3video]    1 |       0        0   0
 [m3video]    2 |       0        0   0
 [m3video]    3 |       0        0   0
 [m3video]    4 |       0        0   0
 [m3video]    5 |       0        0   0
 [m3video]    6 |       0        0   0
 [m3video]    7 |       0        0   0
 [m3video]    8 |       0        0   0
 [m3video]    9 |       0        0   0
 [m3video]   10 |       0        0   0
 [m3video]   11 |       0        0   0
 [m3video]   12 |       0        0   0
 [m3video]   13 |       0        0   0
 [m3video]   14 |       0        0   0
 [m3video]   15 |       0        0   0
 [m3video]
 [m3video] Multi Channel Decode Average Submit Batch Size
 [m3video] Max Submit Batch Size : 24
 [m3video] IVAHD_0 Average Batch Size : 0
 [m3video] IVAHD_0 Max achieved Batch Size : 0
 [m3video] IVAHD_1 Average Batch Size : 0
 [m3video] IVAHD_1 Max achieved Batch Size : 0
 [m3video] IVAHD_2 Average Batch Size : 0
 [m3video] IVAHD_2 Max achieved Batch Size : 0
 [m3video]
 [m3video] Multi Channel Decode Batch break Stats
 [m3video] Total Number of Batches created: 0
 [m3video] All numbers are based off total number of Batches created
 [m3video]       Batch breaks due to batch sizeexceeding limit: 0 %
 [m3video]       Batch breaks due to ReqObj Que being empty: 0 %
 [m3video]       Batch breaks due to changed resolution class: 0 %
 [m3video]       Batch breaks due to interlace and progressivecontent mix: 0 %
 [m3video]       Batch breaks due to channel repeat: 0 %
 [m3video]       Batch breaks due to different codec: 0 %
 [m3video] Total Number of Batches created: 0
 [m3video] All numbers are based off total number of Batches created
 [m3video]       Batch breaks due to batch sizeexceeding limit: 0 %
 [m3video]       Batch breaks due to ReqObj Que being empty: 0 %
 [m3video]       Batch breaks due to changed resolution class: 0 %
 [m3video]       Batch breaks due to interlace and progressivecontent mix: 0 %
 [m3video]       Batch breaks due to channel repeat: 0 %
 [m3video]       Batch breaks due to different codec: 0 %
 [m3video] Total Number of Batches created: 0
 [m3video] All numbers are based off total number of Batches created
 [m3video]       Batch breaks due to batch sizeexceeding limit: 0 %
 [m3video]       Batch breaks due to ReqObj Que being empty: 0 %
 [m3video]       Batch breaks due to changed resolution class: 0 %
 [m3video]       Batch breaks due to interlace and progressivecontent mix: 0 %
 [m3video]       Batch breaks due to channel repeat: 0 %
 [m3video]       Batch breaks due to different codec: 0 %
 [m3video]

-------------------------

 Enter Choice:  [m3video]       30547: HDVICP-ID:0
 [m3video] All percentage figures are based off totalElapsedTime
 [m3video]               totalAcquire2wait :0 %
 [m3video]               totalWait2Isr :0 %
 [m3video]               totalIsr2Done :0 %
 [m3video]               totalWait2Done :0 %
 [m3video]               totalDone2Release :0 %
 [m3video]               totalAcquire2Release :0 %
 [m3video]               totalAcq2acqDelay :0 %
 [m3video]               totalElapsedTime in msec :       0
 [m3video]               numAccessCnt:       0
 [m3video]              IVA-FPS :       0
 [m3video]              Average time spent per frame in microsec:       0
 [m3video]      30548: HDVICP-ID:1
 [m3video] All percentage figures are based off totalElapsedTime
 [m3video]               totalAcquire2wait :0 %
 [m3video]               totalWait2Isr :0 %
 [m3video]               totalIsr2Done :0 %
 [m3video]               totalWait2Done :0 %
 [m3video]               totalDone2Release :0 %
 [m3video]               totalAcquire2Release :0 %
 [m3video]               totalAcq2acqDelay :0 %
 [m3video]               totalElapsedTime in msec :       0
 [m3video]               numAccessCnt:       0
 [m3video]              IVA-FPS :       0
 [m3video]              Average time spent per frame in microsec:       0
 [m3video]      30548: HDVICP-ID:2
 [m3video] All percentage figures are based off totalElapsedTime
 [m3video]               totalAcquire2wait :0 %
 [m3video]               totalWait2Isr :0 %
 [m3video]               totalIsr2Done :0 %
 [m3video]               totalWait2Done :0 %
 [m3video]               totalDone2Release :0 %
 [m3video]               totalAcquire2Release :0 %
 [m3video]               totalAcq2acqDelay :0 %
 [m3video]               totalElapsedTime in msec :       0
 [m3video]               numAccessCnt:       0
 [m3video]              IVA-FPS :       0
 [m3video]              Average time spent per frame in microsec:       0

-----------------------

Why the decoder is not emptying the data? any Idea?

Thanks

Subash

  • ipcBitsInVideoPrm.baseCreateParams.notifyNextLink            = FALSE;

    should be set to TRUE

     

     ipcFramesOutVideoPrm.baseCreateParams.notifyPrevLink = FALSE;

    should be set to TRUE

     

  • Thanks Badri,

     The applied the above recommendation and the decoder started working. The decoder receives data and it is processing. But I see a small issue in IPC FRAMES receiving side.

    /* IVA HD Stats*/

    Enter Choice:  [m3video]       307092: HDVICP-ID:0
     [m3video] All percentage figures are based off totalElapsedTime
     [m3video]               totalAcquire2wait :0 %
     [m3video]               totalWait2Isr :4 %
     [m3video]               totalIsr2Done :0 %
     [m3video]               totalWait2Done :4 %
     [m3video]               totalDone2Release :0 %
     [m3video]               totalAcquire2Release :4 %
     [m3video]               totalAcq2acqDelay :95 %
     [m3video]               totalElapsedTime in msec :    6241
     [m3video]               numAccessCnt:     192
     [m3video]              IVA-FPS :      32
     [m3video]              Average time spent per frame in microsec:    1300
     [m3video]      307093: HDVICP-ID:1
     [m3video] All percentage figures are based off totalElapsedTime
     [m3video]               totalAcquire2wait :0 %
     [m3video]               totalWait2Isr :0 %
     [m3video]               totalIsr2Done :0 %
     [m3video]               totalWait2Done :0 %
     [m3video]               totalDone2Release :0 %
     [m3video]               totalAcquire2Release :0 %
     [m3video]               totalAcq2acqDelay :0 %
     [m3video]               totalElapsedTime in msec :       0
     [m3video]               numAccessCnt:       0
     [m3video]              IVA-FPS :       0
     [m3video]              Average time spent per frame in microsec:       0
     [m3video]      307093: HDVICP-ID:2
     [m3video] All percentage figures are based off totalElapsedTime
     [m3video]               totalAcquire2wait :0 %
     [m3video]               totalWait2Isr :0 %
     [m3video]               totalIsr2Done :0 %
     [m3video]               totalWait2Done :0 %
     [m3video]               totalDone2Release :0 %
     [m3video]               totalAcquire2Release :0 %
     [m3video]               totalAcq2acqDelay :0 %
     [m3video]               totalElapsedTime in msec :       0
     [m3video]               numAccessCnt:       0
     [m3video]              IVA-FPS :       0
     [m3video]              Average time spent per frame in microsec:       0

    Periodically I call the following sequence to copy the frames and write to File.

    ------------------------------------------------

            status =  IpcFramesInLink_getFullVideoFrames(SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0,
                                                         &bufList);
            OSA_assert(0 == status);

            if (bufList.numFrames > 0)
            {
                iChains_ipcFramesWriteBitsToFile(&bufList);
            }
            status = IpcFramesInLink_putEmptyVideoFrames(SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0,
                                                             &bufList);

           ----------------------------------------

    I am not getting valid address in the VIDFrame_Buf. The bufList->frames[i].addr[0][0] & bufList->frames[i].addr[0][1] hold NULL pointers. I am getting correct frameHeight and frameWidth values.

    1. Do you have any idea why and when these pointers will point to NULL?

    2. Can I directly copy the content from these virtual addresses? 

    Thanks


  • Code should be

    ------------------------------------------------

    status = IpcFramesInLink_getFullVideoFrames(SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0,
    &bufList);
    OSA_assert(0 == status);
    if (bufList.numFrames > 0)
    {
        iChains_ipcFramesWriteBitsToFile(&bufList);

        status = IpcFramesInLink_putEmptyVideoFrames(SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0,
    &bufList);

    }
    ----------------------------------------

    If you get NULL address even after fixing this then check and print the physical address when bufAddr is NULL.BufAddr will be Non-NULL only if buffer is allocated from a SharedRegion that is mapped on A8. i.e. SR1. For buffers allocated from Sr2 or tiler heap bufAddr will be NULL.It is best for the app to mmap the buffer from the physical address.

    Also check the follwoing:

    Are you enabling tiler for decoder output ? If u r enabling try disabling it to be able to export the frame to A8.

     

  • Badri,

        Thanks for your super fast reply.

        The problem is solved. From the application, I mapped Mem region using the physical address and accessed the output frames.

    I have One more question to ask.

    1. Between two processing links (DEC, ENC, DEI), we set the notifyNextLink to TRUE.

    2. But between IPC M3 and Host Links, you suggested me to set notifyNextLink to FALSE.

    why?


    Thanks

  • Setting notify to TRUE for IPC links will cause interrupt to occur on the remote core each time a frame is exchanged. If running a large number of channels this will cause a lot of interrupts and it is preferable to run the ipcLink in noNotify mode where the ipcLinks work on periodic polling instead of interrupt mode

  • Thank you for your support.