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.

question about scalar framerate

Dear all:

         I am using DVRRDK3.0 with DM8168EVM.

        I create a chain, src->sclr->nsf->ipcOutVpss->ipcInVideo->enc->ipcBitsOutVideo->ipcBitsInHost.

        I set the sclr link out resolution = 720*576, inputFrameRate = 30, outputFrameRate = 30,and I have the stream save to a file, when I play this file ,I found the framerate is 25. I want to know why the framerate is not 30?

the following is the my code:

srcPrm.outQueParams.nextLink = sclrId;
if (isProgressive)
{
srcPrm.timerPeriod = 30;
}
else
{
srcPrm.timerPeriod = 15;
}
srcPrm.inputInfo.numCh = SRC_NUM_CH;
for(i = 0; i < srcPrm.inputInfo.numCh; i++)
{
System_LinkChInfo *pChInfo;

pChInfo = &srcPrm.inputInfo.chInfo[i];

pChInfo->dataFormat = SYSTEM_DF_YUV420SP_UV;
pChInfo->memType = SYSTEM_MT_TILEDMEM;
pChInfo->width = 1920;
if (isProgressive)
{
pChInfo->height = 1080;
pChInfo->scanFormat = SYSTEM_SF_PROGRESSIVE;
}
else
{
pChInfo->height = 480/2;
pChInfo->scanFormat = SYSTEM_SF_INTERLACED;
}
pChInfo->pitch[0] = SystemUtils_align(pChInfo->width+pChInfo->startX,
SYSTEM_BUFFER_ALIGNMENT);
pChInfo->pitch[1] = pChInfo->pitch[0];
pChInfo->pitch[2] = 0;
}

SclrLink_CreateParams_Init(&sclrPrm);
sclrPrm.inQueParams.prevLinkId = srcId;
sclrPrm.inQueParams.prevLinkQueId = 0;
sclrPrm.outQueParams.nextLink = nsfId;
sclrPrm.tilerEnable = FALSE;
sclrPrm.enableLineSkipSc = FALSE;
sclrPrm.inputFrameRate = 30;
sclrPrm.outputFrameRate = 30;

sclrPrm.scaleMode = SCLR_SCALE_MODE_ABSOLUTE;

sclrPrm.outScaleFactor.absoluteResolution.outWidth = 720;
sclrPrm.outScaleFactor.absoluteResolution.outHeight = 576;

NsfLink_CreateParams_Init(&nsfPrm);
nsfPrm.bypassNsf = TRUE;
nsfPrm.tilerEnable = FALSE;
nsfPrm.inQueParams.prevLinkId = sclrId;
nsfPrm.inQueParams.prevLinkQueId = 0;
nsfPrm.numOutQue = 1;
nsfPrm.numBufsPerCh = 0;
nsfPrm.inputFrameRate = 30;
nsfPrm.outputFrameRate = 30;
nsfPrm.outQueParams[0].nextLink = ipcOutVpssId;

ipcOutVpssPrm.inQueParams.prevLinkId = nsfId;
ipcOutVpssPrm.inQueParams.prevLinkQueId = 0;
ipcOutVpssPrm.numOutQue = 1;
ipcOutVpssPrm.outQueParams[0].nextLink = ipcInVideoId;
ipcOutVpssPrm.notifyNextLink = TRUE;
ipcOutVpssPrm.notifyPrevLink = TRUE;
ipcOutVpssPrm.noNotifyMode = FALSE;

ipcInVideoPrm.inQueParams.prevLinkId = ipcOutVpssId;
ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
ipcInVideoPrm.numOutQue = 1;
ipcInVideoPrm.outQueParams[0].nextLink = encId;
ipcInVideoPrm.notifyNextLink = TRUE;
ipcInVideoPrm.notifyPrevLink = TRUE;
ipcInVideoPrm.noNotifyMode = FALSE;

