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.

DM8127 H264 GDR codec

Other Parts Discussed in Thread: DM385

Hi,
        I have a problem with DM8127 H264 codec about GDR mode.I have enable the GDR mode with "intraRefreshRate = 2;gdrOverlapRowsBtwFrames = 1;".But the paramsters "IH264ENC_CTRL_START_GDR" must be set periodic. If you just set only once, it just refresh one frame, and will not continue. So it is right ?
And when I set IH264ENC_CTRL_START_GDR , the current frame will be very bigger. So how can I control it ? I have a sample H.264 stream by others. The rate control is must better . How they do that ?

  • Hi,
    Can you tell me the below details?
    1. Are you encoding interlaced or progressive?
    2. What is the intraRefreshMethod you set?
    3. encodingPreset = ?.
    4. By seeing the snapshot attached, I assume you dont encode any B-frame. Please confirm this.

    Also Refer to H.264 Encoder user guide's APPENDIX-O. This will give you an idea on how to use GDR.

  • Hi,

    1. I am encoding progressive.

    2. .intraRefreshMethod = IH264_INTRAREFRESH_GDR

    3.encodingPreset = XDM_USER_DEFINED;

    4.I do not encode any B-frame.

    The GDR refresh  need to be acvtived by "IH264ENC_CTRL_START_GDR"  periodly , or not ?  Now If I set IH264ENC_CTRL_START_GDR, the GDR will refresh .But when it refresh the whole frame, it will stop. And I need to set IH264ENC_CTRL_START_GDR to restart.  Is it normally ?

  • Hi,

    Thanks for the details.

    Antimax Antimax said:
    The GDR refresh  need to be acvtived by "IH264ENC_CTRL_START_GDR"  periodly , or not ?  Now If I set IH264ENC_CTRL_START_GDR, the GDR will refresh .But when it refresh the whole frame, it will stop. And I need to set IH264ENC_CTRL_START_GDR to restart.  Is it normally ?

    yes. It needs to be set periodically. It is normal behaviour.

  • Hi,

    Thanks. 

    But how to control stream rate like that ?  I need the bitrate to be smooth . But  when I set IH264ENC_CTRL_START_GDR, the current frame length will be more bigger than others. But why ?

  • Hi,

    Can you share your encoder parameter settings? 

  • Hi,

    Thanks a lot.  My paramster is blew.

    /*--------------------------------------------------------------------------*/
    /* First set default values to base class XDM params structure */
    /* Please refer User guide Table 4.5 for further details on values */
    /*--------------------------------------------------------------------------*/
    params->videnc2Params.encodingPreset = XDM_USER_DEFINED; //Docter shen
    params->videnc2Params.rateControlPreset = IVIDEO_LOW_DELAY;
    // params->videnc2Params.rateControlPreset = IVIDEO_STORAGE;
    params->videnc2Params.maxHeight = IMG_HEIGHT;
    params->videnc2Params.maxWidth = IMG_WIDTH;
    params->videnc2Params.dataEndianness = XDM_BYTE;
    params->videnc2Params.maxInterFrameInterval = 1;
    params->videnc2Params.maxBitRate = -1;
    // params->videnc2Params.maxBitRate = 1500000; //Docter shen
    params->videnc2Params.minBitRate = 0;
    params->videnc2Params.inputChromaFormat = XDM_YUV_420SP;
    params->videnc2Params.inputContentType = IVIDEO_PROGRESSIVE;
    params->videnc2Params.operatingMode = IVIDEO_ENCODE_ONLY;
    params->videnc2Params.profile = IH264_HIGH_PROFILE;
    params->videnc2Params.level = IH264_LEVEL_51;
    params->videnc2Params.inputDataMode = IVIDEO_ENTIREFRAME;//IVIDEO_NUMROWS; //Antimax IVIDEO_ENTIREFRAME
    params->videnc2Params.outputDataMode = IVIDEO_ENTIREFRAME;//IVIDEO_SLICEMODE; //Antimax IVIDEO_ENTIREFRAME
    params->videnc2Params.numInputDataUnits = 1;
    params->videnc2Params.numOutputDataUnits = 1;

    /*--------------------------------------------------------------------------*/
    /* Set rate controll params in extended XDM params structure */
    /* Please refer User guide Table 4.7 for further details on values */
    /*--------------------------------------------------------------------------*/
    params->rateControlParams.rateControlParamsPreset = IH264_RATECONTROLPARAMS_USERDEFINED;
    params->rateControlParams.scalingMatrixPreset = IH264_SCALINGMATRIX_DEFAULT;
    params->rateControlParams.rcAlgo = IH264_RATECONTROL_DEFAULT;
    params->rateControlParams.minPicSizeRatioI = 0;
    params->rateControlParams.maxPicSizeRatioI = 640;
    params->rateControlParams.minPicSizeRatioP = 0;
    params->rateControlParams.maxPicSizeRatioP = 0;
    params->rateControlParams.minPicSizeRatioB = 0;
    params->rateControlParams.maxPicSizeRatioB = 0;
    params->rateControlParams.frameSkipThMulQ5 = 0;
    params->rateControlParams.vbvUseLevelThQ5 = 0;

    params->rateControlParams.qpI = -1;
    params->rateControlParams.qpP = -1;
    params->rateControlParams.qpOffsetB = 4;

    params->rateControlParams.qpMaxI = 40;
    params->rateControlParams.qpMinI = 10;
    params->rateControlParams.qpMaxP = 51;
    params->rateControlParams.qpMinP = 10;
    params->rateControlParams.qpMaxB = 51;
    params->rateControlParams.qpMinB = 10;

    params->rateControlParams.allowFrameSkip = 0;
    params->rateControlParams.removeExpensiveCoeff = 0;
    params->rateControlParams.chromaQPIndexOffset = 0;
    params->rateControlParams.IPQualityFactor = IH264_QUALITY_FACTOR_DEFAULT;

    #if (GDR_MODE_ENABLE)
    params->rateControlParams.initialBufferLevel = 5000000;
    params->rateControlParams.HRDBufferSize = 5000000;
    #else
    params->rateControlParams.initialBufferLevel = 1024000;
    params->rateControlParams.HRDBufferSize = params->rateControlParams.initialBufferLevel * 2;
    #endif

    params->rateControlParams.enablePRC = 1;
    params->rateControlParams.enablePartialFrameSkip = 0;
    params->rateControlParams.discardSavedBits = 0;
    params->rateControlParams.VBRDuration = 8;
    params->rateControlParams.VBRsensitivity = 0;

    #if (GDR_MODE_ENABLE)
    params->rateControlParams.skipDistributionWindowLength = 5;
    params->rateControlParams.numSkipInDistributionWindow = 1;
    #else
    params->rateControlParams.skipDistributionWindowLength = 0;
    params->rateControlParams.numSkipInDistributionWindow = 0;
    #endif

    params->rateControlParams.enableHRDComplianceMode = 1;
    /*--------------------------------------------------------------------------*/
    /* Set Inter coding params in extended XDM params structure */
    /* Please refer User guide Table 4.8 for further details on values */
    /*--------------------------------------------------------------------------*/
    params->interCodingParams.interCodingPreset = IH264_INTERCODING_USERDEFINED;
    params->interCodingParams.searchRangeHorP = 144;
    params->interCodingParams.searchRangeVerP = 32;
    params->interCodingParams.searchRangeHorB = 144;
    params->interCodingParams.searchRangeVerB = 16;
    params->interCodingParams.interCodingBias = IH264_BIASFACTOR_DEFAULT;
    params->interCodingParams.skipMVCodingBias = IH264_BIASFACTOR_DEFAULT;
    #if (GDR_MODE_ENABLE)
    params->interCodingParams.minBlockSizeP = 0;
    params->interCodingParams.minBlockSizeB = 0;
    #else
    params->interCodingParams.minBlockSizeP = IH264_BLOCKSIZE_8x8;
    params->interCodingParams.minBlockSizeB = IH264_BLOCKSIZE_8x8;
    #endif
    params->interCodingParams.meAlgoMode = IH264ENC_MOTIONESTMODE_DEFAULT;

    /*--------------------------------------------------------------------------*/
    /* Set Intra coding params in extended XDM params structure */
    /* Please refer User guide Table 4.9 for further details on values */
    /*--------------------------------------------------------------------------*/
    params->intraCodingParams.lumaIntra4x4Enable = 0x0FF;
    params->intraCodingParams.lumaIntra8x8Enable = 0x0FF;
    params->intraCodingParams.lumaIntra16x16Enable = 0xF;
    params->intraCodingParams.chromaIntra8x8Enable = 0xF;
    params->intraCodingParams.chromaComponentEnable = IH264_CHROMA_COMPONENT_DEFAULT;

    #if (GDR_MODE_ENABLE)
    params->intraCodingParams.intraCodingPreset = IH264_INTRACODING_USERDEFINED;
    params->intraCodingParams.intraRefreshMethod = IH264_INTRAREFRESH_GDR;
    params->intraCodingParams.intraRefreshRate = 2;
    params->intraCodingParams.gdrOverlapRowsBtwFrames = 1;
    #else
    params->intraCodingParams.intraCodingPreset = IH264_INTRACODING_DEFAULT;
    params->intraCodingParams.intraRefreshMethod = IH264_INTRAREFRESH_DEFAULT;
    params->intraCodingParams.intraRefreshRate = 0;
    params->intraCodingParams.gdrOverlapRowsBtwFrames = 0;
    #endif
    params->intraCodingParams.constrainedIntraPredEnable = 0;
    params->intraCodingParams.intraCodingBias = 0;

    /*--------------------------------------------------------------------------*/
    /* Set NAL unit coding params in extended XDM params structure */
    /* Please refer User guide Table 4.10 for further details on values */
    /*--------------------------------------------------------------------------*/
    #if (GDR_MODE_ENABLE)
    params->nalUnitControlParams.naluControlPreset = IH264_NALU_CONTROL_USERDEFINED;
    params->nalUnitControlParams.naluPresentMaskStartOfSequence = 8608;
    params->nalUnitControlParams.naluPresentMaskIDRPicture = 8672;
    params->nalUnitControlParams.naluPresentMaskIntraPicture = 8450;
    #else
    params->nalUnitControlParams.naluControlPreset = IH264_NALU_CONTROL_DEFAULT;
    params->nalUnitControlParams.naluPresentMaskStartOfSequence = 416;
    params->nalUnitControlParams.naluPresentMaskIDRPicture = 416;
    params->nalUnitControlParams.naluPresentMaskIntraPicture = 2;
    #endif
    params->nalUnitControlParams.naluPresentMaskNonIntraPicture = 2;
    params->nalUnitControlParams.naluPresentMaskEndOfSequence = 3072;

    /*--------------------------------------------------------------------------*/
    /* Set Slice coding params in extended XDM params structure */
    /* Please refer User guide Table 4.11 for further details on values */
    /*--------------------------------------------------------------------------*/
    params->sliceCodingParams.sliceCodingPreset = IH264_SLICECODING_DEFAULT;//IH264_SLICECODING_USERDEFINED;//Antimax IH264_SLICECODING_DEFAULT;
    params->sliceCodingParams.sliceMode = IH264_SLICEMODE_DEFAULT;//IH264_SLICEMODE_MBUNIT;//Antimax IH264_SLICEMODE_DEFAULT;
    params->sliceCodingParams.sliceUnitSize = 352;
    params->sliceCodingParams.sliceStartOffset[0] = 0;
    params->sliceCodingParams.sliceStartOffset[1] = 0;
    params->sliceCodingParams.sliceStartOffset[2] = 0;
    params->sliceCodingParams.streamFormat = IH264_STREAM_FORMAT_DEFAULT;//IH264_BYTE_STREAM;//Antimax IH264_STREAM_FORMAT_DEFAULT;

    /*--------------------------------------------------------------------------*/
    /* Set Loop filter coding params in extended XDM params structure */
    /* Please refer User guide Table 4.12 for further details on values */
    /*--------------------------------------------------------------------------*/
    params->loopFilterParams.loopfilterPreset = IH264_LOOPFILTER_DEFAULT;
    params->loopFilterParams.loopfilterDisableIDC = IH264_DISABLE_FILTER_DEFAULT;
    params->loopFilterParams.filterOffsetA = 0;
    params->loopFilterParams.filterOffsetB = 0;

    /*--------------------------------------------------------------------------*/
    /* Set VUI coding params in extended XDM params structure */
    /* Please refer User guide Table 4.14 for further details on values */
    /*--------------------------------------------------------------------------*/
    #if (GDR_MODE_ENABLE)
    params->vuiCodingParams.vuiCodingPreset = IH264_VUICODING_USERDEFINED;
    params->vuiCodingParams.aspectRatioInfoPresentFlag = 0;
    params->vuiCodingParams.aspectRatioIdc = 255;
    params->vuiCodingParams.videoSignalTypePresentFlag = 1;
    params->vuiCodingParams.videoFormat = 5;
    params->vuiCodingParams.videoFullRangeFlag = 1;
    #else
    params->vuiCodingParams.vuiCodingPreset = IH264_VUICODING_DEFAULT;
    params->vuiCodingParams.aspectRatioInfoPresentFlag = 1;
    params->vuiCodingParams.aspectRatioIdc = 1;
    params->vuiCodingParams.videoSignalTypePresentFlag = 0;
    params->vuiCodingParams.videoFormat = IH264ENC_VIDEOFORMAT_NTSC;
    params->vuiCodingParams.videoFullRangeFlag = 0;
    #endif
    params->vuiCodingParams.timingInfoPresentFlag = 1;
    params->vuiCodingParams.numUnitsInTicks = 1000;
    params->vuiCodingParams.hrdParamsPresentFlag = 1;

    /*--------------------------------------------------------------------------*/
    /* disable frame packing SEI encoding coding params by default */
    /*--------------------------------------------------------------------------*/
    params->framePackingSEIParams.framePackingPreset = 0;
    #if (GDR_MODE_ENABLE)
    params->framePackingSEIParams.framePackingType = IH264_FRAMEPACK_CHECKERBOARD;
    #else
    params->framePackingSEIParams.framePackingType = IH264_FRAMEPACK_SIDE_BY_SIDE;
    #endif
    params->framePackingSEIParams.frame0PositionX = 0;
    params->framePackingSEIParams.frame0PositionY = 0;
    params->framePackingSEIParams.frame1PositionX = 0;
    params->framePackingSEIParams.frame1PositionY = 0;

    /*--------------------------------------------------------------------------*/
    /* Set StereoVideoinformation coding params in extended XDM params structure*/
    /* Please refer User guide for further details on values */
    /*--------------------------------------------------------------------------*/
    params->stereoInfoParams.stereoInfoPreset = IH264_STEREOINFO_DISABLE;
    params->stereoInfoParams.topFieldIsLeftViewFlag = 1;
    params->stereoInfoParams.viewSelfContainedFlag = 0;

    /*--------------------------------------------------------------------------*/
    /* Set FMO coding params in extended XDM params structure */
    /* Please refer User guide Table 4.13 for further details on values */
    /*--------------------------------------------------------------------------*/
    params->fmoCodingParams.fmoCodingPreset = IH264_FMOCODING_DEFAULT;
    params->fmoCodingParams.numSliceGroups = 1;
    params->fmoCodingParams.sliceGroupMapType = IH264_SLICE_GRP_MAP_DEFAULT;
    params->fmoCodingParams.sliceGroupChangeDirectionFlag = IH264ENC_SLICEGROUP_CHANGE_DIRECTION_DEFAULT;
    params->fmoCodingParams.sliceGroupChangeRate = 0;
    params->fmoCodingParams.sliceGroupChangeCycle = 0;
    params->fmoCodingParams.sliceGroupParams[0] = 0;
    params->fmoCodingParams.sliceGroupParams[1] = 0;

    /*--------------------------------------------------------------------------*/
    /* Set Extended XDM Encode parameters in extended XDM params structure */
    /* Please refer User guide Table 4.15 for further details on values */
    /*--------------------------------------------------------------------------*/
    params->interlaceCodingType = IH264_INTERLACE_FIELDONLY_ARF;
    params->bottomFieldIntra = 0;
    params->gopStructure = IH264ENC_GOPSTRUCTURE_NONUNIFORM;
    params->entropyCodingMode = IH264_ENTROPYCODING_CABAC;

    #if (GDR_MODE_ENABLE)
    params->transformBlockSize = IH264_TRANSFORM_8x8;
    params->log2MaxFNumMinus4 = 10;
    params->IDRFrameInterval = 0;
    #else
    params->transformBlockSize = IH264_TRANSFORM_ADAPTIVE;
    params->log2MaxFNumMinus4 = 8;
    params->IDRFrameInterval = 25;
    #endif
    params->picOrderCountType = IH264_POC_TYPE_0;
    params->enableRCDO = 0;

    params->pConstantMemory = 0;
    params->reservedParams[0] = 0;
    params->reservedParams[1] = 0x1F;
    params->reservedParams[2] = 0;
    params->enableGMVSei = 0;
    params->constraintSetFlags = 0;
    params->enableLongTermRefFrame = 0;
    params->enableWatermark = 0;
    params->LTRPPeriod = 0xFFFFFFFF;
    params->numTemporalLayer = IH264_TEMPORAL_LAYERS_1;
    params->referencePicMarking = IH264_LONG_TERM_PICTURE;
    params->svcCodingParams.dependencyID = 0;
    params->svcCodingParams.qualityID = 0;
    params->svcCodingParams.enhancementProfileID = 0;
    params->svcCodingParams.layerIndex = 0;
    params->svcCodingParams.svcExtensionFlag = IH264_SVC_EXTENSION_FLAG_DISABLE;
    params->debugTraceLevel = 1;
    params->lastNFramesToLog = 0;
    params->enableAnalyticinfo = 0;

    /*--------------------------------------------------------------------------*/
    /* Set dynamic parameters */
    /* Most of the default parameters can be copied from Encdoer params */
    /*--------------------------------------------------------------------------*/
    memcpy(&((dynamicParams)->rateControlParams), &(params->rateControlParams), sizeof(IH264ENC_RateControlParams));
    memcpy(&((dynamicParams)->interCodingParams), &(params->interCodingParams), sizeof(IH264ENC_InterCodingParams));
    memcpy(&((dynamicParams)->intraCodingParams), &(params->intraCodingParams), sizeof(IH264ENC_IntraCodingParams));
    memcpy(&((dynamicParams)->sliceCodingParams), &(params->sliceCodingParams), sizeof(IH264ENC_SliceCodingParams));
    /*--------------------------------------------------------------------------*/
    /* Set all the XDM dynamic values to default values */
    /*--------------------------------------------------------------------------*/
    dynamicParams->videnc2DynamicParams.size = sizeof(IH264ENC_DynamicParams);
    dynamicParams->videnc2DynamicParams.captureWidth = IMG_WIDTH;
    dynamicParams->videnc2DynamicParams.forceFrame = IVIDEO_NA_FRAME;
    dynamicParams->videnc2DynamicParams.generateHeader = XDM_ENCODE_AU;
    dynamicParams->videnc2DynamicParams.ignoreOutbufSizeFlag = 1;
    dynamicParams->videnc2DynamicParams.inputHeight = IMG_HEIGHT;
    dynamicParams->videnc2DynamicParams.inputWidth = IMG_WIDTH;
    dynamicParams->videnc2DynamicParams.interFrameInterval = 1; //modify by david
    #if (GDR_MODE_ENABLE)
    dynamicParams->videnc2DynamicParams.intraFrameInterval = 0;
    #else
    dynamicParams->videnc2DynamicParams.intraFrameInterval = 30;
    #endif

    #if (GDR_MODE_ENABLE)
    dynamicParams->videnc2DynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_PIXEL;
    #else
    dynamicParams->videnc2DynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
    #endif
    dynamicParams->videnc2DynamicParams.putDataFxn = NULL;
    dynamicParams->videnc2DynamicParams.putDataHandle = 0;
    dynamicParams->videnc2DynamicParams.refFrameRate = 30000;
    dynamicParams->videnc2DynamicParams.sampleAspectRatioHeight = 1;
    dynamicParams->videnc2DynamicParams.sampleAspectRatioWidth = 1;
    dynamicParams->videnc2DynamicParams.targetBitRate = 2000000;
    dynamicParams->videnc2DynamicParams.targetFrameRate = 30000;

    dynamicParams->videnc2DynamicParams.putDataFxn = NULL;
    dynamicParams->videnc2DynamicParams.getDataFxn = NULL;
    dynamicParams->videnc2DynamicParams.getBufferFxn = NULL;
    dynamicParams->videnc2DynamicParams.getDataHandle = NULL;

    dynamicParams->sliceGroupChangeCycle = params->fmoCodingParams.sliceGroupChangeCycle;

    dynamicParams->searchCenter.x = 32767;
    dynamicParams->searchCenter.y = 0;
    dynamicParams->enableStaticMBCount = 0;
    dynamicParams->enableROI = 0;
    dynamicParams->reservedDynParams[0] = 0;
    dynamicParams->reservedDynParams[1] = 0;
    dynamicParams->reservedDynParams[2] = 0;

    params->maxIntraFrameInterval = dynamicParams->videnc2DynamicParams.intraFrameInterval;

    for (i = 0; i < IVIDEO_MAX_NUM_METADATA_PLANES; i++)
    {
    params->videnc2Params.metadataType[i] = IVIDEO_METADATAPLANE_NONE;
    }

    venc_params.h264_status.videnc2Status.size = sizeof(IH264ENC_Status);
    venc_params.h264_status.videnc2Status.extendedError = 0;
    venc_params.h264_params.videnc2Params.size = sizeof(IH264ENC_Params);
    venc_params.h264_dynamic_params.videnc2DynamicParams.size = sizeof(IH264ENC_DynamicParams);
    venc_params.h264_dynamic_params.videnc2DynamicParams.lateAcquireArg = 0x100;
    venc_params.h264_dynamic_params.videnc2DynamicParams.captureWidth = IMG_WIDTH;
    venc_params.h264_dynamic_params.videnc2DynamicParams.inputHeight = IMG_HEIGHT;
    venc_params.h264_dynamic_params.videnc2DynamicParams.inputWidth = IMG_WIDTH;
    venc_params.h264_dynamic_params.videnc2DynamicParams.targetBitRate = 1500000; //1800000; //3500000;
    venc_params.h264_dynamic_params.videnc2DynamicParams.targetFrameRate = 30000;

    #if (GDR_MODE_ENABLE)
    venc_params.b_gdr_mode = 0x1;
    venc_params.gdr_interval = venc_params.h264_dynamic_params.videnc2DynamicParams.inputHeight >> 4;
    venc_params.h264_dynamic_params.videnc2DynamicParams.lateAcquireArg = 0;
    #endif

  • Hi,

    Thanks  you very much. The attach file is my parameter.

    encode parameter.txt
      /*--------------------------------------------------------------------------*/
        /* First set default values to base class XDM params structure              */
        /* Please refer User guide Table 4.5 for further details on values          */
        /*--------------------------------------------------------------------------*/
        params->videnc2Params.encodingPreset = XDM_USER_DEFINED;   //Docter shen
        params->videnc2Params.rateControlPreset = IVIDEO_LOW_DELAY;
    //    params->videnc2Params.rateControlPreset = IVIDEO_STORAGE;
        params->videnc2Params.maxHeight = IMG_HEIGHT;
        params->videnc2Params.maxWidth = IMG_WIDTH;
        params->videnc2Params.dataEndianness = XDM_BYTE;
        params->videnc2Params.maxInterFrameInterval = 1;
        params->videnc2Params.maxBitRate = -1;
    //    params->videnc2Params.maxBitRate = 1500000;  //Docter shen
        params->videnc2Params.minBitRate = 0;
        params->videnc2Params.inputChromaFormat = XDM_YUV_420SP;
        params->videnc2Params.inputContentType = IVIDEO_PROGRESSIVE;
        params->videnc2Params.operatingMode = IVIDEO_ENCODE_ONLY;
        params->videnc2Params.profile = IH264_HIGH_PROFILE;
        params->videnc2Params.level = IH264_LEVEL_51;
        params->videnc2Params.inputDataMode = IVIDEO_ENTIREFRAME;//IVIDEO_NUMROWS;   //Antimax  IVIDEO_ENTIREFRAME
        params->videnc2Params.outputDataMode = IVIDEO_ENTIREFRAME;//IVIDEO_SLICEMODE; //Antimax IVIDEO_ENTIREFRAME
        params->videnc2Params.numInputDataUnits = 1;
        params->videnc2Params.numOutputDataUnits = 1;
    
        /*--------------------------------------------------------------------------*/
        /* Set rate controll params in extended XDM params structure                */
        /* Please refer User guide Table 4.7 for further details on values          */
        /*--------------------------------------------------------------------------*/
        params->rateControlParams.rateControlParamsPreset = IH264_RATECONTROLPARAMS_USERDEFINED;
        params->rateControlParams.scalingMatrixPreset = IH264_SCALINGMATRIX_DEFAULT;
        params->rateControlParams.rcAlgo = IH264_RATECONTROL_DEFAULT;
        params->rateControlParams.minPicSizeRatioI = 0;
        params->rateControlParams.maxPicSizeRatioI = 640;
        params->rateControlParams.minPicSizeRatioP = 0;
        params->rateControlParams.maxPicSizeRatioP = 0;
        params->rateControlParams.minPicSizeRatioB = 0;
        params->rateControlParams.maxPicSizeRatioB = 0;
        params->rateControlParams.frameSkipThMulQ5 = 0;
        params->rateControlParams.vbvUseLevelThQ5 = 0;
    
        params->rateControlParams.qpI = -1;
        params->rateControlParams.qpP = -1;
        params->rateControlParams.qpOffsetB = 4;
    
        params->rateControlParams.qpMaxI = 40;
        params->rateControlParams.qpMinI = 10;
        params->rateControlParams.qpMaxP = 51;
        params->rateControlParams.qpMinP = 10;
        params->rateControlParams.qpMaxB = 51;
        params->rateControlParams.qpMinB = 10;
    
        params->rateControlParams.allowFrameSkip = 0;
        params->rateControlParams.removeExpensiveCoeff = 0;
        params->rateControlParams.chromaQPIndexOffset = 0;
        params->rateControlParams.IPQualityFactor = IH264_QUALITY_FACTOR_DEFAULT;
    
    #if (GDR_MODE_ENABLE)
        params->rateControlParams.initialBufferLevel = 5000000;
        params->rateControlParams.HRDBufferSize = 5000000;
    #else
        params->rateControlParams.initialBufferLevel = 1024000;
        params->rateControlParams.HRDBufferSize = params->rateControlParams.initialBufferLevel * 2;
    #endif
    
        params->rateControlParams.enablePRC = 1;
        params->rateControlParams.enablePartialFrameSkip = 0;
        params->rateControlParams.discardSavedBits = 0;
        params->rateControlParams.VBRDuration = 8;
        params->rateControlParams.VBRsensitivity = 0;
    
    #if (GDR_MODE_ENABLE)
        params->rateControlParams.skipDistributionWindowLength = 5;
        params->rateControlParams.numSkipInDistributionWindow = 1;
    #else
        params->rateControlParams.skipDistributionWindowLength = 0;
        params->rateControlParams.numSkipInDistributionWindow = 0;
    #endif
    
        params->rateControlParams.enableHRDComplianceMode = 1;
        /*--------------------------------------------------------------------------*/
        /* Set Inter coding params in extended XDM params structure                 */
        /* Please refer User guide Table 4.8 for further details on values          */
        /*--------------------------------------------------------------------------*/
        params->interCodingParams.interCodingPreset = IH264_INTERCODING_USERDEFINED;
        params->interCodingParams.searchRangeHorP = 144;
        params->interCodingParams.searchRangeVerP = 32;
        params->interCodingParams.searchRangeHorB = 144;
        params->interCodingParams.searchRangeVerB = 16;
        params->interCodingParams.interCodingBias = IH264_BIASFACTOR_DEFAULT;
        params->interCodingParams.skipMVCodingBias = IH264_BIASFACTOR_DEFAULT;
    #if (GDR_MODE_ENABLE)
        params->interCodingParams.minBlockSizeP = 0;
        params->interCodingParams.minBlockSizeB = 0;
    #else
        params->interCodingParams.minBlockSizeP = IH264_BLOCKSIZE_8x8;
        params->interCodingParams.minBlockSizeB = IH264_BLOCKSIZE_8x8;
    #endif
        params->interCodingParams.meAlgoMode = IH264ENC_MOTIONESTMODE_DEFAULT;
    
        /*--------------------------------------------------------------------------*/
        /* Set Intra coding params in extended XDM params structure                 */
        /* Please refer User guide Table 4.9 for further details on values          */
        /*--------------------------------------------------------------------------*/
        params->intraCodingParams.lumaIntra4x4Enable = 0x0FF;
        params->intraCodingParams.lumaIntra8x8Enable = 0x0FF;
        params->intraCodingParams.lumaIntra16x16Enable = 0xF;
        params->intraCodingParams.chromaIntra8x8Enable = 0xF;
        params->intraCodingParams.chromaComponentEnable = IH264_CHROMA_COMPONENT_DEFAULT;
    
    #if (GDR_MODE_ENABLE)
        params->intraCodingParams.intraCodingPreset = IH264_INTRACODING_USERDEFINED;
        params->intraCodingParams.intraRefreshMethod = IH264_INTRAREFRESH_GDR;
        params->intraCodingParams.intraRefreshRate = 2;
        params->intraCodingParams.gdrOverlapRowsBtwFrames = 1;
    #else
        params->intraCodingParams.intraCodingPreset = IH264_INTRACODING_DEFAULT;
        params->intraCodingParams.intraRefreshMethod = IH264_INTRAREFRESH_DEFAULT;
        params->intraCodingParams.intraRefreshRate = 0;
        params->intraCodingParams.gdrOverlapRowsBtwFrames = 0;
    #endif
        params->intraCodingParams.constrainedIntraPredEnable = 0;
        params->intraCodingParams.intraCodingBias = 0;
    
        /*--------------------------------------------------------------------------*/
        /* Set NAL unit coding params in extended XDM params structure              */
        /* Please refer User guide Table 4.10 for further details on values         */
        /*--------------------------------------------------------------------------*/
    #if (GDR_MODE_ENABLE)
        params->nalUnitControlParams.naluControlPreset = IH264_NALU_CONTROL_USERDEFINED;
        params->nalUnitControlParams.naluPresentMaskStartOfSequence = 8608;
        params->nalUnitControlParams.naluPresentMaskIDRPicture = 8672;
        params->nalUnitControlParams.naluPresentMaskIntraPicture = 8450;
    #else
        params->nalUnitControlParams.naluControlPreset = IH264_NALU_CONTROL_DEFAULT;
        params->nalUnitControlParams.naluPresentMaskStartOfSequence = 416;
        params->nalUnitControlParams.naluPresentMaskIDRPicture = 416;
        params->nalUnitControlParams.naluPresentMaskIntraPicture = 2;
    #endif
        params->nalUnitControlParams.naluPresentMaskNonIntraPicture = 2;
        params->nalUnitControlParams.naluPresentMaskEndOfSequence = 3072;
    
        /*--------------------------------------------------------------------------*/
        /* Set Slice coding params in extended XDM params structure                 */
        /* Please refer User guide Table 4.11 for further details on values         */
        /*--------------------------------------------------------------------------*/
        params->sliceCodingParams.sliceCodingPreset = IH264_SLICECODING_DEFAULT;//IH264_SLICECODING_USERDEFINED;//Antimax IH264_SLICECODING_DEFAULT;
        params->sliceCodingParams.sliceMode = IH264_SLICEMODE_DEFAULT;//IH264_SLICEMODE_MBUNIT;//Antimax IH264_SLICEMODE_DEFAULT;
        params->sliceCodingParams.sliceUnitSize = 352;
        params->sliceCodingParams.sliceStartOffset[0] = 0;
        params->sliceCodingParams.sliceStartOffset[1] = 0;
        params->sliceCodingParams.sliceStartOffset[2] = 0;
        params->sliceCodingParams.streamFormat = IH264_STREAM_FORMAT_DEFAULT;//IH264_BYTE_STREAM;//Antimax IH264_STREAM_FORMAT_DEFAULT;
    
        /*--------------------------------------------------------------------------*/
        /* Set Loop filter coding params in extended XDM params structure           */
        /* Please refer User guide Table 4.12 for further details on values         */
        /*--------------------------------------------------------------------------*/
        params->loopFilterParams.loopfilterPreset = IH264_LOOPFILTER_DEFAULT;
        params->loopFilterParams.loopfilterDisableIDC = IH264_DISABLE_FILTER_DEFAULT;
        params->loopFilterParams.filterOffsetA = 0;
        params->loopFilterParams.filterOffsetB = 0;
    
        /*--------------------------------------------------------------------------*/
        /* Set VUI coding params in extended XDM params structure                   */
        /* Please refer User guide Table 4.14 for further details on values         */
        /*--------------------------------------------------------------------------*/
    #if (GDR_MODE_ENABLE)
        params->vuiCodingParams.vuiCodingPreset = IH264_VUICODING_USERDEFINED;
        params->vuiCodingParams.aspectRatioInfoPresentFlag = 0;
        params->vuiCodingParams.aspectRatioIdc = 255;
        params->vuiCodingParams.videoSignalTypePresentFlag = 1;
        params->vuiCodingParams.videoFormat = 5;
        params->vuiCodingParams.videoFullRangeFlag = 1;
    #else
        params->vuiCodingParams.vuiCodingPreset = IH264_VUICODING_DEFAULT;
        params->vuiCodingParams.aspectRatioInfoPresentFlag = 1;
        params->vuiCodingParams.aspectRatioIdc = 1;
        params->vuiCodingParams.videoSignalTypePresentFlag = 0;
        params->vuiCodingParams.videoFormat = IH264ENC_VIDEOFORMAT_NTSC;
        params->vuiCodingParams.videoFullRangeFlag = 0;
    #endif
        params->vuiCodingParams.timingInfoPresentFlag = 1;
        params->vuiCodingParams.numUnitsInTicks = 1000;
        params->vuiCodingParams.hrdParamsPresentFlag = 1;
    
        /*--------------------------------------------------------------------------*/
        /* disable frame packing SEI encoding coding params by default              */
        /*--------------------------------------------------------------------------*/
        params->framePackingSEIParams.framePackingPreset = 0;
    #if (GDR_MODE_ENABLE)
        params->framePackingSEIParams.framePackingType = IH264_FRAMEPACK_CHECKERBOARD;
    #else
        params->framePackingSEIParams.framePackingType = IH264_FRAMEPACK_SIDE_BY_SIDE;
    #endif
        params->framePackingSEIParams.frame0PositionX = 0;
        params->framePackingSEIParams.frame0PositionY = 0;
        params->framePackingSEIParams.frame1PositionX = 0;
        params->framePackingSEIParams.frame1PositionY = 0;
    
        /*--------------------------------------------------------------------------*/
        /* Set StereoVideoinformation coding params in extended XDM params structure*/
        /* Please refer User guide for further details on values                    */
        /*--------------------------------------------------------------------------*/
        params->stereoInfoParams.stereoInfoPreset = IH264_STEREOINFO_DISABLE;
        params->stereoInfoParams.topFieldIsLeftViewFlag = 1;
        params->stereoInfoParams.viewSelfContainedFlag = 0;
    
        /*--------------------------------------------------------------------------*/
        /* Set FMO coding params in extended XDM params structure                   */
        /* Please refer User guide Table 4.13 for further details on values         */
        /*--------------------------------------------------------------------------*/
        params->fmoCodingParams.fmoCodingPreset = IH264_FMOCODING_DEFAULT;
        params->fmoCodingParams.numSliceGroups = 1;
        params->fmoCodingParams.sliceGroupMapType = IH264_SLICE_GRP_MAP_DEFAULT;
        params->fmoCodingParams.sliceGroupChangeDirectionFlag = IH264ENC_SLICEGROUP_CHANGE_DIRECTION_DEFAULT;
        params->fmoCodingParams.sliceGroupChangeRate = 0;
        params->fmoCodingParams.sliceGroupChangeCycle = 0;
        params->fmoCodingParams.sliceGroupParams[0] = 0;
        params->fmoCodingParams.sliceGroupParams[1] = 0;
    
        /*--------------------------------------------------------------------------*/
        /* Set Extended XDM Encode parameters in extended XDM params structure      */
        /* Please refer User guide Table 4.15 for further details on values         */
        /*--------------------------------------------------------------------------*/
        params->interlaceCodingType = IH264_INTERLACE_FIELDONLY_ARF;
        params->bottomFieldIntra = 0;
        params->gopStructure = IH264ENC_GOPSTRUCTURE_NONUNIFORM;
        params->entropyCodingMode = IH264_ENTROPYCODING_CABAC;
    
    #if (GDR_MODE_ENABLE)
        params->transformBlockSize = IH264_TRANSFORM_8x8;
        params->log2MaxFNumMinus4 = 10;
        params->IDRFrameInterval = 0;
    #else
        params->transformBlockSize = IH264_TRANSFORM_ADAPTIVE;
        params->log2MaxFNumMinus4 = 8;
        params->IDRFrameInterval = 25;
    #endif
        params->picOrderCountType = IH264_POC_TYPE_0;
        params->enableRCDO = 0;
    
        params->pConstantMemory = 0;
        params->reservedParams[0] = 0;
        params->reservedParams[1] = 0x1F;
        params->reservedParams[2] = 0;
        params->enableGMVSei = 0;
        params->constraintSetFlags = 0;
        params->enableLongTermRefFrame = 0;
        params->enableWatermark = 0;
        params->LTRPPeriod = 0xFFFFFFFF;
        params->numTemporalLayer = IH264_TEMPORAL_LAYERS_1;
        params->referencePicMarking = IH264_LONG_TERM_PICTURE;
        params->svcCodingParams.dependencyID = 0;
        params->svcCodingParams.qualityID = 0;
        params->svcCodingParams.enhancementProfileID = 0;
        params->svcCodingParams.layerIndex = 0;
        params->svcCodingParams.svcExtensionFlag = IH264_SVC_EXTENSION_FLAG_DISABLE;
        params->debugTraceLevel = 1;
        params->lastNFramesToLog = 0;
        params->enableAnalyticinfo = 0;
    
        /*--------------------------------------------------------------------------*/
        /* Set dynamic parameters                                                   */
        /* Most of the default parameters can be copied from Encdoer params         */
        /*--------------------------------------------------------------------------*/
        memcpy(&((dynamicParams)->rateControlParams), &(params->rateControlParams), sizeof(IH264ENC_RateControlParams));
        memcpy(&((dynamicParams)->interCodingParams), &(params->interCodingParams), sizeof(IH264ENC_InterCodingParams));
        memcpy(&((dynamicParams)->intraCodingParams), &(params->intraCodingParams), sizeof(IH264ENC_IntraCodingParams));
        memcpy(&((dynamicParams)->sliceCodingParams), &(params->sliceCodingParams), sizeof(IH264ENC_SliceCodingParams));
        /*--------------------------------------------------------------------------*/
        /* Set all the XDM dynamic values to default values                         */
        /*--------------------------------------------------------------------------*/
        dynamicParams->videnc2DynamicParams.size = sizeof(IH264ENC_DynamicParams);
        dynamicParams->videnc2DynamicParams.captureWidth = IMG_WIDTH;
        dynamicParams->videnc2DynamicParams.forceFrame = IVIDEO_NA_FRAME;
        dynamicParams->videnc2DynamicParams.generateHeader = XDM_ENCODE_AU;
        dynamicParams->videnc2DynamicParams.ignoreOutbufSizeFlag = 1;
        dynamicParams->videnc2DynamicParams.inputHeight = IMG_HEIGHT;
        dynamicParams->videnc2DynamicParams.inputWidth = IMG_WIDTH;
        dynamicParams->videnc2DynamicParams.interFrameInterval = 1;     //modify by david
    #if (GDR_MODE_ENABLE)
                dynamicParams->videnc2DynamicParams.intraFrameInterval = 0;
    #else
        dynamicParams->videnc2DynamicParams.intraFrameInterval = 30;
    #endif
    
    #if (GDR_MODE_ENABLE)
        dynamicParams->videnc2DynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_PIXEL;
    #else
        dynamicParams->videnc2DynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
    #endif
        dynamicParams->videnc2DynamicParams.putDataFxn = NULL;
        dynamicParams->videnc2DynamicParams.putDataHandle = 0;
        dynamicParams->videnc2DynamicParams.refFrameRate = 30000;
        dynamicParams->videnc2DynamicParams.sampleAspectRatioHeight = 1;
        dynamicParams->videnc2DynamicParams.sampleAspectRatioWidth = 1;
        dynamicParams->videnc2DynamicParams.targetBitRate = 2000000;
        dynamicParams->videnc2DynamicParams.targetFrameRate = 30000;
    
        dynamicParams->videnc2DynamicParams.putDataFxn = NULL;
        dynamicParams->videnc2DynamicParams.getDataFxn = NULL;
        dynamicParams->videnc2DynamicParams.getBufferFxn = NULL;
        dynamicParams->videnc2DynamicParams.getDataHandle = NULL;
    
        dynamicParams->sliceGroupChangeCycle = params->fmoCodingParams.sliceGroupChangeCycle;
    
        dynamicParams->searchCenter.x = 32767;
        dynamicParams->searchCenter.y = 0;
        dynamicParams->enableStaticMBCount = 0;
        dynamicParams->enableROI = 0;
        dynamicParams->reservedDynParams[0] = 0;
        dynamicParams->reservedDynParams[1] = 0;
        dynamicParams->reservedDynParams[2] = 0;
    
        params->maxIntraFrameInterval = dynamicParams->videnc2DynamicParams.intraFrameInterval;
    
        for (i = 0; i < IVIDEO_MAX_NUM_METADATA_PLANES; i++)
        {
            params->videnc2Params.metadataType[i] = IVIDEO_METADATAPLANE_NONE;
        }
    }
    
    
     venc_params.h264_status.videnc2Status.size = sizeof(IH264ENC_Status);
        venc_params.h264_status.videnc2Status.extendedError = 0;
        venc_params.h264_params.videnc2Params.size = sizeof(IH264ENC_Params);
        venc_params.h264_dynamic_params.videnc2DynamicParams.size = sizeof(IH264ENC_DynamicParams);
        venc_params.h264_dynamic_params.videnc2DynamicParams.lateAcquireArg = 0x100;
        venc_params.h264_dynamic_params.videnc2DynamicParams.captureWidth = IMG_WIDTH;
        venc_params.h264_dynamic_params.videnc2DynamicParams.inputHeight = IMG_HEIGHT;
        venc_params.h264_dynamic_params.videnc2DynamicParams.inputWidth = IMG_WIDTH;
        venc_params.h264_dynamic_params.videnc2DynamicParams.targetBitRate = 1500000; //1800000; //3500000;
        venc_params.h264_dynamic_params.videnc2DynamicParams.targetFrameRate = 30000;
    
    #if (GDR_MODE_ENABLE)
        venc_params.b_gdr_mode = 0x1;
        venc_params.gdr_interval = venc_params.h264_dynamic_params.videnc2DynamicParams.inputHeight >> 4;
        venc_params.h264_dynamic_params.videnc2DynamicParams.lateAcquireArg = 0;
    #endif

  • Hi,

    Can you set these and try.

     rateControlPreset = User defined;

    rcAlgo = VBR;

    initialBufferLevel = HRDBufferSize = 2* TargetBitrate;

    Can you increase the intraRefreshRate value and check? (When intraRefreshMethod == IH264_INTRAREFRESH_GDR, intraRefreshRate is treated/interpreted number of rows to be intra refreshed per frame.)

    Also

    What is the resolution you are encoding? 

  • Hi,

         I  have done it as your say. But it is no  effect.  I found that  the I mb size when I set IH264ENC_CTRL_START_GDR  is more double size  than  others. I think it is may be the key . 8000.zip

  • Hi Antimax,

    Can you share the other stream where you see the better compression? Also did you try modifying  intraRefreshRate = 4 & gdrOverlapRowsBtwFrames = 2; I dont have a ready setup to test these.I will get back to you once I try this. 

    Mean while you can try modifiying gdrOverlapRowsBtwFrames & intraRefreshRate

  • Hi Antimax,
    Thanks for sharing it privately. Can you please tell, which encoder was used, where you see better compression?
  • Hi,
    The better compression is encoded by DM385. But I do not know the detail things.
  • Hi Antimax,
    Thanks for the details.
    Can you try this and let me know your observation?

    rateControlPreset = User defined;

    rcAlgo = CBR;

    initialBufferLevel = HRDBufferSize = (1/2* TargetBitrate);

    You can also refer to the sample test app provided with IPNC-RDK @ ../Source/ti_tools/codecs-dm814x/REL.500.V.H264AVC.E.IVAHD.02.00.07.01/500.V.H264AVC.E.IVAHD.02.00/IVAHD_001/Client/test

    What is the encoder version are you using?