122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani/*
222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani * Copyright 2015 The Android Open Source Project
322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani *
422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani * Licensed under the Apache License, Version 2.0 (the "License");
522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani * you may not use this file except in compliance with the License.
622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani * You may obtain a copy of the License at
722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani *
822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani *      http://www.apache.org/licenses/LICENSE-2.0
922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani *
1022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani * Unless required by applicable law or agreed to in writing, software
1122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani * distributed under the License is distributed on an "AS IS" BASIS,
1222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani * See the License for the specific language governing permissions and
1422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani * limitations under the License.
1522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani */
1622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
1722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani//#define LOG_NDEBUG 0
1822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#define LOG_TAG "SoftAVCEnc"
1922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include <utils/Log.h>
2022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include <utils/misc.h>
2122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
2222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include "OMX_Video.h"
2322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
2422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include <HardwareAPI.h>
2522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include <MetadataBufferType.h>
2622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include <media/stagefright/foundation/ADebug.h>
2722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include <media/stagefright/MediaDefs.h>
2822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include <media/stagefright/MediaErrors.h>
2922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include <media/stagefright/MetaData.h>
3022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include <media/stagefright/Utils.h>
31870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang#include <OMX_IndexExt.h>
32870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang#include <OMX_VideoExt.h>
3322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include <ui/Rect.h>
3422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
3522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include "ih264_typedefs.h"
3622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include "iv2.h"
3722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include "ive2.h"
3822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include "ih264e.h"
3922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#include "SoftAVCEnc.h"
4022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
4122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhaninamespace android {
4222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
4322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    #define ive_api_function ih264e_api_function
4422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
4522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhanitemplate<class T>
4622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhanistatic void InitOMXParams(T *params) {
4722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    params->nSize = sizeof(T);
4822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    params->nVersion.s.nVersionMajor = 1;
4922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    params->nVersion.s.nVersionMinor = 0;
5022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    params->nVersion.s.nRevision = 0;
5122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    params->nVersion.s.nStep = 0;
5222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
5322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
5415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alexstruct LevelConversion {
5522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    OMX_VIDEO_AVCLEVELTYPE omxLevel;
5622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    WORD32 avcLevel;
5715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex};
5822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
5922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhanistatic LevelConversion ConversionTable[] = {
6022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel1,  10 },
6122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel1b, 9  },
6222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel11, 11 },
6322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel12, 12 },
6422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel13, 13 },
6522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel2,  20 },
6622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel21, 21 },
6722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel22, 22 },
6822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel3,  30 },
6922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel31, 31 },
7022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel32, 32 },
7122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel4,  40 },
7222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel41, 41 },
7322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel42, 42 },
7422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel5,  50 },
7522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCLevel51, 51 },
7622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani};
7722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
7822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhanistatic const CodecProfileLevel kProfileLevels[] = {
7922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1  },
8022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1b },
8122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel11 },
8222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel12 },
8322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel13 },
8422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel2  },
8522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel21 },
8622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel22 },
8722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel3  },
8822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel31 },
8922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel32 },
9022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel4  },
9122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel41 },
9215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel1  },
9315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel1b },
9415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel11 },
9515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel12 },
9615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel13 },
9715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel2  },
9815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel21 },
9915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel22 },
10015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel3  },
10115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel31 },
10215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel32 },
10315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel4  },
10415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel41 },
10522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
10615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex};
10722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
10822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhanistatic size_t GetCPUCoreCount() {
10922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    long cpuCoreCount = 1;
11022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#if defined(_SC_NPROCESSORS_ONLN)
11122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN);
11222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#else
11322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    // _SC_NPROC_ONLN must be defined...
11422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    cpuCoreCount = sysconf(_SC_NPROC_ONLN);
11522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani#endif
11622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    CHECK(cpuCoreCount >= 1);
11715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    ALOGV("Number of CPU cores: %ld", cpuCoreCount);
11822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return (size_t)cpuCoreCount;
11922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
12022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
12122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhanistatic status_t ConvertOmxAvcLevelToAvcSpecLevel(
12222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        OMX_VIDEO_AVCLEVELTYPE omxLevel, WORD32 *avcLevel) {
12322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    for (size_t i = 0; i < NELEM(ConversionTable); ++i) {
12422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        if (omxLevel == ConversionTable[i].omxLevel) {
12522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            *avcLevel = ConversionTable[i].avcLevel;
12622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return OK;
12722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
12822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
12922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
13022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ALOGE("ConvertOmxAvcLevelToAvcSpecLevel: %d level not supported",
13122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            (int32_t)omxLevel);
13222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
13322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return BAD_VALUE;
13422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
13522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
13622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhanistatic status_t ConvertAvcSpecLevelToOmxAvcLevel(
13722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        WORD32 avcLevel, OMX_VIDEO_AVCLEVELTYPE *omxLevel) {
13822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    for (size_t i = 0; i < NELEM(ConversionTable); ++i) {
13922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        if (avcLevel == ConversionTable[i].avcLevel) {
14022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            *omxLevel = ConversionTable[i].omxLevel;
14122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return OK;
14222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
14322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
14422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
14522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ALOGE("ConvertAvcSpecLevelToOmxAvcLevel: %d level not supported",
14622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            (int32_t)avcLevel);
14722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
14822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return BAD_VALUE;
14922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
15022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
15122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
15222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniSoftAVC::SoftAVC(
15322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        const char *name,
15422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        const OMX_CALLBACKTYPE *callbacks,
15522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        OMX_PTR appData,
15622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        OMX_COMPONENTTYPE **component)
15722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    : SoftVideoEncoderOMXComponent(
15822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            name, "video_encoder.avc", OMX_VIDEO_CodingAVC,
15922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            kProfileLevels, NELEM(kProfileLevels),
16022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            176 /* width */, 144 /* height */,
16122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            callbacks, appData, component),
16230fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar      mUpdateFlag(0),
16322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani      mIvVideoColorFormat(IV_YUV_420P),
16422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani      mAVCEncProfile(IV_PROFILE_BASE),
16515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex      mAVCEncLevel(41),
16622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani      mStarted(false),
16722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani      mSawInputEOS(false),
16815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex      mSawOutputEOS(false),
16922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani      mSignalledError(false),
17022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani      mCodecCtx(NULL) {
17122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
17222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    initPorts(kNumBuffers, kNumBuffers, ((mWidth * mHeight * 3) >> 1),
17322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            MEDIA_MIMETYPE_VIDEO_AVC, 2);
17422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
17522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    // If dump is enabled, then open create an empty file
17622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    GENERATE_FILE_NAMES();
17722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    CREATE_DUMP_FILE(mInFile);
17822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    CREATE_DUMP_FILE(mOutFile);
17915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    memset(mConversionBuffers, 0, sizeof(mConversionBuffers));
18015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    memset(mInputBufferInfo, 0, sizeof(mInputBufferInfo));
18115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
18215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    initEncParams();
18322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
18422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
18522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
18622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniSoftAVC::~SoftAVC() {
18722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    releaseEncoder();
18822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    List<BufferInfo *> &outQueue = getPortQueue(1);
18922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    List<BufferInfo *> &inQueue = getPortQueue(0);
19022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    CHECK(outQueue.empty());
19122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    CHECK(inQueue.empty());
19222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
19322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
19415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alexvoid  SoftAVC::initEncParams() {
19522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mCodecCtx = NULL;
19622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mMemRecords = NULL;
19722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mNumMemRecords = DEFAULT_MEM_REC_CNT;
19822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mHeaderGenerated = 0;
19922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mNumCores = GetCPUCoreCount();
20022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mArch = DEFAULT_ARCH;
20122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mSliceMode = DEFAULT_SLICE_MODE;
20222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mSliceParam = DEFAULT_SLICE_PARAM;
20322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mHalfPelEnable = DEFAULT_HPEL;
20422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mIInterval = DEFAULT_I_INTERVAL;
20522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mIDRInterval = DEFAULT_IDR_INTERVAL;
20622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mDisableDeblkLevel = DEFAULT_DISABLE_DEBLK_LEVEL;
20722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mEnableFastSad = DEFAULT_ENABLE_FAST_SAD;
20822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mEnableAltRef = DEFAULT_ENABLE_ALT_REF;
20922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mEncSpeed = DEFAULT_ENC_SPEED;
21022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mIntra4x4 = DEFAULT_INTRA4x4;
2119515aca0c07a32128a65a68749bda3ea6851c109Doney Alex    mConstrainedIntraFlag = DEFAULT_CONSTRAINED_INTRA;
21222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mAIRMode = DEFAULT_AIR;
21322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mAIRRefreshPeriod = DEFAULT_AIR_REFRESH_PERIOD;
21422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mPSNREnable = DEFAULT_PSNR_ENABLE;
21522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mReconEnable = DEFAULT_RECON_ENABLE;
21615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    mEntropyMode = DEFAULT_ENTROPY_MODE;
21715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    mBframes = DEFAULT_B_FRAMES;
21822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
21922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    gettimeofday(&mTimeStart, NULL);
22022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    gettimeofday(&mTimeEnd, NULL);
22122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
22222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
22322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
22422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
22522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setDimensions() {
22622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_dimensions_ip_t s_dimensions_ip;
22722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_dimensions_op_t s_dimensions_op;
22822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
22922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
23022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_dimensions_ip.e_cmd = IVE_CMD_VIDEO_CTL;
23122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_dimensions_ip.e_sub_cmd = IVE_CMD_CTL_SET_DIMENSIONS;
23222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_dimensions_ip.u4_ht = mHeight;
23322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_dimensions_ip.u4_wd = mWidth;
23422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
23522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_dimensions_ip.u4_timestamp_high = -1;
23622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_dimensions_ip.u4_timestamp_low = -1;
23722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
23822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_dimensions_ip.u4_size = sizeof(ive_ctl_set_dimensions_ip_t);
23922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_dimensions_op.u4_size = sizeof(ive_ctl_set_dimensions_op_t);
24022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
24122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, &s_dimensions_ip, &s_dimensions_op);
24222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
24322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to set frame dimensions = 0x%x\n",
24422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                s_dimensions_op.u4_error_code);
24522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
24622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
24722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
24822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
24922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
25022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setNumCores() {
25122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
25222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_num_cores_ip_t s_num_cores_ip;
25322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_num_cores_op_t s_num_cores_op;
25422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_num_cores_ip.e_cmd = IVE_CMD_VIDEO_CTL;
25522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_num_cores_ip.e_sub_cmd = IVE_CMD_CTL_SET_NUM_CORES;
25622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_num_cores_ip.u4_num_cores = MIN(mNumCores, CODEC_MAX_CORES);
25722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_num_cores_ip.u4_timestamp_high = -1;
25822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_num_cores_ip.u4_timestamp_low = -1;
25922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_num_cores_ip.u4_size = sizeof(ive_ctl_set_num_cores_ip_t);
26022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
26122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_num_cores_op.u4_size = sizeof(ive_ctl_set_num_cores_op_t);
26222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
26322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(
26422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            mCodecCtx, (void *) &s_num_cores_ip, (void *) &s_num_cores_op);
26522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
26622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to set processor params = 0x%x\n",
26722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                s_num_cores_op.u4_error_code);
26822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
26922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
27022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
27122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
27222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
27322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setFrameRate() {
27422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_frame_rate_ip_t s_frame_rate_ip;
27522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_frame_rate_op_t s_frame_rate_op;
27622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
27722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
27822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_frame_rate_ip.e_cmd = IVE_CMD_VIDEO_CTL;
27922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_frame_rate_ip.e_sub_cmd = IVE_CMD_CTL_SET_FRAMERATE;
28022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
28115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    s_frame_rate_ip.u4_src_frame_rate = mFramerate >> 16;
28215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    s_frame_rate_ip.u4_tgt_frame_rate = mFramerate >> 16;
28322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
28422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_frame_rate_ip.u4_timestamp_high = -1;
28522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_frame_rate_ip.u4_timestamp_low = -1;
28622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
28722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_frame_rate_ip.u4_size = sizeof(ive_ctl_set_frame_rate_ip_t);
28822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_frame_rate_op.u4_size = sizeof(ive_ctl_set_frame_rate_op_t);
28922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
29022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, &s_frame_rate_ip, &s_frame_rate_op);
29122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
29222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to set frame rate = 0x%x\n",
29322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                s_frame_rate_op.u4_error_code);
29422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
29522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
29622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
29722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
29822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
29922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setIpeParams() {
30022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_ipe_params_ip_t s_ipe_params_ip;
30122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_ipe_params_op_t s_ipe_params_op;
30222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
30322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
30422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_ipe_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
30522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_ipe_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_IPE_PARAMS;
30622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
30722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_ipe_params_ip.u4_enable_intra_4x4 = mIntra4x4;
30822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_ipe_params_ip.u4_enc_speed_preset = mEncSpeed;
3099515aca0c07a32128a65a68749bda3ea6851c109Doney Alex    s_ipe_params_ip.u4_constrained_intra_pred = mConstrainedIntraFlag;
31022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
31122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_ipe_params_ip.u4_timestamp_high = -1;
31222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_ipe_params_ip.u4_timestamp_low = -1;
31322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
31422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_ipe_params_ip.u4_size = sizeof(ive_ctl_set_ipe_params_ip_t);
31522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_ipe_params_op.u4_size = sizeof(ive_ctl_set_ipe_params_op_t);
31622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
31722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, &s_ipe_params_ip, &s_ipe_params_op);
31822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
31922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to set ipe params = 0x%x\n",
32022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                s_ipe_params_op.u4_error_code);
32122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
32222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
32322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
32422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
32522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
32622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setBitRate() {
32722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_bitrate_ip_t s_bitrate_ip;
32822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_bitrate_op_t s_bitrate_op;
32922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
33022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
33122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_bitrate_ip.e_cmd = IVE_CMD_VIDEO_CTL;
33222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_bitrate_ip.e_sub_cmd = IVE_CMD_CTL_SET_BITRATE;
33322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
33422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_bitrate_ip.u4_target_bitrate = mBitrate;
33522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
33622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_bitrate_ip.u4_timestamp_high = -1;
33722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_bitrate_ip.u4_timestamp_low = -1;
33822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
33922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_bitrate_ip.u4_size = sizeof(ive_ctl_set_bitrate_ip_t);
34022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_bitrate_op.u4_size = sizeof(ive_ctl_set_bitrate_op_t);
34122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
34222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, &s_bitrate_ip, &s_bitrate_op);
34322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
34422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to set bit rate = 0x%x\n", s_bitrate_op.u4_error_code);
34522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
34622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
34722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
34822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
34922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
35022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setFrameType(IV_PICTURE_CODING_TYPE_T e_frame_type) {
35122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_frame_type_ip_t s_frame_type_ip;
35222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_frame_type_op_t s_frame_type_op;
35322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
35422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_frame_type_ip.e_cmd = IVE_CMD_VIDEO_CTL;
35522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_frame_type_ip.e_sub_cmd = IVE_CMD_CTL_SET_FRAMETYPE;
35622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
35722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_frame_type_ip.e_frame_type = e_frame_type;
35822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
35922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_frame_type_ip.u4_timestamp_high = -1;
36022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_frame_type_ip.u4_timestamp_low = -1;
36122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
36222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_frame_type_ip.u4_size = sizeof(ive_ctl_set_frame_type_ip_t);
36322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_frame_type_op.u4_size = sizeof(ive_ctl_set_frame_type_op_t);
36422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
36522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, &s_frame_type_ip, &s_frame_type_op);
36622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
36722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to set frame type = 0x%x\n",
36822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                s_frame_type_op.u4_error_code);
36922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
37022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
37122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
37222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
37322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
37422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setQp() {
37522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_qp_ip_t s_qp_ip;
37622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_qp_op_t s_qp_op;
37722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
37822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
37922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_ip.e_cmd = IVE_CMD_VIDEO_CTL;
38022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_ip.e_sub_cmd = IVE_CMD_CTL_SET_QP;
38122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
38222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_ip.u4_i_qp = DEFAULT_I_QP;
38322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_ip.u4_i_qp_max = DEFAULT_QP_MAX;
38422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_ip.u4_i_qp_min = DEFAULT_QP_MIN;
38522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
38622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_ip.u4_p_qp = DEFAULT_P_QP;
38722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_ip.u4_p_qp_max = DEFAULT_QP_MAX;
38822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_ip.u4_p_qp_min = DEFAULT_QP_MIN;
38922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
39022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_ip.u4_b_qp = DEFAULT_P_QP;
39122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_ip.u4_b_qp_max = DEFAULT_QP_MAX;
39222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_ip.u4_b_qp_min = DEFAULT_QP_MIN;
39322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
39422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_ip.u4_timestamp_high = -1;
39522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_ip.u4_timestamp_low = -1;
39622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
39722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_ip.u4_size = sizeof(ive_ctl_set_qp_ip_t);
39822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_qp_op.u4_size = sizeof(ive_ctl_set_qp_op_t);
39922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
40022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, &s_qp_ip, &s_qp_op);
40122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
40222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to set qp 0x%x\n", s_qp_op.u4_error_code);
40322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
40422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
40522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
40622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
40722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
40822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setEncMode(IVE_ENC_MODE_T e_enc_mode) {
40922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
41022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_enc_mode_ip_t s_enc_mode_ip;
41122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_enc_mode_op_t s_enc_mode_op;
41222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
41322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_enc_mode_ip.e_cmd = IVE_CMD_VIDEO_CTL;
41422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_enc_mode_ip.e_sub_cmd = IVE_CMD_CTL_SET_ENC_MODE;
41522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
41622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_enc_mode_ip.e_enc_mode = e_enc_mode;
41722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
41822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_enc_mode_ip.u4_timestamp_high = -1;
41922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_enc_mode_ip.u4_timestamp_low = -1;
42022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
42122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_enc_mode_ip.u4_size = sizeof(ive_ctl_set_enc_mode_ip_t);
42222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_enc_mode_op.u4_size = sizeof(ive_ctl_set_enc_mode_op_t);
42322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
42422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, &s_enc_mode_ip, &s_enc_mode_op);
42522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
42622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to set in header encode mode = 0x%x\n",
42722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                s_enc_mode_op.u4_error_code);
42822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
42922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
43022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
43122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
43222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
43322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setVbvParams() {
43422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_vbv_params_ip_t s_vbv_ip;
43522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_vbv_params_op_t s_vbv_op;
43622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
43722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
43822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_vbv_ip.e_cmd = IVE_CMD_VIDEO_CTL;
43922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_vbv_ip.e_sub_cmd = IVE_CMD_CTL_SET_VBV_PARAMS;
44022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
44122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_vbv_ip.u4_vbv_buf_size = 0;
44222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_vbv_ip.u4_vbv_buffer_delay = 1000;
44322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
44422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_vbv_ip.u4_timestamp_high = -1;
44522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_vbv_ip.u4_timestamp_low = -1;
44622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
44722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_vbv_ip.u4_size = sizeof(ive_ctl_set_vbv_params_ip_t);
44822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_vbv_op.u4_size = sizeof(ive_ctl_set_vbv_params_op_t);
44922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
45022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, &s_vbv_ip, &s_vbv_op);
45122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
45222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to set VBC params = 0x%x\n", s_vbv_op.u4_error_code);
45322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
45422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
45522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
45622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
45722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
45822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setAirParams() {
45922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_air_params_ip_t s_air_ip;
46022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_air_params_op_t s_air_op;
46122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
46222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
46322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_air_ip.e_cmd = IVE_CMD_VIDEO_CTL;
46422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_air_ip.e_sub_cmd = IVE_CMD_CTL_SET_AIR_PARAMS;
46522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
46622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_air_ip.e_air_mode = mAIRMode;
46722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_air_ip.u4_air_refresh_period = mAIRRefreshPeriod;
46822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
46922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_air_ip.u4_timestamp_high = -1;
47022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_air_ip.u4_timestamp_low = -1;
47122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
47222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_air_ip.u4_size = sizeof(ive_ctl_set_air_params_ip_t);
47322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_air_op.u4_size = sizeof(ive_ctl_set_air_params_op_t);
47422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
47522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, &s_air_ip, &s_air_op);
47622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
47722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to set air params = 0x%x\n", s_air_op.u4_error_code);
47822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
47922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
48022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
48122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
48222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
48322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setMeParams() {
48422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
48522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_me_params_ip_t s_me_params_ip;
48622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_me_params_op_t s_me_params_op;
48722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
48822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_me_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
48922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_me_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_ME_PARAMS;
49022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
49122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_me_params_ip.u4_enable_fast_sad = mEnableFastSad;
49222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_me_params_ip.u4_enable_alt_ref = mEnableAltRef;
49322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
49422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_me_params_ip.u4_enable_hpel = mHalfPelEnable;
49522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_me_params_ip.u4_enable_qpel = DEFAULT_QPEL;
49622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_me_params_ip.u4_me_speed_preset = DEFAULT_ME_SPEED;
49722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_me_params_ip.u4_srch_rng_x = DEFAULT_SRCH_RNG_X;
49822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_me_params_ip.u4_srch_rng_y = DEFAULT_SRCH_RNG_Y;
49922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
50022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_me_params_ip.u4_timestamp_high = -1;
50122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_me_params_ip.u4_timestamp_low = -1;
50222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
50322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_me_params_ip.u4_size = sizeof(ive_ctl_set_me_params_ip_t);
50422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_me_params_op.u4_size = sizeof(ive_ctl_set_me_params_op_t);
50522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
50622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, &s_me_params_ip, &s_me_params_op);
50722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
50822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to set me params = 0x%x\n", s_me_params_op.u4_error_code);
50922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
51022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
51122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
51222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
51322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
51422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setGopParams() {
51522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
51622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_gop_params_ip_t s_gop_params_ip;
51722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_gop_params_op_t s_gop_params_op;
51822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
51922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_gop_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
52022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_gop_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_GOP_PARAMS;
52122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
52222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_gop_params_ip.u4_i_frm_interval = mIInterval;
52322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_gop_params_ip.u4_idr_frm_interval = mIDRInterval;
52422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
52522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_gop_params_ip.u4_timestamp_high = -1;
52622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_gop_params_ip.u4_timestamp_low = -1;
52722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
52822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_gop_params_ip.u4_size = sizeof(ive_ctl_set_gop_params_ip_t);
52922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_gop_params_op.u4_size = sizeof(ive_ctl_set_gop_params_op_t);
53022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
53122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, &s_gop_params_ip, &s_gop_params_op);
53222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
53322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to set ME params = 0x%x\n",
53422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                s_gop_params_op.u4_error_code);
53522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
53622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
53722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
53822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
53922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
54022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setProfileParams() {
54122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
54222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_profile_params_ip_t s_profile_params_ip;
54322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_profile_params_op_t s_profile_params_op;
54422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
54522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_profile_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
54622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_profile_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_PROFILE_PARAMS;
54722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
54822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_profile_params_ip.e_profile = DEFAULT_EPROFILE;
54915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    s_profile_params_ip.u4_entropy_coding_mode = mEntropyMode;
55022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_profile_params_ip.u4_timestamp_high = -1;
55122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_profile_params_ip.u4_timestamp_low = -1;
55222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
55322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_profile_params_ip.u4_size = sizeof(ive_ctl_set_profile_params_ip_t);
55422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_profile_params_op.u4_size = sizeof(ive_ctl_set_profile_params_op_t);
55522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
55622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, &s_profile_params_ip, &s_profile_params_op);
55722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
55822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to set profile params = 0x%x\n",
55922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                s_profile_params_op.u4_error_code);
56022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
56122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
56222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
56322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
56422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
56522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setDeblockParams() {
56622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
56722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_deblock_params_ip_t s_deblock_params_ip;
56822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_set_deblock_params_op_t s_deblock_params_op;
56922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
57022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_deblock_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
57122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_deblock_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_DEBLOCK_PARAMS;
57222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
57322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_deblock_params_ip.u4_disable_deblock_level = mDisableDeblkLevel;
57422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
57522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_deblock_params_ip.u4_timestamp_high = -1;
57622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_deblock_params_ip.u4_timestamp_low = -1;
57722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
57822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_deblock_params_ip.u4_size = sizeof(ive_ctl_set_deblock_params_ip_t);
57922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_deblock_params_op.u4_size = sizeof(ive_ctl_set_deblock_params_op_t);
58022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
58122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, &s_deblock_params_ip, &s_deblock_params_op);
58222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
58322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to enable/disable deblock params = 0x%x\n",
58422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                s_deblock_params_op.u4_error_code);
58522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
58622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
58722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
58822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
58922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
59022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhanivoid SoftAVC::logVersion() {
59122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_getversioninfo_ip_t s_ctl_ip;
59222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ive_ctl_getversioninfo_op_t s_ctl_op;
59322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    UWORD8 au1_buf[512];
59422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
59522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
59622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_ctl_ip.e_cmd = IVE_CMD_VIDEO_CTL;
59722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_ctl_ip.e_sub_cmd = IVE_CMD_CTL_GETVERSION;
59822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_ctl_ip.u4_size = sizeof(ive_ctl_getversioninfo_ip_t);
59922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_ctl_op.u4_size = sizeof(ive_ctl_getversioninfo_op_t);
60022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_ctl_ip.pu1_version = au1_buf;
60122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_ctl_ip.u4_version_bufsize = sizeof(au1_buf);
60222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
60322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, (void *) &s_ctl_ip, (void *) &s_ctl_op);
60422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
60522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
60622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Error in getting version: 0x%x", s_ctl_op.u4_error_code);
60722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    } else {
60822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGV("Ittiam encoder version: %s", (char *)s_ctl_ip.pu1_version);
60922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
61022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return;
61122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
61222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
61322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::initEncoder() {
61422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
61522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    WORD32 level;
61622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    uint32_t displaySizeY;
61722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    CHECK(!mStarted);
61822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
61922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    OMX_ERRORTYPE errType = OMX_ErrorNone;
62022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
62122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    displaySizeY = mWidth * mHeight;
62222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (displaySizeY > (1920 * 1088)) {
62322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        level = 50;
62422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    } else if (displaySizeY > (1280 * 720)) {
62522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        level = 40;
62622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    } else if (displaySizeY > (720 * 576)) {
62722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        level = 31;
62822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    } else if (displaySizeY > (624 * 320)) {
62922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        level = 30;
63022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    } else if (displaySizeY > (352 * 288)) {
63122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        level = 21;
63222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    } else {
63322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        level = 20;
63422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
63522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mAVCEncLevel = MAX(level, mAVCEncLevel);
63622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
637df0ebf5f9ea5c16aaec4752bdf06af101cc541b8Harish Mahendrakar    mStride = mWidth;
63822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
63922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (mInputDataIsMeta) {
64015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        for (size_t i = 0; i < MAX_CONVERSION_BUFFERS; i++) {
64115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            if (mConversionBuffers[i] != NULL) {
64215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                free(mConversionBuffers[i]);
6437099d9b5f3761dbe3f76166129c3f0a22d2470efMarco Nelissen                mConversionBuffers[i] = 0;
64415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            }
64522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
646595fede0cf7b53b4d3f51d72df8d66fd7ff14d1cWei Jia            if (((uint64_t)mStride * mHeight) > ((uint64_t)INT32_MAX / 3)) {
647f6fe4340219a8e674f3250fe32d4697ec8184b24Wei Jia                ALOGE("Buffer size is too big.");
648f6fe4340219a8e674f3250fe32d4697ec8184b24Wei Jia                return OMX_ErrorUndefined;
649f6fe4340219a8e674f3250fe32d4697ec8184b24Wei Jia            }
65015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            mConversionBuffers[i] = (uint8_t *)malloc(mStride * mHeight * 3 / 2);
65115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
65215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            if (mConversionBuffers[i] == NULL) {
65322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                ALOGE("Allocating conversion buffer failed.");
65422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                return OMX_ErrorUndefined;
65522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            }
65615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
65715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            mConversionBuffersFree[i] = 1;
65822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
65922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
66022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
66122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    switch (mColorFormat) {
66222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        case OMX_COLOR_FormatYUV420SemiPlanar:
66322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            mIvVideoColorFormat = IV_YUV_420SP_UV;
66422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ALOGV("colorFormat YUV_420SP");
66522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            break;
66622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        default:
66722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        case OMX_COLOR_FormatYUV420Planar:
66822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            mIvVideoColorFormat = IV_YUV_420P;
66922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ALOGV("colorFormat YUV_420P");
67022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            break;
67122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
67222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
67315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    ALOGD("Params width %d height %d level %d colorFormat %d", mWidth,
67422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            mHeight, mAVCEncLevel, mIvVideoColorFormat);
67522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
67622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Getting Number of MemRecords */
67722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    {
67822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        iv_num_mem_rec_ip_t s_num_mem_rec_ip;
67922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        iv_num_mem_rec_op_t s_num_mem_rec_op;
68022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
68122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_num_mem_rec_ip.u4_size = sizeof(iv_num_mem_rec_ip_t);
68222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_num_mem_rec_op.u4_size = sizeof(iv_num_mem_rec_op_t);
68322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
68422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_num_mem_rec_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC;
68522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
68622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        status = ive_api_function(0, &s_num_mem_rec_ip, &s_num_mem_rec_op);
68722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
68822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        if (status != IV_SUCCESS) {
68922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ALOGE("Get number of memory records failed = 0x%x\n",
69022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    s_num_mem_rec_op.u4_error_code);
69122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return OMX_ErrorUndefined;
69222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
69322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
69422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        mNumMemRecords = s_num_mem_rec_op.u4_num_mem_rec;
69522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
69622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
69722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Allocate array to hold memory records */
698f6fe4340219a8e674f3250fe32d4697ec8184b24Wei Jia    if (mNumMemRecords > SIZE_MAX / sizeof(iv_mem_rec_t)) {
699f6fe4340219a8e674f3250fe32d4697ec8184b24Wei Jia        ALOGE("requested memory size is too big.");
700f6fe4340219a8e674f3250fe32d4697ec8184b24Wei Jia        return OMX_ErrorUndefined;
701f6fe4340219a8e674f3250fe32d4697ec8184b24Wei Jia    }
70222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mMemRecords = (iv_mem_rec_t *)malloc(mNumMemRecords * sizeof(iv_mem_rec_t));
70322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (NULL == mMemRecords) {
704ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar        ALOGE("Unable to allocate memory for hold memory records: Size %zu",
70522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                mNumMemRecords * sizeof(iv_mem_rec_t));
70622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        mSignalledError = true;
70722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
70822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
70922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
71022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
71122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    {
71222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        iv_mem_rec_t *ps_mem_rec;
71322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ps_mem_rec = mMemRecords;
71415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        for (size_t i = 0; i < mNumMemRecords; i++) {
71522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_mem_rec->u4_size = sizeof(iv_mem_rec_t);
71622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_mem_rec->pv_base = NULL;
71722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_mem_rec->u4_mem_size = 0;
71822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_mem_rec->u4_mem_alignment = 0;
71922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_mem_rec->e_mem_type = IV_NA_MEM_TYPE;
72022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
72122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_mem_rec++;
72222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
72322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
72422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
72522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Getting MemRecords Attributes */
72622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    {
72722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        iv_fill_mem_rec_ip_t s_fill_mem_rec_ip;
72822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        iv_fill_mem_rec_op_t s_fill_mem_rec_op;
72922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
73022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_fill_mem_rec_ip.u4_size = sizeof(iv_fill_mem_rec_ip_t);
73122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_fill_mem_rec_op.u4_size = sizeof(iv_fill_mem_rec_op_t);
73222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
73322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_fill_mem_rec_ip.e_cmd = IV_CMD_FILL_NUM_MEM_REC;
73422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_fill_mem_rec_ip.ps_mem_rec = mMemRecords;
73522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_fill_mem_rec_ip.u4_num_mem_rec = mNumMemRecords;
73622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_fill_mem_rec_ip.u4_max_wd = mWidth;
73722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_fill_mem_rec_ip.u4_max_ht = mHeight;
73822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_fill_mem_rec_ip.u4_max_level = mAVCEncLevel;
73922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_fill_mem_rec_ip.e_color_format = DEFAULT_INP_COLOR_FORMAT;
74022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_fill_mem_rec_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM;
74122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_fill_mem_rec_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM;
74222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_fill_mem_rec_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X;
74322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_fill_mem_rec_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y;
74422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
74522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        status = ive_api_function(0, &s_fill_mem_rec_ip, &s_fill_mem_rec_op);
74622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
74722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        if (status != IV_SUCCESS) {
74822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ALOGE("Fill memory records failed = 0x%x\n",
74922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    s_fill_mem_rec_op.u4_error_code);
75022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            mSignalledError = true;
75122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
75222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return OMX_ErrorUndefined;
75322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
75422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
75522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
75622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Allocating Memory for Mem Records */
75722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    {
75822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        WORD32 total_size;
75922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        iv_mem_rec_t *ps_mem_rec;
76022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        total_size = 0;
76122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ps_mem_rec = mMemRecords;
76215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
76315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        for (size_t i = 0; i < mNumMemRecords; i++) {
76422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_mem_rec->pv_base = ive_aligned_malloc(
76522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    ps_mem_rec->u4_mem_alignment, ps_mem_rec->u4_mem_size);
76622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            if (ps_mem_rec->pv_base == NULL) {
767ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar                ALOGE("Allocation failure for mem record id %zu size %u\n", i,
76822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                        ps_mem_rec->u4_mem_size);
76922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                mSignalledError = true;
77022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
77122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                return OMX_ErrorUndefined;
77222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
77322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            }
77422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            total_size += ps_mem_rec->u4_mem_size;
77522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
77622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_mem_rec++;
77722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
77822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
77922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
78022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Codec Instance Creation */
78122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    {
78222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ive_init_ip_t s_init_ip;
78322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ive_init_op_t s_init_op;
78422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
78522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        mCodecCtx = (iv_obj_t *)mMemRecords[0].pv_base;
78622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        mCodecCtx->u4_size = sizeof(iv_obj_t);
78722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        mCodecCtx->pv_fxns = (void *)ive_api_function;
78822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
78922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.u4_size = sizeof(ive_init_ip_t);
79022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_op.u4_size = sizeof(ive_init_op_t);
79122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
79222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.e_cmd = IV_CMD_INIT;
79322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.u4_num_mem_rec = mNumMemRecords;
79422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.ps_mem_rec = mMemRecords;
79522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.u4_max_wd = mWidth;
79622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.u4_max_ht = mHeight;
79722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM;
79822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM;
79922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.u4_max_level = mAVCEncLevel;
80022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.e_inp_color_fmt = mIvVideoColorFormat;
80122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
80222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        if (mReconEnable || mPSNREnable) {
80322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            s_init_ip.u4_enable_recon = 1;
80422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        } else {
80522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            s_init_ip.u4_enable_recon = 0;
80622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
80722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.e_recon_color_fmt = DEFAULT_RECON_COLOR_FORMAT;
80822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.e_rc_mode = DEFAULT_RC_MODE;
80922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.u4_max_framerate = DEFAULT_MAX_FRAMERATE;
81022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.u4_max_bitrate = DEFAULT_MAX_BITRATE;
81115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        s_init_ip.u4_num_bframes = mBframes;
81222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.e_content_type = IV_PROGRESSIVE;
81322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X;
81422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y;
81522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.e_slice_mode = mSliceMode;
81622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.u4_slice_param = mSliceParam;
81722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.e_arch = mArch;
81822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        s_init_ip.e_soc = DEFAULT_SOC;
81922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
82022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        status = ive_api_function(mCodecCtx, &s_init_ip, &s_init_op);
82122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
82222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        if (status != IV_SUCCESS) {
82322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ALOGE("Init memory records failed = 0x%x\n",
82422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    s_init_op.u4_error_code);
82522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            mSignalledError = true;
82622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            notify(OMX_EventError, OMX_ErrorUndefined, 0 /* arg2 */, NULL /* data */);
82722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return OMX_ErrorUndefined;
82822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
82922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
83022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
83122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Get Codec Version */
83222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    logVersion();
83322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
83422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* set processor details */
83522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    setNumCores();
83622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
83722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Video control Set Frame dimensions */
83822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    setDimensions();
83922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
84022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Video control Set Frame rates */
84122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    setFrameRate();
84222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
84322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Video control Set IPE Params */
84422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    setIpeParams();
84522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
84622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Video control Set Bitrate */
84722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    setBitRate();
84822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
84922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Video control Set QP */
85022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    setQp();
85122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
85222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Video control Set AIR params */
85322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    setAirParams();
85422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
85522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Video control Set VBV params */
85622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    setVbvParams();
85722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
85822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Video control Set Motion estimation params */
85922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    setMeParams();
86022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
86122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Video control Set GOP params */
86222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    setGopParams();
86322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
86422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Video control Set Deblock params */
86522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    setDeblockParams();
86622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
86722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Video control Set Profile params */
86822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    setProfileParams();
86922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
87022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Video control Set in Encode header mode */
87122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    setEncMode(IVE_ENC_MODE_HEADER);
87222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
87322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ALOGV("init_codec successfull");
87422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
87522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mSpsPpsHeaderReceived = false;
87622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mStarted = true;
87722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
87822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
87922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
88022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
88122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::releaseEncoder() {
88222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status = IV_SUCCESS;
88322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    iv_retrieve_mem_rec_ip_t s_retrieve_mem_ip;
88422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    iv_retrieve_mem_rec_op_t s_retrieve_mem_op;
88522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    iv_mem_rec_t *ps_mem_rec;
88622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
88722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (!mStarted) {
88822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorNone;
88922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
89022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
89122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_retrieve_mem_ip.u4_size = sizeof(iv_retrieve_mem_rec_ip_t);
89222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_retrieve_mem_op.u4_size = sizeof(iv_retrieve_mem_rec_op_t);
89322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_retrieve_mem_ip.e_cmd = IV_CMD_RETRIEVE_MEMREC;
89422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    s_retrieve_mem_ip.ps_mem_rec = mMemRecords;
89522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
89622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    status = ive_api_function(mCodecCtx, &s_retrieve_mem_ip, &s_retrieve_mem_op);
89722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
89822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (status != IV_SUCCESS) {
89922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGE("Unable to retrieve memory records = 0x%x\n",
90022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                s_retrieve_mem_op.u4_error_code);
90122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUndefined;
90222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
90322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
90422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Free memory records */
90522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_mem_rec = mMemRecords;
90615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    for (size_t i = 0; i < s_retrieve_mem_op.u4_num_mem_rec_filled; i++) {
90722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ive_aligned_free(ps_mem_rec->pv_base);
90822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ps_mem_rec++;
90922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
91022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
91122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    free(mMemRecords);
91222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
91315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    for (size_t i = 0; i < MAX_CONVERSION_BUFFERS; i++) {
91415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        if (mConversionBuffers[i]) {
91515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            free(mConversionBuffers[i]);
91615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            mConversionBuffers[i] = NULL;
91715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        }
91822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
91922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
92022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mStarted = false;
92122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
92222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
92322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
92422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
92522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::internalGetParameter(OMX_INDEXTYPE index, OMX_PTR params) {
92622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    switch (index) {
92722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        case OMX_IndexParamVideoBitrate:
92822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        {
92922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            OMX_VIDEO_PARAM_BITRATETYPE *bitRate =
93022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                (OMX_VIDEO_PARAM_BITRATETYPE *)params;
93122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
9322720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            if (!isValidOMXParam(bitRate)) {
9332720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen                return OMX_ErrorBadParameter;
9342720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            }
9352720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen
93622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            if (bitRate->nPortIndex != 1) {
93722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                return OMX_ErrorUndefined;
93822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            }
93922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
94022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            bitRate->eControlRate = OMX_Video_ControlRateVariable;
94122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            bitRate->nTargetBitrate = mBitrate;
94222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return OMX_ErrorNone;
94322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
94422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
94522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        case OMX_IndexParamVideoAvc:
94622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        {
94722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            OMX_VIDEO_PARAM_AVCTYPE *avcParams = (OMX_VIDEO_PARAM_AVCTYPE *)params;
94822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
9492720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            if (!isValidOMXParam(avcParams)) {
9502720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen                return OMX_ErrorBadParameter;
9512720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            }
9522720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen
95322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            if (avcParams->nPortIndex != 1) {
95422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                return OMX_ErrorUndefined;
95522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            }
95622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
95715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            OMX_VIDEO_AVCLEVELTYPE omxLevel = OMX_VIDEO_AVCLevel41;
95822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            if (OMX_ErrorNone
95922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    != ConvertAvcSpecLevelToOmxAvcLevel(mAVCEncLevel, &omxLevel)) {
96022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                return OMX_ErrorUndefined;
96122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            }
96222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
96315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            avcParams->eProfile = OMX_VIDEO_AVCProfileBaseline;
96422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            avcParams->eLevel = omxLevel;
96522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            avcParams->nRefFrames = 1;
96622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            avcParams->bUseHadamard = OMX_TRUE;
96722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            avcParams->nAllowedPictureTypes = (OMX_VIDEO_PictureTypeI
96815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    | OMX_VIDEO_PictureTypeP | OMX_VIDEO_PictureTypeB);
96922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            avcParams->nRefIdx10ActiveMinus1 = 0;
97022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            avcParams->nRefIdx11ActiveMinus1 = 0;
97122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            avcParams->bWeightedPPrediction = OMX_FALSE;
97222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            avcParams->bconstIpred = OMX_FALSE;
97322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            avcParams->bDirect8x8Inference = OMX_FALSE;
97422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            avcParams->bDirectSpatialTemporal = OMX_FALSE;
97522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            avcParams->nCabacInitIdc = 0;
97622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return OMX_ErrorNone;
97722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
97822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
97922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        default:
98022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return SoftVideoEncoderOMXComponent::internalGetParameter(index, params);
98122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
98222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
98322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
98422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR params) {
98522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    int32_t indexFull = index;
98622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
98722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    switch (indexFull) {
98822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        case OMX_IndexParamVideoBitrate:
98922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        {
9902720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            OMX_VIDEO_PARAM_BITRATETYPE *bitRate =
9912720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen                (OMX_VIDEO_PARAM_BITRATETYPE *)params;
9922720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen
9932720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            if (!isValidOMXParam(bitRate)) {
9942720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen                return OMX_ErrorBadParameter;
9952720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            }
9962720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen
9972720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            return internalSetBitrateParams(bitRate);
99822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
99922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
100022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        case OMX_IndexParamVideoAvc:
100122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        {
100222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            OMX_VIDEO_PARAM_AVCTYPE *avcType = (OMX_VIDEO_PARAM_AVCTYPE *)params;
100322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
10042720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            if (!isValidOMXParam(avcType)) {
10052720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen                return OMX_ErrorBadParameter;
10062720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            }
10072720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen
100822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            if (avcType->nPortIndex != 1) {
100922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                return OMX_ErrorUndefined;
101022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            }
101122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
101215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            mEntropyMode = 0;
101315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
101415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            if (OMX_TRUE == avcType->bEntropyCodingCABAC)
101515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                mEntropyMode = 1;
101615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
101715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            if ((avcType->nAllowedPictureTypes & OMX_VIDEO_PictureTypeB) &&
101815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    avcType->nPFrames) {
1019d72e751fa185f053773603222fd220ab77c92b2fLajos Molnar                mBframes = avcType->nBFrames;
102015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            }
102115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
1022d72e751fa185f053773603222fd220ab77c92b2fLajos Molnar            mIInterval = (avcType->nPFrames + 1) * (avcType->nBFrames + 1);
1023972f653af6288f8dbb3ebd205c599e0cbb23456aDoney Alex            mConstrainedIntraFlag = avcType->bconstIpred;
102415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
102515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            if (OMX_VIDEO_AVCLoopFilterDisable == avcType->eLoopFilterMode)
102615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                mDisableDeblkLevel = 4;
102715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
102815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            if (avcType->nRefFrames != 1
102922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    || avcType->bUseHadamard != OMX_TRUE
103022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    || avcType->nRefIdx10ActiveMinus1 != 0
103122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    || avcType->nRefIdx11ActiveMinus1 != 0
103222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    || avcType->bWeightedPPrediction != OMX_FALSE
103322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    || avcType->bDirect8x8Inference != OMX_FALSE
103422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    || avcType->bDirectSpatialTemporal != OMX_FALSE
103522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    || avcType->nCabacInitIdc != 0) {
1036d72e751fa185f053773603222fd220ab77c92b2fLajos Molnar                // OMX does not allow a way to signal what values are wrong, so it's
1037d72e751fa185f053773603222fd220ab77c92b2fLajos Molnar                // best for components to just do best effort in supporting these values
1038d72e751fa185f053773603222fd220ab77c92b2fLajos Molnar                ALOGV("ignoring unsupported settings");
103922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            }
104022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
104122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            if (OK != ConvertOmxAvcLevelToAvcSpecLevel(avcType->eLevel, &mAVCEncLevel)) {
104222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                return OMX_ErrorUndefined;
104322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            }
104422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
104522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return OMX_ErrorNone;
104622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
104722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
104822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        default:
104922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return SoftVideoEncoderOMXComponent::internalSetParameter(index, params);
105022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
105122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
105222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
1053870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu KuangOMX_ERRORTYPE SoftAVC::getConfig(
1054870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang        OMX_INDEXTYPE index, OMX_PTR _params) {
1055870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang    switch ((int)index) {
1056870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang        case OMX_IndexConfigAndroidIntraRefresh:
1057870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang        {
1058870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang            OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *intraRefreshParams =
1059870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang                (OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *)_params;
10602720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen
10612720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            if (!isValidOMXParam(intraRefreshParams)) {
10622720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen                return OMX_ErrorBadParameter;
10632720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            }
10642720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen
1065870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang            if (intraRefreshParams->nPortIndex != kOutputPortIndex) {
1066870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang                return OMX_ErrorUndefined;
1067870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang            }
1068870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang
1069d08a068bee8396b2ccdd819920b4496de2309a68Hangyu Kuang            intraRefreshParams->nRefreshPeriod =
1070d08a068bee8396b2ccdd819920b4496de2309a68Hangyu Kuang                    (mAIRMode == IVE_AIR_MODE_NONE) ? 0 : mAIRRefreshPeriod;
1071870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang            return OMX_ErrorNone;
1072870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang        }
1073870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang
1074870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang        default:
1075870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang            return SoftVideoEncoderOMXComponent::getConfig(index, _params);
1076870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang    }
1077870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang}
1078870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang
107922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setConfig(
108022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        OMX_INDEXTYPE index, const OMX_PTR _params) {
1081870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang    switch ((int)index) {
108222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        case OMX_IndexConfigVideoIntraVOPRefresh:
108322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        {
108422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            OMX_CONFIG_INTRAREFRESHVOPTYPE *params =
108522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                (OMX_CONFIG_INTRAREFRESHVOPTYPE *)_params;
108622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
10872720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            if (!isValidOMXParam(params)) {
10882720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen                return OMX_ErrorBadParameter;
10892720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            }
10902720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen
109122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            if (params->nPortIndex != kOutputPortIndex) {
109222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                return OMX_ErrorBadPortIndex;
109322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            }
109422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
109530fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar            if (params->IntraRefreshVOP) {
109630fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar                mUpdateFlag |= kRequestKeyFrame;
109730fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar            }
109822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return OMX_ErrorNone;
109922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
110022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
110122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        case OMX_IndexConfigVideoBitrate:
110222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        {
110322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            OMX_VIDEO_CONFIG_BITRATETYPE *params =
110422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                (OMX_VIDEO_CONFIG_BITRATETYPE *)_params;
110522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
11062720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            if (!isValidOMXParam(params)) {
11072720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen                return OMX_ErrorBadParameter;
11082720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            }
11092720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen
111022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            if (params->nPortIndex != kOutputPortIndex) {
111122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                return OMX_ErrorBadPortIndex;
111222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            }
111322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
111422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            if (mBitrate != params->nEncodeBitrate) {
111522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                mBitrate = params->nEncodeBitrate;
111630fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar                mUpdateFlag |= kUpdateBitrate;
111722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            }
111822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return OMX_ErrorNone;
111922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
112022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
1121870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang        case OMX_IndexConfigAndroidIntraRefresh:
1122870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang        {
1123870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang            const OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *intraRefreshParams =
1124870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang                (const OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *)_params;
11252720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen
11262720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            if (!isValidOMXParam(intraRefreshParams)) {
11272720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen                return OMX_ErrorBadParameter;
11282720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            }
11292720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen
1130870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang            if (intraRefreshParams->nPortIndex != kOutputPortIndex) {
1131870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang                return OMX_ErrorUndefined;
1132870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang            }
1133870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang
1134870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang            if (intraRefreshParams->nRefreshPeriod == 0) {
1135870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang                mAIRMode = IVE_AIR_MODE_NONE;
1136870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang                mAIRRefreshPeriod = 0;
1137870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang            } else if (intraRefreshParams->nRefreshPeriod > 0) {
1138870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang                mAIRMode = IVE_AIR_MODE_CYCLIC;
1139870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang                mAIRRefreshPeriod = intraRefreshParams->nRefreshPeriod;
1140870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang            }
11417c36a6bc3f3fe4fe6d1d36b92c3a203de654b012Hangyu Kuang            mUpdateFlag |= kUpdateAIRMode;
1142870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang            return OMX_ErrorNone;
1143870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang        }
1144870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang
114522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        default:
114622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return SimpleSoftOMXComponent::setConfig(index, _params);
114722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
114822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
114922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
115022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::internalSetBitrateParams(
115122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        const OMX_VIDEO_PARAM_BITRATETYPE *bitrate) {
115222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (bitrate->nPortIndex != kOutputPortIndex) {
115322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return OMX_ErrorUnsupportedIndex;
115422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
115522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
115622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    mBitrate = bitrate->nTargetBitrate;
115730fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar    mUpdateFlag |= kUpdateBitrate;
115822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
115922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
116022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
116122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
116222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setEncodeArgs(
116322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ive_video_encode_ip_t *ps_encode_ip,
116422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ive_video_encode_op_t *ps_encode_op,
116522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        OMX_BUFFERHEADERTYPE *inputBufferHeader,
116622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        OMX_BUFFERHEADERTYPE *outputBufferHeader) {
116722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    iv_raw_buf_t *ps_inp_raw_buf;
116822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    const uint8_t *source;
116922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    UWORD8 *pu1_buf;
117022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
117122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_inp_raw_buf = &ps_encode_ip->s_inp_buf;
117222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_encode_ip->s_out_buf.pv_buf = outputBufferHeader->pBuffer;
117322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_encode_ip->s_out_buf.u4_bytes = 0;
117422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_encode_ip->s_out_buf.u4_bufsize = outputBufferHeader->nAllocLen;
117522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_encode_ip->u4_size = sizeof(ive_video_encode_ip_t);
117622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_encode_op->u4_size = sizeof(ive_video_encode_op_t);
117722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
117822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_encode_ip->e_cmd = IVE_CMD_VIDEO_ENCODE;
117922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_encode_ip->pv_bufs = NULL;
118022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_encode_ip->pv_mb_info = NULL;
118122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_encode_ip->pv_pic_info = NULL;
118222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_encode_ip->u4_mb_info_type = 0;
118322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_encode_ip->u4_pic_info_type = 0;
118422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_encode_op->s_out_buf.pv_buf = NULL;
118522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
118622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    /* Initialize color formats */
118722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    ps_inp_raw_buf->e_color_fmt = mIvVideoColorFormat;
118822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    source = NULL;
118915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    if ((inputBufferHeader != NULL) && inputBufferHeader->nFilledLen) {
119022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        source = inputBufferHeader->pBuffer + inputBufferHeader->nOffset;
119122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
119222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        if (mInputDataIsMeta) {
119315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            uint8_t *conversionBuffer = NULL;
119415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            for (size_t i = 0; i < MAX_CONVERSION_BUFFERS; i++) {
119515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                if (mConversionBuffersFree[i]) {
119615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    mConversionBuffersFree[i] = 0;
119715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    conversionBuffer = mConversionBuffers[i];
119815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    break;
119915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                }
120015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            }
120115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
120215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            if (NULL == conversionBuffer) {
120315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                ALOGE("No free buffers to hold conversion data");
120415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                return OMX_ErrorUndefined;
120515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            }
120615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
120722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            source = extractGraphicBuffer(
120815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    conversionBuffer, (mWidth * mHeight * 3 / 2), source,
120922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    inputBufferHeader->nFilledLen, mWidth, mHeight);
121022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
121122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            if (source == NULL) {
121222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                ALOGE("Error in extractGraphicBuffer");
121322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
121422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                return OMX_ErrorUndefined;
121522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            }
121622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
121715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        ps_encode_ip->u4_is_last = 0;
121815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        ps_encode_ip->u4_timestamp_high = (inputBufferHeader->nTimeStamp) >> 32;
121915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        ps_encode_ip->u4_timestamp_low = (inputBufferHeader->nTimeStamp) & 0xFFFFFFFF;
122015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    }
122115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    else {
122215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        if (mSawInputEOS){
122315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            ps_encode_ip->u4_is_last = 1;
122415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        }
122515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        memset(ps_inp_raw_buf, 0, sizeof(iv_raw_buf_t));
122615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        ps_inp_raw_buf->e_color_fmt = mIvVideoColorFormat;
122715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        ps_inp_raw_buf->u4_size = sizeof(iv_raw_buf_t);
122815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        return OMX_ErrorNone;
122922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
123022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
123122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    pu1_buf = (UWORD8 *)source;
123222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    switch (mIvVideoColorFormat) {
123322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        case IV_YUV_420P:
123422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        {
123522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->apv_bufs[0] = pu1_buf;
123622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            pu1_buf += (mStride) * mHeight;
123722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->apv_bufs[1] = pu1_buf;
123822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            pu1_buf += (mStride / 2) * mHeight / 2;
123922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->apv_bufs[2] = pu1_buf;
124022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
124122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_wd[0] = mWidth;
124222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_wd[1] = mWidth / 2;
124322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_wd[2] = mWidth / 2;
124422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
124522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_ht[0] = mHeight;
124622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_ht[1] = mHeight / 2;
124722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_ht[2] = mHeight / 2;
124822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
124922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_strd[0] = mStride;
125022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_strd[1] = (mStride / 2);
125122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_strd[2] = (mStride / 2);
125222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            break;
125322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
125422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
125522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        case IV_YUV_422ILE:
125622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        {
125722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->apv_bufs[0] = pu1_buf;
125822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_wd[0] = mWidth * 2;
125922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_ht[0] = mHeight;
126022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_strd[0] = mStride * 2;
126122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            break;
126222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
126322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
126422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        case IV_YUV_420SP_UV:
126522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        case IV_YUV_420SP_VU:
126622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        default:
126722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        {
126822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->apv_bufs[0] = pu1_buf;
126922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            pu1_buf += (mStride) * mHeight;
127022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->apv_bufs[1] = pu1_buf;
127122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
127222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_wd[0] = mWidth;
127322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_wd[1] = mWidth;
127422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
127522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_ht[0] = mHeight;
127622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_ht[1] = mHeight / 2;
127722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
127822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_strd[0] = mStride;
127922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ps_inp_raw_buf->au4_strd[1] = mStride;
128022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            break;
128122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
128222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
128322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return OMX_ErrorNone;
128422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
128522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
128622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhanivoid SoftAVC::onQueueFilled(OMX_U32 portIndex) {
128722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    IV_STATUS_T status;
128822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    WORD32 timeDelay, timeTaken;
128922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
129022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    UNUSED(portIndex);
129122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
129222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    // Initialize encoder if not already initialized
129322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    if (mCodecCtx == NULL) {
129422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        if (OMX_ErrorNone != initEncoder()) {
129522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ALOGE("Failed to initialize encoder");
129622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            notify(OMX_EventError, OMX_ErrorUndefined, 0 /* arg2 */, NULL /* data */);
129722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return;
129822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
129922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
130015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    if (mSignalledError) {
130122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        return;
130222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
130322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
130422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    List<BufferInfo *> &inQueue = getPortQueue(0);
130522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    List<BufferInfo *> &outQueue = getPortQueue(1);
130622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
130715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex    while (!mSawOutputEOS && !outQueue.empty()) {
130815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
130922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        OMX_ERRORTYPE error;
131022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ive_video_encode_ip_t s_encode_ip;
131122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ive_video_encode_op_t s_encode_op;
131222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        BufferInfo *outputBufferInfo = *outQueue.begin();
131322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        OMX_BUFFERHEADERTYPE *outputBufferHeader = outputBufferInfo->mHeader;
131422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
131515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        BufferInfo *inputBufferInfo;
131615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        OMX_BUFFERHEADERTYPE *inputBufferHeader;
1317cbe6ac2f281362d9dfbff867dd414d5cc2f6d21eChong Zhang
131815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        if (mSawInputEOS) {
131915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            inputBufferHeader = NULL;
132015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            inputBufferInfo = NULL;
132115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        } else if (!inQueue.empty()) {
132215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            inputBufferInfo = *inQueue.begin();
132315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            inputBufferHeader = inputBufferInfo->mHeader;
132415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        } else {
132522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return;
132622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
132722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
132822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        outputBufferHeader->nTimeStamp = 0;
132922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        outputBufferHeader->nFlags = 0;
133022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        outputBufferHeader->nOffset = 0;
133122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        outputBufferHeader->nFilledLen = 0;
133222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        outputBufferHeader->nOffset = 0;
133322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
133415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        if (inputBufferHeader != NULL) {
133515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            outputBufferHeader->nFlags = inputBufferHeader->nFlags;
133615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        }
133715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
133822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        uint8_t *outPtr = (uint8_t *)outputBufferHeader->pBuffer;
133922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
134022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        if (!mSpsPpsHeaderReceived) {
134122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            error = setEncodeArgs(&s_encode_ip, &s_encode_op, NULL, outputBufferHeader);
134222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            if (error != OMX_ErrorNone) {
134322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                mSignalledError = true;
134422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
134522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                return;
134622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            }
134722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            status = ive_api_function(mCodecCtx, &s_encode_ip, &s_encode_op);
134822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
134922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            if (IV_SUCCESS != status) {
135022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                ALOGE("Encode Frame failed = 0x%x\n",
135122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                        s_encode_op.u4_error_code);
135222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            } else {
135322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                ALOGV("Bytes Generated in header %d\n",
135422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                        s_encode_op.s_out_buf.u4_bytes);
135522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            }
135622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
135722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            mSpsPpsHeaderReceived = true;
135822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
135922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            outputBufferHeader->nFlags = OMX_BUFFERFLAG_CODECCONFIG;
136022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            outputBufferHeader->nFilledLen = s_encode_op.s_out_buf.u4_bytes;
136115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            if (inputBufferHeader != NULL) {
136215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                outputBufferHeader->nTimeStamp = inputBufferHeader->nTimeStamp;
136315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            }
136422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
136522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            outQueue.erase(outQueue.begin());
136622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            outputBufferInfo->mOwnedByUs = false;
136715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
136822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            DUMP_TO_FILE(
136922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    mOutFile, outputBufferHeader->pBuffer,
137022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    outputBufferHeader->nFilledLen);
137122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            notifyFillBufferDone(outputBufferHeader);
137222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
137322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            setEncMode(IVE_ENC_MODE_PICTURE);
137422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return;
137522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
137622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
137730fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar        if (mUpdateFlag) {
137830fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar            if (mUpdateFlag & kUpdateBitrate) {
137930fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar                setBitRate();
138030fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar            }
138130fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar            if (mUpdateFlag & kRequestKeyFrame) {
138230fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar                setFrameType(IV_IDR_FRAME);
138330fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar            }
13847c36a6bc3f3fe4fe6d1d36b92c3a203de654b012Hangyu Kuang            if (mUpdateFlag & kUpdateAIRMode) {
13857c36a6bc3f3fe4fe6d1d36b92c3a203de654b012Hangyu Kuang                setAirParams();
13867c36a6bc3f3fe4fe6d1d36b92c3a203de654b012Hangyu Kuang                notify(OMX_EventPortSettingsChanged, kOutputPortIndex,
13877c36a6bc3f3fe4fe6d1d36b92c3a203de654b012Hangyu Kuang                        OMX_IndexConfigAndroidIntraRefresh, NULL);
13887c36a6bc3f3fe4fe6d1d36b92c3a203de654b012Hangyu Kuang            }
138930fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar            mUpdateFlag = 0;
139022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
139122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
139215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        if ((inputBufferHeader != NULL)
139315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                && (inputBufferHeader->nFlags & OMX_BUFFERFLAG_EOS)) {
139422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            mSawInputEOS = true;
139522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
139622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
139715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        /* In normal mode, store inputBufferInfo and this will be returned
139815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex           when encoder consumes this input */
139915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        if (!mInputDataIsMeta && (inputBufferInfo != NULL)) {
140015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            for (size_t i = 0; i < MAX_INPUT_BUFFER_HEADERS; i++) {
140115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                if (NULL == mInputBufferInfo[i]) {
140215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    mInputBufferInfo[i] = inputBufferInfo;
140315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    break;
140415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                }
140515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            }
140615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        }
140722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        error = setEncodeArgs(
140822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                &s_encode_ip, &s_encode_op, inputBufferHeader, outputBufferHeader);
140915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex
141022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        if (error != OMX_ErrorNone) {
141122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            mSignalledError = true;
141222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
141322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return;
141422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
141522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
141622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        DUMP_TO_FILE(
141722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                mInFile, s_encode_ip.s_inp_buf.apv_bufs[0],
141822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                (mHeight * mStride * 3 / 2));
141922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
142022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        GETTIME(&mTimeStart, NULL);
142122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        /* Compute time elapsed between end of previous decode()
142222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani         * to start of current decode() */
142322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        TIME_DIFF(mTimeEnd, mTimeStart, timeDelay);
142422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        status = ive_api_function(mCodecCtx, &s_encode_ip, &s_encode_op);
142522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
142622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        if (IV_SUCCESS != status) {
142722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            ALOGE("Encode Frame failed = 0x%x\n",
142822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                    s_encode_op.u4_error_code);
142922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            mSignalledError = true;
143022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            notify(OMX_EventError, OMX_ErrorUndefined, 0, 0);
143122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            return;
143222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
143322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
143422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        GETTIME(&mTimeEnd, NULL);
143522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        /* Compute time taken for decode() */
143622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        TIME_DIFF(mTimeStart, mTimeEnd, timeTaken);
143722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
143822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        ALOGV("timeTaken=%6d delay=%6d numBytes=%6d", timeTaken, timeDelay,
143922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani                s_encode_op.s_out_buf.u4_bytes);
144022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
144115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        /* In encoder frees up an input buffer, mark it as free */
144215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        if (s_encode_op.s_inp_buf.apv_bufs[0] != NULL) {
144315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            if (mInputDataIsMeta) {
144415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                for (size_t i = 0; i < MAX_CONVERSION_BUFFERS; i++) {
144515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    if (mConversionBuffers[i] == s_encode_op.s_inp_buf.apv_bufs[0]) {
144615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                        mConversionBuffersFree[i] = 1;
144715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                        break;
144815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    }
144915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                }
145015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            } else {
145115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                /* In normal mode, call EBD on inBuffeHeader that is freed by the codec */
145215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                for (size_t i = 0; i < MAX_INPUT_BUFFER_HEADERS; i++) {
145315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    uint8_t *buf = NULL;
145415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    OMX_BUFFERHEADERTYPE *bufHdr = NULL;
145515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    if (mInputBufferInfo[i] != NULL) {
145615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                        bufHdr = mInputBufferInfo[i]->mHeader;
145715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                        buf = bufHdr->pBuffer + bufHdr->nOffset;
145815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    }
145915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    if (s_encode_op.s_inp_buf.apv_bufs[0] == buf) {
146015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                        mInputBufferInfo[i]->mOwnedByUs = false;
146115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                        notifyEmptyBufferDone(bufHdr);
146215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                        mInputBufferInfo[i] = NULL;
146315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                        break;
146415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    }
146515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                }
146615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            }
146715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        }
146822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
146922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        outputBufferHeader->nFilledLen = s_encode_op.s_out_buf.u4_bytes;
147022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
147115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        if (IV_IDR_FRAME == s_encode_op.u4_encoded_frame_type) {
147222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            outputBufferHeader->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
147322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
147422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
147515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        if (inputBufferHeader != NULL) {
147615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            inQueue.erase(inQueue.begin());
147722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
147815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            /* If in meta data, call EBD on input */
147915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            /* In case of normal mode, EBD will be done once encoder
148015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            releases the input buffer */
148115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            if (mInputDataIsMeta) {
148215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                inputBufferInfo->mOwnedByUs = false;
148315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                notifyEmptyBufferDone(inputBufferHeader);
148415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            }
148515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        }
148622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
148715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        if (s_encode_op.u4_is_last) {
148822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani            outputBufferHeader->nFlags |= OMX_BUFFERFLAG_EOS;
148915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            mSawOutputEOS = true;
149015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        } else {
149115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            outputBufferHeader->nFlags &= ~OMX_BUFFERFLAG_EOS;
149222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        }
149322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
149415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        if (outputBufferHeader->nFilledLen || s_encode_op.u4_is_last) {
149515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            outputBufferHeader->nTimeStamp = s_encode_op.u4_timestamp_high;
149615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            outputBufferHeader->nTimeStamp <<= 32;
149715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            outputBufferHeader->nTimeStamp |= s_encode_op.u4_timestamp_low;
149815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            outputBufferInfo->mOwnedByUs = false;
149915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            outQueue.erase(outQueue.begin());
150015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            DUMP_TO_FILE(mOutFile, outputBufferHeader->pBuffer,
150115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex                    outputBufferHeader->nFilledLen);
150215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            notifyFillBufferDone(outputBufferHeader);
150315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        }
150422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
150515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        if (s_encode_op.u4_is_last == 1) {
150615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex            return;
150715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex        }
150822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    }
150922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return;
151022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
151122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
151222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}  // namespace android
151322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani
151422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhaniandroid::SoftOMXComponent *createSoftOMXComponent(
151522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        const char *name, const OMX_CALLBACKTYPE *callbacks,
151622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani        OMX_PTR appData, OMX_COMPONENTTYPE **component) {
151722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani    return new android::SoftAVC(name, callbacks, appData, component);
151822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani}
1519