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