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