aboutsummaryrefslogtreecommitdiffstats
path: root/videocodec/OMXVideoEncoderVP8.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'videocodec/OMXVideoEncoderVP8.cpp')
-rw-r--r--videocodec/OMXVideoEncoderVP8.cpp27
1 files changed, 25 insertions, 2 deletions
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;
}