static OMX_ERRORTYPE OMX_ConfigureDynamicPFramesInH264E( OMX_HANDLETYPE hComponent, OMX_BUFFERHEADERTYPE * pBufferHdr, OMX_U32 nCurrentFrameRate, OMX_U32 nTargetFrameRate) { OMX_ERRORTYPE eError = OMX_ErrorNone; OMX_U32 remainder = 0; OMX_U16 nTargetPFrames =0; /* Target Pframes to be provided to Encoder */ OMX_U16 nCurrentPFrames = 0; /* Current pFrame Value configured to Encoder */ OMX_VIDEO_CONFIG_AVCINTRAPERIOD tPframeH264e; OMX_VIDEO_PARAM_AVCTYPE h264type; OMX_COMPONENTTYPE *pHandle; if (hComponent == NULL){ DOMX_ERROR("Component is invalid/ not present "); return OMX_ErrorBadParameter; } pHandle = (OMX_COMPONENTTYPE *) hComponent; /* Initialise the OMX structures */ OMX_INIT_STRUCT(tPframeH264e, OMX_VIDEO_CONFIG_AVCINTRAPERIOD); OMX_INIT_STRUCT(h264type,OMX_VIDEO_PARAM_AVCTYPE); /* Read number of B Frames if not read yet */ if(!nBFrames){ h264type.nPortIndex = 1; eError = pHandle->GetParameter(hComponent,OMX_IndexParamVideoAvc,&h264type); if(eError != OMX_ErrorNone) { DOMX_ERROR(" Error while reading component info = %d",eError); return eError; } nBFrames = h264type.nBFrames; } /* Read Current pFrames set in Encoder */ tPframeH264e.nPortIndex = 1; eError = pHandle->GetConfig(hComponent,OMX_IndexConfigVideoAVCIntraPeriod,&tPframeH264e); if(eError != OMX_ErrorNone) { DOMX_ERROR(" Error while Getting PFrame info, Error code = %d",eError); return eError; } nCurrentPFrames = tPframeH264e.nPFrames; /* Calculate Target P Frames */ nTargetPFrames = (nCurrentPFrames * nTargetFrameRate) /nCurrentFrameRate; /* Number of pFrames should be multiple of (B FRAMES + 1) */ remainder = nTargetPFrames % (nBFrames + 1); nTargetPFrames = nTargetPFrames - remainder; if(nTargetPFrames == nCurrentPFrames){ DOMX_INFO(" No Change in P Frames, No Update required"); return OMX_ErrorNone; } /* Update the new PFrames to the Encoder */ tPframeH264e.nPFrames = nTargetPFrames; eError = pHandle->SetConfig(hComponent,OMX_IndexConfigVideoAVCIntraPeriod,&tPframeH264e); if(eError != OMX_ErrorNone) { DOMX_ERROR(" Error while setting PFrame info, Error code = %d",eError); } return eError; }
void vcil_in_get_config(ILCS_COMMON_T *st, void *call, int clen, void *resp, int *rlen) { IL_GET_EXECUTE_T *exe = call; IL_GET_RESPONSE_T *ret = resp; OMX_COMPONENTTYPE *pComp = exe->reference; OMX_U32 size = *((OMX_U32 *) (&exe->param)); ret->func = IL_GET_CONFIG; if(size > VC_ILCS_MAX_PARAM_SIZE) { *rlen = IL_GET_RESPONSE_HEADER_SIZE; ret->err = OMX_ErrorHardware; } else { *rlen = size + IL_GET_RESPONSE_HEADER_SIZE; ret->func = IL_GET_CONFIG; ret->err = pComp->GetConfig(pComp, exe->index, exe->param); memcpy(ret->param, exe->param, size); } }
static OMX_ERRORTYPE OMX_ConfigureDynamicFrameRate( OMX_HANDLETYPE hComponent, OMX_BUFFERHEADERTYPE * pBufferHdr, OMX_STRING hCompName) { OMX_ERRORTYPE eError = OMX_ErrorNone; OMX_U32 nTargetFrameRate = 0; /* Target Frame Rate to be provided to Encoder */ OMX_U32 nCurrentFrameRate = 0; /* Current Frame Rate currently set in Encoder */ OMX_CONFIG_FRAMERATETYPE tFrameRate; OMX_COMPONENTTYPE *pHandle; if (hComponent == NULL){ DOMX_ERROR("Component is invalid/ not present "); return OMX_ErrorBadParameter; } pHandle = (OMX_COMPONENTTYPE *) hComponent; /* Initialise the OMX structures */ OMX_INIT_STRUCT(tFrameRate,OMX_CONFIG_FRAMERATETYPE); /* Intialise nLastFrameRateUpdateTime for the 1st frame */ if((!nFrameCounter) && (!nLastFrameRateUpdateTime)){ nLastFrameRateUpdateTime = pBufferHdr-> nTimeStamp; } /* Increment the Frame Counter and Calculate Frame Rate*/ nFrameCounter++; nVideoTime = pBufferHdr->nTimeStamp - nLastFrameRateUpdateTime; if(nVideoTime < 0) { return OMX_ErrorBadParameter; } /*Get Port Frame Rate if not read yet*/ if(!nFrameRateThreshold) { tFrameRate.nPortIndex = 1; /* Output Port Index */ /* Read Current FrameRate */ eError = pHandle->GetConfig(hComponent,OMX_IndexConfigVideoFramerate,&tFrameRate); nFrameRateThreshold = tFrameRate.xEncodeFramerate >>16; nPortFrameRate = nFrameRateThreshold; DOMX_INFO(" Port Frame Rate is %d ", nPortFrameRate); }