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.

Linux/AM5728: H.264 encode frame rate

Part Number: AM5728

Tool/software: Linux

Customer trying to encode H.264 720p stream,(fps 29.97) but the output is only 15fps so far. They checked each performance, and noticed VIDENC2_process takes about 10ms for each 720p frame.

 

Is there any way to make it faster with 720p encoding?

Attached is their encode parameter.

 

//static functions
static int setInitParams(S_VidEncode_Obj *videoEnc, dceEncObj_t *dceEncObj)
{
    IH264ENC_Params *h264enc_params = NULL;
    VIDENC2_Params *params;

    if ((videoEnc == NULL) || (dceEncObj == NULL))
    {
        Report_Log(LOG_WARNING, "dceEncObj object is NULL");
        return -1;
    }

    dceEncObj->inArgs = dce_alloc(sizeof(IH264ENC_InArgs));
    if (dceEncObj->inArgs == NULL) return -1;
    dceEncObj->inArgs->size = sizeof(IH264ENC_InArgs);

    dceEncObj->outArgs = dce_alloc(sizeof(IH264ENC_OutArgs));
    if(!dceEncObj->outArgs) return -1;
    dceEncObj->outArgs->size = sizeof(IH264ENC_OutArgs);
    dceEncObj->h264enc_outArgs = (IH264ENC_OutArgs *) dceEncObj->outArgs;

    dceEncObj->params = dce_alloc(sizeof(IH264ENC_Params));
    if(!dceEncObj->params) return -1;
    dceEncObj->params->size = sizeof(IH264ENC_Params);

    params = dceEncObj->params;

    params->encodingPreset          = XDM_USER_DEFINED; //XDM_USER_DEFINED; //XDM_EncodingPreset
    params->rateControlPreset       = IVIDEO_USER_DEFINED;
    params->maxHeight               = videoEnc->vidHeight; //1080;
    params->maxWidth                = videoEnc->vidWidth; //1920;
    params->dataEndianness          = XDM_BYTE; //XDM_DataFormat
    params->maxBitRate              = -1; //IGNORED
    params->minBitRate              = 0;
    params->inputChromaFormat       = XDM_YUV_420SP; //XDM_ChromaFormat
    params->inputContentType        = IVIDEO_PROGRESSIVE; //IVIDEO_ContentType
    params->operatingMode           = IVIDEO_ENCODE_ONLY; //IVIDEO_OperatingMode
    params->profile                 = dceEncObj->profile;
    params->level                   = dceEncObj->level;
    params->inputDataMode           = IVIDEO_ENTIREFRAME; //IVIDEO_DataMode
    params->outputDataMode          = IVIDEO_ENTIREFRAME; //IVIDEO_DataMode
    params->numInputDataUnits       = 1;
    params->numOutputDataUnits      = 1;
    params->metadataType[0]         = IVIDEO_METADATAPLANE_NONE;
    params->metadataType[1]         = IVIDEO_METADATAPLANE_NONE;
    params->metadataType[2]         = IVIDEO_METADATAPLANE_NONE;
    params->maxInterFrameInterval   = 1; //1,31 if IVIDEO_ContentType is IVIDEO_PROGRESSIVE

    h264enc_params = dceEncObj->h264enc_params = (IH264ENC_Params *) dceEncObj->params;

    h264enc_params->interlaceCodingType     = IH264_INTERLACE_DEFAULT;
    h264enc_params->bottomFieldIntra        = 0;
    h264enc_params->gopStructure            = IH264ENC_GOPSTRUCTURE_DEFAULT; // IH264ENC_GOPSTRUCTURE_NONUNIFORM
    h264enc_params->entropyCodingMode       = IH264_ENTROPYCODING_DEFAULT; // IH264_ENTROPYCODING_CAVLC - BASE PROFILE
    h264enc_params->transformBlockSize      = IH264_TRANSFORM_4x4; // BASE PROFILE
    h264enc_params->log2MaxFNumMinus4       = 10;
    h264enc_params->picOrderCountType       = IH264_POC_TYPE_DEFAULT; // IH264_POC_TYPE_0
    h264enc_params->enableWatermark         = 0;
    h264enc_params->IDRFrameInterval        = 1;
    h264enc_params->pConstantMemory         = 0;
    h264enc_params->maxIntraFrameInterval   = 0x7FFFFFFF;
    h264enc_params->debugTraceLevel         = 0;
    h264enc_params->lastNFramesToLog        = 0;
    h264enc_params->enableAnalyticinfo      = 0;
    h264enc_params->enableGMVSei            = 0;
    h264enc_params->constraintSetFlags      = 20;
    h264enc_params->enableRCDO              = 0;
    h264enc_params->enableLongTermRefFrame  = IH264ENC_LTRP_NONE;
    h264enc_params->LTRPPeriod              = 0;

    //H-P Coding Control Params
    h264enc_params->numTemporalLayer        = IH264_TEMPORAL_LAYERS_1;
    h264enc_params->referencePicMarking     = IH264_LONG_TERM_PICTURE;
    h264enc_params->reservedParams[0]       = 0;
    h264enc_params->reservedParams[1]       = 0;
    h264enc_params->reservedParams[2]       = 0;

    //rate control params
    h264enc_params->rateControlParams.rateControlParamsPreset   = IH264_RATECONTROLPARAMS_DEFAULT;//IH264_RATECONTROLPARAMS_USERDEFINED;
    h264enc_params->rateControlParams.scalingMatrixPreset       = IH264_SCALINGMATRIX_NONE;
    h264enc_params->rateControlParams.rcAlgo                    = IH264_RATECONTROL_DEFAULT; // 0
    h264enc_params->rateControlParams.qpI                       = 28;
    h264enc_params->rateControlParams.qpMaxI                    = 36;
    h264enc_params->rateControlParams.qpMinI                    = 10;
    h264enc_params->rateControlParams.qpP                       = 28;
    h264enc_params->rateControlParams.qpMaxP                    = 40;
    h264enc_params->rateControlParams.qpMinP                    = 10;
    h264enc_params->rateControlParams.qpOffsetB                 = 4;
    h264enc_params->rateControlParams.qpMaxB                    = 44;
    h264enc_params->rateControlParams.qpMinB                    = 10;
    h264enc_params->rateControlParams.allowFrameSkip            = 0;
    h264enc_params->rateControlParams.removeExpensiveCoeff      = 0;
    h264enc_params->rateControlParams.chromaQPIndexOffset       = 0;
    h264enc_params->rateControlParams.IPQualityFactor           = IH264_QUALITY_FACTOR_DEFAULT; // 0
    h264enc_params->rateControlParams.initialBufferLevel        = 64000;
    h264enc_params->rateControlParams.HRDBufferSize             = 64000;
    h264enc_params->rateControlParams.minPicSizeRatioI          = 0;
    h264enc_params->rateControlParams.maxPicSizeRatioI          = 20;
    h264enc_params->rateControlParams.minPicSizeRatioP          = 0;
    h264enc_params->rateControlParams.maxPicSizeRatioP          = 0;
    h264enc_params->rateControlParams.minPicSizeRatioB          = 0;
    h264enc_params->rateControlParams.maxPicSizeRatioB          = 0;
    h264enc_params->rateControlParams.enablePRC                 = 1;
    h264enc_params->rateControlParams.enablePartialFrameSkip    = 0;
    h264enc_params->rateControlParams.discardSavedBits          = 0;
    h264enc_params->rateControlParams.reserved                  = 0;
    h264enc_params->rateControlParams.VBRDuration               = 8;
    h264enc_params->rateControlParams.VBRsensitivity            = 0;
    h264enc_params->rateControlParams.skipDistributionWindowLength = 5;
    h264enc_params->rateControlParams.numSkipInDistributionWindow =1;
    h264enc_params->rateControlParams.enableHRDComplianceMode   = 1;
    h264enc_params->rateControlParams.frameSkipThMulQ5          = 0;
    h264enc_params->rateControlParams.vbvUseLevelThQ5           = 0;
    h264enc_params->rateControlParams.reservedRC[0]             = 0;
    h264enc_params->rateControlParams.reservedRC[1]             = 0;
    h264enc_params->rateControlParams.reservedRC[2]             = 0;

    //intercoding coding params
    h264enc_params->interCodingParams.interCodingPreset         = IH264_INTERCODING_USERDEFINED;
    h264enc_params->interCodingParams.searchRangeHorP           = 144;
    h264enc_params->interCodingParams.searchRangeVerP           = 32;
    h264enc_params->interCodingParams.searchRangeHorB           = 144;
    h264enc_params->interCodingParams.searchRangeVerB           = 16;
    h264enc_params->interCodingParams.interCodingBias           = IH264_BIASFACTOR_DEFAULT;
    h264enc_params->interCodingParams.skipMVCodingBias          = IH264_BIASFACTOR_MILD;
    h264enc_params->interCodingParams.minBlockSizeP             = IH264_BLOCKSIZE_8x8;
    h264enc_params->interCodingParams.minBlockSizeB             = IH264_BLOCKSIZE_8x8;
    h264enc_params->interCodingParams.meAlgoMode                = IH264ENC_MOTIONESTMODE_DEFAULT;

    //intra coding params.
    h264enc_params->intraCodingParams.intraCodingPreset         = IH264_INTRACODING_DEFAULT;
    h264enc_params->intraCodingParams.lumaIntra4x4Enable        = 0;
    h264enc_params->intraCodingParams.lumaIntra8x8Enable        = 0x0FF;
    h264enc_params->intraCodingParams.lumaIntra16x16Enable      = 0;  // BASE PROFILE
    h264enc_params->intraCodingParams.chromaIntra8x8Enable      = 0;  // BASE PROFILE
    h264enc_params->intraCodingParams.chromaComponentEnable     = IH264_CHROMA_COMPONENT_CB_CR_BOTH;  // BASE PROFILE
    h264enc_params->intraCodingParams.intraRefreshMethod        = IH264_INTRAREFRESH_DEFAULT;
    h264enc_params->intraCodingParams.intraRefreshRate          = 0;
    h264enc_params->intraCodingParams.gdrOverlapRowsBtwFrames   = 0;
    h264enc_params->intraCodingParams.constrainedIntraPredEnable = 0;
    h264enc_params->intraCodingParams.intraCodingBias           = IH264ENC_INTRACODINGBIAS_DEFAULT;

    //NALU Control Params.
    h264enc_params->nalUnitControlParams.naluControlPreset              = IH264_NALU_CONTROL_USERDEFINED;
    h264enc_params->nalUnitControlParams.naluPresentMaskStartOfSequence = 0x21A0; // 416
    h264enc_params->nalUnitControlParams.naluPresentMaskIDRPicture      = 0x21A0; //32
    h264enc_params->nalUnitControlParams.naluPresentMaskIntraPicture    = 0x21A0;
    h264enc_params->nalUnitControlParams.naluPresentMaskNonIntraPicture = 0x21A0;
    h264enc_params->nalUnitControlParams.naluPresentMaskEndOfSequence   = 0x0C00; // 3072

    //Slice coding params
    h264enc_params->sliceCodingParams.sliceCodingPreset         = IH264_SLICECODING_DEFAULT;
    h264enc_params->sliceCodingParams.sliceMode                 = IH264_SLICEMODE_DEFAULT;
    h264enc_params->sliceCodingParams.sliceUnitSize             = 0;
    h264enc_params->sliceCodingParams.sliceStartOffset[0]       = 0;
    h264enc_params->sliceCodingParams.sliceStartOffset[1]       = 0;
    h264enc_params->sliceCodingParams.sliceStartOffset[2]       = 0;
    h264enc_params->sliceCodingParams.streamFormat              = IH264_STREAM_FORMAT_DEFAULT;

    //Loop Filter Params
    h264enc_params->loopFilterParams.loopfilterPreset           = IH264_LOOPFILTER_DEFAULT;
    h264enc_params->loopFilterParams.loopfilterDisableIDC       = IH264_DISABLE_FILTER_DEFAULT;
    h264enc_params->loopFilterParams.filterOffsetA              = 0;
    h264enc_params->loopFilterParams.filterOffsetB              = 0;

    //fmo coding params
    h264enc_params->fmoCodingParams.fmoCodingPreset                 = IH264_FMOCODING_DEFAULT;
    h264enc_params->fmoCodingParams.numSliceGroups                  = 1;
    h264enc_params->fmoCodingParams.sliceGroupMapType               = IH264_SLICE_GRP_MAP_DEFAULT;
    h264enc_params->fmoCodingParams.sliceGroupChangeDirectionFlag   = IH264ENC_SLICEGROUP_CHANGE_DIRECTION_DEFAULT;
    h264enc_params->fmoCodingParams.sliceGroupChangeRate            = 0;
    h264enc_params->fmoCodingParams.sliceGroupChangeCycle           = 0;
    h264enc_params->fmoCodingParams.sliceGroupParams[0]             = 0;
    h264enc_params->fmoCodingParams.sliceGroupParams[1]             = 0;

    //VUI Control Params
    h264enc_params->vuiCodingParams.vuiCodingPreset                 = IH264_VUICODING_USERDEFINED;
    h264enc_params->vuiCodingParams.aspectRatioInfoPresentFlag      = 1;
    h264enc_params->vuiCodingParams.aspectRatioIdc                  = IH264ENC_ASPECTRATIO_10_11;// : IH264ENC_ASPECTRATIO_16_11;
    h264enc_params->vuiCodingParams.videoSignalTypePresentFlag      = 0;
    h264enc_params->vuiCodingParams.videoFormat                     = IH264ENC_VIDEOFORMAT_NTSC;
    h264enc_params->vuiCodingParams.videoFullRangeFlag              = 0;
    h264enc_params->vuiCodingParams.timingInfoPresentFlag           = 1;
    h264enc_params->vuiCodingParams.hrdParamsPresentFlag            = 0;
    h264enc_params->vuiCodingParams.numUnitsInTicks                 = 1001;

    //Stereo Info Control Params
    h264enc_params->stereoInfoParams.stereoInfoPreset               = IH264_STEREOINFO_DISABLE;
    h264enc_params->stereoInfoParams.topFieldIsLeftViewFlag         = 1;
    h264enc_params->stereoInfoParams.viewSelfContainedFlag          = 0;

    //Frame Packing SEI Params
    h264enc_params->framePackingSEIParams.framePackingPreset        = IH264_FRAMEPACK_SEI_DISABLE;
    h264enc_params->framePackingSEIParams.framePackingType          = IH264_FRAMEPACK_TYPE_DEFAULT;
    h264enc_params->framePackingSEIParams.frame0PositionX           = 0;
    h264enc_params->framePackingSEIParams.frame0PositionY           = 0;
    h264enc_params->framePackingSEIParams.frame1PositionX           = 0;
    h264enc_params->framePackingSEIParams.frame1PositionY           = 0;
    h264enc_params->framePackingSEIParams.reservedByte              = 0;

    //SVC coding params
    h264enc_params->svcCodingParams.svcExtensionFlag                = IH264_SVC_EXTENSION_FLAG_DISABLE;
    h264enc_params->svcCodingParams.dependencyID                    = 0;
    h264enc_params->svcCodingParams.qualityID                       = 0;
    h264enc_params->svcCodingParams.enhancementProfileID            = 0;
    h264enc_params->svcCodingParams.layerIndex                      = 0;
    h264enc_params->svcCodingParams.refLayerDQId                    = 0;

    return 0;
}

