diff options
| author | Zhao Liang <leo.zhao@intel.com> | 2013-08-23 14:21:16 +0800 |
|---|---|---|
| committer | Patrick Tjin <pattjin@google.com> | 2014-07-21 22:02:53 -0700 |
| commit | 88c8d2ab4d97fe48ed25c3adff105f2cef5a2d36 (patch) | |
| tree | 36bc56a577c464b86342f0c30d9bcb59e9e97d1d /videocodec | |
| parent | dccea72fa33ead9951c7863344d4b1c99deb820a (diff) | |
| download | android_hardware_intel_common_omx-components-88c8d2ab4d97fe48ed25c3adff105f2cef5a2d36.tar.gz android_hardware_intel_common_omx-components-88c8d2ab4d97fe48ed25c3adff105f2cef5a2d36.tar.bz2 android_hardware_intel_common_omx-components-88c8d2ab4d97fe48ed25c3adff105f2cef5a2d36.zip | |
Support Sync mode video encoding in omx
BZ: 131021
Use one new ext parameter to control sync mode, this mode is used for timelapse recording
Signed-off-by: Zhao Liang <leo.zhao@intel.com>
Change-Id: I099d62d02bdf28598893d7167486b4d5f1623120
Reviewed-on: http://android.intel.com:8080/127318
Reviewed-by: Zhao, Leo <leo.zhao@intel.com>
Reviewed-by: Yuan, Shengquan <shengquan.yuan@intel.com>
Reviewed-by: Shi, PingX <pingx.shi@intel.com>
Tested-by: Shi, PingX <pingx.shi@intel.com>
Reviewed-by: cactus <cactus@intel.com>
Tested-by: cactus <cactus@intel.com>
Diffstat (limited to 'videocodec')
| -rwxr-xr-x | videocodec/Android.mk | 4 | ||||
| -rwxr-xr-x | videocodec/OMXVideoEncoderAVC.cpp | 8 | ||||
| -rw-r--r-- | videocodec/OMXVideoEncoderAVC.h | 2 | ||||
| -rwxr-xr-x | videocodec/OMXVideoEncoderBase.cpp | 22 | ||||
| -rw-r--r-- | videocodec/OMXVideoEncoderBase.h | 2 | ||||
| -rw-r--r-- | videocodec/OMXVideoEncoderH263.cpp | 15 | ||||
| -rw-r--r-- | videocodec/OMXVideoEncoderMPEG4.cpp | 7 | ||||
| -rw-r--r-- | videocodec/OMXVideoEncoderVP8.cpp | 5 |
8 files changed, 48 insertions, 17 deletions
diff --git a/videocodec/Android.mk b/videocodec/Android.mk index 89606c9..8e289d2 100755 --- a/videocodec/Android.mk +++ b/videocodec/Android.mk @@ -359,10 +359,6 @@ ifeq ($(ENABLE_IMG_GRAPHICS),true) LOCAL_CFLAGS += -DIMG_GFX endif -ifeq ($(SW_MPEG4_ENCODER),true) - LOCAL_CFLAGS += -DSYNC_MODE -endif - LOCAL_MODULE_TAGS := optional LOCAL_MODULE := libOMXVideoEncoderH263 include $(BUILD_SHARED_LIBRARY) diff --git a/videocodec/OMXVideoEncoderAVC.cpp b/videocodec/OMXVideoEncoderAVC.cpp index ddc94ad..b22fe94 100755 --- a/videocodec/OMXVideoEncoderAVC.cpp +++ b/videocodec/OMXVideoEncoderAVC.cpp @@ -487,9 +487,10 @@ OMX_ERRORTYPE OMXVideoEncoderAVC::ProcessDataRetrieve( ports[INPORT_INDEX]->ReturnAllRetainedBuffers(); //return last all retained frames if (outBuf.flag & ENCODE_BUFFERFLAG_ENDOFSTREAM) retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; + else if (mSyncEncoding) + retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; else retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; //retain current frame - mFrameOutputCount ++; } } else //not complete output all encoded data, push again to continue output @@ -591,7 +592,8 @@ OMX_ERRORTYPE OMXVideoEncoderAVC::ProcessorProcess( eInfo.EncodeComplete = true; mFrameEncodedCount ++; - if (mFrameEncodedCount == 2) {//not getoutput for second encode frame to keep in async mode + + if (mSyncEncoding == OMX_FALSE && mFrameEncodedCount == 2) {//not getoutput for second encode frame to keep in async mode eInfo.DataRetrieved = true; ports[INPORT_INDEX]->ReturnAllRetainedBuffers(); retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; @@ -607,7 +609,7 @@ OMX_ERRORTYPE OMXVideoEncoderAVC::ProcessorProcess( /* Check EOE state, if yes, this is final encode frame, need to push this buffer again to call getOutput again for final output */ - if (eInfo.EndOfEncode && eInfo.EncodeComplete && eInfo.DataRetrieved) { + if (mSyncEncoding == OMX_FALSE && eInfo.EndOfEncode && eInfo.EncodeComplete && eInfo.DataRetrieved) { eInfo.DataRetrieved = false; eInfo.EndOfEncode = false; retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; diff --git a/videocodec/OMXVideoEncoderAVC.h b/videocodec/OMXVideoEncoderAVC.h index a3d4d82..4dc257e 100644 --- a/videocodec/OMXVideoEncoderAVC.h +++ b/videocodec/OMXVideoEncoderAVC.h @@ -103,7 +103,7 @@ private: enum { // OMX_PARAM_PORTDEFINITIONTYPE OUTPORT_MIN_BUFFER_COUNT = 1, - OUTPORT_ACTUAL_BUFFER_COUNT = 10, + OUTPORT_ACTUAL_BUFFER_COUNT = 6, OUTPORT_BUFFER_SIZE = 1382400, NUM_REFERENCE_FRAME = 4, }; diff --git a/videocodec/OMXVideoEncoderBase.cpp b/videocodec/OMXVideoEncoderBase.cpp index 91d59ab..e98fed2 100755 --- a/videocodec/OMXVideoEncoderBase.cpp +++ b/videocodec/OMXVideoEncoderBase.cpp @@ -30,7 +30,8 @@ OMXVideoEncoderBase::OMXVideoEncoderBase() ,mFrameOutputCount(0) ,mFrameRetrieved(OMX_TRUE) ,mFirstFrame(OMX_TRUE) - ,mStoreMetaDataInBuffers(OMX_FALSE) { + ,mStoreMetaDataInBuffers(OMX_FALSE) + ,mSyncEncoding(OMX_FALSE){ mEncoderParams = new VideoParamsCommon(); if (!mEncoderParams) LOGE("OMX_ErrorInsufficientResources"); @@ -448,6 +449,7 @@ OMX_ERRORTYPE OMXVideoEncoderBase::BuildHandlerList(void) { //AddHandler(OMX_IndexParamIntelAdaptiveSliceControl, GetParamIntelAdaptiveSliceControl, SetParamIntelAdaptiveSliceControl); //AddHandler(OMX_IndexParamVideoProfileLevelQuerySupported, GetParamVideoProfileLevelQuerySupported, SetParamVideoProfileLevelQuerySupported); AddHandler((OMX_INDEXTYPE)OMX_IndexStoreMetaDataInBuffers, GetStoreMetaDataInBuffers, SetStoreMetaDataInBuffers); + AddHandler((OMX_INDEXTYPE)OMX_IndexExtSyncEncoding, GetSyncEncoding, SetSyncEncoding); return OMX_ErrorNone; } @@ -874,6 +876,24 @@ OMX_ERRORTYPE OMXVideoEncoderBase::SetStoreMetaDataInBuffers(OMX_PTR pStructure) return OMX_ErrorNone; }; +OMX_ERRORTYPE OMXVideoEncoderBase::GetSyncEncoding(OMX_PTR pStructure) { + OMX_BOOL* syncEncoding = static_cast<OMX_BOOL*>(pStructure); + + *syncEncoding = mSyncEncoding; + + return OMX_ErrorNone; +}; + +OMX_ERRORTYPE OMXVideoEncoderBase::SetSyncEncoding(OMX_PTR pStructure) { + CHECK_SET_PARAM_STATE(); + + mSyncEncoding = *(static_cast<OMX_BOOL*>(pStructure)); + + LOGD("SetSyncEncoding %d", mSyncEncoding); + + return OMX_ErrorNone; +}; + #ifdef IMG_GFX // Utility function that blits the original source buffer in RGBA format to a temporary // buffer in NV12 format, and use the temporary buffer as the source buffer diff --git a/videocodec/OMXVideoEncoderBase.h b/videocodec/OMXVideoEncoderBase.h index 29a4f63..6e47624 100644 --- a/videocodec/OMXVideoEncoderBase.h +++ b/videocodec/OMXVideoEncoderBase.h @@ -69,6 +69,7 @@ protected: DECLARE_HANDLER(OMXVideoEncoderBase, ParamIntelAdaptiveSliceControl); //DECLARE_HANDLER(OMXVideoEncoderBase, ParamVideoProfileLevelQuerySupported); DECLARE_HANDLER(OMXVideoEncoderBase, StoreMetaDataInBuffers); + DECLARE_HANDLER(OMXVideoEncoderBase, SyncEncoding); protected: virtual OMX_ERRORTYPE SetVideoEncoderParam(); @@ -89,6 +90,7 @@ protected: OMX_BOOL mFirstFrame; OMX_BOOL mFrameRetrieved; OMX_BOOL mStoreMetaDataInBuffers; + OMX_BOOL mSyncEncoding; private: diff --git a/videocodec/OMXVideoEncoderH263.cpp b/videocodec/OMXVideoEncoderH263.cpp index 0c62532..c81e9ec 100644 --- a/videocodec/OMXVideoEncoderH263.cpp +++ b/videocodec/OMXVideoEncoderH263.cpp @@ -143,14 +143,12 @@ OMX_ERRORTYPE OMXVideoEncoderH263::ProcessorProcess( ports[INPORT_INDEX]->ReturnAllRetainedBuffers(); } -#ifndef SYNC_MODE - if (mFrameInputCount == 0) { + if (mSyncEncoding == OMX_FALSE && mFrameInputCount == 0) { retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; mFrameRetrieved = OMX_TRUE; goto out; } -#endif outBuf.format = OUTPUT_EVERYTHING; ret = mVideoEncoder->getOutput(&outBuf); @@ -158,7 +156,11 @@ OMX_ERRORTYPE OMXVideoEncoderH263::ProcessorProcess( if(ret == ENCODE_NO_REQUEST_DATA) { mFrameRetrieved = OMX_TRUE; retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; - retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; + if (mSyncEncoding) + retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; + else + retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; + goto out; } @@ -174,7 +176,10 @@ OMX_ERRORTYPE OMXVideoEncoderH263::ProcessorProcess( if(outBuf.flag & ENCODE_BUFFERFLAG_ENDOFFRAME) { outflags |= OMX_BUFFERFLAG_ENDOFFRAME; mFrameRetrieved = OMX_TRUE; - retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; + if (mSyncEncoding) + retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; + else + retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; } else { retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; //get again diff --git a/videocodec/OMXVideoEncoderMPEG4.cpp b/videocodec/OMXVideoEncoderMPEG4.cpp index 46ab444..a59dc37 100644 --- a/videocodec/OMXVideoEncoderMPEG4.cpp +++ b/videocodec/OMXVideoEncoderMPEG4.cpp @@ -159,7 +159,7 @@ OMX_ERRORTYPE OMXVideoEncoderMPEG4::ProcessorProcess( outfilledlen = outBuf.dataSize; mFirstFrame = OMX_FALSE; } else { - if (mFrameInputCount == 1) { + if (mSyncEncoding == OMX_FALSE && mFrameInputCount == 1) { retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; mFrameRetrieved = OMX_TRUE; @@ -184,7 +184,10 @@ OMX_ERRORTYPE OMXVideoEncoderMPEG4::ProcessorProcess( LOGV("Get buffer done\n"); outflags |= OMX_BUFFERFLAG_ENDOFFRAME; mFrameRetrieved = OMX_TRUE; - retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; + if (mSyncEncoding) + retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; + else + retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; } else { retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; //get again diff --git a/videocodec/OMXVideoEncoderVP8.cpp b/videocodec/OMXVideoEncoderVP8.cpp index 84eb632..a1d7616 100644 --- a/videocodec/OMXVideoEncoderVP8.cpp +++ b/videocodec/OMXVideoEncoderVP8.cpp @@ -118,7 +118,10 @@ OMX_ERRORTYPE OMXVideoEncoderVP8::ProcessorProcess(OMX_BUFFERHEADERTYPE **buffer LOGV("Get buffer done\n"); outflags |= OMX_BUFFERFLAG_ENDOFFRAME; mFrameRetrieved = OMX_TRUE; - retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; + if (mSyncEncoding) + retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; + else + retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; } else { retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; //get again |
