aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhding3 <haitao.ding@intel.com>2014-12-05 17:53:41 +0800
committerEd Tam <etam@google.com>2014-12-09 12:39:49 -0800
commitd5673bef309abf657748a91cbad83562de186803 (patch)
treed90af6462382d11ce73c889b1ac3096eafe9a73d
parent4f61fb9367fcc5b11b54fd9e3337c21339dd3c99 (diff)
downloadandroid_hardware_intel_common_omx-components-d5673bef309abf657748a91cbad83562de186803.tar.gz
android_hardware_intel_common_omx-components-d5673bef309abf657748a91cbad83562de186803.tar.bz2
android_hardware_intel_common_omx-components-d5673bef309abf657748a91cbad83562de186803.zip
To support standard omx api for passing GTS test
Bug: 18665040 Change-Id: I1329040409263fa001216f6be1b85b3d28e4da09 Signed-off-by: hding3 <haitao.ding@intel.com>
-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 */