aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhding3 <haitao.ding@intel.com>2014-12-10 03:33:03 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-12-10 03:33:03 +0000
commit32c61446097f1bfeb560700bc43fcf99fed544b9 (patch)
tree6e6484a33c18fdcaa62503b53ffe49ce82130a1d
parentb29a8dee33df6289ad381ac98e0054863c925603 (diff)
parentd5673bef309abf657748a91cbad83562de186803 (diff)
downloadandroid_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.cpp45
-rw-r--r--videocodec/OMXVideoEncoderBase.h2
-rw-r--r--videocodec/OMXVideoEncoderVP8.cpp27
-rw-r--r--videocodec/OMXVideoEncoderVP8.h2
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 */