for (i = 0; i < SRC_NUM_CH; i++)
{
encPrm.chCreateParams[i].format = IVIDEO_H264HP;
encPrm.chCreateParams[i].profile = IH264_HIGH_PROFILE;
encPrm.chCreateParams[i].dataLayout = IVIDEO_FIELD_SEPARATED;
if (isProgressive)
encPrm.chCreateParams[i].fieldMergeEncodeEnable = FALSE;
else
encPrm.chCreateParams[i].fieldMergeEncodeEnable = TRUE;
encPrm.chCreateParams[i].maxBitRate = -1;
encPrm.chCreateParams[i].encodingPreset = 3;
encPrm.chCreateParams[i].rateControlPreset = 0;
encPrm.chCreateParams[i].enableHighSpeed = 0;
encPrm.chCreateParams[i].encodingPreset = XDM_DEFAULT;
encPrm.chCreateParams[i].enableAnalyticinfo = 0;
encPrm.chCreateParams[i].enableWaterMarking = 0;
encPrm.chCreateParams[i].rateControlPreset = IVIDEO_STORAGE;

encPrm.chCreateParams[i].defaultDynamicParams.intraFrameInterval = 30;
encPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = (2 * 1000 * 1000);
encPrm.chCreateParams[i].defaultDynamicParams.interFrameInterval = 1;
encPrm.chCreateParams[i].defaultDynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
encPrm.chCreateParams[i].defaultDynamicParams.rcAlg = 0 ;
encPrm.chCreateParams[i].defaultDynamicParams.qpMin = 10;
encPrm.chCreateParams[i].defaultDynamicParams.qpMax = 40;
encPrm.chCreateParams[i].defaultDynamicParams.qpInit = -1;
encPrm.chCreateParams[i].defaultDynamicParams.vbrDuration = 8;
encPrm.chCreateParams[i].defaultDynamicParams.vbrSensitivity = 0;
encPrm.chCreateParams[i].defaultDynamicParams.inputFrameRate = 30;
encPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = 30;
}
encPrm.inQueParams.prevLinkId = ipcInVideoId;
encPrm.inQueParams.prevLinkQueId = 0;
encPrm.outQueParams.nextLink = ipcBitsOutVideoId;
encPrm.numBufPerCh[0] = 6;
encPrm.numBufPerCh[1] = 6;
encPrm.numBufPerCh[2] = 6;
encPrm.numBufPerCh[3] = 6;

ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = encId;
ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsOutVideoPrm.baseCreateParams.numOutQue = 1;
ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInHostId;
Chains_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutVideoPrm, TRUE);

ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId = ipcBitsOutVideoId;
ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;                                                               ipcBitsInHostPrm.baseCreateParams.outQueParams[0].nextLink = SYSTEM_LINK_ID_INVALID;                Chains_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm);

  • You should set encodingPreset = XDM_USER_DEFINED for correct SEI info (which has frame rate info) to be populated.

  • Hi Badri,

              Thanks for you  reply. I can modify the framerate now, and I have another question to  consult.

              When the chain is runing, I want to dynamically modify the parameters.

              For example , I invoke the following API to modify the sclr Link framerate,     

             System_linkControl(sclrId, SCLR_LINK_CMD_SET_FRAME_RATE, &sclrParams, sizeof(sclrParams), TRUE);

             if I want a modified result, should I need to do the same modify to nsf Link and enc Link? or I just do this is ok.

  • Whenever input frame rate of encoder is modified the encoder should be reconfigured with correct inputFrameRate and targetFrameRate and bitrate else bitrate calculation will be wrong

  • Hi Badri,

            I set the encoder params as follows:

     for (i = 0; i < SRC_NUM_CH; i++)
     {
     encPrm.chCreateParams[i].format = IVIDEO_H264HP;
     encPrm.chCreateParams[i].profile = IH264_HIGH_PROFILE;
     encPrm.chCreateParams[i].dataLayout = IVIDEO_FIELD_SEPARATED;
     if (isProgressive)
     encPrm.chCreateParams[i].fieldMergeEncodeEnable = FALSE;
     else
     encPrm.chCreateParams[i].fieldMergeEncodeEnable = TRUE;
     encPrm.chCreateParams[i].maxBitRate = -1;
     encPrm.chCreateParams[i].encodingPreset = XDM_USER_DEFINED;
     encPrm.chCreateParams[i].rateControlPreset = 0;
     encPrm.chCreateParams[i].enableHighSpeed = 0;
     encPrm.chCreateParams[i].enableAnalyticinfo = 0;
     encPrm.chCreateParams[i].enableWaterMarking = 0;
     encPrm.chCreateParams[i].rateControlPreset = IVIDEO_STORAGE;
     
     encPrm.chCreateParams[i].defaultDynamicParams.inputFrameRate = 60;
     encPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = 60;
     encPrm.chCreateParams[i].defaultDynamicParams.intraFrameInterval = 60;
     encPrm.chCreateParams[i].defaultDynamicParams.interFrameInterval = 1;
     encPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = (2 * 1000 * 1000);
     encPrm.chCreateParams[i].defaultDynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
     encPrm.chCreateParams[i].defaultDynamicParams.rcAlg = 0 ;
     encPrm.chCreateParams[i].defaultDynamicParams.qpMin = 10;
     encPrm.chCreateParams[i].defaultDynamicParams.qpMax = 40;
     encPrm.chCreateParams[i].defaultDynamicParams.qpInit = -1;
     encPrm.chCreateParams[i].defaultDynamicParams.vbrDuration = 8;
     encPrm.chCreateParams[i].defaultDynamicParams.vbrSensitivity = 0;
    }

          I save the stream to a file, when I paly the file, I can find the framerate is 60.

         But when I invoke the API: 

                           System_linkControl(encId, ENC_LINK_CMD_PRINT_STATISTICS, NULL, 0, TRUE);

        It prints the statistics as follows, why the two framerate is not the same?

    [m3video] Elasped Time : 8 secs
    [m3video]
    [m3video]
    [m3video] CH | In Recv In Skip In User Out Latency
    [m3video] Num | FPS FPS Skip FPS FPS Min / Max
    [m3video] --------------------------------------------
    [m3video] 0 | 17 0 0 17 255 / 24701

    [m3video]
    [m3video] Multi Channel Encode Average Submit Batch Size
    [m3video] Max Submit Batch Size : 24
    [m3video] IVAHD_0 Average Batch Size : 1
    [m3video] IVAHD_0 Max achieved Batch Size : 1
    [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 Encode Batch break Stats
    [m3video] Total Number of Batches created: 136
    [m3video] All numbers are based off total number of Batches created
    [m3video] Batch breaks due to batch sizeexceeding limit: 100 %
    [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 %

       

  • Scaler cannot do 2 channel 1080P60 scaling in real time so you will see reduced frame rate at encode link. Share the full logs of Vsys_printDetailedStatistics.

  • Hi Badri,

               My chain is src->sclr->nsf->ipcOutVpss->ipcInVideo->enc->ipcBitsOutVideo->ipcBitsInHost.

              The following is my demo code, I just use one Scaler Module:

    srcPrm.outQueParams.nextLink = sclrId;
    if (isProgressive)
    {
    srcPrm.timerPeriod = 60;
    }
    else 
    {
    srcPrm.timerPeriod = 15;
    }
    srcPrm.inputInfo.numCh = SRC_NUM_CH;
    for(i = 0; i < srcPrm.inputInfo.numCh; i++)
    {
    System_LinkChInfo *pChInfo;

    pChInfo = &srcPrm.inputInfo.chInfo[i];

    pChInfo->dataFormat = SYSTEM_DF_YUV420SP_UV;
    pChInfo->memType = SYSTEM_MT_TILEDMEM;
    pChInfo->width = 1920;
    if (isProgressive)
    {
    pChInfo->height = 1080;
    pChInfo->scanFormat = SYSTEM_SF_PROGRESSIVE;
    }
    else
    {
    pChInfo->height = 480/2;
    pChInfo->scanFormat = SYSTEM_SF_INTERLACED;
    }
    pChInfo->pitch[0] = SystemUtils_align(pChInfo->width+pChInfo->startX,
    SYSTEM_BUFFER_ALIGNMENT);
    pChInfo->pitch[1] = pChInfo->pitch[0];
    pChInfo->pitch[2] = 0;
    }

    SclrLink_CreateParams_Init(&sclrPrm);
    sclrPrm.inQueParams.prevLinkId = srcId;
    sclrPrm.inQueParams.prevLinkQueId = 0;
    sclrPrm.outQueParams.nextLink = nsfId;
    sclrPrm.tilerEnable = FALSE;
    sclrPrm.enableLineSkipSc = FALSE;
    sclrPrm.inputFrameRate = 60;
    sclrPrm.outputFrameRate = 60;

    sclrPrm.scaleMode = SCLR_SCALE_MODE_ABSOLUTE;

    sclrPrm.outScaleFactor.absoluteResolution.outWidth = 1920;
    sclrPrm.outScaleFactor.absoluteResolution.outHeight = 1080;

    NsfLink_CreateParams_Init(&nsfPrm);
    nsfPrm.bypassNsf = TRUE;
    nsfPrm.tilerEnable = FALSE;
    nsfPrm.inQueParams.prevLinkId = sclrId;
    nsfPrm.inQueParams.prevLinkQueId = 0;
    nsfPrm.numOutQue = 1;
    nsfPrm.numBufsPerCh = 0;
    nsfPrm.inputFrameRate = 60;
    nsfPrm.outputFrameRate = 60;
    nsfPrm.outQueParams[0].nextLink = ipcOutVpssId;

    ipcOutVpssPrm.inQueParams.prevLinkId = nsfId;
    ipcOutVpssPrm.inQueParams.prevLinkQueId = 0;
    ipcOutVpssPrm.numOutQue = 1;
    ipcOutVpssPrm.outQueParams[0].nextLink = ipcInVideoId;
    ipcOutVpssPrm.notifyNextLink = TRUE;
    ipcOutVpssPrm.notifyPrevLink = TRUE;
    ipcOutVpssPrm.noNotifyMode = FALSE;

    ipcInVideoPrm.inQueParams.prevLinkId = ipcOutVpssId;
    ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
    ipcInVideoPrm.numOutQue = 1;
    ipcInVideoPrm.outQueParams[0].nextLink = encId;
    ipcInVideoPrm.notifyNextLink = TRUE;
    ipcInVideoPrm.notifyPrevLink = TRUE;
    ipcInVideoPrm.noNotifyMode = FALSE;

     for (i = 0; i < SRC_NUM_CH; i++)
     {
     encPrm.chCreateParams[i].format = IVIDEO_H264HP;
     encPrm.chCreateParams[i].profile = IH264_HIGH_PROFILE;
     encPrm.chCreateParams[i].dataLayout = IVIDEO_FIELD_SEPARATED;
     if (isProgressive)
     encPrm.chCreateParams[i].fieldMergeEncodeEnable = FALSE;
     else
     encPrm.chCreateParams[i].fieldMergeEncodeEnable = TRUE;
     encPrm.chCreateParams[i].maxBitRate = -1;
     encPrm.chCreateParams[i].encodingPreset = XDM_USER_DEFINED;//3;
     encPrm.chCreateParams[i].rateControlPreset = 0;
     encPrm.chCreateParams[i].enableHighSpeed = 0;
     encPrm.chCreateParams[i].enableAnalyticinfo = 0;
     encPrm.chCreateParams[i].enableWaterMarking = 0;
     encPrm.chCreateParams[i].rateControlPreset = IVIDEO_STORAGE;
     
     encPrm.chCreateParams[i].defaultDynamicParams.inputFrameRate = 60;
     encPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = 60;
     encPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = (2 * 1000 * 1000);
     encPrm.chCreateParams[i].defaultDynamicParams.intraFrameInterval = 60;
     encPrm.chCreateParams[i].defaultDynamicParams.interFrameInterval = 1;
     encPrm.chCreateParams[i].defaultDynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
     encPrm.chCreateParams[i].defaultDynamicParams.rcAlg = 0 ;
     encPrm.chCreateParams[i].defaultDynamicParams.qpMin = 10;
     encPrm.chCreateParams[i].defaultDynamicParams.qpMax = 40;
     encPrm.chCreateParams[i].defaultDynamicParams.qpInit = -1;
     encPrm.chCreateParams[i].defaultDynamicParams.vbrDuration = 8;
     encPrm.chCreateParams[i].defaultDynamicParams.vbrSensitivity = 0;
     }

    encPrm.inQueParams.prevLinkId = ipcInVideoId;
    encPrm.inQueParams.prevLinkQueId = 0;
    encPrm.outQueParams.nextLink = ipcBitsOutVideoId;
    encPrm.numBufPerCh[0] = 6;
    encPrm.numBufPerCh[1] = 6;
    encPrm.numBufPerCh[2] = 6;
    encPrm.numBufPerCh[3] = 6;

    ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = encId;
    ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    ipcBitsOutVideoPrm.baseCreateParams.numOutQue = 1;
    ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInHostId;
    Chains_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutVideoPrm, TRUE);

    ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId = ipcBitsOutVideoId;
    ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;                                                               ipcBitsInHostPrm.baseCreateParams.outQueParams[0].nextLink = SYSTEM_LINK_ID_INVALID;                Chains_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm);

           I print the statistics:

    System_linkControl(sclrId,
             SCLR_LINK_CMD_PRINT_STATISTICS, NULL, 0, TRUE);
    OSA_waitMsecs(2000);

    System_linkControl(nsfId,
              NSF_LINK_CMD_PRINT_STATISTICS, NULL, 0, TRUE);
    OSA_waitMsecs(2000);

    System_linkControl(encId,
               ENC_LINK_CMD_PRINT_STATISTICS, NULL, 0, TRUE);

    [m3vpss ] *** [Scalar0 ] SCLR Statistics ***
    [m3vpss ]
    [m3vpss ] Elasped Time : 9 secs
    [m3vpss ] Total Fields Processed : 157
    [m3vpss ] Total Fields FPS : 125 FPS
    [m3vpss ]
    [m3vpss ]
    [m3vpss ] CH | In Recv In Reject In Process Out Skip Out User Out Latency
    [m3vpss ] Num | FPS FPS FPS FPS FPS Skip FPS Min / Max
    [m3vpss ] ---------------------------------------------------------------------
    [m3vpss ] 0 | 17 0 17 17 0 0 255 236199
    [m3vpss ]
    [m3vpss ]
    [m3vpss ] *** [NSF0] NSF Statistics ***
    [m3vpss ]
    [m3vpss ] Elasped Time : 11 secs
    [m3vpss ] Total Fields Processed : 186
    [m3vpss ] Total Fields FPS : 111 FPS
    [m3vpss ]
    [m3vpss ]
    [m3vpss ] CH | In Recv In Reject In Process Out User Out Out
    [m3vpss ] Num | FPS FPS FPS FPS Skip FPS Skip FPS
    [m3vpss ] ------------------------------------------------
    [m3vpss ] 0 | 16 0 16 16 0 0
    [m3vpss ]

    ====================
    Chains Run-time Menu
    ====================

    0: Stop Chain

    s: Switch Display Layout (Sequential change of layout)
    c: Switch Display Channel (Sequential: Increments by 1)
    p: Print Capture Statistics
    b: Modify Encoder Bit Rate
    f: Modify Encoder Frame Rate
    r: Modify Intra Frame Interval(GOP)
    t: Toggle force IDR frame
    g: Print Encoder Dynamic Parameters
    i: Print IVA-HD Statistics
    m: Print SwMs Statistics
    a: Audio Capture / Playback

    Enter Choice: [m3video]
    [m3video] *** ENCODE Statistics ***
    [m3video]
    [m3video] Elasped Time : 12 secs
    [m3video]
    [m3video]
    [m3video] CH | In Recv In Skip In User Out Latency
    [m3video] Num | FPS FPS Skip FPS FPS Min / Max
    [m3video] --------------------------------------------
    [m3video] 0 | 17 0 0 17 255 / 239701
    [m3video]
    [m3video] Multi Channel Encode Average Submit Batch Size
    [m3video] Max Submit Batch Size : 24
    [m3video] IVAHD_0 Average Batch Size : 1
    [m3video] IVAHD_0 Max achieved Batch Size : 1
    [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 Encode Batch break Stats
    [m3video] Total Number of Batches created: 212
    [m3video] All numbers are based off total number of Batches created
    [m3video] Batch breaks due to batch sizeexceeding limit: 100 %
    [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 %


  • You have set NullSrc period as 60. So fps will be 1000/60 = 16.6 ~ 17 which is what the statistics is showing and this is expected. If you want 60 fps set the timerPeriod correctly to 16

  • Badri,

           Thank you very much.

           I have solved the problem.

          And when I  tried to change the framerate dynamically, I found I can not modify it.

          I invoke the Api, I can not modify the input and output framerate.       

                    System_linkControl(sclrId, SCLR_LINK_CMD_SET_FRAME_RATE, &params, sizeof(params), TRUE);

         I also invoke the Api , the same does not change the framerate.

                   System_linkControl(encId, ENC_LINK_CMD_SET_CODEC_INPUT_FPS, &encFps, sizeof(encFps), TRUE);
                   System_linkControl(encId, ENC_LINK_CMD_SET_CODEC_FPS, &encTargetFps, sizeof(encTargetFps), TRUE);

       If I want to change the framerate dynamically, how should I do it?

  • The APis are correct..There is probably some issue with your application passing correct params. You can debug it by printing the performance logs and checking the encoder configuration by invoking encLink GET_DYNAMIC_PARAMS linkControl cmd.

  • If I just invoke  System_linkControl(encId, ENC_LINK_CMD_SET_CODEC_FPS, &encTargetFps, sizeof(encTargetFps)

    I can change the targetFrameRate,

    Enter Choice: [m3video] 
    [m3video] *** ENCODE Statistics *** 
    [m3video] 
    [m3video] Elasped Time : 12 secs
    [m3video] 
    [m3video] 
    [m3video] CH | In Recv In Skip In User Out Latency 
    [m3video] Num | FPS FPS Skip FPS FPS Min / Max
    [m3video] --------------------------------------------
    [m3video] 0 | 63 0 31 31 255 / 61916
    [m3video]

    But when I invoke  System_linkControl(encId, ENC_LINK_CMD_SET_CODEC_INPUT_FPS, &encFps, sizeof(encFps), TRUE);

    I can not change the input framerate.

    And I invoke System_linkControl(sclrId, SCLR_LINK_CMD_SET_FRAME_RATE, &params, sizeof(params), TRUE);

    I also can not change the input and output framerate with sclr link

    the following is my demo code:

    srcPrm.outQueParams.nextLink = sclrId;
    if (isProgressive)
    {
    srcPrm.timerPeriod = 16;
    }
    else 
    {
    srcPrm.timerPeriod = 15;
    }
    srcPrm.inputInfo.numCh = SRC_NUM_CH;
    for(i = 0; i < srcPrm.inputInfo.numCh; i++)
    {
    System_LinkChInfo *pChInfo;

    pChInfo = &srcPrm.inputInfo.chInfo[i];

    pChInfo->dataFormat = SYSTEM_DF_YUV420SP_UV;
    pChInfo->memType = SYSTEM_MT_TILEDMEM;
    pChInfo->width = 1920;
    if (isProgressive)
    {
    pChInfo->height = 1080;
    pChInfo->scanFormat = SYSTEM_SF_PROGRESSIVE;
    }
    else
    {
    pChInfo->height = 480/2;
    pChInfo->scanFormat = SYSTEM_SF_INTERLACED;
    }
    pChInfo->pitch[0] = SystemUtils_align(pChInfo->width+pChInfo->startX,
    SYSTEM_BUFFER_ALIGNMENT);
    pChInfo->pitch[1] = pChInfo->pitch[0];
    pChInfo->pitch[2] = 0;
    }

    SclrLink_CreateParams_Init(&sclrPrm);
    sclrPrm.inQueParams.prevLinkId = srcId;
    sclrPrm.inQueParams.prevLinkQueId = 0;
    sclrPrm.outQueParams.nextLink = nsfId;
    sclrPrm.tilerEnable = FALSE;
    sclrPrm.enableLineSkipSc = FALSE;
    sclrPrm.inputFrameRate = 60;
    sclrPrm.outputFrameRate = 60;

    sclrPrm.scaleMode = SCLR_SCALE_MODE_ABSOLUTE;

    sclrPrm.outScaleFactor.absoluteResolution.outWidth = 1920;
    sclrPrm.outScaleFactor.absoluteResolution.outHeight = 1080;

    NsfLink_CreateParams_Init(&nsfPrm);
    nsfPrm.bypassNsf = TRUE;
    nsfPrm.tilerEnable = FALSE;
    nsfPrm.inQueParams.prevLinkId = sclrId;
    nsfPrm.inQueParams.prevLinkQueId = 0;
    nsfPrm.numOutQue = 1;
    nsfPrm.numBufsPerCh = 0;
    nsfPrm.inputFrameRate = 60;
    nsfPrm.outputFrameRate = 60;
    nsfPrm.outQueParams[0].nextLink = ipcOutVpssId;

    ipcOutVpssPrm.inQueParams.prevLinkId = nsfId;
    ipcOutVpssPrm.inQueParams.prevLinkQueId = 0;
    ipcOutVpssPrm.numOutQue = 1;
    ipcOutVpssPrm.outQueParams[0].nextLink = ipcInVideoId;
    ipcOutVpssPrm.notifyNextLink = TRUE;
    ipcOutVpssPrm.notifyPrevLink = TRUE;
    ipcOutVpssPrm.noNotifyMode = FALSE;

    ipcInVideoPrm.inQueParams.prevLinkId = ipcOutVpssId;
    ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
    ipcInVideoPrm.numOutQue = 1;
    ipcInVideoPrm.outQueParams[0].nextLink = encId;
    ipcInVideoPrm.notifyNextLink = TRUE;
    ipcInVideoPrm.notifyPrevLink = TRUE;
    ipcInVideoPrm.noNotifyMode = FALSE;

     for (i = 0; i < SRC_NUM_CH; i++)
     {
     encPrm.chCreateParams[i].format = IVIDEO_H264HP;
     encPrm.chCreateParams[i].profile = IH264_HIGH_PROFILE;
     encPrm.chCreateParams[i].dataLayout = IVIDEO_FIELD_SEPARATED;
     if (isProgressive)
     encPrm.chCreateParams[i].fieldMergeEncodeEnable = FALSE;
     else
     encPrm.chCreateParams[i].fieldMergeEncodeEnable = TRUE;
     encPrm.chCreateParams[i].maxBitRate = -1;
     encPrm.chCreateParams[i].encodingPreset = XDM_USER_DEFINED;//3;
     encPrm.chCreateParams[i].rateControlPreset = 0;
     encPrm.chCreateParams[i].enableHighSpeed = 0;
     encPrm.chCreateParams[i].enableAnalyticinfo = 0;
     encPrm.chCreateParams[i].enableWaterMarking = 0;
     encPrm.chCreateParams[i].rateControlPreset = IVIDEO_STORAGE;
     
     encPrm.chCreateParams[i].defaultDynamicParams.inputFrameRate = 60;
     encPrm.chCreateParams[i].defaultDynamicParams.targetFrameRate = 60;
     encPrm.chCreateParams[i].defaultDynamicParams.targetBitRate = (2 * 1000 * 1000);
     encPrm.chCreateParams[i].defaultDynamicParams.intraFrameInterval = 60;
     encPrm.chCreateParams[i].defaultDynamicParams.interFrameInterval = 1;
     encPrm.chCreateParams[i].defaultDynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
     encPrm.chCreateParams[i].defaultDynamicParams.rcAlg = 0 ;
     encPrm.chCreateParams[i].defaultDynamicParams.qpMin = 10;
     encPrm.chCreateParams[i].defaultDynamicParams.qpMax = 40;
     encPrm.chCreateParams[i].defaultDynamicParams.qpInit = -1;
     encPrm.chCreateParams[i].defaultDynamicParams.vbrDuration = 8;
     encPrm.chCreateParams[i].defaultDynamicParams.vbrSensitivity = 0;
     }

    encPrm.inQueParams.prevLinkId = ipcInVideoId;
    encPrm.inQueParams.prevLinkQueId = 0;
    encPrm.outQueParams.nextLink = ipcBitsOutVideoId;
    encPrm.numBufPerCh[0] = 6;
    encPrm.numBufPerCh[1] = 6;
    encPrm.numBufPerCh[2] = 6;
    encPrm.numBufPerCh[3] = 6;

    ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = encId;
    ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
    ipcBitsOutVideoPrm.baseCreateParams.numOutQue = 1;
    ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = ipcBitsInHostId;
    Chains_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutVideoPrm, TRUE);

    ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId = ipcBitsOutVideoId;
    ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;                                                               ipcBitsInHostPrm.baseCreateParams.outQueParams[0].nextLink = SYSTEM_LINK_ID_INVALID;                Chains_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm);


  • Share full logs of not working case.