aboutsummaryrefslogtreecommitdiffstats
path: root/videocodec
diff options
context:
space:
mode:
authorZhao Liang <leo.zhao@intel.com>2013-08-23 14:21:16 +0800
committerPatrick Tjin <pattjin@google.com>2014-07-21 22:02:53 -0700
commit88c8d2ab4d97fe48ed25c3adff105f2cef5a2d36 (patch)
tree36bc56a577c464b86342f0c30d9bcb59e9e97d1d /videocodec
parentdccea72fa33ead9951c7863344d4b1c99deb820a (diff)
downloadandroid_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-xvideocodec/Android.mk4
-rwxr-xr-xvideocodec/OMXVideoEncoderAVC.cpp8
-rw-r--r--videocodec/OMXVideoEncoderAVC.h2
-rwxr-xr-xvideocodec/OMXVideoEncoderBase.cpp22
-rw-r--r--videocodec/OMXVideoEncoderBase.h2
-rw-r--r--videocodec/OMXVideoEncoderH263.cpp15
-rw-r--r--videocodec/OMXVideoEncoderMPEG4.cpp7
-rw-r--r--videocodec/OMXVideoEncoderVP8.cpp5
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