Quantcast
Channel: Processors
Viewing all articles
Browse latest Browse all 124323

Forum Post: OMX VENC cant change bitrate dynamically

$
0
0

Hi,

I have referred to the H.264 Encoder User Guide and the following posts and have not been able to find an answer to this:

http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/716/p/288641/1007735.aspx#1007735

http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/100/t/303485.aspx

I am using EVSDK 5.05.02.

I'm trying to change the bit rate of the VENC while it is running. Here is the setup code I use for the VENC:

    OMX_ERRORTYPE eError = OMX_ErrorUndefined;     OMX_HANDLETYPE pHandle = NULL;     OMX_VIDEO_PARAM_PROFILELEVELTYPE tProfileLevel;     OMX_VIDEO_PARAM_ENCODER_PRESETTYPE tEncoderPreset;     OMX_VIDEO_PARAM_BITRATETYPE tVidEncBitRate;     OMX_VIDEO_PARAM_PORTFORMATTYPE tVideoParams;     OMX_PARAM_PORTDEFINITIONTYPE tPortDef;     OMX_VIDEO_CONFIG_DYNAMICPARAMS tDynParams;     OMX_VIDEO_PARAM_STATICPARAMS   tStaticParam;      int captureWidth, captureHeight;     captureWidth  = m_capture_width;     captureHeight = m_capture_height;      pHandle = m_omx_handle;      OMX_INIT_PARAM (&tPortDef);     /* Get the Number of Ports */      tPortDef.nPortIndex = OMX_VIDENC_INPUT_PORT;     eError = OMX_GetParameter (pHandle, OMX_IndexParamPortDefinition, &tPortDef);     /* set the actual number of buffers required */     tPortDef.nBufferCountActual = GetNumInputBuffers(0);     /* set the video format settings */     tPortDef.format.video.nFrameWidth = captureWidth;     tPortDef.format.video.nStride = captureWidth;     tPortDef.format.video.nFrameHeight = captureHeight;     tPortDef.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;     /* settings for OMX_IndexParamVideoPortFormat */     tPortDef.nBufferSize = (captureWidth * captureHeight * 3) >> 1;     eError = OMX_SetParameter (pHandle, OMX_IndexParamPortDefinition, &tPortDef);     if (eError != OMX_ErrorNone)     {         ERROR ("failed to set Encode OMX_IndexParamPortDefinition for input \n");     }      OMX_INIT_PARAM (&tPortDef);      tPortDef.nPortIndex = OMX_VIDENC_OUTPUT_PORT;     eError = OMX_GetParameter (pHandle, OMX_IndexParamPortDefinition, &tPortDef);     /* settings for OMX_IndexParamPortDefinition */     /* set the actual number of buffers required */     tPortDef.nBufferCountActual = GetNumOutputBuffers(0);     tPortDef.format.video.nFrameWidth = captureWidth;     tPortDef.format.video.nFrameHeight = captureHeight;     tPortDef.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;     tPortDef.format.video.xFramerate = (m_nFrameRate << 16);     tVideoParams.xFramerate = (m_nFrameRate << 16);     /* settings for OMX_IndexParamVideoPortFormat */      eError = OMX_SetParameter (pHandle, OMX_IndexParamPortDefinition, &tPortDef);     if (eError != OMX_ErrorNone)     {         ERROR ("failed to set Encode OMX_IndexParamPortDefinition for output \n");     }      /* For changing bit rate following index can be used */     OMX_INIT_PARAM (&tVidEncBitRate);      tVidEncBitRate.nPortIndex = OMX_VIDENC_OUTPUT_PORT;     eError = OMX_GetParameter (pHandle, OMX_IndexParamVideoBitrate,             &tVidEncBitRate);      tVidEncBitRate.eControlRate = OMX_Video_ControlRateConstant;//OMX_Video_ControlRateDisable;     tVidEncBitRate.nTargetBitrate = m_nBitRate;     eError = OMX_SetParameter (pHandle, OMX_IndexParamVideoBitrate,             &tVidEncBitRate);      if (eError != OMX_ErrorNone)     {         ERROR ("failed to set Encode bitrate \n");     }     /* Set the profile and level for H264 */     OMX_INIT_PARAM (&tProfileLevel);     tProfileLevel.nPortIndex = OMX_VIDENC_OUTPUT_PORT;      eError = OMX_GetParameter (pHandle, OMX_IndexParamVideoProfileLevelCurrent,             &tProfileLevel);      /* set as baseline 4.2 level */      tProfileLevel.eProfile = OMX_VIDEO_AVCProfileHigh;     tProfileLevel.eLevel = OMX_VIDEO_AVCLevel51;      eError = OMX_SetParameter (pHandle, OMX_IndexParamVideoProfileLevelCurrent,             &tProfileLevel);     if (eError != OMX_ErrorNone)         ERROR ("failed to set encoder pfofile \n");      /* Encoder Preset settings */     OMX_INIT_PARAM (&tEncoderPreset);     tEncoderPreset.nPortIndex = OMX_VIDENC_OUTPUT_PORT;     eError = OMX_GetParameter (pHandle, (OMX_INDEXTYPE)OMX_TI_IndexParamVideoEncoderPreset,             &tEncoderPreset);      tEncoderPreset.eEncodingModePreset = OMX_Video_Enc_High_Quality;     tEncoderPreset.eRateControlPreset = OMX_Video_RC_User_Defined; //OMX_Video_RC_Storage;//OMX_Video_RC_Low_Delay;      eError = OMX_SetParameter (pHandle, (OMX_INDEXTYPE)OMX_TI_IndexParamVideoEncoderPreset,             &tEncoderPreset);     if (eError != OMX_ErrorNone)     {         ERROR ("failed to Encoder Preset \n");     }      OMX_INIT_PARAM (&tStaticParam);      tStaticParam.nPortIndex = OMX_VIDENC_OUTPUT_PORT;      eError = OMX_GetParameter(pHandle, (OMX_INDEXTYPE)OMX_TI_IndexParamVideoStaticParams,&tStaticParam);          tStaticParam.videoStaticParams.h264EncStaticParams.videnc2Params.encodingPreset = XDM_USER_DEFINED;     tStaticParam.videoStaticParams.h264EncStaticParams.videnc2Params.rateControlPreset = IVIDEO_USER_DEFINED; //IVIDEO_STORAGE;//IVIDEO_LOW_DELAY;     tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.rateControlParamsPreset = IH264_RATECONTROLPARAMS_USERDEFINED; //IH264_RATECONTROLPARAMS_DEFAULT;     tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.rcAlgo = IH264_RATECONTROL_PRC_LOW_DELAY;     tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.VBRDuration = 1;     tStaticParam.videoStaticParams.h264EncStaticParams.numTemporalLayer = IH264_TEMPORAL_LAYERS_1;     tStaticParam.videoStaticParams.h264EncStaticParams.videnc2Params.maxBitRate = -1; //m_nBitRate * 1.5;     tStaticParam.videoStaticParams.h264EncStaticParams.videnc2Params.minBitRate = 0;//16 * 1024;      /* for base profile */     tStaticParam.videoStaticParams.h264EncStaticParams.transformBlockSize = IH264_TRANSFORM_ADAPTIVE;     tStaticParam.videoStaticParams.h264EncStaticParams.entropyCodingMode = IH264_ENTROPYCODING_CAVLC;      // for the mask bits, please refer to codec user guide      tStaticParam.videoStaticParams.h264EncStaticParams.nalUnitControlParams.naluControlPreset = IH264_NALU_CONTROL_USERDEFINED;     tStaticParam.videoStaticParams.h264EncStaticParams.nalUnitControlParams.naluPresentMaskStartOfSequence |= 0x01A0;     tStaticParam.videoStaticParams.h264EncStaticParams.nalUnitControlParams.naluPresentMaskIDRPicture |= 0x01A0;     tStaticParam.videoStaticParams.h264EncStaticParams.nalUnitControlParams.naluPresentMaskIntraPicture |= 0x01A0;     tStaticParam.videoStaticParams.h264EncStaticParams.nalUnitControlParams.naluPresentMaskNonIntraPicture |= 0x0002;     tStaticParam.videoStaticParams.h264EncStaticParams.nalUnitControlParams.naluPresentMaskEndOfSequence |= 0x0C00;      //     // This seems to work in all but the first time the app is run.     //     tStaticParam.videoStaticParams.h264EncStaticParams.IDRFrameInterval=1;      eError = OMX_SetParameter(pHandle, (OMX_INDEXTYPE)OMX_TI_IndexParamVideoStaticParams,&tStaticParam);      if (eError != OMX_ErrorNone)         ERROR("Failed to set static params");       /* before creating use set_parameters, for run-time change use set_config        all codec supported parameters can be set using this index       */      OMX_INIT_PARAM (&tDynParams);      tDynParams.nPortIndex = OMX_VIDENC_OUTPUT_PORT;      eError = OMX_GetParameter(pHandle, (OMX_INDEXTYPE)OMX_TI_IndexParamVideoDynamicParams,&tDynParams);      /* setting I frame interval */     printf("Setting iframe interval: %d\n", m_nIFrameFreq);     tDynParams.videoDynamicParams.h264EncDynamicParams.videnc2DynamicParams.intraFrameInterval = m_nIFrameFreq * m_nFrameRate;     tDynParams.videoDynamicParams.h264EncDynamicParams.videnc2DynamicParams.targetBitRate = m_nBitRate;     tDynParams.videoDynamicParams.h264EncDynamicParams.rateControlParams.rateControlParamsPreset = IH264_RATECONTROLPARAMS_USERDEFINED;     tDynParams.videoDynamicParams.h264EncDynamicParams.rateControlParams.rcAlgo = IH264_RATECONTROL_PRC_LOW_DELAY;     eError = OMX_SetParameter(pHandle, (OMX_INDEXTYPE)OMX_TI_IndexParamVideoDynamicParams,&tDynParams); 

Here is the code i'm using to try and dynamically change the bitrate:

OMX_VIDEO_CONFIG_BITRATETYPE tBitRate;  OMX_INIT_PARAM(&tBitRate); eError=OMX_GetConfig(pHandle,OMX_IndexConfigVideoBitrate,&tBitRate); printf( "CURRENT BIT RATE IS %d\n", tBitRate.nEncodeBitrate ); //tBitRate.eControlRate = OMX_Video_ControlRateConstant; //OMX_Video_ControlRateVariable; tBitRate.nPortIndex=OMX_VIDENC_OUTPUT_PORT; tBitRate.nEncodeBitrate=value; eError=OMX_SetConfig(pHandle,OMX_IndexConfigVideoBitrate,&tBitRate); if(eError!=OMX_ErrorNone) {   printf("Bit Rate Config Error %i\n",eError); } else {   printf( "Bit rate changed to %d\n", value );   m_nBitRate=value; } 

I call this every 300 frames at 30fps. I use a tool I downloaded called Bitrate Viewer to view the changes in bitrate. It looks like the bitrate changes are never applied.

Is there a setting I need to change to get this to work?

Thanks,

Steven


Viewing all articles
Browse latest Browse all 124323

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>