1b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse/*
2b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse* Copyright (c) 2009-2011 Intel Corporation.  All rights reserved.
3b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse*
4b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse* Licensed under the Apache License, Version 2.0 (the "License");
5b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse* you may not use this file except in compliance with the License.
6b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse* You may obtain a copy of the License at
7b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse*
8b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse* http://www.apache.org/licenses/LICENSE-2.0
9b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse*
10b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse* Unless required by applicable law or agreed to in writing, software
11b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse* distributed under the License is distributed on an "AS IS" BASIS,
12b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse* See the License for the specific language governing permissions and
14b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse* limitations under the License.
15b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse*/
16b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
17b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
18b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse#define LOG_TAG "OMXVideoEncoderMPEG4"
19b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse#include "OMXVideoEncoderMPEG4.h"
20b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
21b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glissestatic const char *MPEG4_MIME_TYPE = "video/mpeg4";
22b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
23330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek OlšákOMXVideoEncoderMPEG4::OMXVideoEncoderMPEG4() {
24330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák    LOGV("OMXVideoEncoderMPEG4 is constructed.");
25b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse    BuildHandlerList();
26330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák    mVideoEncoder = createVideoEncoder(MPEG4_MIME_TYPE);
278fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch    if (!mVideoEncoder) LOGE("OMX_ErrorInsufficientResources");
288fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch}
298fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch
303fccc14b2fb35aef95bc04dee46e280a48679299Henri VerbeetOMXVideoEncoderMPEG4::~OMXVideoEncoderMPEG4() {
31c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    LOGV("OMXVideoEncoderMPEG4 is destructed.");
32c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse}
33c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
34c0c979eebc076b95cc8d18a013ce2968fe6311adJerome GlisseOMX_ERRORTYPE OMXVideoEncoderMPEG4::InitOutputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionOutput) {
35c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    // OMX_VIDEO_PARAM_MPEG4TYPE
36c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    memset(&mParamMpeg4, 0, sizeof(mParamMpeg4));
37c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    SetTypeHeader(&mParamMpeg4, sizeof(mParamMpeg4));
38c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    mParamMpeg4.nPortIndex = OUTPORT_INDEX;
39c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    mParamMpeg4.eProfile = OMX_VIDEO_MPEG4ProfileSimple;
40c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    // TODO: Check eLevel (Level3)
41c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    mParamMpeg4.eLevel = OMX_VIDEO_MPEG4Level5; //OMX_VIDEO_MPEG4Level3;
42c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
43c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    // override OMX_PARAM_PORTDEFINITIONTYPE
44c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    paramPortDefinitionOutput->nBufferCountActual = OUTPORT_ACTUAL_BUFFER_COUNT;
45c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    paramPortDefinitionOutput->nBufferCountMin = OUTPORT_MIN_BUFFER_COUNT;
46c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    paramPortDefinitionOutput->nBufferSize = OUTPORT_BUFFER_SIZE;
47c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    paramPortDefinitionOutput->format.video.cMIMEType = (OMX_STRING)MPEG4_MIME_TYPE;
48c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    paramPortDefinitionOutput->format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
49c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
50c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    // override OMX_VIDEO_PARAM_PROFILELEVELTYPE
51c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    // TODO: check if profile/level supported is correct
52c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    mParamProfileLevel.eProfile = mParamMpeg4.eProfile;
53c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    mParamProfileLevel.eLevel = mParamMpeg4.eLevel; //OMX_VIDEO_MPEG4Level5;
54c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
55c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    // override OMX_VIDEO_CONFIG_INTEL_BITRATETYPE
56c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    mConfigIntelBitrate.nInitialQP = 15;  // Initial QP for I frames
57c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    return OMX_ErrorNone;
58c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse}
59c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
60c0c979eebc076b95cc8d18a013ce2968fe6311adJerome GlisseOMX_ERRORTYPE OMXVideoEncoderMPEG4::SetVideoEncoderParam(void) {
61c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
62c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    if (!mEncoderParams) {
63c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse        LOGE("NULL pointer: mEncoderParams");
64c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse        return OMX_ErrorBadParameter;
65c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    }
66c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
67c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    mVideoEncoder->getParameters(mEncoderParams);
68c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    mEncoderParams->profile = (VAProfile)PROFILE_MPEG4SIMPLE;
69c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    return OMXVideoEncoderBase::SetVideoEncoderParam();
70c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse}
71c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
72c0c979eebc076b95cc8d18a013ce2968fe6311adJerome GlisseOMX_ERRORTYPE OMXVideoEncoderMPEG4::ProcessorInit(void) {
73c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    return OMXVideoEncoderBase::ProcessorInit();
74c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse}
75c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
76c0c979eebc076b95cc8d18a013ce2968fe6311adJerome GlisseOMX_ERRORTYPE OMXVideoEncoderMPEG4::ProcessorDeinit(void) {
77c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    return OMXVideoEncoderBase::ProcessorDeinit();
78c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse}
79c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
80c0c979eebc076b95cc8d18a013ce2968fe6311adJerome GlisseOMX_ERRORTYPE OMXVideoEncoderMPEG4::ProcessorProcess(
81c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    OMX_BUFFERHEADERTYPE **buffers,
82c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    buffer_retain_t *retains,
83c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    OMX_U32) {
84c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
85c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse    VideoEncOutputBuffer outBuf;
863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    VideoEncRawBuffer inBuf;
873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    Encode_Status ret = ENCODE_SUCCESS;
883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    OMX_U32 outfilledlen = 0;
903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    OMX_S64 outtimestamp = 0;
913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    OMX_U32 outflags = 0;
923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    OMX_ERRORTYPE oret = OMX_ErrorNone;
933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    LOGV_IF(buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS,
963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            "%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__);
973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    if (!buffers[INPORT_INDEX]->nFilledLen) {
993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        LOGV("%s(),%d: input buffer's nFilledLen is zero\n",  __func__, __LINE__);
1003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        goto out;
1013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    }
1023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    inBuf.data = buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset;
1043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    inBuf.size = buffers[INPORT_INDEX]->nFilledLen;
1053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    inBuf.type = FTYPE_UNKNOWN;
1063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    inBuf.flag = 0;
1073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    inBuf.timeStamp = buffers[INPORT_INDEX]->nTimeStamp;
1083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    LOGV("inBuf.data=%x, size=%d", (unsigned)inBuf.data, inBuf.size);
1103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    outBuf.data =
1123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset;
1133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    outBuf.dataSize = 0;
1143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    outBuf.bufferSize = buffers[OUTPORT_INDEX]->nAllocLen - buffers[OUTPORT_INDEX]->nOffset;
1153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    if (mFrameRetrieved) {
1183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        // encode and setConfig need to be thread safe
1193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        pthread_mutex_unlock(&mSerializationLock);
1203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        ret = mVideoEncoder->encode(&inBuf);
1213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        pthread_mutex_unlock(&mSerializationLock);
1223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        CHECK_ENCODE_STATUS("encode");
1243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        mFrameRetrieved = OMX_FALSE;
1253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        // This is for buffer contention, we won't release current buffer
1273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        // but the last input buffer
1283fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        ports[INPORT_INDEX]->ReturnAllRetainedBuffers();
1293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    }
1303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    if (mFirstFrame) {
1323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        LOGV("mFirstFrame\n");
1333fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        outBuf.format = OUTPUT_CODEC_DATA;
1343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        ret = mVideoEncoder->getOutput(&outBuf);
1353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        CHECK_ENCODE_STATUS("getOutput");
1363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        // Return code could not be ENCODE_BUFFER_TOO_SMALL
1373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        // If we don't return error, we will have dead lock issue
1383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        if (ret == ENCODE_BUFFER_TOO_SMALL) {
1393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            return OMX_ErrorUndefined;
1403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        }
1413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        LOGV("output codec data size = %d", outBuf.dataSize);
1433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        outflags |= OMX_BUFFERFLAG_CODECCONFIG;
1453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        outflags |= OMX_BUFFERFLAG_ENDOFFRAME;
1463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        outflags |= OMX_BUFFERFLAG_SYNCFRAME;
1473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;
1493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        outfilledlen = outBuf.dataSize;
1503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        mFirstFrame = OMX_FALSE;
1513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    } else {
1523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        if (mSyncEncoding == OMX_FALSE && mFrameInputCount == 1) {
1533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE;
1543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;
1553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            mFrameRetrieved = OMX_TRUE;
1563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            goto out;
1573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        }
1583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        outBuf.format = OUTPUT_EVERYTHING;
1603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        mVideoEncoder->getOutput(&outBuf);
1613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        CHECK_ENCODE_STATUS("getOutput");
1623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        LOGV("output data size = %d", outBuf.dataSize);
1643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        outfilledlen = outBuf.dataSize;
1673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        outtimestamp = outBuf.timeStamp;
1683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        if (outBuf.flag & ENCODE_BUFFERFLAG_SYNCFRAME) {
1703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            outflags |= OMX_BUFFERFLAG_SYNCFRAME;
1713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        }
1723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        if (outBuf.flag & ENCODE_BUFFERFLAG_ENDOFFRAME) {
1743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            LOGV("Get buffer done\n");
1753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            outflags |= OMX_BUFFERFLAG_ENDOFFRAME;
1763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            mFrameRetrieved = OMX_TRUE;
1773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            if (mSyncEncoding)
1783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN;
1793fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            else
1803fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE;
1813fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
182866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie        } else {
1833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;  //get again
184754ea4ea76f1d5ac6150090cffe2542bdf178d87Marek Olšák
185866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie        }
186754ea4ea76f1d5ac6150090cffe2542bdf178d87Marek Olšák
1873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    }
1883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    if (outfilledlen > 0) {
1903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        retains[OUTPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN;
1913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    } else {
1923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;
1933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    }
1943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1970d0285ba916d9e25871354441c09b0a8c7c9b844Christian König#if SHOW_FPS
1983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    {
1993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        struct timeval t;
2003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        OMX_TICKS current_ts, interval_ts;
201914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        float current_fps, average_fps;
2020110aa09e5898987ee86586e438ac571075eba3aDave Airlie
2030110aa09e5898987ee86586e438ac571075eba3aDave Airlie        t.tv_sec = t.tv_usec = 0;
204914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        gettimeofday(&t, NULL);
205914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
206914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        current_ts =
207914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák            (nsecs_t)t.tv_sec * 1000000000 + (nsecs_t)t.tv_usec * 1000;
208914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        interval_ts = current_ts - lastTs;
209914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        lastTs = current_ts;
210914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
211914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        current_fps = (float)1000000000 / (float)interval_ts;
2120d0285ba916d9e25871354441c09b0a8c7c9b844Christian König        average_fps = (current_fps + lastFps) / 2;
2133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        lastFps = current_fps;
2143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
215914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        LOGV("FPS = %2.1f\n", average_fps);
2160110aa09e5898987ee86586e438ac571075eba3aDave Airlie    }
2170110aa09e5898987ee86586e438ac571075eba3aDave Airlie#endif
218914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
219914b4bb80c28c81101941d5533361ae0108eb771Marek Olšákout:
220914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
221914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    if (retains[OUTPORT_INDEX] != BUFFER_RETAIN_GETAGAIN) {
222914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        buffers[OUTPORT_INDEX]->nFilledLen = outfilledlen;
223914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        buffers[OUTPORT_INDEX]->nTimeStamp = outtimestamp;
224914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        buffers[OUTPORT_INDEX]->nFlags = outflags;
225914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    }
226914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
227914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    if (retains[INPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN ||
2280110aa09e5898987ee86586e438ac571075eba3aDave Airlie            retains[INPORT_INDEX] == BUFFER_RETAIN_ACCUMULATE ) {
2290110aa09e5898987ee86586e438ac571075eba3aDave Airlie        mFrameInputCount ++;
2303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    }
231914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
232914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    if (retains[OUTPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN)
233914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        mFrameOutputCount ++;
234914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
235914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    return oret;
236914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
237914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák}
238914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
2393fccc14b2fb35aef95bc04dee46e280a48679299Henri VerbeetOMX_ERRORTYPE OMXVideoEncoderMPEG4::BuildHandlerList(void) {
2403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    OMXVideoEncoderBase::BuildHandlerList();
24177058335ebc9a1c2a81ec2cf98a8a157065e69d0Dave Airlie    AddHandler(OMX_IndexParamVideoMpeg4, GetParamVideoMpeg4, SetParamVideoMpeg4);
24277058335ebc9a1c2a81ec2cf98a8a157065e69d0Dave Airlie    AddHandler(OMX_IndexParamVideoProfileLevelQuerySupported, GetParamVideoProfileLevelQuerySupported, SetParamVideoProfileLevelQuerySupported);
2433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    return OMX_ErrorNone;
2443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet}
2453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2473fccc14b2fb35aef95bc04dee46e280a48679299Henri VerbeetOMX_ERRORTYPE OMXVideoEncoderMPEG4::GetParamVideoProfileLevelQuerySupported(OMX_PTR pStructure) {
2483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    OMX_ERRORTYPE ret;
2493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pStructure;
2503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    CHECK_TYPE_HEADER(p);
2513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
2523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    struct ProfileLevelTable {
2543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        OMX_U32 profile;
2553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        OMX_U32 level;
2563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    } plTable[] = {
2573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level5},
2583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    };
2593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    OMX_U32 count = sizeof(plTable)/sizeof(ProfileLevelTable);
261914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    CHECK_ENUMERATION_RANGE(p->nProfileIndex,count);
2620110aa09e5898987ee86586e438ac571075eba3aDave Airlie
2630110aa09e5898987ee86586e438ac571075eba3aDave Airlie    p->eProfile = plTable[p->nProfileIndex].profile;
2643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    p->eLevel = plTable[p->nProfileIndex].level;
265914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
266914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    return OMX_ErrorNone;
267914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák}
268914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
269914b4bb80c28c81101941d5533361ae0108eb771Marek OlšákOMX_ERRORTYPE OMXVideoEncoderMPEG4::SetParamVideoProfileLevelQuerySupported(OMX_PTR) {
270914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    LOGW("SetParamVideoMpeg4ProfileLevel is not supported.");
271914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    return OMX_ErrorUnsupportedSetting;
272914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák}
2733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2743fccc14b2fb35aef95bc04dee46e280a48679299Henri VerbeetOMX_ERRORTYPE OMXVideoEncoderMPEG4::GetParamVideoMpeg4(OMX_PTR pStructure) {
275914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    OMX_ERRORTYPE ret;
2760110aa09e5898987ee86586e438ac571075eba3aDave Airlie    OMX_VIDEO_PARAM_MPEG4TYPE *p = (OMX_VIDEO_PARAM_MPEG4TYPE *)pStructure;
2770110aa09e5898987ee86586e438ac571075eba3aDave Airlie    CHECK_TYPE_HEADER(p);
2783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
2793fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2803fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    memcpy(p, &mParamMpeg4, sizeof(*p));
281914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    return OMX_ErrorNone;
2820110aa09e5898987ee86586e438ac571075eba3aDave Airlie}
2830110aa09e5898987ee86586e438ac571075eba3aDave Airlie
2843fccc14b2fb35aef95bc04dee46e280a48679299Henri VerbeetOMX_ERRORTYPE OMXVideoEncoderMPEG4::SetParamVideoMpeg4(OMX_PTR pStructure) {
2853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    OMX_ERRORTYPE ret;
2863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    OMX_VIDEO_PARAM_MPEG4TYPE *p = (OMX_VIDEO_PARAM_MPEG4TYPE *)pStructure;
2873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    CHECK_TYPE_HEADER(p);
2883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
2893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    CHECK_SET_PARAM_STATE();
2903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    // TODO: do we need to check if port is enabled?
2923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    // TODO: see SetPortMpeg4Param implementation - Can we make simple copy????
2933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    memcpy(&mParamMpeg4, p, sizeof(mParamMpeg4));
2943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    return OMX_ErrorNone;
2953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet}
2963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2983fccc14b2fb35aef95bc04dee46e280a48679299Henri VerbeetDECLARE_OMX_COMPONENT("OMX.Intel.VideoEncoder.MPEG4", "video_encoder.mpeg4", OMXVideoEncoderMPEG4);
2993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
3003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
3013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet