diff options
author | hding3 <haitao.ding@intel.com> | 2014-12-10 03:33:03 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-12-10 03:33:03 +0000 |
commit | 32c61446097f1bfeb560700bc43fcf99fed544b9 (patch) | |
tree | 6e6484a33c18fdcaa62503b53ffe49ce82130a1d | |
parent | b29a8dee33df6289ad381ac98e0054863c925603 (diff) | |
parent | d5673bef309abf657748a91cbad83562de186803 (diff) | |
download | android_hardware_intel_common_omx-components-32c61446097f1bfeb560700bc43fcf99fed544b9.tar.gz android_hardware_intel_common_omx-components-32c61446097f1bfeb560700bc43fcf99fed544b9.tar.bz2 android_hardware_intel_common_omx-components-32c61446097f1bfeb560700bc43fcf99fed544b9.zip |
am d5673bef: To support standard omx api for passing GTS test
* commit 'd5673bef309abf657748a91cbad83562de186803':
To support standard omx api for passing GTS test
-rw-r--r-- | videocodec/OMXVideoEncoderBase.cpp | 45 | ||||
-rw-r--r-- | videocodec/OMXVideoEncoderBase.h | 2 | ||||
-rw-r--r-- | videocodec/OMXVideoEncoderVP8.cpp | 27 | ||||
-rw-r--r-- | videocodec/OMXVideoEncoderVP8.h | 2 |
4 files changed, 74 insertions, 2 deletions
diff --git a/videocodec/OMXVideoEncoderBase.cpp b/videocodec/OMXVideoEncoderBase.cpp index bc37f4f..5e918c9 100644 --- a/videocodec/OMXVideoEncoderBase.cpp +++ b/videocodec/OMXVideoEncoderBase.cpp @@ -172,6 +172,12 @@ OMX_ERRORTYPE OMXVideoEncoderBase::InitOutputPort(void) { mConfigIntelBitrate.nFrameRate = 0; mConfigIntelBitrate.nTemporalID = 0; + // OMX_VIDEO_CONFIG_BITRATETYPE + memset(&mConfigBitrate, 0, sizeof(mConfigBitrate)); + SetTypeHeader(&mConfigBitrate, sizeof(mConfigBitrate)); + mConfigBitrate.nPortIndex = OUTPORT_INDEX; + mConfigBitrate.nEncodeBitrate = 0; // Maximum bitrate + // OMX_VIDEO_CONFIG_INTEL_AIR memset(&mConfigIntelAir, 0, sizeof(mConfigIntelAir)); SetTypeHeader(&mConfigIntelAir, sizeof(mConfigIntelAir)); @@ -404,6 +410,7 @@ OMX_ERRORTYPE OMXVideoEncoderBase::BuildHandlerList(void) { AddHandler((OMX_INDEXTYPE)OMX_IndexExtSyncEncoding, GetSyncEncoding, SetSyncEncoding); AddHandler((OMX_INDEXTYPE)OMX_IndexExtPrependSPSPPS, GetPrependSPSPPS, SetPrependSPSPPS); AddHandler((OMX_INDEXTYPE)OMX_IndexExtTemporalLayer, GetTemporalLayer,SetTemporalLayer); + AddHandler((OMX_INDEXTYPE)OMX_IndexConfigVideoBitrate, GetConfigVideoBitrate, SetConfigVideoBitrate); AddHandler((OMX_INDEXTYPE)OMX_IndexExtRequestBlackFramePointer, GetBlackFramePointer, GetBlackFramePointer); return OMX_ErrorNone; } @@ -935,3 +942,41 @@ OMX_ERRORTYPE OMXVideoEncoderBase::GetBlackFramePointer(OMX_PTR pStructure) { OMX_ERRORTYPE OMXVideoEncoderBase::SetBlackFramePointer(OMX_PTR) { return OMX_ErrorUnsupportedSetting; } + +OMX_ERRORTYPE OMXVideoEncoderBase::GetConfigVideoBitrate(OMX_PTR pStructure) { + + OMX_ERRORTYPE ret; + OMX_VIDEO_CONFIG_BITRATETYPE *p = (OMX_VIDEO_CONFIG_BITRATETYPE *)pStructure; + + CHECK_TYPE_HEADER(p); + CHECK_PORT_INDEX(p, OUTPORT_INDEX); + memcpy(p, &mConfigBitrate, sizeof(*p)); + return OMX_ErrorNone; +} +OMX_ERRORTYPE OMXVideoEncoderBase::SetConfigVideoBitrate(OMX_PTR pStructure){ + OMX_ERRORTYPE ret; + Encode_Status retStatus = ENCODE_SUCCESS; + if (mParamBitrate.eControlRate == OMX_Video_ControlRateMax){ + LOGE("SetConfigIntelBitrate failed. Feature is disabled."); + return OMX_ErrorUnsupportedIndex; + } + OMX_VIDEO_CONFIG_BITRATETYPE *p = (OMX_VIDEO_CONFIG_BITRATETYPE *)pStructure; + CHECK_TYPE_HEADER(p); + CHECK_PORT_INDEX(p, OUTPORT_INDEX); + + // set in either Loaded state (ComponentSetParam) or Executing state (ComponentSetConfig) + mConfigBitrate = *p; + + // return OMX_ErrorNone if not in Executing state + // TODO: return OMX_ErrorIncorrectStateOperation? + // CHECK_SET_CONFIG_STATE(); + + VideoConfigBitRate configBitRate; + configBitRate.rcParams.bitRate = mConfigBitrate.nEncodeBitrate; + configBitRate.rcParams.temporalID = 0; + retStatus = mVideoEncoder->setConfig(&configBitRate); + if(retStatus != ENCODE_SUCCESS) { + LOGW("failed to set IntelBitrate"); + } + return OMX_ErrorNone; +} diff --git a/videocodec/OMXVideoEncoderBase.h b/videocodec/OMXVideoEncoderBase.h index f16b0a3..f2926b3 100644 --- a/videocodec/OMXVideoEncoderBase.h +++ b/videocodec/OMXVideoEncoderBase.h @@ -72,6 +72,7 @@ protected: DECLARE_HANDLER(OMXVideoEncoderBase, SyncEncoding); DECLARE_HANDLER(OMXVideoEncoderBase, PrependSPSPPS); DECLARE_HANDLER(OMXVideoEncoderBase, TemporalLayer); + DECLARE_HANDLER(OMXVideoEncoderBase, ConfigVideoBitrate); DECLARE_HANDLER(OMXVideoEncoderBase, BlackFramePointer); protected: @@ -86,6 +87,7 @@ protected: OMX_VIDEO_PARAM_INTEL_ADAPTIVE_SLICE_CONTROL mParamIntelAdaptiveSliceControl; OMX_VIDEO_PARAM_PROFILELEVELTYPE mParamProfileLevel; OMX_VIDEO_PARAM_INTEL_TEMPORAL_LAYER mTemporalLayer; + OMX_VIDEO_CONFIG_BITRATETYPE mConfigBitrate; IVideoEncoder *mVideoEncoder; VideoParamsCommon *mEncoderParams; diff --git a/videocodec/OMXVideoEncoderVP8.cpp b/videocodec/OMXVideoEncoderVP8.cpp index d2a2aee..ec1062d 100644 --- a/videocodec/OMXVideoEncoderVP8.cpp +++ b/videocodec/OMXVideoEncoderVP8.cpp @@ -6,6 +6,7 @@ static const char *VP8_MIME_TYPE = "video/x-vnd.on2.vp8"; OMXVideoEncoderVP8::OMXVideoEncoderVP8() { LOGV("OMXVideoEncoderVP8 is constructed."); + mLastTimestamp = 0x7FFFFFFFFFFFFFFFLL; BuildHandlerList(); mVideoEncoder = createVideoEncoder(VP8_MIME_TYPE); if(!mVideoEncoder) LOGE("OMX_ErrorInsufficientResources"); @@ -82,7 +83,8 @@ OMX_ERRORTYPE OMXVideoEncoderVP8::ProcessorProcess(OMX_BUFFERHEADERTYPE **buffer OMX_S64 outtimestamp = 0; OMX_U32 outflags = 0; OMX_ERRORTYPE oret = OMX_ErrorNone; - + OMX_U32 frameDuration; + OMX_U32 this_fps; if(buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS) { LOGV("%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__); outflags |= OMX_BUFFERFLAG_EOS; @@ -98,6 +100,27 @@ OMX_ERRORTYPE OMXVideoEncoderVP8::ProcessorProcess(OMX_BUFFERHEADERTYPE **buffer inBuf.type = FTYPE_UNKNOWN; inBuf.timeStamp = buffers[INPORT_INDEX]->nTimeStamp; + if (inBuf.timeStamp > mLastTimestamp) { + frameDuration = (OMX_U32)(inBuf.timeStamp - mLastTimestamp); + } else { + frameDuration = (OMX_U32)(1000000 / mEncoderParams->frameRate.frameRateNum); + } + + this_fps = (OMX_U32)((1000000.000 / frameDuration) * 1000 + 1)/1000; + + if(this_fps != mEncoderParams->frameRate.frameRateNum) + {// a new FrameRate is coming + mConfigFramerate.xEncodeFramerate = this_fps; + mEncoderParams->frameRate.frameRateNum = this_fps; + VideoConfigFrameRate framerate; + mVideoEncoder->getConfig(&framerate); + framerate.frameRate.frameRateDenom = 1; + framerate.frameRate.frameRateNum = mConfigFramerate.xEncodeFramerate; + ret = mVideoEncoder->setConfig(&framerate); + if(ret != ENCODE_SUCCESS) { + LOGW("Failed to set frame rate config"); + } + } outBuf.data = buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset; outBuf.dataSize = 0; @@ -137,7 +160,7 @@ OMX_ERRORTYPE OMXVideoEncoderVP8::ProcessorProcess(OMX_BUFFERHEADERTYPE **buffer outfilledlen = outBuf.dataSize; outtimestamp = buffers[INPORT_INDEX]->nTimeStamp; - + mLastTimestamp = inBuf.timeStamp; if (outBuf.flag & ENCODE_BUFFERFLAG_SYNCFRAME) { outflags |= OMX_BUFFERFLAG_SYNCFRAME; } diff --git a/videocodec/OMXVideoEncoderVP8.h b/videocodec/OMXVideoEncoderVP8.h index afafb7f..f6a6b56 100644 --- a/videocodec/OMXVideoEncoderVP8.h +++ b/videocodec/OMXVideoEncoderVP8.h @@ -28,6 +28,8 @@ class OMXVideoEncoderVP8 : public OMXVideoEncoderBase { OMX_VIDEO_PARAM_VP8TYPE mParamVp8; OMX_VIDEO_VP8REFERENCEFRAMETYPE mConfigVideoVp8ReferenceFrame; + // Last input buffer timestamp + OMX_TICKS mLastTimestamp; }; #endif /* OMX_VIDEO_ENCODER_VP8_H */ |