OMXVideoEncoderVP8.cpp revision d06de36eb079130c029eb590dd56d600266cb7f2
162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying#define LOG_TAG "OMXVideoEncoderVP8"
362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying#include "OMXVideoEncoderVP8.h"
462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
563ee173ed94850f02f22d0c1143ebfecb1066597Liu Bolunstatic const char *VP8_MIME_TYPE = "video/x-vnd.on2.vp8";
662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMXVideoEncoderVP8::OMXVideoEncoderVP8() {
862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    LOGV("OMXVideoEncoderVP8 is constructed.");
962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    BuildHandlerList();
1062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    mVideoEncoder = createVideoEncoder(VP8_MIME_TYPE);
1162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    if(!mVideoEncoder) LOGE("OMX_ErrorInsufficientResources");
1262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying}
1362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
1462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMXVideoEncoderVP8::~OMXVideoEncoderVP8() {
1562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    LOGV("OMXVideoEncoderVP8 is destructed.");
1662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying}
1762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
1862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::InitOutputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionOutput) {
1962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
2062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    memset(&mParamVp8, 0, sizeof(mParamVp8));
2162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    SetTypeHeader(&mParamVp8, sizeof(mParamVp8));
2262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    mParamVp8.nPortIndex = OUTPORT_INDEX;
2362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    mParamVp8.eProfile = OMX_VIDEO_VP8ProfileMain;
2462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    mParamVp8.eLevel = OMX_VIDEO_VP8Level_Version3;
2562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
26cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    memset(&mConfigVideoVp8ReferenceFrame, 0, sizeof(mConfigVideoVp8ReferenceFrame));
27cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    SetTypeHeader(&mConfigVideoVp8ReferenceFrame, sizeof(mConfigVideoVp8ReferenceFrame));
28cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    mConfigVideoVp8ReferenceFrame.nPortIndex = OUTPORT_INDEX;
29cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    mConfigVideoVp8ReferenceFrame.bUsePreviousFrame = OMX_TRUE;
30cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    mConfigVideoVp8ReferenceFrame.bUseGoldenFrame = OMX_TRUE;
31cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    mConfigVideoVp8ReferenceFrame.bUseAlternateFrame = OMX_TRUE;
32cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    mConfigVideoVp8ReferenceFrame.bPreviousFrameRefresh = OMX_TRUE;
33cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    mConfigVideoVp8ReferenceFrame.bGoldenFrameRefresh = OMX_TRUE;
34cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    mConfigVideoVp8ReferenceFrame.bAlternateFrameRefresh = OMX_TRUE;
35cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun
3662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    paramPortDefinitionOutput->nBufferCountActual = OUTPORT_ACTUAL_BUFFER_COUNT;
3762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    paramPortDefinitionOutput->nBufferCountMin = OUTPORT_MIN_BUFFER_COUNT;
3862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    paramPortDefinitionOutput->nBufferSize = OUTPORT_BUFFER_SIZE;
3962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    paramPortDefinitionOutput->format.video.cMIMEType = (OMX_STRING)VP8_MIME_TYPE;
4007cf1edddd80bbcd569575d9a6759fd82fd963f8Dan Liang    paramPortDefinitionOutput->format.video.eCompressionFormat = OMX_VIDEO_CodingVP8;
4162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
4294f43328fd68ede85ccf631ca0fa9c942d18f5eeliubolun    // OMX_VIDEO_PARAM_INTEL_NUMBER_OF_TEMPORAL_LAYER
436b334fd4175f234d24739f75330c50549fb6bed0bolunliu    memset(&mTemporalLayer, 0, sizeof(mTemporalLayer));
446b334fd4175f234d24739f75330c50549fb6bed0bolunliu    SetTypeHeader(&mTemporalLayer, sizeof(mTemporalLayer));
456b334fd4175f234d24739f75330c50549fb6bed0bolunliu    mTemporalLayer.nPortIndex = OUTPORT_INDEX;
466b334fd4175f234d24739f75330c50549fb6bed0bolunliu    mTemporalLayer.nNumberOfTemporalLayer = 1;//default value is 1
4794f43328fd68ede85ccf631ca0fa9c942d18f5eeliubolun
4862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    mParamProfileLevel.eProfile = OMX_VIDEO_VP8ProfileMain;
4962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    mParamProfileLevel.eLevel = OMX_VIDEO_VP8Level_Version3;
5062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    return OMX_ErrorNone;
5162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying}
5262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
5362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::SetVideoEncoderParam() {
5462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
5562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    if (!mEncoderParams) {
5662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        LOGE("NULL pointer: mEncoderParams");
5762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        return OMX_ErrorBadParameter;
5862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    }
5962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
6062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    mVideoEncoder->getParameters(mEncoderParams);
615096d08f3afc029d82f2e2a34aa1fb8a427ce050Chang Ying    mEncoderParams->profile = VAProfileVP8Version0_3;
6262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    return OMXVideoEncoderBase::SetVideoEncoderParam();
6362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying}
6462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
6562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::ProcessorInit(void) {
6662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    return OMXVideoEncoderBase::ProcessorInit();
6762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying}
6862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
6962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::ProcessorDeinit(void) {
7062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    return OMXVideoEncoderBase::ProcessorDeinit();
7162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying}
7262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
7362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::ProcessorProcess(OMX_BUFFERHEADERTYPE **buffers,
7462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        buffer_retain_t *retains,
7562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        OMX_U32 numberBuffers) {
7662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
7762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    VideoEncOutputBuffer outBuf;
7862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    VideoEncRawBuffer inBuf;
7962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    Encode_Status ret = ENCODE_SUCCESS;
8062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
8162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    OMX_U32 outfilledlen = 0;
8262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    OMX_S64 outtimestamp = 0;
8362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    OMX_U32 outflags = 0;
8462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    OMX_ERRORTYPE oret = OMX_ErrorNone;
8562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
86d06de36eb079130c029eb590dd56d600266cb7f2bolunliu    if(buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS) {
87d06de36eb079130c029eb590dd56d600266cb7f2bolunliu        LOGV("%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__);
88d06de36eb079130c029eb590dd56d600266cb7f2bolunliu        outflags |= OMX_BUFFERFLAG_EOS;
89d06de36eb079130c029eb590dd56d600266cb7f2bolunliu    }
9062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
9162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    if (!buffers[INPORT_INDEX]->nFilledLen) {
9262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        LOGV("%s(),%d: input buffer's nFilledLen is zero\n",  __func__, __LINE__);
9362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        goto out;
9462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    }
9562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
9662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    inBuf.data = buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset;
9762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    inBuf.size = buffers[INPORT_INDEX]->nFilledLen;
98d06de36eb079130c029eb590dd56d600266cb7f2bolunliu    inBuf.type = FTYPE_UNKNOWN;
99d06de36eb079130c029eb590dd56d600266cb7f2bolunliu    inBuf.timeStamp = buffers[INPORT_INDEX]->nTimeStamp;
10062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
10162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    outBuf.data =
10262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset;
10362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    outBuf.dataSize = 0;
10462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    outBuf.bufferSize = buffers[OUTPORT_INDEX]->nAllocLen - buffers[OUTPORT_INDEX]->nOffset;
10562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
10662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    if (mFrameRetrieved) {
10762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        // encode and setConfig need to be thread safe
10862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        pthread_mutex_unlock(&mSerializationLock);
10962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        ret = mVideoEncoder->encode(&inBuf);
11062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        pthread_mutex_unlock(&mSerializationLock);
11162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
11262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        CHECK_ENCODE_STATUS("encode");
11362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        mFrameRetrieved = OMX_FALSE;
11462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
11562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        // This is for buffer contention, we won't release current buffer
11662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        // but the last input buffer
11762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        ports[INPORT_INDEX]->ReturnAllRetainedBuffers();
11862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    }
11962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
12062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    {
12162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        outBuf.format = OUTPUT_EVERYTHING;
122dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu        ret = mVideoEncoder->getOutput(&outBuf);
123dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu        //CHECK_ENCODE_STATUS("getOutput");
124dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu        if(ret == ENCODE_NO_REQUEST_DATA) {
125dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu            mFrameRetrieved = OMX_TRUE;
126dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu            retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;
127dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu            if (mSyncEncoding)
128dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu                retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN;
129dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu            else
130d06de36eb079130c029eb590dd56d600266cb7f2bolunliu                retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN;
131dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu
132dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu            goto out;
133dc6587395a102b4d59af5010adf5a6507b1f6556bolunliu        }
13462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
1350740ec12c293d6b6080fd92d210300b4ed5169faliubolun        LOGV("VP8 encode output data size = %d", outBuf.dataSize);
13662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
13762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
13862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        outfilledlen = outBuf.dataSize;
13962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        outtimestamp = buffers[INPORT_INDEX]->nTimeStamp;
14062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
14162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        if (outBuf.flag & ENCODE_BUFFERFLAG_SYNCFRAME) {
14262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying            outflags |= OMX_BUFFERFLAG_SYNCFRAME;
14362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        }
14462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
14562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        if (outBuf.flag & ENCODE_BUFFERFLAG_ENDOFFRAME) {
14662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying            LOGV("Get buffer done\n");
14762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying            outflags |= OMX_BUFFERFLAG_ENDOFFRAME;
14862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying            mFrameRetrieved = OMX_TRUE;
14988c8d2ab4d97fe48ed25c3adff105f2cef5a2d36Zhao Liang            if (mSyncEncoding)
15088c8d2ab4d97fe48ed25c3adff105f2cef5a2d36Zhao Liang                retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN;
15188c8d2ab4d97fe48ed25c3adff105f2cef5a2d36Zhao Liang            else
152d06de36eb079130c029eb590dd56d600266cb7f2bolunliu                retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN;
15362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
15462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        } else {
15562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying            retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;  //get again
15662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
15762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        }
15862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
15962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    }
16062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
16162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
16262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    if (outfilledlen > 0) {
16362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        retains[OUTPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN;
16462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    } else {
16562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;
16662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    }
16762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
16862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
16962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
17062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying#if SHOW_FPS
17162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    {
17262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        struct timeval t;
17362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        OMX_TICKS current_ts, interval_ts;
17462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        float current_fps, average_fps;
17562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
17662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        t.tv_sec = t.tv_usec = 0;
17762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        gettimeofday(&t, NULL);
17862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
17962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        current_ts =
18062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying            (nsecs_t)t.tv_sec * 1000000000 + (nsecs_t)t.tv_usec * 1000;
18162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        interval_ts = current_ts - lastTs;
18262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        lastTs = current_ts;
18362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
18462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        current_fps = (float)1000000000 / (float)interval_ts;
18562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        average_fps = (current_fps + lastFps) / 2;
18662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        lastFps = current_fps;
18762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
18862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        LOGV("FPS = %2.1f\n", average_fps);
18962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    }
19062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying#endif
19162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
19262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Yingout:
19362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
19462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    if (retains[OUTPORT_INDEX] != BUFFER_RETAIN_GETAGAIN) {
19562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        buffers[OUTPORT_INDEX]->nFilledLen = outfilledlen;
19662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        buffers[OUTPORT_INDEX]->nTimeStamp = outtimestamp;
19762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        buffers[OUTPORT_INDEX]->nFlags = outflags;
19862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    }
19962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
20062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    if (retains[INPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN ||
20162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying            retains[INPORT_INDEX] == BUFFER_RETAIN_ACCUMULATE ) {
20262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        mFrameInputCount ++;
20362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    }
20462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
20562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    if (retains[OUTPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN)
20662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying        mFrameOutputCount ++;
20762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
20862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    return oret;
20962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying}
21062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
21162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::BuildHandlerList(void) {
21262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    OMXVideoEncoderBase::BuildHandlerList();
21362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    AddHandler((OMX_INDEXTYPE)OMX_IndexParamVideoVp8, GetParamVideoVp8, SetParamVideoVp8);
21462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    AddHandler((OMX_INDEXTYPE)OMX_IndexConfigVideoVp8ReferenceFrame, GetConfigVideoVp8ReferenceFrame, SetConfigVideoVp8ReferenceFrame);
215186cf3638a4f387568fe2590e81a1a8a23c054e4liubolun    AddHandler((OMX_INDEXTYPE)OMX_IndexExtVP8MaxFrameSizeRatio, GetConfigVp8MaxFrameSizeRatio, SetConfigVp8MaxFrameSizeRatio);
21694f43328fd68ede85ccf631ca0fa9c942d18f5eeliubolun
21762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    return OMX_ErrorNone;
21862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying}
21962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
22062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::GetParamVideoVp8(OMX_PTR pStructure) {
22162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    OMX_ERRORTYPE ret;
22262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    OMX_VIDEO_PARAM_VP8TYPE *p = (OMX_VIDEO_PARAM_VP8TYPE*) pStructure;
22362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    CHECK_TYPE_HEADER(p);
22462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
22562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
22662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    memcpy(p, &mParamVp8, sizeof(*p));
22762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    return OMX_ErrorNone;
22862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying}
22962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
23062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::SetParamVideoVp8(OMX_PTR pStructure) {
23162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    OMX_ERRORTYPE ret;
23262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    OMX_VIDEO_PARAM_VP8TYPE *p = (OMX_VIDEO_PARAM_VP8TYPE*) pStructure;
23362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    CHECK_TYPE_HEADER(p);
23462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
23562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    CHECK_SET_PARAM_STATE();
23662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
23762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    memcpy(&mParamVp8, p, sizeof(mParamVp8));
23862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    return OMX_ErrorNone;
23962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying}
24062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
24162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::GetConfigVideoVp8ReferenceFrame(OMX_PTR pStructure) {
242cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    OMX_ERRORTYPE ret;
243cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    OMX_VIDEO_VP8REFERENCEFRAMETYPE *p = (OMX_VIDEO_VP8REFERENCEFRAMETYPE*)pStructure;
244cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    CHECK_TYPE_HEADER(p);
245cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
246cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun
247cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    memcpy(p, &mConfigVideoVp8ReferenceFrame, sizeof(*p));
248cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun
24962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    return OMX_ErrorNone;
25062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying}
25162b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
25262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang YingOMX_ERRORTYPE OMXVideoEncoderVP8::SetConfigVideoVp8ReferenceFrame(OMX_PTR pStructure) {
25362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    OMX_ERRORTYPE ret;
25462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    Encode_Status retStatus = ENCODE_SUCCESS;
25562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    OMX_VIDEO_VP8REFERENCEFRAMETYPE *p = (OMX_VIDEO_VP8REFERENCEFRAMETYPE*) pStructure;
25662b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    CHECK_TYPE_HEADER(p);
25762b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
25862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
25962b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    CHECK_SET_CONFIG_STATE();
26062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
261cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    VideoConfigVP8ReferenceFrame configVP8ReferenceFrame;
262cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    configVP8ReferenceFrame.no_ref_last = !p->bUsePreviousFrame;
263cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    configVP8ReferenceFrame.no_ref_gf = !p->bUseGoldenFrame;
264cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    configVP8ReferenceFrame.no_ref_arf = !p->bUseAlternateFrame;
265cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    configVP8ReferenceFrame.refresh_alternate_frame = p->bAlternateFrameRefresh;
266cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    configVP8ReferenceFrame.refresh_golden_frame = p->bGoldenFrameRefresh;
267cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    configVP8ReferenceFrame.refresh_last = p->bPreviousFrameRefresh;
26862b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
269cf4e7f501f88b2f8fc44b8440722de273d264aealiubolun    retStatus = mVideoEncoder->setConfig(&configVP8ReferenceFrame);
27062b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    if(retStatus != ENCODE_SUCCESS) {
2718b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun        LOGW("Failed to set reference frame");
27262b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    }
27362b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying    return OMX_ErrorNone;
27462b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying}
27562b0bf25eda4d2f48a228d7f3483e773e08292e2Chang Ying
276186cf3638a4f387568fe2590e81a1a8a23c054e4liubolunOMX_ERRORTYPE OMXVideoEncoderVP8::GetConfigVp8MaxFrameSizeRatio(OMX_PTR pStructure) {
277a0f95d79fa654a816532eea0ee8868e56049847cliubolun
2788b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun    return OMX_ErrorNone;
2798b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun}
2808b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun
281186cf3638a4f387568fe2590e81a1a8a23c054e4liubolunOMX_ERRORTYPE OMXVideoEncoderVP8::SetConfigVp8MaxFrameSizeRatio(OMX_PTR pStructure) {
2828b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun    OMX_ERRORTYPE ret;
2838b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun    Encode_Status retStatus = ENCODE_SUCCESS;
284186cf3638a4f387568fe2590e81a1a8a23c054e4liubolun    OMX_VIDEO_CONFIG_INTEL_VP8_MAX_FRAME_SIZE_RATIO *p = (OMX_VIDEO_CONFIG_INTEL_VP8_MAX_FRAME_SIZE_RATIO*)pStructure;
2858b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun    CHECK_TYPE_HEADER(p);
2868b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
2878b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun
2888b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun    CHECK_SET_CONFIG_STATE();
2898b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun
290186cf3638a4f387568fe2590e81a1a8a23c054e4liubolun    VideoConfigVP8MaxFrameSizeRatio configVP8MaxFrameSizeRatio;
291186cf3638a4f387568fe2590e81a1a8a23c054e4liubolun    configVP8MaxFrameSizeRatio.max_frame_size_ratio = p->nMaxFrameSizeRatio;
2928b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun
293186cf3638a4f387568fe2590e81a1a8a23c054e4liubolun    retStatus = mVideoEncoder->setConfig(&configVP8MaxFrameSizeRatio);
2948b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun    if(retStatus != ENCODE_SUCCESS) {
295186cf3638a4f387568fe2590e81a1a8a23c054e4liubolun        LOGW("Failed to set vp8 max frame size ratio");
2968b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun    }
2978b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun
2988b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun    return OMX_ErrorNone;
2998b2ba82826c315930fee3fe174b18abbfada5250Liu Bolun}
300a0f95d79fa654a816532eea0ee8868e56049847cliubolun
3016333d6c9db604ad320f2c1d4baa7a51eb4883a78Liu BolunDECLARE_OMX_COMPONENT("OMX.Intel.VideoEncoder.VP8", "video_encoder.vp8", OMXVideoEncoderVP8);
302