static int setInitDynParams(S_VidEncode_Obj *videoEnc, dceEncObj_t *dceEncObj)
{
    VIDENC2_DynamicParams   *dynParams = NULL;
    IH264ENC_DynamicParams   *h264enc_dynParams = NULL;

    dynParams = dceEncObj->dynParams = dce_alloc(sizeof(IH264ENC_DynamicParams));
    if(!dceEncObj->dynParams) return -1;
    dceEncObj->dynParams->size = sizeof(IH264ENC_DynamicParams);

    dynParams->inputHeight              = videoEnc->vidHeight;
    dynParams->inputWidth               = videoEnc->vidWidth;
    dynParams->refFrameRate             = videoEnc->frameRate * 10; // refFrameRate in fps * 1000
    dynParams->targetFrameRate          = videoEnc->frameRate * 10; // Target frame rate in fps * 1000
    dynParams->targetBitRate            = videoEnc->bitRate * 1024;
    dynParams->intraFrameInterval       = 30;
    dynParams->generateHeader           = XDM_ENCODE_AU;
    dynParams->captureWidth             = videoEnc->vidWidth;
    dynParams->forceFrame               = IVIDEO_NA_FRAME;
    dynParams->sampleAspectRatioHeight  = 1;
    dynParams->sampleAspectRatioWidth   = 1;
    dynParams->ignoreOutbufSizeFlag     = XDAS_FALSE;  // If this is XDAS_TRUE then getBufferFxn and getBufferHandle needs to be set.
    dynParams->putDataFxn               = NULL;
    dynParams->putDataHandle            = NULL;
    dynParams->getDataFxn               = NULL;
    dynParams->getDataHandle            = NULL;
    dynParams->getBufferFxn             = NULL;
    dynParams->getBufferHandle          = NULL;
    dynParams->lateAcquireArg           = -1;

    dynParams->interFrameInterval       = 1; // 2 B frames
    dynParams->mvAccuracy               = IVIDENC2_MOTIONVECTOR_QUARTERPEL; //IVIDENC2_MotionVectorAccuracy

    h264enc_dynParams = (IH264ENC_DynamicParams *) dynParams;

    h264enc_dynParams->sliceGroupChangeCycle        = 0;
    h264enc_dynParams->searchCenter.x               = 0x7FFF; // or 32767
    h264enc_dynParams->searchCenter.y               = 0x7FFF; // or 32767
    h264enc_dynParams->enableStaticMBCount          = 0;
    h264enc_dynParams->enableROI                    = 0;
    h264enc_dynParams->reservedDynParams[0]         = 0;
    h264enc_dynParams->reservedDynParams[1]         = 0;
    h264enc_dynParams->reservedDynParams[2]         = 0;

    //Rate Control Params
    h264enc_dynParams->rateControlParams.rateControlParamsPreset    = IH264_RATECONTROLPARAMS_EXISTING;
    h264enc_dynParams->rateControlParams.scalingMatrixPreset        = IH264_SCALINGMATRIX_NONE;
    h264enc_dynParams->rateControlParams.rcAlgo                     = IH264_RATECONTROL_DEFAULT;
    h264enc_dynParams->rateControlParams.qpI                        = 28;
    h264enc_dynParams->rateControlParams.qpMaxI                     = 36;
    h264enc_dynParams->rateControlParams.qpMinI                     = 10;
    h264enc_dynParams->rateControlParams.qpP                        = 28;
    h264enc_dynParams->rateControlParams.qpMaxP                     = 40;
    h264enc_dynParams->rateControlParams.qpMinP                     = 10;
    h264enc_dynParams->rateControlParams.qpOffsetB                  = 4;
    h264enc_dynParams->rateControlParams.qpMaxB                     = 44;
    h264enc_dynParams->rateControlParams.qpMinB                     = 10;
    h264enc_dynParams->rateControlParams.allowFrameSkip             = 0;
    h264enc_dynParams->rateControlParams.removeExpensiveCoeff       = 0;
    h264enc_dynParams->rateControlParams.IPQualityFactor            = IH264_QUALITY_FACTOR_DEFAULT;
    h264enc_dynParams->rateControlParams.chromaQPIndexOffset        = 0;
    h264enc_dynParams->rateControlParams.initialBufferLevel         = 64000;
    h264enc_dynParams->rateControlParams.HRDBufferSize              = 64000;
    h264enc_dynParams->rateControlParams.enablePartialFrameSkip     = 0;
    h264enc_dynParams->rateControlParams.minPicSizeRatioI           = 0;
    h264enc_dynParams->rateControlParams.maxPicSizeRatioI           = 20;
    h264enc_dynParams->rateControlParams.minPicSizeRatioP           = 0;
    h264enc_dynParams->rateControlParams.maxPicSizeRatioP           = 0;
    h264enc_dynParams->rateControlParams.minPicSizeRatioB           = 0;
    h264enc_dynParams->rateControlParams.maxPicSizeRatioB           = 0;
    h264enc_dynParams->rateControlParams.enablePRC                  = 1;
    h264enc_dynParams->rateControlParams.enableHRDComplianceMode    = 0;
    h264enc_dynParams->rateControlParams.reserved                   = 0;
    h264enc_dynParams->rateControlParams.VBRDuration                = 8;
    h264enc_dynParams->rateControlParams.VBRsensitivity             = 0;
    h264enc_dynParams->rateControlParams.skipDistributionWindowLength = 5;
    h264enc_dynParams->rateControlParams.numSkipInDistributionWindow = 1;
    h264enc_dynParams->rateControlParams.enableHRDComplianceMode    = 1;
    h264enc_dynParams->rateControlParams.frameSkipThMulQ5           = 0;
    h264enc_dynParams->rateControlParams.vbvUseLevelThQ5            = 0;
    h264enc_dynParams->rateControlParams.reservedRC[0]              = 0;
    h264enc_dynParams->rateControlParams.reservedRC[1]              = 0;
    h264enc_dynParams->rateControlParams.reservedRC[2]              = 0;

    //Inter Coding Params
    h264enc_dynParams->interCodingParams.interCodingPreset          = IH264_INTERCODING_EXISTING;
    h264enc_dynParams->interCodingParams.searchRangeHorP            = 144;
    h264enc_dynParams->interCodingParams.searchRangeVerP            = 32;
    h264enc_dynParams->interCodingParams.searchRangeHorB            = 144;
    h264enc_dynParams->interCodingParams.searchRangeVerB            = 16;
    h264enc_dynParams->interCodingParams.interCodingBias            = IH264_BIASFACTOR_DEFAULT;
    h264enc_dynParams->interCodingParams.skipMVCodingBias           = IH264_BIASFACTOR_MILD;
    h264enc_dynParams->interCodingParams.minBlockSizeP              = IH264_BLOCKSIZE_8x8;
    h264enc_dynParams->interCodingParams.minBlockSizeB              = IH264_BLOCKSIZE_8x8;
    h264enc_dynParams->interCodingParams.meAlgoMode                 = IH264ENC_MOTIONESTMODE_DEFAULT;

    //Intra Coding Params
    h264enc_dynParams->intraCodingParams.intraCodingPreset          = IH264_INTRACODING_EXISTING;
    h264enc_dynParams->intraCodingParams.lumaIntra4x4Enable         = 0xFF; // or 255 BASE PROFILE
    h264enc_dynParams->intraCodingParams.lumaIntra8x8Enable         = 0; // BASE PROFILE
    h264enc_dynParams->intraCodingParams.lumaIntra16x16Enable       = 0;
    h264enc_dynParams->intraCodingParams.chromaIntra8x8Enable       = 0;
    h264enc_dynParams->intraCodingParams.chromaComponentEnable      = IH264_CHROMA_COMPONENT_CB_CR_BOTH;
    h264enc_dynParams->intraCodingParams.intraRefreshMethod         = IH264_INTRAREFRESH_DEFAULT;
    h264enc_dynParams->intraCodingParams.intraRefreshRate           = 0;
    h264enc_dynParams->intraCodingParams.gdrOverlapRowsBtwFrames    = 0;
    h264enc_dynParams->intraCodingParams.constrainedIntraPredEnable = 0;
    h264enc_dynParams->intraCodingParams.intraCodingBias            = IH264ENC_INTRACODINGBIAS_DEFAULT;

    //Slice Coding Params
    h264enc_dynParams->sliceCodingParams.sliceCodingPreset          = IH264_SLICECODING_EXISTING;
    h264enc_dynParams->sliceCodingParams.sliceMode                  = IH264_SLICEMODE_DEFAULT;
    h264enc_dynParams->sliceCodingParams.sliceUnitSize              = 0;
    h264enc_dynParams->sliceCodingParams.sliceStartOffset[0]        = 0;
    h264enc_dynParams->sliceCodingParams.sliceStartOffset[1]        = 0;
    h264enc_dynParams->sliceCodingParams.sliceStartOffset[2]        = 0;
    h264enc_dynParams->sliceCodingParams.streamFormat               = IH264_STREAM_FORMAT_DEFAULT;

    dceEncObj->h264enc_dynParams = h264enc_dynParams;

    dceEncObj->h264enc_status = dce_alloc(sizeof(IH264ENC_Status));

    if(!dceEncObj->h264enc_status)
    {
        Report_Log(LOG_WARNING, "dce_alloc enc status failed");
        return -1;
    }

    ((VIDENC2_Status*)(dceEncObj->h264enc_status))->size = sizeof(IH264ENC_Status);

    dceEncObj->status = (VIDENC2_Status*) (dceEncObj->h264enc_status);

    Report_Log(LOG_DEBUG, "encoder params res: %dx%d fr %dfps br %dkbps rotated %d profile_value %d level %d",
               dynParams->inputWidth, dynParams->inputHeight, videoEnc->frameRate, videoEnc->bitRate, videoEnc->rotation, dceEncObj->profile, dceEncObj->level);


    return 0;
}

  • The software team have been notified. They will respond here.
  • Hello,

    The am572x is able to handle 720p30 h264 encoding.
    Are they observe the issue when the default videnc2test demo is used?

    BR
    Margarita
  • Margarita,

    I suspect they have some sort of configuration issue and they are looking for guidance on this. They report that if they try to encode at 480p rate then they are able to achieve 30fps.

    Regards,

    Lawrence
  • Hello,

    Please could you check with the default videnc2test demo?
    You could try with gstreamer encoding pipeline also.
    What is the application that they are using only is it only encoding?

    BR
    Margarita
  • More information from the customer the application is performing a transcode H.265 (on ARM) to H.264 (HWA):

    They noticed that memcpy(720p YUV frame to ybuff and uvbuff for fdy and fduv) takes more than 30msec with thier code.

     

            memcpy((char *)dceEncObj->buf.ybuff, inFrameObj->buff, (videoEnc->vidWidth * videoEnc->vidHeight));<

            memcpy((char *)dceEncObj->buf.uvbuff, &inFrameObj->buff[videoEnc->vidWidth * videoEnc->vidHeight],<

                ((videoEnc->vidWidth * videoEnc->vidHeight) >> 1));<

     

    The player is idle, it only takes 3 msec.(h265 software decoding, so CPU is very busy)

     

    Is there any way to improve memcpy performance

  • Hello,

    I tested transcoding on my side with gstreamer.
    I used this pipeline :

    gst-launch-1.0 filesrc location=TearOfSteel-Short-1280x720.265 ! 'video/x-raw, format=(string)NV12, framerate=(fraction)30/1, width=(int)1280, height=(int)720' ! h265dec threads=2 ! vpe ! 'video/x-raw, format=(string)NV12, width=(int)1280, height=(int)720' ! queue ! ducatih264enc ! h264parse ! qtmux ! filesink location=trans.mov

    For decoding:

    gst-launch-1.0 -v playbin uri=file:///usr/share/ti/video/trans.mov video-sink=fpsdisplaysink


    Here is part of the output:

    /GstPlayBin:playbin0/GstPlaySink:playsink/GstBin:vbin/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 92, dropped: 0, current: 29.75, average: 30.00
    /GstPlayBin:playbin0/GstPlaySink:playsink/GstBin:vbin/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 92, dropped: 0, current: 29.75, average: 30.00
    /GstPlayBin:playbin0/GstPlaySink:playsink/GstBin:vbin/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 108, dropped: 0, current: 30.75, average: 30.11
    /GstPlayBin:playbin0/GstPlaySink:playsink/GstBin:vbin/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 108, dropped: 0, current: 30.72, average: 30.11
    /GstPlayBin:playbin0/GstPlaySink:playsink/GstBin:vbin/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 123, dropped: 0, current: 29.78, average: 30.07
    /GstPlayBin:playbin0/GstPlaySink:playsink/GstBin:vbin/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 123, dropped: 0, current: 29.78, average: 30.07
    /GstPlayBin:playbin0/GstPlaySink:playsink/GstBin:vbin/GstFPSDisplaySink:fpsdisplaysink0/GstTextOverlay:fps-display-text-overlay: text = rendered: 138, dropped: 0, current: 29.74, average: 30.03
    /GstPlayBin:playbin0/GstPlaySink:playsink/GstBin:vbin/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 138, dropped: 0, current: 29.74, average: 30.03


    It seems like 15fps is observed on customers side due memcpy so they should avoid it.

    Hope this helps.

    BR
    Margarita
  • Margarita,

    When using gstreamer pipeline is that implementing zero overhead copy or DMA? Is there code example I can point the customer to?

    Regards,

    Lawrence
  • Hello,

    I am sorry for the delay. I was out of office.
    Gstreamer uses dmabuf which means zero buffer copy(they could check capture->enc pipeline also).
    The cause of the issue is memcpy.

    Hope this helps.

    BR
    Margarita
  • Hello Lawrence,

    I am closing this thread. Please feel free to reopen it again.

    BR
    Margarita