SoftAVCEnc.cpp revision cbe6ac2f281362d9dfbff867dd414d5cc2f6d21e
196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell/*
296675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * Copyright 2015 The Android Open Source Project
396675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell *
496675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * Licensed under the Apache License, Version 2.0 (the "License");
596675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * you may not use this file except in compliance with the License.
696675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * You may obtain a copy of the License at
796675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell *
896675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell *      http://www.apache.org/licenses/LICENSE-2.0
996675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell *
1096675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * Unless required by applicable law or agreed to in writing, software
1196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * distributed under the License is distributed on an "AS IS" BASIS,
1296675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1396675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * See the License for the specific language governing permissions and
1496675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell * limitations under the License.
1596675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell */
16fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell
1796675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell//#define LOG_NDEBUG 0
1894a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy#define LOG_TAG "SoftAVCEnc"
19a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes#include <utils/Log.h>
20417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye#include <utils/misc.h>
2196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell
228028dd32a4a04154050220dd0693583d5b750330Adam Powell#include "OMX_Video.h"
23a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes
2496675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell#include <HardwareAPI.h>
253d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette#include <MetadataBufferType.h>
266b336f835d637853800b94689375a03f337139a4Adam Powell#include <media/stagefright/foundation/ADebug.h>
27fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell#include <media/stagefright/MediaDefs.h>
28e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell#include <media/stagefright/MediaErrors.h>
29cf78b3e5101349fdddbde14b3a55140f9562ae66Adam Powell#include <media/stagefright/MetaData.h>
30640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell#include <media/stagefright/Utils.h>
317ade1be822ed05a143b059319dccd5e9f623b56dAdam Powell#include <ui/Rect.h>
3294a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy
337bc3ca0dc52be52ecad1c0de8c62a6a4bf8141caAdam Powell#include "ih264_typedefs.h"
34fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell#include "iv2.h"
35fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell#include "ive2.h"
36fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell#include "ih264e.h"
3704c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell#include "SoftAVCEnc.h"
38fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell
3996675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powellnamespace android {
4096675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell
41fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell    #define ive_api_function ih264e_api_function
42fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell
43fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powelltemplate<class T>
44fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powellstatic void InitOMXParams(T *params) {
4596675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell    params->nSize = sizeof(T);
4696675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell    params->nVersion.s.nVersionMajor = 1;
4796675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell    params->nVersion.s.nVersionMinor = 0;
4896675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell    params->nVersion.s.nRevision = 0;
4935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    params->nVersion.s.nStep = 0;
50be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell}
5135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
5296675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powelltypedef struct LevelConversion {
537ade1be822ed05a143b059319dccd5e9f623b56dAdam Powell    OMX_VIDEO_AVCLEVELTYPE omxLevel;
543d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    WORD32 avcLevel;
553d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette} LevelConcersion;
563d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette
573d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverettestatic LevelConversion ConversionTable[] = {
583d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    { OMX_VIDEO_AVCLevel1,  10 },
593d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    { OMX_VIDEO_AVCLevel1b, 9  },
608028dd32a4a04154050220dd0693583d5b750330Adam Powell    { OMX_VIDEO_AVCLevel11, 11 },
61696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    { OMX_VIDEO_AVCLevel12, 12 },
6204c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell    { OMX_VIDEO_AVCLevel13, 13 },
63c46125042493e66f7dfdccec24e3b0739600b194Adam Powell    { OMX_VIDEO_AVCLevel2,  20 },
64640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    { OMX_VIDEO_AVCLevel21, 21 },
6589b09da7b3b1e69264d9ec710c66eb2f891b313eAdam Powell    { OMX_VIDEO_AVCLevel22, 22 },
6635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    { OMX_VIDEO_AVCLevel3,  30 },
67be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    { OMX_VIDEO_AVCLevel31, 31 },
688515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    { OMX_VIDEO_AVCLevel32, 32 },
69e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    { OMX_VIDEO_AVCLevel4,  40 },
70e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    { OMX_VIDEO_AVCLevel41, 41 },
7196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell    { OMX_VIDEO_AVCLevel42, 42 },
7296675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell    { OMX_VIDEO_AVCLevel5,  50 },
7396675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell    { OMX_VIDEO_AVCLevel51, 51 },
7496675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell};
7596675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell
7696675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powellstatic const CodecProfileLevel kProfileLevels[] = {
77f16888f1e849b0bc0b9c17e5f833c4e2cd54c382Adam Powell    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1  },
78be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1b },
79be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel11 },
80be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel12 },
813d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel13 },
823d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel2  },
83773b1b97fc0f01efc8cf1e17a1250a9b654b1b85Adam Powell    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel21 },
84773b1b97fc0f01efc8cf1e17a1250a9b654b1b85Adam Powell    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel22 },
853d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel3  },
863d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel31 },
873d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel32 },
883d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel4  },
893d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel41 },
903d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette};
913d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette
92417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye
933d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverettestatic size_t GetCPUCoreCount() {
943d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    long cpuCoreCount = 1;
953d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette#if defined(_SC_NPROCESSORS_ONLN)
963d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN);
973d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette#else
983d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    // _SC_NPROC_ONLN must be defined...
993d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    cpuCoreCount = sysconf(_SC_NPROC_ONLN);
1003d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette#endif
1013d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    CHECK(cpuCoreCount >= 1);
1023d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    ALOGD("Number of CPU cores: %ld", cpuCoreCount);
1033d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    return (size_t)cpuCoreCount;
1043d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette}
1053d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette
1063d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverettestatic status_t ConvertOmxAvcLevelToAvcSpecLevel(
1073d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette        OMX_VIDEO_AVCLEVELTYPE omxLevel, WORD32 *avcLevel) {
1083d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    for (size_t i = 0; i < NELEM(ConversionTable); ++i) {
1093d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette        if (omxLevel == ConversionTable[i].omxLevel) {
1103d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette            *avcLevel = ConversionTable[i].avcLevel;
1113d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette            return OK;
1123d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette        }
1133d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    }
1143d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette
1153d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette    ALOGE("ConvertOmxAvcLevelToAvcSpecLevel: %d level not supported",
116696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            (int32_t)omxLevel);
117696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
118e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell    return BAD_VALUE;
119696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell}
120696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
1216c6f575423d6718c3ff322224c1520901ce881e1Adam Powellstatic status_t ConvertAvcSpecLevelToOmxAvcLevel(
122773b1b97fc0f01efc8cf1e17a1250a9b654b1b85Adam Powell        WORD32 avcLevel, OMX_VIDEO_AVCLEVELTYPE *omxLevel) {
1238515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    for (size_t i = 0; i < NELEM(ConversionTable); ++i) {
1246c6f575423d6718c3ff322224c1520901ce881e1Adam Powell        if (avcLevel == ConversionTable[i].avcLevel) {
1255cd13265af66e72d9865cabb4b05bdb7791b54efChris Banes            *omxLevel = ConversionTable[i].omxLevel;
1265cd13265af66e72d9865cabb4b05bdb7791b54efChris Banes            return OK;
1275cd13265af66e72d9865cabb4b05bdb7791b54efChris Banes        }
1285cd13265af66e72d9865cabb4b05bdb7791b54efChris Banes    }
1295cd13265af66e72d9865cabb4b05bdb7791b54efChris Banes
1305cd13265af66e72d9865cabb4b05bdb7791b54efChris Banes    ALOGE("ConvertAvcSpecLevelToOmxAvcLevel: %d level not supported",
1315cd13265af66e72d9865cabb4b05bdb7791b54efChris Banes            (int32_t)avcLevel);
1326c6f575423d6718c3ff322224c1520901ce881e1Adam Powell
133773b1b97fc0f01efc8cf1e17a1250a9b654b1b85Adam Powell    return BAD_VALUE;
134773b1b97fc0f01efc8cf1e17a1250a9b654b1b85Adam Powell}
135e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
136e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
137e43340c80dc66c45edc793ecd0343774aa34d108Adam PowellSoftAVC::SoftAVC(
138e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        const char *name,
1398515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        const OMX_CALLBACKTYPE *callbacks,
140640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        OMX_PTR appData,
14135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell        OMX_COMPONENTTYPE **component)
14289b09da7b3b1e69264d9ec710c66eb2f891b313eAdam Powell    : SoftVideoEncoderOMXComponent(
14335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell            name, "video_encoder.avc", OMX_VIDEO_CodingAVC,
14489b09da7b3b1e69264d9ec710c66eb2f891b313eAdam Powell            kProfileLevels, NELEM(kProfileLevels),
14589b09da7b3b1e69264d9ec710c66eb2f891b313eAdam Powell            176 /* width */, 144 /* height */,
14689b09da7b3b1e69264d9ec710c66eb2f891b313eAdam Powell            callbacks, appData, component),
14789b09da7b3b1e69264d9ec710c66eb2f891b313eAdam Powell      mIvVideoColorFormat(IV_YUV_420P),
14889b09da7b3b1e69264d9ec710c66eb2f891b313eAdam Powell      mIDRFrameRefreshIntervalInSec(1),
14989b09da7b3b1e69264d9ec710c66eb2f891b313eAdam Powell      mAVCEncProfile(IV_PROFILE_BASE),
15089b09da7b3b1e69264d9ec710c66eb2f891b313eAdam Powell      mAVCEncLevel(31),
151da9710806bc7874b8c553f4daf9cf14f35ae1b07Adam Powell      mPrevTimestampUs(-1),
15289b09da7b3b1e69264d9ec710c66eb2f891b313eAdam Powell      mStarted(false),
15389b09da7b3b1e69264d9ec710c66eb2f891b313eAdam Powell      mSawInputEOS(false),
154640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell      mSignalledError(false),
155640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell      mConversionBuffer(NULL),
15635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell      mCodecCtx(NULL) {
157e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
158e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    initPorts(kNumBuffers, kNumBuffers, ((mWidth * mHeight * 3) >> 1),
15935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell            MEDIA_MIMETYPE_VIDEO_AVC, 2);
16035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
16175d022af1f24cf2d8a7551183ea5bbe943d25d21Adam Powell    // If dump is enabled, then open create an empty file
16275d022af1f24cf2d8a7551183ea5bbe943d25d21Adam Powell    GENERATE_FILE_NAMES();
16375d022af1f24cf2d8a7551183ea5bbe943d25d21Adam Powell    CREATE_DUMP_FILE(mInFile);
16475d022af1f24cf2d8a7551183ea5bbe943d25d21Adam Powell    CREATE_DUMP_FILE(mOutFile);
16575d022af1f24cf2d8a7551183ea5bbe943d25d21Adam Powell
16675d022af1f24cf2d8a7551183ea5bbe943d25d21Adam Powell}
16735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
16835aecd5884a5ccfe380903e39f30f468315e8f92Adam PowellSoftAVC::~SoftAVC() {
16935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    releaseEncoder();
17035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    List<BufferInfo *> &outQueue = getPortQueue(1);
17135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    List<BufferInfo *> &inQueue = getPortQueue(0);
17235aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    CHECK(outQueue.empty());
17335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    CHECK(inQueue.empty());
17435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell}
17535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
17635aecd5884a5ccfe380903e39f30f468315e8f92Adam PowellOMX_ERRORTYPE SoftAVC::initEncParams() {
17735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    mCodecCtx = NULL;
17835aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    mMemRecords = NULL;
17935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    mNumMemRecords = DEFAULT_MEM_REC_CNT;
180fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell    mHeaderGenerated = 0;
181fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell    mNumCores = GetCPUCoreCount();
182367ee326058bbee6fc179b8b1eb2174fe7ba8f45Adam Powell    mArch = DEFAULT_ARCH;
18335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    mSliceMode = DEFAULT_SLICE_MODE;
18435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    mSliceParam = DEFAULT_SLICE_PARAM;
18535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    mHalfPelEnable = DEFAULT_HPEL;
18635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    mIInterval = DEFAULT_I_INTERVAL;
18735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    mIDRInterval = DEFAULT_IDR_INTERVAL;
1883bb421d5b85a8a99c408d16e4f80163a53bc0505Adam Powell    mDisableDeblkLevel = DEFAULT_DISABLE_DEBLK_LEVEL;
1893bb421d5b85a8a99c408d16e4f80163a53bc0505Adam Powell    mFrameRate = DEFAULT_SRC_FRAME_RATE;
1903bb421d5b85a8a99c408d16e4f80163a53bc0505Adam Powell    mEnableFastSad = DEFAULT_ENABLE_FAST_SAD;
1913bb421d5b85a8a99c408d16e4f80163a53bc0505Adam Powell    mEnableAltRef = DEFAULT_ENABLE_ALT_REF;
1923bb421d5b85a8a99c408d16e4f80163a53bc0505Adam Powell    mEncSpeed = DEFAULT_ENC_SPEED;
1933bb421d5b85a8a99c408d16e4f80163a53bc0505Adam Powell    mIntra4x4 = DEFAULT_INTRA4x4;
1943bb421d5b85a8a99c408d16e4f80163a53bc0505Adam Powell    mAIRMode = DEFAULT_AIR;
19535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    mAIRRefreshPeriod = DEFAULT_AIR_REFRESH_PERIOD;
19635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    mPSNREnable = DEFAULT_PSNR_ENABLE;
19735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    mReconEnable = DEFAULT_RECON_ENABLE;
19835aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
19935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    gettimeofday(&mTimeStart, NULL);
200160bb7fa60e8ece654e6ce999b6c16af50ee7357Adam Powell    gettimeofday(&mTimeEnd, NULL);
20114b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
20214b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    return OMX_ErrorNone;
20335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell}
20414b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
20514b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
20635aecd5884a5ccfe380903e39f30f468315e8f92Adam PowellOMX_ERRORTYPE SoftAVC::setDimensions() {
20735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    ive_ctl_set_dimensions_ip_t s_dimensions_ip;
20835aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    ive_ctl_set_dimensions_op_t s_dimensions_op;
20935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    IV_STATUS_T status;
21014b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
21114b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_dimensions_ip.e_cmd = IVE_CMD_VIDEO_CTL;
212be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_dimensions_ip.e_sub_cmd = IVE_CMD_CTL_SET_DIMENSIONS;
21314b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_dimensions_ip.u4_ht = mHeight;
21414b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_dimensions_ip.u4_wd = mWidth;
215be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_dimensions_ip.u4_strd = mStride;
216be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell
217be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_dimensions_ip.u4_timestamp_high = -1;
218be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_dimensions_ip.u4_timestamp_low = -1;
219be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell
220be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_dimensions_ip.u4_size = sizeof(ive_ctl_set_dimensions_ip_t);
22135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_dimensions_op.u4_size = sizeof(ive_ctl_set_dimensions_op_t);
22235aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
22335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    status = ive_api_function(mCodecCtx, &s_dimensions_ip, &s_dimensions_op);
22435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    if (status != IV_SUCCESS) {
225160bb7fa60e8ece654e6ce999b6c16af50ee7357Adam Powell        ALOGE("Unable to set frame dimensions = 0x%x\n",
22614b7e2c1688914ba8b6854738981337d7c0653beAdam Powell                s_dimensions_op.u4_error_code);
22714b7e2c1688914ba8b6854738981337d7c0653beAdam Powell        return OMX_ErrorUndefined;
228be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    }
22935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    return OMX_ErrorNone;
23035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell}
23135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
23235aecd5884a5ccfe380903e39f30f468315e8f92Adam PowellOMX_ERRORTYPE SoftAVC::setNumCores() {
23335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    IV_STATUS_T status;
234367ee326058bbee6fc179b8b1eb2174fe7ba8f45Adam Powell    ive_ctl_set_num_cores_ip_t s_num_cores_ip;
23535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    ive_ctl_set_num_cores_op_t s_num_cores_op;
23635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_num_cores_ip.e_cmd = IVE_CMD_VIDEO_CTL;
237160bb7fa60e8ece654e6ce999b6c16af50ee7357Adam Powell    s_num_cores_ip.e_sub_cmd = IVE_CMD_CTL_SET_NUM_CORES;
23814b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_num_cores_ip.u4_num_cores = MIN(mNumCores, CODEC_MAX_CORES);
23935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_num_cores_ip.u4_timestamp_high = -1;
24035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_num_cores_ip.u4_timestamp_low = -1;
24135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_num_cores_ip.u4_size = sizeof(ive_ctl_set_num_cores_ip_t);
24214b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
24335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_num_cores_op.u4_size = sizeof(ive_ctl_set_num_cores_op_t);
24435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
245be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    status = ive_api_function(
246be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell            mCodecCtx, (void *) &s_num_cores_ip, (void *) &s_num_cores_op);
247be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    if (status != IV_SUCCESS) {
248be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell        ALOGE("Unable to set processor params = 0x%x\n",
24935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell                s_num_cores_op.u4_error_code);
25035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell        return OMX_ErrorUndefined;
25135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    }
25235aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    return OMX_ErrorNone;
253160bb7fa60e8ece654e6ce999b6c16af50ee7357Adam Powell}
25435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
25535aecd5884a5ccfe380903e39f30f468315e8f92Adam PowellOMX_ERRORTYPE SoftAVC::setFrameRate() {
25635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    ive_ctl_set_frame_rate_ip_t s_frame_rate_ip;
25735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    ive_ctl_set_frame_rate_op_t s_frame_rate_op;
25835aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    IV_STATUS_T status;
25935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
26035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_frame_rate_ip.e_cmd = IVE_CMD_VIDEO_CTL;
26135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_frame_rate_ip.e_sub_cmd = IVE_CMD_CTL_SET_FRAMERATE;
262160bb7fa60e8ece654e6ce999b6c16af50ee7357Adam Powell
26335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_frame_rate_ip.u4_src_frame_rate = mFrameRate;
26435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_frame_rate_ip.u4_tgt_frame_rate = mFrameRate;
26535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
26635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_frame_rate_ip.u4_timestamp_high = -1;
26735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_frame_rate_ip.u4_timestamp_low = -1;
26835aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
26935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_frame_rate_ip.u4_size = sizeof(ive_ctl_set_frame_rate_ip_t);
27035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_frame_rate_op.u4_size = sizeof(ive_ctl_set_frame_rate_op_t);
27135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
27235aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    status = ive_api_function(mCodecCtx, &s_frame_rate_ip, &s_frame_rate_op);
27335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    if (status != IV_SUCCESS) {
27435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell        ALOGE("Unable to set frame rate = 0x%x\n",
27535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell                s_frame_rate_op.u4_error_code);
27614b7e2c1688914ba8b6854738981337d7c0653beAdam Powell        return OMX_ErrorUndefined;
27735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    }
278be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    return OMX_ErrorNone;
27935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell}
280be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell
281be3c329ebec083e5ff933bab6b6c501519ad2bffAdam PowellOMX_ERRORTYPE SoftAVC::setIpeParams() {
282be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    ive_ctl_set_ipe_params_ip_t s_ipe_params_ip;
283be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    ive_ctl_set_ipe_params_op_t s_ipe_params_op;
28435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    IV_STATUS_T status;
28535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
286be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_ipe_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
287be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_ipe_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_IPE_PARAMS;
288be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell
289be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_ipe_params_ip.u4_enable_intra_4x4 = mIntra4x4;
290be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_ipe_params_ip.u4_enc_speed_preset = mEncSpeed;
291be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell
292be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_ipe_params_ip.u4_timestamp_high = -1;
293be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_ipe_params_ip.u4_timestamp_low = -1;
294be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell
295be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_ipe_params_ip.u4_size = sizeof(ive_ctl_set_ipe_params_ip_t);
29635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_ipe_params_op.u4_size = sizeof(ive_ctl_set_ipe_params_op_t);
29735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
29835aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    status = ive_api_function(mCodecCtx, &s_ipe_params_ip, &s_ipe_params_op);
29935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    if (status != IV_SUCCESS) {
30035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell        ALOGE("Unable to set ipe params = 0x%x\n",
30135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell                s_ipe_params_op.u4_error_code);
30235aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell        return OMX_ErrorUndefined;
30335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    }
30435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    return OMX_ErrorNone;
30514b7e2c1688914ba8b6854738981337d7c0653beAdam Powell}
30614b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
30714b7e2c1688914ba8b6854738981337d7c0653beAdam PowellOMX_ERRORTYPE SoftAVC::setBitRate() {
30814b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    ive_ctl_set_bitrate_ip_t s_bitrate_ip;
309be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    ive_ctl_set_bitrate_op_t s_bitrate_op;
31014b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    IV_STATUS_T status;
31114b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
31214b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_bitrate_ip.e_cmd = IVE_CMD_VIDEO_CTL;
31314b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_bitrate_ip.e_sub_cmd = IVE_CMD_CTL_SET_BITRATE;
31414b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
315be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_bitrate_ip.u4_target_bitrate = mBitrate;
316be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell
31714b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_bitrate_ip.u4_timestamp_high = -1;
31814b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_bitrate_ip.u4_timestamp_low = -1;
319be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell
320be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_bitrate_ip.u4_size = sizeof(ive_ctl_set_bitrate_ip_t);
32114b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_bitrate_op.u4_size = sizeof(ive_ctl_set_bitrate_op_t);
32214b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
32335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    status = ive_api_function(mCodecCtx, &s_bitrate_ip, &s_bitrate_op);
3243bb421d5b85a8a99c408d16e4f80163a53bc0505Adam Powell    if (status != IV_SUCCESS) {
3253bb421d5b85a8a99c408d16e4f80163a53bc0505Adam Powell        ALOGE("Unable to set bit rate = 0x%x\n", s_bitrate_op.u4_error_code);
32635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell        return OMX_ErrorUndefined;
32735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    }
32814b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    return OMX_ErrorNone;
32935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell}
33035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
33135aecd5884a5ccfe380903e39f30f468315e8f92Adam PowellOMX_ERRORTYPE SoftAVC::setFrameType(IV_PICTURE_CODING_TYPE_T e_frame_type) {
33214b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    ive_ctl_set_frame_type_ip_t s_frame_type_ip;
33314b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    ive_ctl_set_frame_type_op_t s_frame_type_op;
33414b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    IV_STATUS_T status;
33514b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
336be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell    s_frame_type_ip.e_cmd = IVE_CMD_VIDEO_CTL;
33714b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_frame_type_ip.e_sub_cmd = IVE_CMD_CTL_SET_FRAMETYPE;
33814b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
33914b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_frame_type_ip.e_frame_type = e_frame_type;
34014b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
34114b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_frame_type_ip.u4_timestamp_high = -1;
34214b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_frame_type_ip.u4_timestamp_low = -1;
34314b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
34414b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_frame_type_ip.u4_size = sizeof(ive_ctl_set_frame_type_ip_t);
34514b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_frame_type_op.u4_size = sizeof(ive_ctl_set_frame_type_op_t);
34614b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
34714b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    status = ive_api_function(mCodecCtx, &s_frame_type_ip, &s_frame_type_op);
34814b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    if (status != IV_SUCCESS) {
34914b7e2c1688914ba8b6854738981337d7c0653beAdam Powell        ALOGE("Unable to set frame type = 0x%x\n",
35014b7e2c1688914ba8b6854738981337d7c0653beAdam Powell                s_frame_type_op.u4_error_code);
35114b7e2c1688914ba8b6854738981337d7c0653beAdam Powell        return OMX_ErrorUndefined;
35214b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    }
35314b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    return OMX_ErrorNone;
35414b7e2c1688914ba8b6854738981337d7c0653beAdam Powell}
35514b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
35614b7e2c1688914ba8b6854738981337d7c0653beAdam PowellOMX_ERRORTYPE SoftAVC::setQp() {
35714b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    ive_ctl_set_qp_ip_t s_qp_ip;
35835aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    ive_ctl_set_qp_op_t s_qp_op;
35935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    IV_STATUS_T status;
36035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
36135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_qp_ip.e_cmd = IVE_CMD_VIDEO_CTL;
36235aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_qp_ip.e_sub_cmd = IVE_CMD_CTL_SET_QP;
36335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
36435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_qp_ip.u4_i_qp = DEFAULT_I_QP;
36535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_qp_ip.u4_i_qp_max = DEFAULT_QP_MAX;
36635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_qp_ip.u4_i_qp_min = DEFAULT_QP_MIN;
36735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
36835aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_qp_ip.u4_p_qp = DEFAULT_P_QP;
36935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_qp_ip.u4_p_qp_max = DEFAULT_QP_MAX;
37035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_qp_ip.u4_p_qp_min = DEFAULT_QP_MIN;
37135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
372367ee326058bbee6fc179b8b1eb2174fe7ba8f45Adam Powell    s_qp_ip.u4_b_qp = DEFAULT_P_QP;
373367ee326058bbee6fc179b8b1eb2174fe7ba8f45Adam Powell    s_qp_ip.u4_b_qp_max = DEFAULT_QP_MAX;
37435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_qp_ip.u4_b_qp_min = DEFAULT_QP_MIN;
37535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
37635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_qp_ip.u4_timestamp_high = -1;
37735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_qp_ip.u4_timestamp_low = -1;
37835aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
37935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_qp_ip.u4_size = sizeof(ive_ctl_set_qp_ip_t);
38035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_qp_op.u4_size = sizeof(ive_ctl_set_qp_op_t);
38135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
38235aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    status = ive_api_function(mCodecCtx, &s_qp_ip, &s_qp_op);
38335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    if (status != IV_SUCCESS) {
38435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell        ALOGE("Unable to set qp 0x%x\n", s_qp_op.u4_error_code);
38535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell        return OMX_ErrorUndefined;
38635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    }
38735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    return OMX_ErrorNone;
388160bb7fa60e8ece654e6ce999b6c16af50ee7357Adam Powell}
38935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
39035aecd5884a5ccfe380903e39f30f468315e8f92Adam PowellOMX_ERRORTYPE SoftAVC::setEncMode(IVE_ENC_MODE_T e_enc_mode) {
39135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    IV_STATUS_T status;
39235aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    ive_ctl_set_enc_mode_ip_t s_enc_mode_ip;
39335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    ive_ctl_set_enc_mode_op_t s_enc_mode_op;
39435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
39535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_enc_mode_ip.e_cmd = IVE_CMD_VIDEO_CTL;
39635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_enc_mode_ip.e_sub_cmd = IVE_CMD_CTL_SET_ENC_MODE;
39735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
39835aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_enc_mode_ip.e_enc_mode = e_enc_mode;
39935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
40035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_enc_mode_ip.u4_timestamp_high = -1;
40135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_enc_mode_ip.u4_timestamp_low = -1;
40235aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
40335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_enc_mode_ip.u4_size = sizeof(ive_ctl_set_enc_mode_ip_t);
40435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_enc_mode_op.u4_size = sizeof(ive_ctl_set_enc_mode_op_t);
40535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
406a7dec6d9734bdc3a9e39ffd357002e25c6fdc99bAdam Powell    status = ive_api_function(mCodecCtx, &s_enc_mode_ip, &s_enc_mode_op);
407a7dec6d9734bdc3a9e39ffd357002e25c6fdc99bAdam Powell    if (status != IV_SUCCESS) {
408a7dec6d9734bdc3a9e39ffd357002e25c6fdc99bAdam Powell        ALOGE("Unable to set in header encode mode = 0x%x\n",
409a7dec6d9734bdc3a9e39ffd357002e25c6fdc99bAdam Powell                s_enc_mode_op.u4_error_code);
410160bb7fa60e8ece654e6ce999b6c16af50ee7357Adam Powell        return OMX_ErrorUndefined;
411a7dec6d9734bdc3a9e39ffd357002e25c6fdc99bAdam Powell    }
41235aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    return OMX_ErrorNone;
41335aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell}
41435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
41535aecd5884a5ccfe380903e39f30f468315e8f92Adam PowellOMX_ERRORTYPE SoftAVC::setVbvParams() {
41635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    ive_ctl_set_vbv_params_ip_t s_vbv_ip;
41735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    ive_ctl_set_vbv_params_op_t s_vbv_op;
41835aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    IV_STATUS_T status;
419a7dec6d9734bdc3a9e39ffd357002e25c6fdc99bAdam Powell
42035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_vbv_ip.e_cmd = IVE_CMD_VIDEO_CTL;
421160bb7fa60e8ece654e6ce999b6c16af50ee7357Adam Powell    s_vbv_ip.e_sub_cmd = IVE_CMD_CTL_SET_VBV_PARAMS;
422a7dec6d9734bdc3a9e39ffd357002e25c6fdc99bAdam Powell
423160bb7fa60e8ece654e6ce999b6c16af50ee7357Adam Powell    s_vbv_ip.u4_vbv_buf_size = 0;
424160bb7fa60e8ece654e6ce999b6c16af50ee7357Adam Powell    s_vbv_ip.u4_vbv_buffer_delay = 1000;
42535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
42635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_vbv_ip.u4_timestamp_high = -1;
42735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_vbv_ip.u4_timestamp_low = -1;
42835aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
42935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_vbv_ip.u4_size = sizeof(ive_ctl_set_vbv_params_ip_t);
430640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_vbv_op.u4_size = sizeof(ive_ctl_set_vbv_params_op_t);
431640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
432640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    status = ive_api_function(mCodecCtx, &s_vbv_ip, &s_vbv_op);
433640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    if (status != IV_SUCCESS) {
434640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        ALOGE("Unable to set VBC params = 0x%x\n", s_vbv_op.u4_error_code);
435640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        return OMX_ErrorUndefined;
436640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    }
437640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    return OMX_ErrorNone;
438640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell}
439640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
4401970cfd4ef97a5a1b5dc385b114d615d858c359bChris BanesOMX_ERRORTYPE SoftAVC::setAirParams() {
441640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    ive_ctl_set_air_params_ip_t s_air_ip;
442640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    ive_ctl_set_air_params_op_t s_air_op;
443640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    IV_STATUS_T status;
444640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
445640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_air_ip.e_cmd = IVE_CMD_VIDEO_CTL;
44635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_air_ip.e_sub_cmd = IVE_CMD_CTL_SET_AIR_PARAMS;
4470762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio
448640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_air_ip.e_air_mode = mAIRMode;
449640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_air_ip.u4_air_refresh_period = mAIRRefreshPeriod;
450640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
451640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_air_ip.u4_timestamp_high = -1;
452640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_air_ip.u4_timestamp_low = -1;
453640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
454640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_air_ip.u4_size = sizeof(ive_ctl_set_air_params_ip_t);
455640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_air_op.u4_size = sizeof(ive_ctl_set_air_params_op_t);
456640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
457640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    status = ive_api_function(mCodecCtx, &s_air_ip, &s_air_op);
458640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    if (status != IV_SUCCESS) {
459640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        ALOGE("Unable to set air params = 0x%x\n", s_air_op.u4_error_code);
460640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        return OMX_ErrorUndefined;
461640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    }
4620762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    return OMX_ErrorNone;
4630762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio}
4640762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio
4650762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di MeglioOMX_ERRORTYPE SoftAVC::setMeParams() {
4660762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    IV_STATUS_T status;
4670762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    ive_ctl_set_me_params_ip_t s_me_params_ip;
4680762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    ive_ctl_set_me_params_op_t s_me_params_op;
4690762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio
4700762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    s_me_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
471640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_me_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_ME_PARAMS;
472640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
473640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_me_params_ip.u4_enable_fast_sad = mEnableFastSad;
474640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_me_params_ip.u4_enable_alt_ref = mEnableAltRef;
475640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
47635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_me_params_ip.u4_enable_hpel = mHalfPelEnable;
477640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_me_params_ip.u4_enable_qpel = DEFAULT_QPEL;
47835aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_me_params_ip.u4_me_speed_preset = DEFAULT_ME_SPEED;
47935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_me_params_ip.u4_srch_rng_x = DEFAULT_SRCH_RNG_X;
48035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_me_params_ip.u4_srch_rng_y = DEFAULT_SRCH_RNG_Y;
481640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
482640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_me_params_ip.u4_timestamp_high = -1;
483640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_me_params_ip.u4_timestamp_low = -1;
484640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
485640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_me_params_ip.u4_size = sizeof(ive_ctl_set_me_params_ip_t);
486640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_me_params_op.u4_size = sizeof(ive_ctl_set_me_params_op_t);
487640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
48814b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    status = ive_api_function(mCodecCtx, &s_me_params_ip, &s_me_params_op);
48914b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    if (status != IV_SUCCESS) {
49014b7e2c1688914ba8b6854738981337d7c0653beAdam Powell        ALOGE("Unable to set me params = 0x%x\n", s_me_params_op.u4_error_code);
49114b7e2c1688914ba8b6854738981337d7c0653beAdam Powell        return OMX_ErrorUndefined;
49214b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    }
49314b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    return OMX_ErrorNone;
49414b7e2c1688914ba8b6854738981337d7c0653beAdam Powell}
49514b7e2c1688914ba8b6854738981337d7c0653beAdam Powell
49614b7e2c1688914ba8b6854738981337d7c0653beAdam PowellOMX_ERRORTYPE SoftAVC::setGopParams() {
49714b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    IV_STATUS_T status;
49814b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    ive_ctl_set_gop_params_ip_t s_gop_params_ip;
49914b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    ive_ctl_set_gop_params_op_t s_gop_params_op;
50035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
50114b7e2c1688914ba8b6854738981337d7c0653beAdam Powell    s_gop_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
502640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_gop_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_GOP_PARAMS;
5030762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio
5040762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    s_gop_params_ip.u4_i_frm_interval = mIInterval;
5050762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    s_gop_params_ip.u4_idr_frm_interval = mIDRInterval;
5060762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    s_gop_params_ip.u4_num_b_frames = DEFAULT_B_FRAMES;
5070762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio
5080762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    s_gop_params_ip.u4_timestamp_high = -1;
5090762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    s_gop_params_ip.u4_timestamp_low = -1;
5100762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio
5110762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    s_gop_params_ip.u4_size = sizeof(ive_ctl_set_gop_params_ip_t);
5120762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    s_gop_params_op.u4_size = sizeof(ive_ctl_set_gop_params_op_t);
5130762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio
5140762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    status = ive_api_function(mCodecCtx, &s_gop_params_ip, &s_gop_params_op);
5150762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    if (status != IV_SUCCESS) {
5160762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio        ALOGE("Unable to set ME params = 0x%x\n",
5170762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio                s_gop_params_op.u4_error_code);
518640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        return OMX_ErrorUndefined;
5190762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    }
5200762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    return OMX_ErrorNone;
5210762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio}
5220762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio
5230762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di MeglioOMX_ERRORTYPE SoftAVC::setProfileParams() {
5240762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    IV_STATUS_T status;
5250762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    ive_ctl_set_profile_params_ip_t s_profile_params_ip;
5260762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    ive_ctl_set_profile_params_op_t s_profile_params_op;
527640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
5280762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    s_profile_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
5290762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    s_profile_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_PROFILE_PARAMS;
5300762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio
5310762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    s_profile_params_ip.e_profile = DEFAULT_EPROFILE;
5320762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio
5330762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    s_profile_params_ip.u4_timestamp_high = -1;
5340762cec04fa5ce65a2adc6d70ea1396041b1a88dFabrice Di Meglio    s_profile_params_ip.u4_timestamp_low = -1;
535640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
536640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_profile_params_ip.u4_size = sizeof(ive_ctl_set_profile_params_ip_t);
537640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    s_profile_params_op.u4_size = sizeof(ive_ctl_set_profile_params_op_t);
538640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
5398515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    status = ive_api_function(mCodecCtx, &s_profile_params_ip, &s_profile_params_op);
5408515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell    if (status != IV_SUCCESS) {
541e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        ALOGE("Unable to set profile params = 0x%x\n",
5428028dd32a4a04154050220dd0693583d5b750330Adam Powell                s_profile_params_op.u4_error_code);
5438028dd32a4a04154050220dd0693583d5b750330Adam Powell        return OMX_ErrorUndefined;
5449cc36ca1b520c06f882e84b909f3a2b75d303a06Chris Banes    }
545a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes    return OMX_ErrorNone;
5469cc36ca1b520c06f882e84b909f3a2b75d303a06Chris Banes}
547a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes
5489cc36ca1b520c06f882e84b909f3a2b75d303a06Chris BanesOMX_ERRORTYPE SoftAVC::setDeblockParams() {
549a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes    IV_STATUS_T status;
550a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes    ive_ctl_set_deblock_params_ip_t s_deblock_params_ip;
551a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes    ive_ctl_set_deblock_params_op_t s_deblock_params_op;
5529cc36ca1b520c06f882e84b909f3a2b75d303a06Chris Banes
5539cc36ca1b520c06f882e84b909f3a2b75d303a06Chris Banes    s_deblock_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
5549cc36ca1b520c06f882e84b909f3a2b75d303a06Chris Banes    s_deblock_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_DEBLOCK_PARAMS;
555a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes
5569cc36ca1b520c06f882e84b909f3a2b75d303a06Chris Banes    s_deblock_params_ip.u4_disable_deblock_level = mDisableDeblkLevel;
557a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes
5589cc36ca1b520c06f882e84b909f3a2b75d303a06Chris Banes    s_deblock_params_ip.u4_timestamp_high = -1;
559a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes    s_deblock_params_ip.u4_timestamp_low = -1;
560a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes
561a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes    s_deblock_params_ip.u4_size = sizeof(ive_ctl_set_deblock_params_ip_t);
562a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes    s_deblock_params_op.u4_size = sizeof(ive_ctl_set_deblock_params_op_t);
563a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes
564a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes    status = ive_api_function(mCodecCtx, &s_deblock_params_ip, &s_deblock_params_op);
565a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes    if (status != IV_SUCCESS) {
566a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes        ALOGE("Unable to enable/disable deblock params = 0x%x\n",
567a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes                s_deblock_params_op.u4_error_code);
568a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes        return OMX_ErrorUndefined;
569a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes    }
570a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes    return OMX_ErrorNone;
571a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes}
572a41b78973db3dfde159f7d641f794f462ad323d3Chris Banes
5739cc36ca1b520c06f882e84b909f3a2b75d303a06Chris Banesvoid SoftAVC::logVersion() {
5749cc36ca1b520c06f882e84b909f3a2b75d303a06Chris Banes    ive_ctl_getversioninfo_ip_t s_ctl_ip;
5757ade1be822ed05a143b059319dccd5e9f623b56dAdam Powell    ive_ctl_getversioninfo_op_t s_ctl_op;
5767ade1be822ed05a143b059319dccd5e9f623b56dAdam Powell    UWORD8 au1_buf[512];
5777ade1be822ed05a143b059319dccd5e9f623b56dAdam Powell    IV_STATUS_T status;
5787ade1be822ed05a143b059319dccd5e9f623b56dAdam Powell
5796b336f835d637853800b94689375a03f337139a4Adam Powell    s_ctl_ip.e_cmd = IVE_CMD_VIDEO_CTL;
5807ade1be822ed05a143b059319dccd5e9f623b56dAdam Powell    s_ctl_ip.e_sub_cmd = IVE_CMD_CTL_GETVERSION;
5817ade1be822ed05a143b059319dccd5e9f623b56dAdam Powell    s_ctl_ip.u4_size = sizeof(ive_ctl_getversioninfo_ip_t);
5827ade1be822ed05a143b059319dccd5e9f623b56dAdam Powell    s_ctl_op.u4_size = sizeof(ive_ctl_getversioninfo_op_t);
5837ade1be822ed05a143b059319dccd5e9f623b56dAdam Powell    s_ctl_ip.pu1_version = au1_buf;
58435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    s_ctl_ip.u4_version_bufsize = sizeof(au1_buf);
58535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
58635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    status = ive_api_function(mCodecCtx, (void *) &s_ctl_ip, (void *) &s_ctl_op);
58735aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
58835aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell    if (status != IV_SUCCESS) {
5897ade1be822ed05a143b059319dccd5e9f623b56dAdam Powell        ALOGE("Error in getting version: 0x%x", s_ctl_op.u4_error_code);
5908c1b02e7592dd02f30750c56bf88c65f8acbd3c9Adam Powell    } else {
5918c1b02e7592dd02f30750c56bf88c65f8acbd3c9Adam Powell        ALOGV("Ittiam encoder version: %s", (char *)s_ctl_ip.pu1_version);
5928c1b02e7592dd02f30750c56bf88c65f8acbd3c9Adam Powell    }
5938c1b02e7592dd02f30750c56bf88c65f8acbd3c9Adam Powell    return;
5943f476b34049d062942eafcf48396f593e00bd324Adam Powell}
5953f476b34049d062942eafcf48396f593e00bd324Adam Powell
5963f476b34049d062942eafcf48396f593e00bd324Adam PowellOMX_ERRORTYPE SoftAVC::initEncoder() {
5973f476b34049d062942eafcf48396f593e00bd324Adam Powell    IV_STATUS_T status;
5983f476b34049d062942eafcf48396f593e00bd324Adam Powell    size_t i;
5997ade1be822ed05a143b059319dccd5e9f623b56dAdam Powell    WORD32 level;
6007ade1be822ed05a143b059319dccd5e9f623b56dAdam Powell    uint32_t displaySizeY;
60196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell    CHECK(!mStarted);
602696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
603696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    OMX_ERRORTYPE errType = OMX_ErrorNone;
60435aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
605696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    displaySizeY = mWidth * mHeight;
606696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell    if (displaySizeY > (1920 * 1088)) {
607fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        level = 50;
608640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    } else if (displaySizeY > (1280 * 720)) {
609640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        level = 40;
610640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    } else if (displaySizeY > (720 * 576)) {
611640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        level = 31;
612640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    } else if (displaySizeY > (624 * 320)) {
613640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        level = 30;
614fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell    } else if (displaySizeY > (352 * 288)) {
61596675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell        level = 21;
61696675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell    } else {
61796675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell        level = 20;
61896675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell    }
619fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell    mAVCEncLevel = MAX(level, mAVCEncLevel);
62096675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell
62196675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell    if (OMX_ErrorNone != (errType = initEncParams())) {
62296675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell        ALOGE("Failed to initialize encoder params");
62396675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell        mSignalledError = true;
624fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
62528a8468995c71ba3fbba12557d143e7599db38d8Alan Viverette        return errType;
62696675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell    }
627f6148c53f93978af678cc0559a4417b608a33ae1Adam Powell
628f6148c53f93978af678cc0559a4417b608a33ae1Adam Powell    mStride = mWidth;
629fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell
630fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell    if (mInputDataIsMeta) {
631fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        if (mConversionBuffer) {
632fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell            free(mConversionBuffer);
633fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell            mConversionBuffer = NULL;
634fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        }
635fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell
636fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        if (mConversionBuffer == NULL) {
637fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell            mConversionBuffer = (uint8_t *)malloc(mStride * mHeight * 3 / 2);
638fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell            if (mConversionBuffer == NULL) {
639fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell                ALOGE("Allocating conversion buffer failed.");
640fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell                return OMX_ErrorUndefined;
641e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
642fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        }
643e8d153673bdbbb113559ad592ad8a4e92e8d0d7eAdam Powell    }
64404c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell
64504c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell    switch (mColorFormat) {
6463d0f21dab8d891b9aebdd5277348d549eeb843e6Alan Viverette        case OMX_COLOR_FormatYUV420SemiPlanar:
64707a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell            mIvVideoColorFormat = IV_YUV_420SP_UV;
648fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell            ALOGV("colorFormat YUV_420SP");
649fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell            break;
650fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        default:
651fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        case OMX_COLOR_FormatYUV420Planar:
652fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell            mIvVideoColorFormat = IV_YUV_420P;
653fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell            ALOGV("colorFormat YUV_420P");
65404c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell            break;
65504c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell    }
65604c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell
657c46125042493e66f7dfdccec24e3b0739600b194Adam Powell    ALOGV("Params width %d height %d level %d colorFormat %d", mWidth,
658c46125042493e66f7dfdccec24e3b0739600b194Adam Powell            mHeight, mAVCEncLevel, mIvVideoColorFormat);
659c46125042493e66f7dfdccec24e3b0739600b194Adam Powell
66004c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell    /* Getting Number of MemRecords */
66104c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell    {
66204c0d4607897157f01c908475fa0c6d7301cf7e5Adam Powell        iv_num_mem_rec_ip_t s_num_mem_rec_ip;
663e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        iv_num_mem_rec_op_t s_num_mem_rec_op;
664e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell
665e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        s_num_mem_rec_ip.u4_size = sizeof(iv_num_mem_rec_ip_t);
666e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        s_num_mem_rec_op.u4_size = sizeof(iv_num_mem_rec_op_t);
667e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell
668e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        s_num_mem_rec_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC;
669e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell
670e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        status = ive_api_function(0, &s_num_mem_rec_ip, &s_num_mem_rec_op);
671e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell
672e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        if (status != IV_SUCCESS) {
673e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell            ALOGE("Get number of memory records failed = 0x%x\n",
674e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell                    s_num_mem_rec_op.u4_error_code);
675e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell            return OMX_ErrorUndefined;
676e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        }
677e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell
678e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        mNumMemRecords = s_num_mem_rec_op.u4_num_mem_rec;
679e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell    }
680e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell
681e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell    /* Allocate array to hold memory records */
682e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell    mMemRecords = (iv_mem_rec_t *)malloc(mNumMemRecords * sizeof(iv_mem_rec_t));
683e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell    if (NULL == mMemRecords) {
684e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        ALOGE("Unable to allocate memory for hold memory records: Size %zu",
685e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell                mNumMemRecords * sizeof(iv_mem_rec_t));
686e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        mSignalledError = true;
687e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
688e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        return OMX_ErrorUndefined;
689e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell    }
690e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell
691e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell    {
692e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        iv_mem_rec_t *ps_mem_rec;
693e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        ps_mem_rec = mMemRecords;
694e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        for (i = 0; i < mNumMemRecords; i++) {
695e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell            ps_mem_rec->u4_size = sizeof(iv_mem_rec_t);
696e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell            ps_mem_rec->pv_base = NULL;
697e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell            ps_mem_rec->u4_mem_size = 0;
698e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell            ps_mem_rec->u4_mem_alignment = 0;
699e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell            ps_mem_rec->e_mem_type = IV_NA_MEM_TYPE;
700e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell
701e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell            ps_mem_rec++;
702e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        }
703e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell    }
704e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell
705e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell    /* Getting MemRecords Attributes */
706e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell    {
707e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        iv_fill_mem_rec_ip_t s_fill_mem_rec_ip;
708e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        iv_fill_mem_rec_op_t s_fill_mem_rec_op;
709e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell
710e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        s_fill_mem_rec_ip.u4_size = sizeof(iv_fill_mem_rec_ip_t);
711e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell        s_fill_mem_rec_op.u4_size = sizeof(iv_fill_mem_rec_op_t);
712e021e6ed8931a0a8296af182fc9b0c76b64fb0c4Adam Powell
713fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        s_fill_mem_rec_ip.e_cmd = IV_CMD_FILL_NUM_MEM_REC;
714fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        s_fill_mem_rec_ip.ps_mem_rec = mMemRecords;
715696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        s_fill_mem_rec_ip.u4_num_mem_rec = mNumMemRecords;
716696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        s_fill_mem_rec_ip.u4_max_wd = mWidth;
717825992f503439bc87d9d7e698a487f17b5acc243Jake Wharton        s_fill_mem_rec_ip.u4_max_ht = mHeight;
718825992f503439bc87d9d7e698a487f17b5acc243Jake Wharton        s_fill_mem_rec_ip.u4_max_level = mAVCEncLevel;
719825992f503439bc87d9d7e698a487f17b5acc243Jake Wharton        s_fill_mem_rec_ip.e_color_format = DEFAULT_INP_COLOR_FORMAT;
720696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        s_fill_mem_rec_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM;
721696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        s_fill_mem_rec_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM;
722696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        s_fill_mem_rec_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X;
723696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        s_fill_mem_rec_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y;
724696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
7258028dd32a4a04154050220dd0693583d5b750330Adam Powell        status = ive_api_function(0, &s_fill_mem_rec_ip, &s_fill_mem_rec_op);
726696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell
727696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        if (status != IV_SUCCESS) {
728be4d68e7b238b8ee879de0481e39c40d3f1683b6Adam Powell            ALOGE("Fill memory records failed = 0x%x\n",
729be4d68e7b238b8ee879de0481e39c40d3f1683b6Adam Powell                    s_fill_mem_rec_op.u4_error_code);
730be4d68e7b238b8ee879de0481e39c40d3f1683b6Adam Powell            mSignalledError = true;
731be4d68e7b238b8ee879de0481e39c40d3f1683b6Adam Powell            notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
732a54956a0bc611b1e9b3914edc7a604b59688f6b7Alan Viverette            return OMX_ErrorUndefined;
733a54956a0bc611b1e9b3914edc7a604b59688f6b7Alan Viverette        }
7347bc3ca0dc52be52ecad1c0de8c62a6a4bf8141caAdam Powell    }
7357bc3ca0dc52be52ecad1c0de8c62a6a4bf8141caAdam Powell
7367bc3ca0dc52be52ecad1c0de8c62a6a4bf8141caAdam Powell    /* Allocating Memory for Mem Records */
73707a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell    {
73807a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        WORD32 total_size;
73907a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        iv_mem_rec_t *ps_mem_rec;
74007a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell        total_size = 0;
74107a74548ae5c1e064508cb1c79ac34de1142b240Adam Powell
742e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        ps_mem_rec = mMemRecords;
743e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        for (i = 0; i < mNumMemRecords; i++) {
744e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            ps_mem_rec->pv_base = ive_aligned_malloc(
745e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                    ps_mem_rec->u4_mem_alignment, ps_mem_rec->u4_mem_size);
746e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            if (ps_mem_rec->pv_base == NULL) {
747e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                ALOGE("Allocation failure for mem record id %zu size %u\n", i,
748e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                        ps_mem_rec->u4_mem_size);
749e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                mSignalledError = true;
750e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
751e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell                return OMX_ErrorUndefined;
752e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
753e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            }
754e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            total_size += ps_mem_rec->u4_mem_size;
755e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
756e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell            ps_mem_rec++;
757e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        }
758e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        printf("\nTotal memory for codec %d\n", total_size);
759e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    }
760e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
761e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    /* Codec Instance Creation */
762e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell    {
763e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        ive_init_ip_t s_init_ip;
764e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        ive_init_op_t s_init_op;
765e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
766c46125042493e66f7dfdccec24e3b0739600b194Adam Powell        mCodecCtx = (iv_obj_t *)mMemRecords[0].pv_base;
767c46125042493e66f7dfdccec24e3b0739600b194Adam Powell        mCodecCtx->u4_size = sizeof(iv_obj_t);
768c46125042493e66f7dfdccec24e3b0739600b194Adam Powell        mCodecCtx->pv_fxns = (void *)ive_api_function;
769e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
770e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        s_init_ip.u4_size = sizeof(ive_init_ip_t);
771e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        s_init_op.u4_size = sizeof(ive_init_op_t);
772e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
773e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        s_init_ip.e_cmd = IV_CMD_INIT;
774e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        s_init_ip.u4_num_mem_rec = mNumMemRecords;
775e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        s_init_ip.ps_mem_rec = mMemRecords;
776e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        s_init_ip.u4_max_wd = mWidth;
777e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        s_init_ip.u4_max_ht = mHeight;
778e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        s_init_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM;
779e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        s_init_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM;
780e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        s_init_ip.u4_max_level = mAVCEncLevel;
781e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell        s_init_ip.e_inp_color_fmt = mIvVideoColorFormat;
782e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell
783fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        if (mReconEnable || mPSNREnable) {
784696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            s_init_ip.u4_enable_recon = 1;
785696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell        } else {
786696cba573e651b0e4f18a4718627c8ccecb3bda0Adam Powell            s_init_ip.u4_enable_recon = 0;
7878515ee846bd76aee86ec5ddfcc4dd1e626dd999cAdam Powell        }
788640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        s_init_ip.e_recon_color_fmt = DEFAULT_RECON_COLOR_FORMAT;
789640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        s_init_ip.e_rc_mode = DEFAULT_RC_MODE;
790fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        s_init_ip.u4_max_framerate = DEFAULT_MAX_FRAMERATE;
791640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        s_init_ip.u4_max_bitrate = DEFAULT_MAX_BITRATE;
792640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell        s_init_ip.u4_max_num_bframes = DEFAULT_B_FRAMES;
793fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        s_init_ip.e_content_type = IV_PROGRESSIVE;
794fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        s_init_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X;
79535aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell        s_init_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y;
79635aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell        s_init_ip.e_slice_mode = mSliceMode;
797fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        s_init_ip.u4_slice_param = mSliceParam;
798fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        s_init_ip.e_arch = mArch;
79935aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell        s_init_ip.e_soc = DEFAULT_SOC;
80035aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
801fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell        status = ive_api_function(mCodecCtx, &s_init_ip, &s_init_op);
802fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell
803160bb7fa60e8ece654e6ce999b6c16af50ee7357Adam Powell        if (status != IV_SUCCESS) {
804160bb7fa60e8ece654e6ce999b6c16af50ee7357Adam Powell            ALOGE("Init memory records failed = 0x%x\n",
805fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell                    s_init_op.u4_error_code);
806fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell            mSignalledError = true;
807be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell            notify(OMX_EventError, OMX_ErrorUndefined, 0 /* arg2 */, NULL /* data */);
808be3c329ebec083e5ff933bab6b6c501519ad2bffAdam Powell            return OMX_ErrorUndefined;
809160bb7fa60e8ece654e6ce999b6c16af50ee7357Adam Powell        }
810fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell    }
81135aecd5884a5ccfe380903e39f30f468315e8f92Adam Powell
812640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    /* Get Codec Version */
813640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    logVersion();
814640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
815640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    /* set processor details */
816640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    setNumCores();
8178c1b02e7592dd02f30750c56bf88c65f8acbd3c9Adam Powell
8188c1b02e7592dd02f30750c56bf88c65f8acbd3c9Adam Powell    /* Video control Set Frame dimensions */
8198c1b02e7592dd02f30750c56bf88c65f8acbd3c9Adam Powell    setDimensions();
8208c1b02e7592dd02f30750c56bf88c65f8acbd3c9Adam Powell
821640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    /* Video control Set Frame rates */
822640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    setFrameRate();
823640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
824640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    /* Video control Set IPE Params */
825640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    setIpeParams();
826640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
827640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    /* Video control Set Bitrate */
828640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    setBitRate();
829640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
830640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    /* Video control Set QP */
831fa18d182a3f37505940e73ae6cd76c2e939f7f7cAdam Powell    setQp();
832640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
833640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    /* Video control Set AIR params */
834640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    setAirParams();
835640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell
83694a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy    /* Video control Set VBV params */
83794a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy    setVbvParams();
83894a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy
83994a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy    /* Video control Set Motion estimation params */
84094a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy    setMeParams();
84194a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy
84294a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy    /* Video control Set GOP params */
84394a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy    setGopParams();
84494a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy
84594a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy    /* Video control Set Deblock params */
84694a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy    setDeblockParams();
84794a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy
848640a66eac612b850b5dabd3b93bd94f83ed2d567Adam Powell    /* Video control Set Profile params */
84996675b1df3969f2d313b68f60ed9fa36805db8ceAdam Powell    setProfileParams();
850
851    /* Video control Set in Encode header mode */
852    setEncMode(IVE_ENC_MODE_HEADER);
853
854    ALOGV("init_codec successfull");
855
856    mSpsPpsHeaderReceived = false;
857    mStarted = true;
858
859    return OMX_ErrorNone;
860}
861
862OMX_ERRORTYPE SoftAVC::releaseEncoder() {
863    IV_STATUS_T status = IV_SUCCESS;
864    iv_retrieve_mem_rec_ip_t s_retrieve_mem_ip;
865    iv_retrieve_mem_rec_op_t s_retrieve_mem_op;
866    iv_mem_rec_t *ps_mem_rec;
867    UWORD32 i;
868
869    if (!mStarted) {
870        return OMX_ErrorNone;
871    }
872
873    s_retrieve_mem_ip.u4_size = sizeof(iv_retrieve_mem_rec_ip_t);
874    s_retrieve_mem_op.u4_size = sizeof(iv_retrieve_mem_rec_op_t);
875    s_retrieve_mem_ip.e_cmd = IV_CMD_RETRIEVE_MEMREC;
876    s_retrieve_mem_ip.ps_mem_rec = mMemRecords;
877
878    status = ive_api_function(mCodecCtx, &s_retrieve_mem_ip, &s_retrieve_mem_op);
879
880    if (status != IV_SUCCESS) {
881        ALOGE("Unable to retrieve memory records = 0x%x\n",
882                s_retrieve_mem_op.u4_error_code);
883        return OMX_ErrorUndefined;
884    }
885
886    /* Free memory records */
887    ps_mem_rec = mMemRecords;
888    for (i = 0; i < s_retrieve_mem_op.u4_num_mem_rec_filled; i++) {
889        ive_aligned_free(ps_mem_rec->pv_base);
890        ps_mem_rec++;
891    }
892
893    free(mMemRecords);
894
895    if (mConversionBuffer != NULL) {
896        free(mConversionBuffer);
897        mConversionBuffer = NULL;
898    }
899
900    mStarted = false;
901
902    return OMX_ErrorNone;
903}
904
905OMX_ERRORTYPE SoftAVC::internalGetParameter(OMX_INDEXTYPE index, OMX_PTR params) {
906    switch (index) {
907        case OMX_IndexParamVideoBitrate:
908        {
909            OMX_VIDEO_PARAM_BITRATETYPE *bitRate =
910                (OMX_VIDEO_PARAM_BITRATETYPE *)params;
911
912            if (bitRate->nPortIndex != 1) {
913                return OMX_ErrorUndefined;
914            }
915
916            bitRate->eControlRate = OMX_Video_ControlRateVariable;
917            bitRate->nTargetBitrate = mBitrate;
918            return OMX_ErrorNone;
919        }
920
921        case OMX_IndexParamVideoAvc:
922        {
923            OMX_VIDEO_PARAM_AVCTYPE *avcParams = (OMX_VIDEO_PARAM_AVCTYPE *)params;
924
925            if (avcParams->nPortIndex != 1) {
926                return OMX_ErrorUndefined;
927            }
928
929            avcParams->eProfile = OMX_VIDEO_AVCProfileBaseline;
930            OMX_VIDEO_AVCLEVELTYPE omxLevel = OMX_VIDEO_AVCLevel31;
931            if (OMX_ErrorNone
932                    != ConvertAvcSpecLevelToOmxAvcLevel(mAVCEncLevel, &omxLevel)) {
933                return OMX_ErrorUndefined;
934            }
935
936            avcParams->eLevel = omxLevel;
937            avcParams->nRefFrames = 1;
938            avcParams->nBFrames = 0;
939            avcParams->bUseHadamard = OMX_TRUE;
940            avcParams->nAllowedPictureTypes = (OMX_VIDEO_PictureTypeI
941                    | OMX_VIDEO_PictureTypeP);
942            avcParams->nRefIdx10ActiveMinus1 = 0;
943            avcParams->nRefIdx11ActiveMinus1 = 0;
944            avcParams->bWeightedPPrediction = OMX_FALSE;
945            avcParams->bEntropyCodingCABAC = OMX_FALSE;
946            avcParams->bconstIpred = OMX_FALSE;
947            avcParams->bDirect8x8Inference = OMX_FALSE;
948            avcParams->bDirectSpatialTemporal = OMX_FALSE;
949            avcParams->nCabacInitIdc = 0;
950            return OMX_ErrorNone;
951        }
952
953        default:
954            return SoftVideoEncoderOMXComponent::internalGetParameter(index, params);
955    }
956}
957
958OMX_ERRORTYPE SoftAVC::internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR params) {
959    int32_t indexFull = index;
960
961    switch (indexFull) {
962        case OMX_IndexParamVideoBitrate:
963        {
964            return internalSetBitrateParams(
965                    (const OMX_VIDEO_PARAM_BITRATETYPE *)params);
966        }
967
968        case OMX_IndexParamVideoAvc:
969        {
970            OMX_VIDEO_PARAM_AVCTYPE *avcType = (OMX_VIDEO_PARAM_AVCTYPE *)params;
971
972            if (avcType->nPortIndex != 1) {
973                return OMX_ErrorUndefined;
974            }
975
976            if (avcType->eProfile != OMX_VIDEO_AVCProfileBaseline
977                    || avcType->nRefFrames != 1 || avcType->nBFrames != 0
978                    || avcType->bUseHadamard != OMX_TRUE
979                    || (avcType->nAllowedPictureTypes & OMX_VIDEO_PictureTypeB) != 0
980                    || avcType->nRefIdx10ActiveMinus1 != 0
981                    || avcType->nRefIdx11ActiveMinus1 != 0
982                    || avcType->bWeightedPPrediction != OMX_FALSE
983                    || avcType->bEntropyCodingCABAC != OMX_FALSE
984                    || avcType->bconstIpred != OMX_FALSE
985                    || avcType->bDirect8x8Inference != OMX_FALSE
986                    || avcType->bDirectSpatialTemporal != OMX_FALSE
987                    || avcType->nCabacInitIdc != 0) {
988                return OMX_ErrorUndefined;
989            }
990
991            if (OK != ConvertOmxAvcLevelToAvcSpecLevel(avcType->eLevel, &mAVCEncLevel)) {
992                return OMX_ErrorUndefined;
993            }
994
995            return OMX_ErrorNone;
996        }
997
998        default:
999            return SoftVideoEncoderOMXComponent::internalSetParameter(index, params);
1000    }
1001}
1002
1003OMX_ERRORTYPE SoftAVC::setConfig(
1004        OMX_INDEXTYPE index, const OMX_PTR _params) {
1005    switch (index) {
1006        case OMX_IndexConfigVideoIntraVOPRefresh:
1007        {
1008            OMX_CONFIG_INTRAREFRESHVOPTYPE *params =
1009                (OMX_CONFIG_INTRAREFRESHVOPTYPE *)_params;
1010
1011            if (params->nPortIndex != kOutputPortIndex) {
1012                return OMX_ErrorBadPortIndex;
1013            }
1014
1015            mKeyFrameRequested = params->IntraRefreshVOP;
1016            return OMX_ErrorNone;
1017        }
1018
1019        case OMX_IndexConfigVideoBitrate:
1020        {
1021            OMX_VIDEO_CONFIG_BITRATETYPE *params =
1022                (OMX_VIDEO_CONFIG_BITRATETYPE *)_params;
1023
1024            if (params->nPortIndex != kOutputPortIndex) {
1025                return OMX_ErrorBadPortIndex;
1026            }
1027
1028            if (mBitrate != params->nEncodeBitrate) {
1029                mBitrate = params->nEncodeBitrate;
1030                mBitrateUpdated = true;
1031            }
1032            return OMX_ErrorNone;
1033        }
1034
1035        default:
1036            return SimpleSoftOMXComponent::setConfig(index, _params);
1037    }
1038}
1039
1040OMX_ERRORTYPE SoftAVC::internalSetBitrateParams(
1041        const OMX_VIDEO_PARAM_BITRATETYPE *bitrate) {
1042    if (bitrate->nPortIndex != kOutputPortIndex) {
1043        return OMX_ErrorUnsupportedIndex;
1044    }
1045
1046    mBitrate = bitrate->nTargetBitrate;
1047    mBitrateUpdated = true;
1048
1049    return OMX_ErrorNone;
1050}
1051
1052OMX_ERRORTYPE SoftAVC::setEncodeArgs(
1053        ive_video_encode_ip_t *ps_encode_ip,
1054        ive_video_encode_op_t *ps_encode_op,
1055        OMX_BUFFERHEADERTYPE *inputBufferHeader,
1056        OMX_BUFFERHEADERTYPE *outputBufferHeader) {
1057    iv_raw_buf_t *ps_inp_raw_buf;
1058    const uint8_t *source;
1059    UWORD8 *pu1_buf;
1060
1061    ps_inp_raw_buf = &ps_encode_ip->s_inp_buf;
1062    ps_encode_ip->s_out_buf.pv_buf = outputBufferHeader->pBuffer;
1063    ps_encode_ip->s_out_buf.u4_bytes = 0;
1064    ps_encode_ip->s_out_buf.u4_bufsize = outputBufferHeader->nAllocLen;
1065    ps_encode_ip->u4_size = sizeof(ive_video_encode_ip_t);
1066    ps_encode_op->u4_size = sizeof(ive_video_encode_op_t);
1067
1068    ps_encode_ip->e_cmd = IVE_CMD_VIDEO_ENCODE;
1069    ps_encode_ip->pv_bufs = NULL;
1070    ps_encode_ip->pv_mb_info = NULL;
1071    ps_encode_ip->pv_pic_info = NULL;
1072    ps_encode_ip->u4_mb_info_type = 0;
1073    ps_encode_ip->u4_pic_info_type = 0;
1074    ps_encode_op->s_out_buf.pv_buf = NULL;
1075
1076    /* Initialize color formats */
1077    ps_inp_raw_buf->e_color_fmt = mIvVideoColorFormat;
1078
1079    source = NULL;
1080    if (inputBufferHeader) {
1081        source = inputBufferHeader->pBuffer + inputBufferHeader->nOffset;
1082
1083        if (mInputDataIsMeta) {
1084            source = extractGraphicBuffer(
1085                    mConversionBuffer, (mWidth * mHeight * 3 / 2), source,
1086                    inputBufferHeader->nFilledLen, mWidth, mHeight);
1087
1088            if (source == NULL) {
1089                ALOGE("Error in extractGraphicBuffer");
1090                notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
1091                return OMX_ErrorUndefined;
1092            }
1093        }
1094    }
1095
1096    pu1_buf = (UWORD8 *)source;
1097    switch (mIvVideoColorFormat) {
1098        case IV_YUV_420P:
1099        {
1100            ps_inp_raw_buf->apv_bufs[0] = pu1_buf;
1101            pu1_buf += (mStride) * mHeight;
1102            ps_inp_raw_buf->apv_bufs[1] = pu1_buf;
1103            pu1_buf += (mStride / 2) * mHeight / 2;
1104            ps_inp_raw_buf->apv_bufs[2] = pu1_buf;
1105
1106            ps_inp_raw_buf->au4_wd[0] = mWidth;
1107            ps_inp_raw_buf->au4_wd[1] = mWidth / 2;
1108            ps_inp_raw_buf->au4_wd[2] = mWidth / 2;
1109
1110            ps_inp_raw_buf->au4_ht[0] = mHeight;
1111            ps_inp_raw_buf->au4_ht[1] = mHeight / 2;
1112            ps_inp_raw_buf->au4_ht[2] = mHeight / 2;
1113
1114            ps_inp_raw_buf->au4_strd[0] = mStride;
1115            ps_inp_raw_buf->au4_strd[1] = (mStride / 2);
1116            ps_inp_raw_buf->au4_strd[2] = (mStride / 2);
1117            break;
1118        }
1119
1120        case IV_YUV_422ILE:
1121        {
1122            ps_inp_raw_buf->apv_bufs[0] = pu1_buf;
1123            ps_inp_raw_buf->au4_wd[0] = mWidth * 2;
1124            ps_inp_raw_buf->au4_ht[0] = mHeight;
1125            ps_inp_raw_buf->au4_strd[0] = mStride * 2;
1126            break;
1127        }
1128
1129        case IV_YUV_420SP_UV:
1130        case IV_YUV_420SP_VU:
1131        default:
1132        {
1133            ps_inp_raw_buf->apv_bufs[0] = pu1_buf;
1134            pu1_buf += (mStride) * mHeight;
1135            ps_inp_raw_buf->apv_bufs[1] = pu1_buf;
1136
1137            ps_inp_raw_buf->au4_wd[0] = mWidth;
1138            ps_inp_raw_buf->au4_wd[1] = mWidth;
1139
1140            ps_inp_raw_buf->au4_ht[0] = mHeight;
1141            ps_inp_raw_buf->au4_ht[1] = mHeight / 2;
1142
1143            ps_inp_raw_buf->au4_strd[0] = mStride;
1144            ps_inp_raw_buf->au4_strd[1] = mStride;
1145            break;
1146        }
1147    }
1148
1149    ps_encode_ip->u4_is_last = 0;
1150
1151    if (inputBufferHeader) {
1152        ps_encode_ip->u4_timestamp_high = (inputBufferHeader->nTimeStamp) >> 32;
1153        ps_encode_ip->u4_timestamp_low = (inputBufferHeader->nTimeStamp) & 0xFFFFFFFF;
1154    }
1155
1156    return OMX_ErrorNone;
1157}
1158
1159void SoftAVC::onQueueFilled(OMX_U32 portIndex) {
1160    IV_STATUS_T status;
1161    WORD32 timeDelay, timeTaken;
1162
1163    UNUSED(portIndex);
1164
1165    // Initialize encoder if not already initialized
1166    if (mCodecCtx == NULL) {
1167        if (OMX_ErrorNone != initEncoder()) {
1168            ALOGE("Failed to initialize encoder");
1169            notify(OMX_EventError, OMX_ErrorUndefined, 0 /* arg2 */, NULL /* data */);
1170            return;
1171        }
1172    }
1173    if (mSignalledError || mSawInputEOS) {
1174        return;
1175    }
1176
1177    List<BufferInfo *> &inQueue = getPortQueue(0);
1178    List<BufferInfo *> &outQueue = getPortQueue(1);
1179
1180    while (!mSawInputEOS && !inQueue.empty() && !outQueue.empty()) {
1181        OMX_ERRORTYPE error;
1182        ive_video_encode_ip_t s_encode_ip;
1183        ive_video_encode_op_t s_encode_op;
1184
1185        BufferInfo *inputBufferInfo = *inQueue.begin();
1186        OMX_BUFFERHEADERTYPE *inputBufferHeader = inputBufferInfo->mHeader;
1187
1188        BufferInfo *outputBufferInfo = *outQueue.begin();
1189        OMX_BUFFERHEADERTYPE *outputBufferHeader = outputBufferInfo->mHeader;
1190
1191        if (inputBufferHeader->nFlags & OMX_BUFFERFLAG_EOS &&
1192                inputBufferHeader->nFilledLen == 0) {
1193            mSawInputEOS = true;
1194
1195            inQueue.erase(inQueue.begin());
1196            inputBufferInfo->mOwnedByUs = false;
1197            notifyEmptyBufferDone(inputBufferHeader);
1198
1199            outputBufferHeader->nFilledLen = 0;
1200            outputBufferHeader->nFlags = OMX_BUFFERFLAG_EOS;
1201
1202            outQueue.erase(outQueue.begin());
1203            outputBufferInfo->mOwnedByUs = false;
1204            notifyFillBufferDone(outputBufferHeader);
1205            return;
1206        }
1207
1208        outputBufferHeader->nTimeStamp = 0;
1209        outputBufferHeader->nFlags = 0;
1210        outputBufferHeader->nOffset = 0;
1211        outputBufferHeader->nFilledLen = 0;
1212        outputBufferHeader->nOffset = 0;
1213
1214        uint8_t *outPtr = (uint8_t *)outputBufferHeader->pBuffer;
1215
1216        if (!mSpsPpsHeaderReceived) {
1217            error = setEncodeArgs(&s_encode_ip, &s_encode_op, NULL, outputBufferHeader);
1218            if (error != OMX_ErrorNone) {
1219                mSignalledError = true;
1220                notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
1221                return;
1222            }
1223            status = ive_api_function(mCodecCtx, &s_encode_ip, &s_encode_op);
1224
1225            if (IV_SUCCESS != status) {
1226                ALOGE("Encode Frame failed = 0x%x\n",
1227                        s_encode_op.u4_error_code);
1228            } else {
1229                ALOGV("Bytes Generated in header %d\n",
1230                        s_encode_op.s_out_buf.u4_bytes);
1231            }
1232
1233            mSpsPpsHeaderReceived = true;
1234
1235            outputBufferHeader->nFlags = OMX_BUFFERFLAG_CODECCONFIG;
1236            outputBufferHeader->nFilledLen = s_encode_op.s_out_buf.u4_bytes;
1237            outputBufferHeader->nTimeStamp = inputBufferHeader->nTimeStamp;
1238
1239            outQueue.erase(outQueue.begin());
1240            outputBufferInfo->mOwnedByUs = false;
1241            DUMP_TO_FILE(
1242                    mOutFile, outputBufferHeader->pBuffer,
1243                    outputBufferHeader->nFilledLen);
1244            notifyFillBufferDone(outputBufferHeader);
1245
1246            setEncMode(IVE_ENC_MODE_PICTURE);
1247            return;
1248        }
1249
1250        if (mBitrateUpdated) {
1251            setBitRate();
1252        }
1253
1254        if (mKeyFrameRequested) {
1255            setFrameType(IV_IDR_FRAME);
1256        }
1257
1258        mPrevTimestampUs = inputBufferHeader->nTimeStamp;
1259
1260        if (inputBufferHeader->nFlags & OMX_BUFFERFLAG_EOS) {
1261            mSawInputEOS = true;
1262        }
1263
1264        error = setEncodeArgs(
1265                &s_encode_ip, &s_encode_op, inputBufferHeader, outputBufferHeader);
1266        if (error != OMX_ErrorNone) {
1267            mSignalledError = true;
1268            notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
1269            return;
1270        }
1271
1272        DUMP_TO_FILE(
1273                mInFile, s_encode_ip.s_inp_buf.apv_bufs[0],
1274                (mHeight * mStride * 3 / 2));
1275        //DUMP_TO_FILE(mInFile, inputBufferHeader->pBuffer + inputBufferHeader->nOffset,
1276        //    inputBufferHeader->nFilledLen);
1277
1278        GETTIME(&mTimeStart, NULL);
1279        /* Compute time elapsed between end of previous decode()
1280         * to start of current decode() */
1281        TIME_DIFF(mTimeEnd, mTimeStart, timeDelay);
1282
1283        status = ive_api_function(mCodecCtx, &s_encode_ip, &s_encode_op);
1284
1285        if (IV_SUCCESS != status) {
1286            ALOGE("Encode Frame failed = 0x%x\n",
1287                    s_encode_op.u4_error_code);
1288            mSignalledError = true;
1289            notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
1290            return;
1291        }
1292
1293        GETTIME(&mTimeEnd, NULL);
1294        /* Compute time taken for decode() */
1295        TIME_DIFF(mTimeStart, mTimeEnd, timeTaken);
1296
1297        ALOGV("timeTaken=%6d delay=%6d numBytes=%6d", timeTaken, timeDelay,
1298                s_encode_op.s_out_buf.u4_bytes);
1299
1300
1301        outputBufferHeader->nFlags = inputBufferHeader->nFlags;
1302        outputBufferHeader->nFilledLen = s_encode_op.s_out_buf.u4_bytes;
1303        outputBufferHeader->nTimeStamp = inputBufferHeader->nTimeStamp;
1304
1305        if (IV_IDR_FRAME
1306                == s_encode_op.u4_encoded_frame_type) {
1307            outputBufferHeader->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
1308        }
1309
1310        inQueue.erase(inQueue.begin());
1311        inputBufferInfo->mOwnedByUs = false;
1312
1313        notifyEmptyBufferDone(inputBufferHeader);
1314
1315        if (mSawInputEOS) {
1316            outputBufferHeader->nFlags |= OMX_BUFFERFLAG_EOS;
1317        }
1318
1319        outputBufferInfo->mOwnedByUs = false;
1320        outQueue.erase(outQueue.begin());
1321
1322        DUMP_TO_FILE(
1323                mOutFile, outputBufferHeader->pBuffer,
1324                outputBufferHeader->nFilledLen);
1325        notifyFillBufferDone(outputBufferHeader);
1326
1327    }
1328    return;
1329}
1330
1331
1332}  // namespace android
1333
1334android::SoftOMXComponent *createSoftOMXComponent(
1335        const char *name, const OMX_CALLBACKTYPE *callbacks,
1336        OMX_PTR appData, OMX_COMPONENTTYPE **component) {
1337    return new android::SoftAVC(name, callbacks, appData, component);
1338}
1339