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; 617c7c9271740c29c02e7926265ed53a44b8113dbfbRay Essick 61822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani CHECK(!mStarted); 61922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 62022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani OMX_ERRORTYPE errType = OMX_ErrorNone; 62122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 62222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani displaySizeY = mWidth * mHeight; 62322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (displaySizeY > (1920 * 1088)) { 62422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani level = 50; 62522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } else if (displaySizeY > (1280 * 720)) { 62622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani level = 40; 62722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } else if (displaySizeY > (720 * 576)) { 62822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani level = 31; 62922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } else if (displaySizeY > (624 * 320)) { 63022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani level = 30; 63122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } else if (displaySizeY > (352 * 288)) { 63222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani level = 21; 63322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } else { 63422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani level = 20; 63522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 63622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mAVCEncLevel = MAX(level, mAVCEncLevel); 63722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 638df0ebf5f9ea5c16aaec4752bdf06af101cc541b8Harish Mahendrakar mStride = mWidth; 63922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 64022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (mInputDataIsMeta) { 64115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex for (size_t i = 0; i < MAX_CONVERSION_BUFFERS; i++) { 64215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (mConversionBuffers[i] != NULL) { 64315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex free(mConversionBuffers[i]); 6447099d9b5f3761dbe3f76166129c3f0a22d2470efMarco Nelissen mConversionBuffers[i] = 0; 64515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 64622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 647595fede0cf7b53b4d3f51d72df8d66fd7ff14d1cWei Jia if (((uint64_t)mStride * mHeight) > ((uint64_t)INT32_MAX / 3)) { 648f6fe4340219a8e674f3250fe32d4697ec8184b24Wei Jia ALOGE("Buffer size is too big."); 649f6fe4340219a8e674f3250fe32d4697ec8184b24Wei Jia return OMX_ErrorUndefined; 650f6fe4340219a8e674f3250fe32d4697ec8184b24Wei Jia } 65115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex mConversionBuffers[i] = (uint8_t *)malloc(mStride * mHeight * 3 / 2); 65215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex 65315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (mConversionBuffers[i] == NULL) { 65422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ALOGE("Allocating conversion buffer failed."); 65522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorUndefined; 65622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 65715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex 65815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex mConversionBuffersFree[i] = 1; 65922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 66022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 66122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 66222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani switch (mColorFormat) { 66322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani case OMX_COLOR_FormatYUV420SemiPlanar: 66422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mIvVideoColorFormat = IV_YUV_420SP_UV; 66522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ALOGV("colorFormat YUV_420SP"); 66622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani break; 66722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani default: 66822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani case OMX_COLOR_FormatYUV420Planar: 66922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mIvVideoColorFormat = IV_YUV_420P; 67022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ALOGV("colorFormat YUV_420P"); 67122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani break; 67222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 67322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 67415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex ALOGD("Params width %d height %d level %d colorFormat %d", mWidth, 67522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mHeight, mAVCEncLevel, mIvVideoColorFormat); 67622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 67722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Getting Number of MemRecords */ 67822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani { 67922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani iv_num_mem_rec_ip_t s_num_mem_rec_ip; 68022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani iv_num_mem_rec_op_t s_num_mem_rec_op; 68122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 68222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_num_mem_rec_ip.u4_size = sizeof(iv_num_mem_rec_ip_t); 68322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_num_mem_rec_op.u4_size = sizeof(iv_num_mem_rec_op_t); 68422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 68522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_num_mem_rec_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC; 68622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 68722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani status = ive_api_function(0, &s_num_mem_rec_ip, &s_num_mem_rec_op); 68822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 68922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (status != IV_SUCCESS) { 69022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ALOGE("Get number of memory records failed = 0x%x\n", 69122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_num_mem_rec_op.u4_error_code); 69222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorUndefined; 69322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 69422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 69522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mNumMemRecords = s_num_mem_rec_op.u4_num_mem_rec; 69622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 69722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 69822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Allocate array to hold memory records */ 699f6fe4340219a8e674f3250fe32d4697ec8184b24Wei Jia if (mNumMemRecords > SIZE_MAX / sizeof(iv_mem_rec_t)) { 700f6fe4340219a8e674f3250fe32d4697ec8184b24Wei Jia ALOGE("requested memory size is too big."); 701f6fe4340219a8e674f3250fe32d4697ec8184b24Wei Jia return OMX_ErrorUndefined; 702f6fe4340219a8e674f3250fe32d4697ec8184b24Wei Jia } 70322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mMemRecords = (iv_mem_rec_t *)malloc(mNumMemRecords * sizeof(iv_mem_rec_t)); 70422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (NULL == mMemRecords) { 705ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGE("Unable to allocate memory for hold memory records: Size %zu", 70622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mNumMemRecords * sizeof(iv_mem_rec_t)); 70722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mSignalledError = true; 70822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); 70922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorUndefined; 71022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 71122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 71222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani { 71322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani iv_mem_rec_t *ps_mem_rec; 71422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_mem_rec = mMemRecords; 71515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex for (size_t i = 0; i < mNumMemRecords; i++) { 71622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_mem_rec->u4_size = sizeof(iv_mem_rec_t); 71722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_mem_rec->pv_base = NULL; 71822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_mem_rec->u4_mem_size = 0; 71922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_mem_rec->u4_mem_alignment = 0; 72022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_mem_rec->e_mem_type = IV_NA_MEM_TYPE; 72122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 72222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_mem_rec++; 72322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 72422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 72522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 72622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Getting MemRecords Attributes */ 72722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani { 72822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani iv_fill_mem_rec_ip_t s_fill_mem_rec_ip; 72922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani iv_fill_mem_rec_op_t s_fill_mem_rec_op; 73022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 73122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_fill_mem_rec_ip.u4_size = sizeof(iv_fill_mem_rec_ip_t); 73222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_fill_mem_rec_op.u4_size = sizeof(iv_fill_mem_rec_op_t); 73322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 73422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_fill_mem_rec_ip.e_cmd = IV_CMD_FILL_NUM_MEM_REC; 73522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_fill_mem_rec_ip.ps_mem_rec = mMemRecords; 73622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_fill_mem_rec_ip.u4_num_mem_rec = mNumMemRecords; 73722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_fill_mem_rec_ip.u4_max_wd = mWidth; 73822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_fill_mem_rec_ip.u4_max_ht = mHeight; 73922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_fill_mem_rec_ip.u4_max_level = mAVCEncLevel; 74022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_fill_mem_rec_ip.e_color_format = DEFAULT_INP_COLOR_FORMAT; 74122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_fill_mem_rec_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM; 74222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_fill_mem_rec_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM; 74322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_fill_mem_rec_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X; 74422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_fill_mem_rec_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y; 74522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 74622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani status = ive_api_function(0, &s_fill_mem_rec_ip, &s_fill_mem_rec_op); 74722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 74822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (status != IV_SUCCESS) { 74922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ALOGE("Fill memory records failed = 0x%x\n", 75022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_fill_mem_rec_op.u4_error_code); 75122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mSignalledError = true; 75222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); 75322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorUndefined; 75422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 75522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 75622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 75722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Allocating Memory for Mem Records */ 75822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani { 75922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani WORD32 total_size; 76022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani iv_mem_rec_t *ps_mem_rec; 76122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani total_size = 0; 76222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_mem_rec = mMemRecords; 76315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex 76415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex for (size_t i = 0; i < mNumMemRecords; i++) { 76522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_mem_rec->pv_base = ive_aligned_malloc( 76622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_mem_rec->u4_mem_alignment, ps_mem_rec->u4_mem_size); 76722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (ps_mem_rec->pv_base == NULL) { 768ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGE("Allocation failure for mem record id %zu size %u\n", i, 76922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_mem_rec->u4_mem_size); 77022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mSignalledError = true; 77122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); 77222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorUndefined; 77322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 77422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 77522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani total_size += ps_mem_rec->u4_mem_size; 77622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 77722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_mem_rec++; 77822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 77922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 78022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 78122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Codec Instance Creation */ 78222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani { 78322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ive_init_ip_t s_init_ip; 78422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ive_init_op_t s_init_op; 78522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 78622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mCodecCtx = (iv_obj_t *)mMemRecords[0].pv_base; 78722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mCodecCtx->u4_size = sizeof(iv_obj_t); 78822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mCodecCtx->pv_fxns = (void *)ive_api_function; 78922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 79022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.u4_size = sizeof(ive_init_ip_t); 79122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_op.u4_size = sizeof(ive_init_op_t); 79222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 79322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.e_cmd = IV_CMD_INIT; 79422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.u4_num_mem_rec = mNumMemRecords; 79522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.ps_mem_rec = mMemRecords; 79622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.u4_max_wd = mWidth; 79722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.u4_max_ht = mHeight; 79822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM; 79922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM; 80022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.u4_max_level = mAVCEncLevel; 80122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.e_inp_color_fmt = mIvVideoColorFormat; 80222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 80322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (mReconEnable || mPSNREnable) { 80422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.u4_enable_recon = 1; 80522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } else { 80622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.u4_enable_recon = 0; 80722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 80822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.e_recon_color_fmt = DEFAULT_RECON_COLOR_FORMAT; 80922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.e_rc_mode = DEFAULT_RC_MODE; 81022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.u4_max_framerate = DEFAULT_MAX_FRAMERATE; 81122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.u4_max_bitrate = DEFAULT_MAX_BITRATE; 81215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex s_init_ip.u4_num_bframes = mBframes; 81322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.e_content_type = IV_PROGRESSIVE; 81422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X; 81522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y; 81622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.e_slice_mode = mSliceMode; 81722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.u4_slice_param = mSliceParam; 81822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.e_arch = mArch; 81922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_ip.e_soc = DEFAULT_SOC; 82022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 82122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani status = ive_api_function(mCodecCtx, &s_init_ip, &s_init_op); 82222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 82322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (status != IV_SUCCESS) { 82422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ALOGE("Init memory records failed = 0x%x\n", 82522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_init_op.u4_error_code); 82622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mSignalledError = true; 82722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani notify(OMX_EventError, OMX_ErrorUndefined, 0 /* arg2 */, NULL /* data */); 82822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorUndefined; 82922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 83022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 83122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 83222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Get Codec Version */ 83322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani logVersion(); 83422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 83522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* set processor details */ 83622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani setNumCores(); 83722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 83822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Video control Set Frame dimensions */ 83922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani setDimensions(); 84022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 84122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Video control Set Frame rates */ 84222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani setFrameRate(); 84322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 84422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Video control Set IPE Params */ 84522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani setIpeParams(); 84622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 84722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Video control Set Bitrate */ 84822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani setBitRate(); 84922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 85022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Video control Set QP */ 85122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani setQp(); 85222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 85322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Video control Set AIR params */ 85422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani setAirParams(); 85522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 85622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Video control Set VBV params */ 85722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani setVbvParams(); 85822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 85922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Video control Set Motion estimation params */ 86022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani setMeParams(); 86122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 86222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Video control Set GOP params */ 86322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani setGopParams(); 86422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 86522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Video control Set Deblock params */ 86622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani setDeblockParams(); 86722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 86822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Video control Set Profile params */ 86922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani setProfileParams(); 87022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 87122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Video control Set in Encode header mode */ 87222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani setEncMode(IVE_ENC_MODE_HEADER); 87322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 87422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ALOGV("init_codec successfull"); 87522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 87622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mSpsPpsHeaderReceived = false; 87722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mStarted = true; 87822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 87922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorNone; 88022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani} 88122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 88222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::releaseEncoder() { 88322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani IV_STATUS_T status = IV_SUCCESS; 88422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani iv_retrieve_mem_rec_ip_t s_retrieve_mem_ip; 88522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani iv_retrieve_mem_rec_op_t s_retrieve_mem_op; 88622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani iv_mem_rec_t *ps_mem_rec; 88722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 88822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (!mStarted) { 88922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorNone; 89022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 89122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 89222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_retrieve_mem_ip.u4_size = sizeof(iv_retrieve_mem_rec_ip_t); 89322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_retrieve_mem_op.u4_size = sizeof(iv_retrieve_mem_rec_op_t); 89422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_retrieve_mem_ip.e_cmd = IV_CMD_RETRIEVE_MEMREC; 89522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_retrieve_mem_ip.ps_mem_rec = mMemRecords; 89622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 89722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani status = ive_api_function(mCodecCtx, &s_retrieve_mem_ip, &s_retrieve_mem_op); 89822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 89922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (status != IV_SUCCESS) { 90022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ALOGE("Unable to retrieve memory records = 0x%x\n", 90122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_retrieve_mem_op.u4_error_code); 90222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorUndefined; 90322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 90422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 90522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Free memory records */ 90622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_mem_rec = mMemRecords; 90715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex for (size_t i = 0; i < s_retrieve_mem_op.u4_num_mem_rec_filled; i++) { 90822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ive_aligned_free(ps_mem_rec->pv_base); 90922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_mem_rec++; 91022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 91122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 91222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani free(mMemRecords); 91322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 91415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex for (size_t i = 0; i < MAX_CONVERSION_BUFFERS; i++) { 91515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (mConversionBuffers[i]) { 91615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex free(mConversionBuffers[i]); 91715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex mConversionBuffers[i] = NULL; 91815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 91922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 92022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 921c7c9271740c29c02e7926265ed53a44b8113dbfbRay Essick // clear other pointers into the space being free()d 922c7c9271740c29c02e7926265ed53a44b8113dbfbRay Essick mCodecCtx = NULL; 923c7c9271740c29c02e7926265ed53a44b8113dbfbRay Essick 92422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mStarted = false; 92522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 92622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorNone; 92722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani} 92822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 92922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::internalGetParameter(OMX_INDEXTYPE index, OMX_PTR params) { 93022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani switch (index) { 93122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani case OMX_IndexParamVideoBitrate: 93222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani { 93322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani OMX_VIDEO_PARAM_BITRATETYPE *bitRate = 93422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani (OMX_VIDEO_PARAM_BITRATETYPE *)params; 93522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 9362720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen if (!isValidOMXParam(bitRate)) { 9372720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return OMX_ErrorBadParameter; 9382720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen } 9392720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 94022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (bitRate->nPortIndex != 1) { 94122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorUndefined; 94222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 94322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 94422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani bitRate->eControlRate = OMX_Video_ControlRateVariable; 94522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani bitRate->nTargetBitrate = mBitrate; 94622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorNone; 94722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 94822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 94922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani case OMX_IndexParamVideoAvc: 95022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani { 95122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani OMX_VIDEO_PARAM_AVCTYPE *avcParams = (OMX_VIDEO_PARAM_AVCTYPE *)params; 95222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 9532720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen if (!isValidOMXParam(avcParams)) { 9542720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return OMX_ErrorBadParameter; 9552720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen } 9562720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 95722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (avcParams->nPortIndex != 1) { 95822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorUndefined; 95922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 96022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 96115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex OMX_VIDEO_AVCLEVELTYPE omxLevel = OMX_VIDEO_AVCLevel41; 96222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (OMX_ErrorNone 96322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani != ConvertAvcSpecLevelToOmxAvcLevel(mAVCEncLevel, &omxLevel)) { 96422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorUndefined; 96522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 96622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 96715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex avcParams->eProfile = OMX_VIDEO_AVCProfileBaseline; 96822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani avcParams->eLevel = omxLevel; 96922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani avcParams->nRefFrames = 1; 97022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani avcParams->bUseHadamard = OMX_TRUE; 97122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani avcParams->nAllowedPictureTypes = (OMX_VIDEO_PictureTypeI 97215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex | OMX_VIDEO_PictureTypeP | OMX_VIDEO_PictureTypeB); 97322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani avcParams->nRefIdx10ActiveMinus1 = 0; 97422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani avcParams->nRefIdx11ActiveMinus1 = 0; 97522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani avcParams->bWeightedPPrediction = OMX_FALSE; 97622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani avcParams->bconstIpred = OMX_FALSE; 97722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani avcParams->bDirect8x8Inference = OMX_FALSE; 97822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani avcParams->bDirectSpatialTemporal = OMX_FALSE; 97922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani avcParams->nCabacInitIdc = 0; 98022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorNone; 98122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 98222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 98322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani default: 98422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return SoftVideoEncoderOMXComponent::internalGetParameter(index, params); 98522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 98622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani} 98722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 98822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR params) { 98922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani int32_t indexFull = index; 99022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 99122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani switch (indexFull) { 99222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani case OMX_IndexParamVideoBitrate: 99322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani { 9942720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen OMX_VIDEO_PARAM_BITRATETYPE *bitRate = 9952720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen (OMX_VIDEO_PARAM_BITRATETYPE *)params; 9962720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 9972720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen if (!isValidOMXParam(bitRate)) { 9982720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return OMX_ErrorBadParameter; 9992720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen } 10002720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 10012720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return internalSetBitrateParams(bitRate); 100222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 100322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 100422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani case OMX_IndexParamVideoAvc: 100522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani { 100622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani OMX_VIDEO_PARAM_AVCTYPE *avcType = (OMX_VIDEO_PARAM_AVCTYPE *)params; 100722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 10082720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen if (!isValidOMXParam(avcType)) { 10092720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return OMX_ErrorBadParameter; 10102720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen } 10112720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 101222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (avcType->nPortIndex != 1) { 101322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorUndefined; 101422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 101522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 101615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex mEntropyMode = 0; 101715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex 101815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (OMX_TRUE == avcType->bEntropyCodingCABAC) 101915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex mEntropyMode = 1; 102015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex 102115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if ((avcType->nAllowedPictureTypes & OMX_VIDEO_PictureTypeB) && 102215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex avcType->nPFrames) { 1023d72e751fa185f053773603222fd220ab77c92b2fLajos Molnar mBframes = avcType->nBFrames; 102415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 102515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex 1026d72e751fa185f053773603222fd220ab77c92b2fLajos Molnar mIInterval = (avcType->nPFrames + 1) * (avcType->nBFrames + 1); 1027972f653af6288f8dbb3ebd205c599e0cbb23456aDoney Alex mConstrainedIntraFlag = avcType->bconstIpred; 102815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex 102915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (OMX_VIDEO_AVCLoopFilterDisable == avcType->eLoopFilterMode) 103015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex mDisableDeblkLevel = 4; 103115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex 103215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (avcType->nRefFrames != 1 103322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani || avcType->bUseHadamard != OMX_TRUE 103422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani || avcType->nRefIdx10ActiveMinus1 != 0 103522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani || avcType->nRefIdx11ActiveMinus1 != 0 103622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani || avcType->bWeightedPPrediction != OMX_FALSE 103722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani || avcType->bDirect8x8Inference != OMX_FALSE 103822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani || avcType->bDirectSpatialTemporal != OMX_FALSE 103922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani || avcType->nCabacInitIdc != 0) { 1040d72e751fa185f053773603222fd220ab77c92b2fLajos Molnar // OMX does not allow a way to signal what values are wrong, so it's 1041d72e751fa185f053773603222fd220ab77c92b2fLajos Molnar // best for components to just do best effort in supporting these values 1042d72e751fa185f053773603222fd220ab77c92b2fLajos Molnar ALOGV("ignoring unsupported settings"); 104322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 104422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 104522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (OK != ConvertOmxAvcLevelToAvcSpecLevel(avcType->eLevel, &mAVCEncLevel)) { 104622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorUndefined; 104722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 104822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 104922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorNone; 105022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 105122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 105222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani default: 105322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return SoftVideoEncoderOMXComponent::internalSetParameter(index, params); 105422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 105522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani} 105622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 1057870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu KuangOMX_ERRORTYPE SoftAVC::getConfig( 1058870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang OMX_INDEXTYPE index, OMX_PTR _params) { 1059870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang switch ((int)index) { 1060870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang case OMX_IndexConfigAndroidIntraRefresh: 1061870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang { 1062870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *intraRefreshParams = 1063870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang (OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *)_params; 10642720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 10652720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen if (!isValidOMXParam(intraRefreshParams)) { 10662720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return OMX_ErrorBadParameter; 10672720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen } 10682720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 1069870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang if (intraRefreshParams->nPortIndex != kOutputPortIndex) { 1070870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang return OMX_ErrorUndefined; 1071870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang } 1072870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang 1073d08a068bee8396b2ccdd819920b4496de2309a68Hangyu Kuang intraRefreshParams->nRefreshPeriod = 1074d08a068bee8396b2ccdd819920b4496de2309a68Hangyu Kuang (mAIRMode == IVE_AIR_MODE_NONE) ? 0 : mAIRRefreshPeriod; 1075870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang return OMX_ErrorNone; 1076870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang } 1077870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang 1078870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang default: 1079870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang return SoftVideoEncoderOMXComponent::getConfig(index, _params); 1080870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang } 1081870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang} 1082870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang 108322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setConfig( 108422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani OMX_INDEXTYPE index, const OMX_PTR _params) { 1085870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang switch ((int)index) { 108622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani case OMX_IndexConfigVideoIntraVOPRefresh: 108722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani { 108822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani OMX_CONFIG_INTRAREFRESHVOPTYPE *params = 108922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani (OMX_CONFIG_INTRAREFRESHVOPTYPE *)_params; 109022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 10912720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen if (!isValidOMXParam(params)) { 10922720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return OMX_ErrorBadParameter; 10932720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen } 10942720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 109522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (params->nPortIndex != kOutputPortIndex) { 109622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorBadPortIndex; 109722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 109822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 109930fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar if (params->IntraRefreshVOP) { 110030fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar mUpdateFlag |= kRequestKeyFrame; 110130fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar } 110222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorNone; 110322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 110422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 110522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani case OMX_IndexConfigVideoBitrate: 110622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani { 110722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani OMX_VIDEO_CONFIG_BITRATETYPE *params = 110822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani (OMX_VIDEO_CONFIG_BITRATETYPE *)_params; 110922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 11102720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen if (!isValidOMXParam(params)) { 11112720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return OMX_ErrorBadParameter; 11122720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen } 11132720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 111422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (params->nPortIndex != kOutputPortIndex) { 111522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorBadPortIndex; 111622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 111722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 111822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (mBitrate != params->nEncodeBitrate) { 111922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mBitrate = params->nEncodeBitrate; 112030fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar mUpdateFlag |= kUpdateBitrate; 112122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 112222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorNone; 112322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 112422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 1125870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang case OMX_IndexConfigAndroidIntraRefresh: 1126870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang { 1127870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang const OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *intraRefreshParams = 1128870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang (const OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *)_params; 11292720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 11302720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen if (!isValidOMXParam(intraRefreshParams)) { 11312720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen return OMX_ErrorBadParameter; 11322720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen } 11332720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen 1134870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang if (intraRefreshParams->nPortIndex != kOutputPortIndex) { 1135870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang return OMX_ErrorUndefined; 1136870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang } 1137870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang 1138870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang if (intraRefreshParams->nRefreshPeriod == 0) { 1139870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang mAIRMode = IVE_AIR_MODE_NONE; 1140870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang mAIRRefreshPeriod = 0; 1141870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang } else if (intraRefreshParams->nRefreshPeriod > 0) { 1142870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang mAIRMode = IVE_AIR_MODE_CYCLIC; 1143870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang mAIRRefreshPeriod = intraRefreshParams->nRefreshPeriod; 1144870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang } 11457c36a6bc3f3fe4fe6d1d36b92c3a203de654b012Hangyu Kuang mUpdateFlag |= kUpdateAIRMode; 1146870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang return OMX_ErrorNone; 1147870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang } 1148870aff9bd2442c8877f5d6b12c73032b5f24535aHangyu Kuang 114922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani default: 115022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return SimpleSoftOMXComponent::setConfig(index, _params); 115122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 115222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani} 115322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 115422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::internalSetBitrateParams( 115522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani const OMX_VIDEO_PARAM_BITRATETYPE *bitrate) { 115622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (bitrate->nPortIndex != kOutputPortIndex) { 115722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorUnsupportedIndex; 115822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 115922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 116022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mBitrate = bitrate->nTargetBitrate; 116130fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar mUpdateFlag |= kUpdateBitrate; 116222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 116322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorNone; 116422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani} 116522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 116622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama AvadhaniOMX_ERRORTYPE SoftAVC::setEncodeArgs( 116722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ive_video_encode_ip_t *ps_encode_ip, 116822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ive_video_encode_op_t *ps_encode_op, 116922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani OMX_BUFFERHEADERTYPE *inputBufferHeader, 117022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani OMX_BUFFERHEADERTYPE *outputBufferHeader) { 117122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani iv_raw_buf_t *ps_inp_raw_buf; 117222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani const uint8_t *source; 117322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani UWORD8 *pu1_buf; 117422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 117522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf = &ps_encode_ip->s_inp_buf; 117622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_encode_ip->s_out_buf.pv_buf = outputBufferHeader->pBuffer; 117722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_encode_ip->s_out_buf.u4_bytes = 0; 117822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_encode_ip->s_out_buf.u4_bufsize = outputBufferHeader->nAllocLen; 117922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_encode_ip->u4_size = sizeof(ive_video_encode_ip_t); 118022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_encode_op->u4_size = sizeof(ive_video_encode_op_t); 118122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 118222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_encode_ip->e_cmd = IVE_CMD_VIDEO_ENCODE; 118322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_encode_ip->pv_bufs = NULL; 118422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_encode_ip->pv_mb_info = NULL; 118522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_encode_ip->pv_pic_info = NULL; 118622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_encode_ip->u4_mb_info_type = 0; 118722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_encode_ip->u4_pic_info_type = 0; 118822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_encode_op->s_out_buf.pv_buf = NULL; 118922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 119022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Initialize color formats */ 119122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->e_color_fmt = mIvVideoColorFormat; 119222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani source = NULL; 119315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if ((inputBufferHeader != NULL) && inputBufferHeader->nFilledLen) { 119422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani source = inputBufferHeader->pBuffer + inputBufferHeader->nOffset; 119522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 119622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (mInputDataIsMeta) { 119715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex uint8_t *conversionBuffer = NULL; 119815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex for (size_t i = 0; i < MAX_CONVERSION_BUFFERS; i++) { 119915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (mConversionBuffersFree[i]) { 120015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex mConversionBuffersFree[i] = 0; 120115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex conversionBuffer = mConversionBuffers[i]; 120215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex break; 120315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 120415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 120515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex 120615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (NULL == conversionBuffer) { 120715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex ALOGE("No free buffers to hold conversion data"); 120815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex return OMX_ErrorUndefined; 120915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 121015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex 121122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani source = extractGraphicBuffer( 121215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex conversionBuffer, (mWidth * mHeight * 3 / 2), source, 121322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani inputBufferHeader->nFilledLen, mWidth, mHeight); 121422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 121522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (source == NULL) { 121622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ALOGE("Error in extractGraphicBuffer"); 121722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); 121822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorUndefined; 121922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 122022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 122115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex ps_encode_ip->u4_is_last = 0; 122215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex ps_encode_ip->u4_timestamp_high = (inputBufferHeader->nTimeStamp) >> 32; 122315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex ps_encode_ip->u4_timestamp_low = (inputBufferHeader->nTimeStamp) & 0xFFFFFFFF; 122415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 122515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex else { 122615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (mSawInputEOS){ 122715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex ps_encode_ip->u4_is_last = 1; 122815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 122915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex memset(ps_inp_raw_buf, 0, sizeof(iv_raw_buf_t)); 123015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex ps_inp_raw_buf->e_color_fmt = mIvVideoColorFormat; 123115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex ps_inp_raw_buf->u4_size = sizeof(iv_raw_buf_t); 123215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex return OMX_ErrorNone; 123322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 123422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 123522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani pu1_buf = (UWORD8 *)source; 123622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani switch (mIvVideoColorFormat) { 123722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani case IV_YUV_420P: 123822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani { 123922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->apv_bufs[0] = pu1_buf; 124022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani pu1_buf += (mStride) * mHeight; 124122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->apv_bufs[1] = pu1_buf; 124222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani pu1_buf += (mStride / 2) * mHeight / 2; 124322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->apv_bufs[2] = pu1_buf; 124422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 124522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_wd[0] = mWidth; 124622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_wd[1] = mWidth / 2; 124722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_wd[2] = mWidth / 2; 124822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 124922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_ht[0] = mHeight; 125022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_ht[1] = mHeight / 2; 125122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_ht[2] = mHeight / 2; 125222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 125322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_strd[0] = mStride; 125422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_strd[1] = (mStride / 2); 125522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_strd[2] = (mStride / 2); 125622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani break; 125722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 125822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 125922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani case IV_YUV_422ILE: 126022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani { 126122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->apv_bufs[0] = pu1_buf; 126222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_wd[0] = mWidth * 2; 126322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_ht[0] = mHeight; 126422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_strd[0] = mStride * 2; 126522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani break; 126622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 126722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 126822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani case IV_YUV_420SP_UV: 126922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani case IV_YUV_420SP_VU: 127022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani default: 127122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani { 127222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->apv_bufs[0] = pu1_buf; 127322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani pu1_buf += (mStride) * mHeight; 127422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->apv_bufs[1] = pu1_buf; 127522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 127622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_wd[0] = mWidth; 127722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_wd[1] = mWidth; 127822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 127922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_ht[0] = mHeight; 128022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_ht[1] = mHeight / 2; 128122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 128222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_strd[0] = mStride; 128322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ps_inp_raw_buf->au4_strd[1] = mStride; 128422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani break; 128522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 128622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 128722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return OMX_ErrorNone; 128822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani} 128922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 129022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhanivoid SoftAVC::onQueueFilled(OMX_U32 portIndex) { 129122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani IV_STATUS_T status; 129222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani WORD32 timeDelay, timeTaken; 129322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 129422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani UNUSED(portIndex); 129522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 129622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani // Initialize encoder if not already initialized 129722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (mCodecCtx == NULL) { 129822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (OMX_ErrorNone != initEncoder()) { 129922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ALOGE("Failed to initialize encoder"); 130022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani notify(OMX_EventError, OMX_ErrorUndefined, 0 /* arg2 */, NULL /* data */); 130122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return; 130222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 130322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 130415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (mSignalledError) { 130522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return; 130622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 130722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 130822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani List<BufferInfo *> &inQueue = getPortQueue(0); 130922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani List<BufferInfo *> &outQueue = getPortQueue(1); 131022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 131115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex while (!mSawOutputEOS && !outQueue.empty()) { 131215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex 131322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani OMX_ERRORTYPE error; 131422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ive_video_encode_ip_t s_encode_ip; 131522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ive_video_encode_op_t s_encode_op; 131622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani BufferInfo *outputBufferInfo = *outQueue.begin(); 131722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani OMX_BUFFERHEADERTYPE *outputBufferHeader = outputBufferInfo->mHeader; 131822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 131915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex BufferInfo *inputBufferInfo; 132015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex OMX_BUFFERHEADERTYPE *inputBufferHeader; 1321cbe6ac2f281362d9dfbff867dd414d5cc2f6d21eChong Zhang 132215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (mSawInputEOS) { 132315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex inputBufferHeader = NULL; 132415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex inputBufferInfo = NULL; 132515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } else if (!inQueue.empty()) { 132615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex inputBufferInfo = *inQueue.begin(); 132715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex inputBufferHeader = inputBufferInfo->mHeader; 132815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } else { 132922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return; 133022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 133122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 133222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani outputBufferHeader->nTimeStamp = 0; 133322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani outputBufferHeader->nFlags = 0; 133422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani outputBufferHeader->nOffset = 0; 133522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani outputBufferHeader->nFilledLen = 0; 133622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani outputBufferHeader->nOffset = 0; 133722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 133815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (inputBufferHeader != NULL) { 133915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex outputBufferHeader->nFlags = inputBufferHeader->nFlags; 134015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 134115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex 134222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani uint8_t *outPtr = (uint8_t *)outputBufferHeader->pBuffer; 134322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 134422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (!mSpsPpsHeaderReceived) { 134522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani error = setEncodeArgs(&s_encode_ip, &s_encode_op, NULL, outputBufferHeader); 134622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (error != OMX_ErrorNone) { 134722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mSignalledError = true; 134822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); 134922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return; 135022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 135122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani status = ive_api_function(mCodecCtx, &s_encode_ip, &s_encode_op); 135222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 135322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (IV_SUCCESS != status) { 135422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ALOGE("Encode Frame failed = 0x%x\n", 135522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_encode_op.u4_error_code); 135622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } else { 135722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ALOGV("Bytes Generated in header %d\n", 135822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_encode_op.s_out_buf.u4_bytes); 135922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 136022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 136122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mSpsPpsHeaderReceived = true; 136222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 136322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani outputBufferHeader->nFlags = OMX_BUFFERFLAG_CODECCONFIG; 136422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani outputBufferHeader->nFilledLen = s_encode_op.s_out_buf.u4_bytes; 136515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (inputBufferHeader != NULL) { 136615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex outputBufferHeader->nTimeStamp = inputBufferHeader->nTimeStamp; 136715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 136822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 136922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani outQueue.erase(outQueue.begin()); 137022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani outputBufferInfo->mOwnedByUs = false; 137115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex 137222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani DUMP_TO_FILE( 137322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mOutFile, outputBufferHeader->pBuffer, 137422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani outputBufferHeader->nFilledLen); 137522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani notifyFillBufferDone(outputBufferHeader); 137622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 137722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani setEncMode(IVE_ENC_MODE_PICTURE); 137822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return; 137922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 138022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 138130fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar if (mUpdateFlag) { 138230fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar if (mUpdateFlag & kUpdateBitrate) { 138330fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar setBitRate(); 138430fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar } 138530fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar if (mUpdateFlag & kRequestKeyFrame) { 138630fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar setFrameType(IV_IDR_FRAME); 138730fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar } 13887c36a6bc3f3fe4fe6d1d36b92c3a203de654b012Hangyu Kuang if (mUpdateFlag & kUpdateAIRMode) { 13897c36a6bc3f3fe4fe6d1d36b92c3a203de654b012Hangyu Kuang setAirParams(); 13907c36a6bc3f3fe4fe6d1d36b92c3a203de654b012Hangyu Kuang notify(OMX_EventPortSettingsChanged, kOutputPortIndex, 13917c36a6bc3f3fe4fe6d1d36b92c3a203de654b012Hangyu Kuang OMX_IndexConfigAndroidIntraRefresh, NULL); 13927c36a6bc3f3fe4fe6d1d36b92c3a203de654b012Hangyu Kuang } 139330fecffdba48c63c2c14783d1eef08b82f422c89Harish Mahendrakar mUpdateFlag = 0; 139422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 139522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 139615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if ((inputBufferHeader != NULL) 139715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex && (inputBufferHeader->nFlags & OMX_BUFFERFLAG_EOS)) { 139822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mSawInputEOS = true; 139922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 140022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 140115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex /* In normal mode, store inputBufferInfo and this will be returned 140215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex when encoder consumes this input */ 140315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (!mInputDataIsMeta && (inputBufferInfo != NULL)) { 140415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex for (size_t i = 0; i < MAX_INPUT_BUFFER_HEADERS; i++) { 140515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (NULL == mInputBufferInfo[i]) { 140615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex mInputBufferInfo[i] = inputBufferInfo; 140715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex break; 140815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 140915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 141015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 141122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani error = setEncodeArgs( 141222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani &s_encode_ip, &s_encode_op, inputBufferHeader, outputBufferHeader); 141315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex 141422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (error != OMX_ErrorNone) { 141522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mSignalledError = true; 141622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); 141722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return; 141822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 141922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 142022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani DUMP_TO_FILE( 142122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mInFile, s_encode_ip.s_inp_buf.apv_bufs[0], 142222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani (mHeight * mStride * 3 / 2)); 142322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 142422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani GETTIME(&mTimeStart, NULL); 142522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Compute time elapsed between end of previous decode() 142622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani * to start of current decode() */ 142722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani TIME_DIFF(mTimeEnd, mTimeStart, timeDelay); 142822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani status = ive_api_function(mCodecCtx, &s_encode_ip, &s_encode_op); 142922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 143022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani if (IV_SUCCESS != status) { 143122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ALOGE("Encode Frame failed = 0x%x\n", 143222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_encode_op.u4_error_code); 143322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani mSignalledError = true; 143422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); 143522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return; 143622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 143722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 143822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani GETTIME(&mTimeEnd, NULL); 143922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani /* Compute time taken for decode() */ 144022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani TIME_DIFF(mTimeStart, mTimeEnd, timeTaken); 144122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 144222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani ALOGV("timeTaken=%6d delay=%6d numBytes=%6d", timeTaken, timeDelay, 144322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani s_encode_op.s_out_buf.u4_bytes); 144422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 144515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex /* In encoder frees up an input buffer, mark it as free */ 144615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (s_encode_op.s_inp_buf.apv_bufs[0] != NULL) { 144715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (mInputDataIsMeta) { 144815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex for (size_t i = 0; i < MAX_CONVERSION_BUFFERS; i++) { 144915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (mConversionBuffers[i] == s_encode_op.s_inp_buf.apv_bufs[0]) { 145015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex mConversionBuffersFree[i] = 1; 145115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex break; 145215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 145315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 145415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } else { 145515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex /* In normal mode, call EBD on inBuffeHeader that is freed by the codec */ 145615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex for (size_t i = 0; i < MAX_INPUT_BUFFER_HEADERS; i++) { 145715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex uint8_t *buf = NULL; 145815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex OMX_BUFFERHEADERTYPE *bufHdr = NULL; 145915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (mInputBufferInfo[i] != NULL) { 146015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex bufHdr = mInputBufferInfo[i]->mHeader; 146115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex buf = bufHdr->pBuffer + bufHdr->nOffset; 146215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 146315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (s_encode_op.s_inp_buf.apv_bufs[0] == buf) { 146415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex mInputBufferInfo[i]->mOwnedByUs = false; 146515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex notifyEmptyBufferDone(bufHdr); 146615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex mInputBufferInfo[i] = NULL; 146715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex break; 146815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 146915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 147015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 147115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 147222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 147322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani outputBufferHeader->nFilledLen = s_encode_op.s_out_buf.u4_bytes; 147422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 147515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (IV_IDR_FRAME == s_encode_op.u4_encoded_frame_type) { 147622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani outputBufferHeader->nFlags |= OMX_BUFFERFLAG_SYNCFRAME; 147722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 147822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 147915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (inputBufferHeader != NULL) { 148015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex inQueue.erase(inQueue.begin()); 148122b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 148215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex /* If in meta data, call EBD on input */ 148315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex /* In case of normal mode, EBD will be done once encoder 148415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex releases the input buffer */ 148515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (mInputDataIsMeta) { 148615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex inputBufferInfo->mOwnedByUs = false; 148715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex notifyEmptyBufferDone(inputBufferHeader); 148815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 148915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 149022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 149115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (s_encode_op.u4_is_last) { 149222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani outputBufferHeader->nFlags |= OMX_BUFFERFLAG_EOS; 149315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex mSawOutputEOS = true; 149415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } else { 149515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex outputBufferHeader->nFlags &= ~OMX_BUFFERFLAG_EOS; 149622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 149722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 149815a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (outputBufferHeader->nFilledLen || s_encode_op.u4_is_last) { 149915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex outputBufferHeader->nTimeStamp = s_encode_op.u4_timestamp_high; 150015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex outputBufferHeader->nTimeStamp <<= 32; 150115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex outputBufferHeader->nTimeStamp |= s_encode_op.u4_timestamp_low; 150215a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex outputBufferInfo->mOwnedByUs = false; 150315a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex outQueue.erase(outQueue.begin()); 150415a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex DUMP_TO_FILE(mOutFile, outputBufferHeader->pBuffer, 150515a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex outputBufferHeader->nFilledLen); 150615a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex notifyFillBufferDone(outputBufferHeader); 150715a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 150822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 150915a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex if (s_encode_op.u4_is_last == 1) { 151015a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex return; 151115a2cb0082d7c0a004c2fdc563c153f4781437d2Doney Alex } 151222b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani } 151322b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return; 151422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani} 151522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 1516c7c9271740c29c02e7926265ed53a44b8113dbfbRay Essickvoid SoftAVC::onReset() { 1517c7c9271740c29c02e7926265ed53a44b8113dbfbRay Essick SoftVideoEncoderOMXComponent::onReset(); 1518c7c9271740c29c02e7926265ed53a44b8113dbfbRay Essick 1519c7c9271740c29c02e7926265ed53a44b8113dbfbRay Essick if (releaseEncoder() != OMX_ErrorNone) { 1520c7c9271740c29c02e7926265ed53a44b8113dbfbRay Essick ALOGW("releaseEncoder failed"); 1521c7c9271740c29c02e7926265ed53a44b8113dbfbRay Essick } 1522c7c9271740c29c02e7926265ed53a44b8113dbfbRay Essick} 1523c7c9271740c29c02e7926265ed53a44b8113dbfbRay Essick 152422b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani} // namespace android 152522b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani 152622b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhaniandroid::SoftOMXComponent *createSoftOMXComponent( 152722b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani const char *name, const OMX_CALLBACKTYPE *callbacks, 152822b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani OMX_PTR appData, OMX_COMPONENTTYPE **component) { 152922b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani return new android::SoftAVC(name, callbacks, appData, component); 153022b3b44ae459974794403ed0f76d95ae43d92985Venkatarama Avadhani} 1531