1033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim/* 2033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * Copyright 2018 The Android Open Source Project 3033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * 4033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * Licensed under the Apache License, Version 2.0 (the "License"); 5033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * you may not use this file except in compliance with the License. 6033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * You may obtain a copy of the License at 7033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * 8033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * http://www.apache.org/licenses/LICENSE-2.0 9033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * 10033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * Unless required by applicable law or agreed to in writing, software 11033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * distributed under the License is distributed on an "AS IS" BASIS, 12033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * See the License for the specific language governing permissions and 14033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * limitations under the License. 15033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim */ 16033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 17d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar//#define LOG_NDEBUG 0 18033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define LOG_TAG "C2SoftAvcEnc" 19d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include <log/log.h> 20033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <utils/misc.h> 21033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 225d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar#include <media/hardware/VideoAPI.h> 23033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <media/stagefright/MediaDefs.h> 24033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <media/stagefright/MediaErrors.h> 25033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <media/stagefright/MetaData.h> 265d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar#include <media/stagefright/foundation/AUtils.h> 279fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 28d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include <C2Debug.h> 29033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <C2PlatformSupport.h> 305d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar#include <Codec2BufferUtils.h> 3172dc0b6eea5a305d58537dcd2ee28e23c72b6e44Lajos Molnar#include <SimpleC2Interface.h> 329fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim#include <util/C2InterfaceHelper.h> 33033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 34d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include "C2SoftAvcEnc.h" 35033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include "ih264e.h" 36033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include "ih264e_error.h" 37033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 38033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimnamespace android { 39033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 409fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kimclass C2SoftAvcEnc::IntfImpl : public C2InterfaceHelper { 419fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kimpublic: 429fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper) 439fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim : C2InterfaceHelper(helper) { 449fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 459fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim setDerivedInstance(this); 469fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 479fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim addParameter( 489fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING) 499fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatVideo)) 509fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .build()); 519fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 529fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim addParameter( 539fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING) 549fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatCompressed)) 559fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .build()); 569fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 579fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim addParameter( 589fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING) 599fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .withConstValue(AllocSharedString<C2PortMimeConfig::input>( 609fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim MEDIA_MIMETYPE_VIDEO_RAW)) 619fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .build()); 629fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 639fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim addParameter( 64e15da79378e753bbd20f1c0f5c6858cc89bd4141Wonsik Kim DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING) 659fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .withConstValue(AllocSharedString<C2PortMimeConfig::output>( 669fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim MEDIA_MIMETYPE_VIDEO_AVC)) 679fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .build()); 689fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 699fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim addParameter( 70e15da79378e753bbd20f1c0f5c6858cc89bd4141Wonsik Kim DefineParam(mUsage, C2_NAME_INPUT_STREAM_USAGE_SETTING) 719fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .withConstValue(new C2StreamUsageTuning::input( 729fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 0u, (uint64_t)C2MemoryUsage::CPU_READ)) 739fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .build()); 749fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 759fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim addParameter( 769fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim DefineParam(mSize, C2_NAME_STREAM_VIDEO_SIZE_SETTING) 779fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .withDefault(new C2VideoSizeStreamTuning::input(0u, 320, 240)) 789fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .withFields({ 798f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim C2F(mSize, width).inRange(2, 2560, 2), 808f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim C2F(mSize, height).inRange(2, 2560, 2), 819fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim }) 829fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .withSetter(SizeSetter) 839fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .build()); 849fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 859fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim addParameter( 869fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim DefineParam(mFrameRate, C2_NAME_STREAM_FRAME_RATE_SETTING) 879fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .withDefault(new C2StreamFrameRateInfo::output(0u, 30.)) 889fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim // TODO: More restriction? 899fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .withFields({C2F(mFrameRate, value).greaterThan(0.)}) 909fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .withSetter(Setter<decltype(*mFrameRate)>::StrictValueWithNoDeps) 919fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .build()); 929fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 939fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim addParameter( 949fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING) 959fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .withDefault(new C2BitrateTuning::output(0u, 64000)) 969fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .withFields({C2F(mBitrate, value).inRange(1, 12000000)}) 979fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps) 989fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim .build()); 999fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim } 1009fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 1019fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim static C2R SizeSetter(bool mayBlock, C2P<C2VideoSizeStreamTuning::input> &me) { 1029fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim (void)mayBlock; 1039fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim // TODO: maybe apply block limit? 1048f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim C2R res = C2R::Ok(); 1058f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim if (!me.F(me.v.width).supportsAtAll(me.v.width)) { 1068f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.width))); 1078f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim } 1088f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim if (!me.F(me.v.height).supportsAtAll(me.v.height)) { 1098f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.height))); 1108f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim } 1118f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim return res; 1129fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim } 1139fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 1149fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim uint32_t getWidth() const { return mSize->width; } 1159fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim uint32_t getHeight() const { return mSize->height; } 1169fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim float getFrameRate() const { return mFrameRate->value; } 1179fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim uint32_t getBitrate() const { return mBitrate->value; } 1189fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 1199fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kimprivate: 1209fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim std::shared_ptr<C2StreamFormatConfig::input> mInputFormat; 1219fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat; 1229fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim std::shared_ptr<C2PortMimeConfig::input> mInputMediaType; 1239fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType; 1249fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim std::shared_ptr<C2StreamUsageTuning::input> mUsage; 1259fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim std::shared_ptr<C2VideoSizeStreamTuning::input> mSize; 1269fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim std::shared_ptr<C2StreamFrameRateInfo::output> mFrameRate; 1279fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim std::shared_ptr<C2BitrateTuning::output> mBitrate; 1289fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim}; 1299fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 130033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ive_api_function ih264e_api_function 131033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1325c2c3d46fc95a4e08dbd7a7a3304e389d85faa86Lajos Molnarconstexpr char COMPONENT_NAME[] = "c2.android.avc.encoder"; 133033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 134033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimnamespace { 135033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 136033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim// From external/libavc/encoder/ih264e_bitstream.h 137033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimconstexpr uint32_t MIN_STREAM_SIZE = 0x800; 138033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 139033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimstatic size_t GetCPUCoreCount() { 140033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim long cpuCoreCount = 1; 141033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#if defined(_SC_NPROCESSORS_ONLN) 142033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN); 143033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#else 144033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // _SC_NPROC_ONLN must be defined... 145033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim cpuCoreCount = sysconf(_SC_NPROC_ONLN); 146033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#endif 147033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim CHECK(cpuCoreCount >= 1); 148033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGV("Number of CPU cores: %ld", cpuCoreCount); 149033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return (size_t)cpuCoreCount; 150033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 151033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 152033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} // namespace 153033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1549fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik KimC2SoftAvcEnc::C2SoftAvcEnc( 1559fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim const char *name, c2_node_id_t id, const std::shared_ptr<IntfImpl> &intfImpl) 1569fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)), 1579fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim mIntf(intfImpl), 158033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mUpdateFlag(0), 159033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mIvVideoColorFormat(IV_YUV_420P), 160033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mAVCEncProfile(IV_PROFILE_BASE), 161033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mAVCEncLevel(41), 162033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mStarted(false), 163033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSawInputEOS(false), 164033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSawOutputEOS(false), 165033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSignalledError(false), 166033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mCodecCtx(NULL), 167033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // TODO: output buffer size 168033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mOutBufferSize(524288) { 169033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 170033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // If dump is enabled, then open create an empty file 171033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim GENERATE_FILE_NAMES(); 172033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim CREATE_DUMP_FILE(mInFile); 173033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim CREATE_DUMP_FILE(mOutFile); 174033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 175033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim initEncParams(); 176033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 177033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 178033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik KimC2SoftAvcEnc::~C2SoftAvcEnc() { 179033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim releaseEncoder(); 180033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 181033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 182033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::onInit() { 183033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 184033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 185033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 186033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::onStop() { 187033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 188033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 189033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 190033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimvoid C2SoftAvcEnc::onReset() { 191033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // TODO: use IVE_CMD_CTL_RESET? 192033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim releaseEncoder(); 193033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim initEncParams(); 194033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 195033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 196033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimvoid C2SoftAvcEnc::onRelease() { 197033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim releaseEncoder(); 198033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 199033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 200033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::onFlush_sm() { 201033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // TODO: use IVE_CMD_CTL_FLUSH? 202033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 203033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 204033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 205033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimvoid C2SoftAvcEnc::initEncParams() { 206033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mCodecCtx = NULL; 207033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mMemRecords = NULL; 208033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mNumMemRecords = DEFAULT_MEM_REC_CNT; 209033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mHeaderGenerated = 0; 210033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mNumCores = GetCPUCoreCount(); 211033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mArch = DEFAULT_ARCH; 212033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSliceMode = DEFAULT_SLICE_MODE; 213033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSliceParam = DEFAULT_SLICE_PARAM; 214033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mHalfPelEnable = DEFAULT_HPEL; 215033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mIInterval = DEFAULT_I_INTERVAL; 216033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mIDRInterval = DEFAULT_IDR_INTERVAL; 217033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mDisableDeblkLevel = DEFAULT_DISABLE_DEBLK_LEVEL; 218033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mEnableFastSad = DEFAULT_ENABLE_FAST_SAD; 219033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mEnableAltRef = DEFAULT_ENABLE_ALT_REF; 220033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mEncSpeed = DEFAULT_ENC_SPEED; 221033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mIntra4x4 = DEFAULT_INTRA4x4; 222033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mConstrainedIntraFlag = DEFAULT_CONSTRAINED_INTRA; 223033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mAIRMode = DEFAULT_AIR; 224033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mAIRRefreshPeriod = DEFAULT_AIR_REFRESH_PERIOD; 225033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mPSNREnable = DEFAULT_PSNR_ENABLE; 226033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mReconEnable = DEFAULT_RECON_ENABLE; 227033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mEntropyMode = DEFAULT_ENTROPY_MODE; 228033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mBframes = DEFAULT_B_FRAMES; 229033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 230033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim gettimeofday(&mTimeStart, NULL); 231033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim gettimeofday(&mTimeEnd, NULL); 232033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 233033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 234033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setDimensions() { 235033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_dimensions_ip_t s_dimensions_ip; 236033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_dimensions_op_t s_dimensions_op; 237033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 238033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 239033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_dimensions_ip.e_cmd = IVE_CMD_VIDEO_CTL; 240033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_dimensions_ip.e_sub_cmd = IVE_CMD_CTL_SET_DIMENSIONS; 2419fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim s_dimensions_ip.u4_ht = mIntf->getHeight(); 2429fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim s_dimensions_ip.u4_wd = mIntf->getWidth(); 243033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 244033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_dimensions_ip.u4_timestamp_high = -1; 245033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_dimensions_ip.u4_timestamp_low = -1; 246033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 247033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_dimensions_ip.u4_size = sizeof(ive_ctl_set_dimensions_ip_t); 248033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_dimensions_op.u4_size = sizeof(ive_ctl_set_dimensions_op_t); 249033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 250033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_dimensions_ip, &s_dimensions_op); 251033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 252033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to set frame dimensions = 0x%x\n", 253033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_dimensions_op.u4_error_code); 254033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 255033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 256033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 257033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 258033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 259033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setNumCores() { 260033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 261033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_num_cores_ip_t s_num_cores_ip; 262033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_num_cores_op_t s_num_cores_op; 263033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_num_cores_ip.e_cmd = IVE_CMD_VIDEO_CTL; 264033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_num_cores_ip.e_sub_cmd = IVE_CMD_CTL_SET_NUM_CORES; 265033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_num_cores_ip.u4_num_cores = MIN(mNumCores, CODEC_MAX_CORES); 266033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_num_cores_ip.u4_timestamp_high = -1; 267033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_num_cores_ip.u4_timestamp_low = -1; 268033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_num_cores_ip.u4_size = sizeof(ive_ctl_set_num_cores_ip_t); 269033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 270033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_num_cores_op.u4_size = sizeof(ive_ctl_set_num_cores_op_t); 271033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 272033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function( 273033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mCodecCtx, (void *) &s_num_cores_ip, (void *) &s_num_cores_op); 274033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 275033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to set processor params = 0x%x\n", 276033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_num_cores_op.u4_error_code); 277033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 278033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 279033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 280033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 281033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 282033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setFrameRate() { 283033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_frame_rate_ip_t s_frame_rate_ip; 284033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_frame_rate_op_t s_frame_rate_op; 285033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 286033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 287033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_rate_ip.e_cmd = IVE_CMD_VIDEO_CTL; 288033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_rate_ip.e_sub_cmd = IVE_CMD_CTL_SET_FRAMERATE; 289033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 2909fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim s_frame_rate_ip.u4_src_frame_rate = mIntf->getFrameRate(); 2919fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim s_frame_rate_ip.u4_tgt_frame_rate = mIntf->getFrameRate(); 292033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 293033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_rate_ip.u4_timestamp_high = -1; 294033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_rate_ip.u4_timestamp_low = -1; 295033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 296033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_rate_ip.u4_size = sizeof(ive_ctl_set_frame_rate_ip_t); 297033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_rate_op.u4_size = sizeof(ive_ctl_set_frame_rate_op_t); 298033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 299033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_frame_rate_ip, &s_frame_rate_op); 300033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 301033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to set frame rate = 0x%x\n", 302033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_rate_op.u4_error_code); 303033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 304033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 305033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 306033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 307033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 308033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setIpeParams() { 309033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_ipe_params_ip_t s_ipe_params_ip; 310033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_ipe_params_op_t s_ipe_params_op; 311033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 312033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 313033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ipe_params_ip.e_cmd = IVE_CMD_VIDEO_CTL; 314033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ipe_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_IPE_PARAMS; 315033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 316033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ipe_params_ip.u4_enable_intra_4x4 = mIntra4x4; 317033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ipe_params_ip.u4_enc_speed_preset = mEncSpeed; 318033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ipe_params_ip.u4_constrained_intra_pred = mConstrainedIntraFlag; 319033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 320033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ipe_params_ip.u4_timestamp_high = -1; 321033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ipe_params_ip.u4_timestamp_low = -1; 322033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 323033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ipe_params_ip.u4_size = sizeof(ive_ctl_set_ipe_params_ip_t); 324033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ipe_params_op.u4_size = sizeof(ive_ctl_set_ipe_params_op_t); 325033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 326033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_ipe_params_ip, &s_ipe_params_op); 327033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 328033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to set ipe params = 0x%x\n", 329033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ipe_params_op.u4_error_code); 330033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 331033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 332033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 333033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 334033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 335033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setBitRate() { 336033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_bitrate_ip_t s_bitrate_ip; 337033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_bitrate_op_t s_bitrate_op; 338033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 339033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 340033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_bitrate_ip.e_cmd = IVE_CMD_VIDEO_CTL; 341033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_bitrate_ip.e_sub_cmd = IVE_CMD_CTL_SET_BITRATE; 342033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 3439fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim s_bitrate_ip.u4_target_bitrate = mIntf->getBitrate(); 344033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 345033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_bitrate_ip.u4_timestamp_high = -1; 346033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_bitrate_ip.u4_timestamp_low = -1; 347033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 348033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_bitrate_ip.u4_size = sizeof(ive_ctl_set_bitrate_ip_t); 349033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_bitrate_op.u4_size = sizeof(ive_ctl_set_bitrate_op_t); 350033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 351033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_bitrate_ip, &s_bitrate_op); 352033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 353033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to set bit rate = 0x%x\n", s_bitrate_op.u4_error_code); 354033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 355033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 356033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 357033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 358033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 359033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setFrameType(IV_PICTURE_CODING_TYPE_T e_frame_type) { 360033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_frame_type_ip_t s_frame_type_ip; 361033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_frame_type_op_t s_frame_type_op; 362033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 363033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_type_ip.e_cmd = IVE_CMD_VIDEO_CTL; 364033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_type_ip.e_sub_cmd = IVE_CMD_CTL_SET_FRAMETYPE; 365033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 366033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_type_ip.e_frame_type = e_frame_type; 367033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 368033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_type_ip.u4_timestamp_high = -1; 369033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_type_ip.u4_timestamp_low = -1; 370033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 371033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_type_ip.u4_size = sizeof(ive_ctl_set_frame_type_ip_t); 372033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_type_op.u4_size = sizeof(ive_ctl_set_frame_type_op_t); 373033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 374033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_frame_type_ip, &s_frame_type_op); 375033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 376033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to set frame type = 0x%x\n", 377033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_frame_type_op.u4_error_code); 378033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 379033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 380033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 381033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 382033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 383033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setQp() { 384033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_qp_ip_t s_qp_ip; 385033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_qp_op_t s_qp_op; 386033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 387033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 388033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_ip.e_cmd = IVE_CMD_VIDEO_CTL; 389033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_ip.e_sub_cmd = IVE_CMD_CTL_SET_QP; 390033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 391033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_ip.u4_i_qp = DEFAULT_I_QP; 392033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_ip.u4_i_qp_max = DEFAULT_QP_MAX; 393033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_ip.u4_i_qp_min = DEFAULT_QP_MIN; 394033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 395033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_ip.u4_p_qp = DEFAULT_P_QP; 396033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_ip.u4_p_qp_max = DEFAULT_QP_MAX; 397033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_ip.u4_p_qp_min = DEFAULT_QP_MIN; 398033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 399033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_ip.u4_b_qp = DEFAULT_P_QP; 400033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_ip.u4_b_qp_max = DEFAULT_QP_MAX; 401033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_ip.u4_b_qp_min = DEFAULT_QP_MIN; 402033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 403033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_ip.u4_timestamp_high = -1; 404033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_ip.u4_timestamp_low = -1; 405033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 406033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_ip.u4_size = sizeof(ive_ctl_set_qp_ip_t); 407033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_qp_op.u4_size = sizeof(ive_ctl_set_qp_op_t); 408033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 409033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_qp_ip, &s_qp_op); 410033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 411033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to set qp 0x%x\n", s_qp_op.u4_error_code); 412033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 413033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 414033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 415033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 416033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 417033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setEncMode(IVE_ENC_MODE_T e_enc_mode) { 418033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 419033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_enc_mode_ip_t s_enc_mode_ip; 420033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_enc_mode_op_t s_enc_mode_op; 421033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 422033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_enc_mode_ip.e_cmd = IVE_CMD_VIDEO_CTL; 423033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_enc_mode_ip.e_sub_cmd = IVE_CMD_CTL_SET_ENC_MODE; 424033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 425033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_enc_mode_ip.e_enc_mode = e_enc_mode; 426033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 427033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_enc_mode_ip.u4_timestamp_high = -1; 428033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_enc_mode_ip.u4_timestamp_low = -1; 429033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 430033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_enc_mode_ip.u4_size = sizeof(ive_ctl_set_enc_mode_ip_t); 431033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_enc_mode_op.u4_size = sizeof(ive_ctl_set_enc_mode_op_t); 432033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 433033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_enc_mode_ip, &s_enc_mode_op); 434033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 435033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to set in header encode mode = 0x%x\n", 436033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_enc_mode_op.u4_error_code); 437033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 438033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 439033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 440033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 441033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 442033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setVbvParams() { 443033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_vbv_params_ip_t s_vbv_ip; 444033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_vbv_params_op_t s_vbv_op; 445033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 446033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 447033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_vbv_ip.e_cmd = IVE_CMD_VIDEO_CTL; 448033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_vbv_ip.e_sub_cmd = IVE_CMD_CTL_SET_VBV_PARAMS; 449033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 450033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_vbv_ip.u4_vbv_buf_size = 0; 451033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_vbv_ip.u4_vbv_buffer_delay = 1000; 452033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 453033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_vbv_ip.u4_timestamp_high = -1; 454033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_vbv_ip.u4_timestamp_low = -1; 455033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 456033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_vbv_ip.u4_size = sizeof(ive_ctl_set_vbv_params_ip_t); 457033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_vbv_op.u4_size = sizeof(ive_ctl_set_vbv_params_op_t); 458033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 459033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_vbv_ip, &s_vbv_op); 460033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 461033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to set VBV params = 0x%x\n", s_vbv_op.u4_error_code); 462033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 463033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 464033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 465033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 466033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 467033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setAirParams() { 468033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_air_params_ip_t s_air_ip; 469033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_air_params_op_t s_air_op; 470033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 471033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 472033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_air_ip.e_cmd = IVE_CMD_VIDEO_CTL; 473033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_air_ip.e_sub_cmd = IVE_CMD_CTL_SET_AIR_PARAMS; 474033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 475033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_air_ip.e_air_mode = mAIRMode; 476033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_air_ip.u4_air_refresh_period = mAIRRefreshPeriod; 477033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 478033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_air_ip.u4_timestamp_high = -1; 479033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_air_ip.u4_timestamp_low = -1; 480033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 481033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_air_ip.u4_size = sizeof(ive_ctl_set_air_params_ip_t); 482033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_air_op.u4_size = sizeof(ive_ctl_set_air_params_op_t); 483033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 484033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_air_ip, &s_air_op); 485033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 486033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to set air params = 0x%x\n", s_air_op.u4_error_code); 487033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 488033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 489033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 490033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 491033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 492033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setMeParams() { 493033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 494033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_me_params_ip_t s_me_params_ip; 495033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_me_params_op_t s_me_params_op; 496033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 497033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_me_params_ip.e_cmd = IVE_CMD_VIDEO_CTL; 498033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_me_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_ME_PARAMS; 499033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 500033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_me_params_ip.u4_enable_fast_sad = mEnableFastSad; 501033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_me_params_ip.u4_enable_alt_ref = mEnableAltRef; 502033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 503033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_me_params_ip.u4_enable_hpel = mHalfPelEnable; 504033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_me_params_ip.u4_enable_qpel = DEFAULT_QPEL; 505033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_me_params_ip.u4_me_speed_preset = DEFAULT_ME_SPEED; 506033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_me_params_ip.u4_srch_rng_x = DEFAULT_SRCH_RNG_X; 507033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_me_params_ip.u4_srch_rng_y = DEFAULT_SRCH_RNG_Y; 508033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 509033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_me_params_ip.u4_timestamp_high = -1; 510033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_me_params_ip.u4_timestamp_low = -1; 511033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 512033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_me_params_ip.u4_size = sizeof(ive_ctl_set_me_params_ip_t); 513033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_me_params_op.u4_size = sizeof(ive_ctl_set_me_params_op_t); 514033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 515033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_me_params_ip, &s_me_params_op); 516033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 517033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to set me params = 0x%x\n", s_me_params_op.u4_error_code); 518033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 519033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 520033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 521033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 522033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 523033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setGopParams() { 524033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 525033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_gop_params_ip_t s_gop_params_ip; 526033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_gop_params_op_t s_gop_params_op; 527033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 528033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_gop_params_ip.e_cmd = IVE_CMD_VIDEO_CTL; 529033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_gop_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_GOP_PARAMS; 530033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 531033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_gop_params_ip.u4_i_frm_interval = mIInterval; 532033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_gop_params_ip.u4_idr_frm_interval = mIDRInterval; 533033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 534033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_gop_params_ip.u4_timestamp_high = -1; 535033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_gop_params_ip.u4_timestamp_low = -1; 536033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 537033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_gop_params_ip.u4_size = sizeof(ive_ctl_set_gop_params_ip_t); 538033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_gop_params_op.u4_size = sizeof(ive_ctl_set_gop_params_op_t); 539033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 540033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_gop_params_ip, &s_gop_params_op); 541033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 542033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to set GOP params = 0x%x\n", 543033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_gop_params_op.u4_error_code); 544033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 545033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 546033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 547033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 548033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 549033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setProfileParams() { 550033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 551033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_profile_params_ip_t s_profile_params_ip; 552033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_profile_params_op_t s_profile_params_op; 553033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 554033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_profile_params_ip.e_cmd = IVE_CMD_VIDEO_CTL; 555033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_profile_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_PROFILE_PARAMS; 556033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 557033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_profile_params_ip.e_profile = DEFAULT_EPROFILE; 558033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_profile_params_ip.u4_entropy_coding_mode = mEntropyMode; 559033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_profile_params_ip.u4_timestamp_high = -1; 560033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_profile_params_ip.u4_timestamp_low = -1; 561033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 562033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_profile_params_ip.u4_size = sizeof(ive_ctl_set_profile_params_ip_t); 563033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_profile_params_op.u4_size = sizeof(ive_ctl_set_profile_params_op_t); 564033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 565033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_profile_params_ip, &s_profile_params_op); 566033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 567033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to set profile params = 0x%x\n", 568033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_profile_params_op.u4_error_code); 569033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 570033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 571033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 572033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 573033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 574033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setDeblockParams() { 575033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 576033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_deblock_params_ip_t s_deblock_params_ip; 577033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_set_deblock_params_op_t s_deblock_params_op; 578033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 579033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_deblock_params_ip.e_cmd = IVE_CMD_VIDEO_CTL; 580033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_deblock_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_DEBLOCK_PARAMS; 581033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 582033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_deblock_params_ip.u4_disable_deblock_level = mDisableDeblkLevel; 583033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 584033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_deblock_params_ip.u4_timestamp_high = -1; 585033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_deblock_params_ip.u4_timestamp_low = -1; 586033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 587033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_deblock_params_ip.u4_size = sizeof(ive_ctl_set_deblock_params_ip_t); 588033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_deblock_params_op.u4_size = sizeof(ive_ctl_set_deblock_params_op_t); 589033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 590033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_deblock_params_ip, &s_deblock_params_op); 591033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 592033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to enable/disable deblock params = 0x%x\n", 593033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_deblock_params_op.u4_error_code); 594033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 595033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 596033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 597033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 598033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 599033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimvoid C2SoftAvcEnc::logVersion() { 600033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_getversioninfo_ip_t s_ctl_ip; 601033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_ctl_getversioninfo_op_t s_ctl_op; 602033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim UWORD8 au1_buf[512]; 603033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 604033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 605033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ctl_ip.e_cmd = IVE_CMD_VIDEO_CTL; 606033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ctl_ip.e_sub_cmd = IVE_CMD_CTL_GETVERSION; 607033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ctl_ip.u4_size = sizeof(ive_ctl_getversioninfo_ip_t); 608033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ctl_op.u4_size = sizeof(ive_ctl_getversioninfo_op_t); 609033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ctl_ip.pu1_version = au1_buf; 610033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_ctl_ip.u4_version_bufsize = sizeof(au1_buf); 611033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 612033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, (void *) &s_ctl_ip, (void *) &s_ctl_op); 613033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 614033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 615033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Error in getting version: 0x%x", s_ctl_op.u4_error_code); 616033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } else { 617033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGV("Ittiam encoder version: %s", (char *)s_ctl_ip.pu1_version); 618033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 619033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return; 620033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 621033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 622033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::initEncoder() { 623033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 624033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim WORD32 level; 625033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim uint32_t displaySizeY; 626033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 627033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim CHECK(!mStarted); 628033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 629033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim c2_status_t errType = C2_OK; 630033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 6319fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim uint32_t width = mIntf->getWidth(); 6329fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim uint32_t height = mIntf->getHeight(); 6339fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim displaySizeY = width * height; 634033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (displaySizeY > (1920 * 1088)) { 635033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim level = 50; 636033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } else if (displaySizeY > (1280 * 720)) { 637033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim level = 40; 638033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } else if (displaySizeY > (720 * 576)) { 639033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim level = 31; 640033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } else if (displaySizeY > (624 * 320)) { 641033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim level = 30; 642033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } else if (displaySizeY > (352 * 288)) { 643033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim level = 21; 644033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } else if (displaySizeY > (176 * 144)) { 645033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim level = 20; 646033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } else { 647033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim level = 10; 648033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 649033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mAVCEncLevel = MAX(level, mAVCEncLevel); 650033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 6519fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim mStride = width; 652033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 653033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // TODO 654033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mIvVideoColorFormat = IV_YUV_420P; 655033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 6569fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim ALOGD("Params width %d height %d level %d colorFormat %d", width, 6579fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim height, mAVCEncLevel, mIvVideoColorFormat); 658033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 659033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Getting Number of MemRecords */ 660033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim { 661033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim iv_num_mem_rec_ip_t s_num_mem_rec_ip; 662033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim iv_num_mem_rec_op_t s_num_mem_rec_op; 663033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 664033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_num_mem_rec_ip.u4_size = sizeof(iv_num_mem_rec_ip_t); 665033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_num_mem_rec_op.u4_size = sizeof(iv_num_mem_rec_op_t); 666033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 667033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_num_mem_rec_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC; 668033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 669033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(0, &s_num_mem_rec_ip, &s_num_mem_rec_op); 670033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 671033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 672033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Get number of memory records failed = 0x%x\n", 673033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_num_mem_rec_op.u4_error_code); 674033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 675033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 676033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 677033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mNumMemRecords = s_num_mem_rec_op.u4_num_mem_rec; 678033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 679033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 680033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Allocate array to hold memory records */ 681033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mNumMemRecords > SIZE_MAX / sizeof(iv_mem_rec_t)) { 682033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("requested memory size is too big."); 683033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 684033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 685033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mMemRecords = (iv_mem_rec_t *)malloc(mNumMemRecords * sizeof(iv_mem_rec_t)); 686033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (NULL == mMemRecords) { 687033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to allocate memory for hold memory records: Size %zu", 688033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mNumMemRecords * sizeof(iv_mem_rec_t)); 689033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSignalledError = true; 690033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 691033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 692033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 693033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim { 694033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim iv_mem_rec_t *ps_mem_rec; 695033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_mem_rec = mMemRecords; 696033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim for (size_t i = 0; i < mNumMemRecords; i++) { 697033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_mem_rec->u4_size = sizeof(iv_mem_rec_t); 698033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_mem_rec->pv_base = NULL; 699033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_mem_rec->u4_mem_size = 0; 700033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_mem_rec->u4_mem_alignment = 0; 701033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_mem_rec->e_mem_type = IV_NA_MEM_TYPE; 702033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 703033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_mem_rec++; 704033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 705033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 706033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 707033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Getting MemRecords Attributes */ 708033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim { 709033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim iv_fill_mem_rec_ip_t s_fill_mem_rec_ip; 710033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim iv_fill_mem_rec_op_t s_fill_mem_rec_op; 711033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 712033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_fill_mem_rec_ip.u4_size = sizeof(iv_fill_mem_rec_ip_t); 713033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_fill_mem_rec_op.u4_size = sizeof(iv_fill_mem_rec_op_t); 714033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 715033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_fill_mem_rec_ip.e_cmd = IV_CMD_FILL_NUM_MEM_REC; 716033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_fill_mem_rec_ip.ps_mem_rec = mMemRecords; 717033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_fill_mem_rec_ip.u4_num_mem_rec = mNumMemRecords; 7189fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim s_fill_mem_rec_ip.u4_max_wd = width; 7199fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim s_fill_mem_rec_ip.u4_max_ht = height; 720033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_fill_mem_rec_ip.u4_max_level = mAVCEncLevel; 721033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_fill_mem_rec_ip.e_color_format = DEFAULT_INP_COLOR_FORMAT; 722033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_fill_mem_rec_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM; 723033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_fill_mem_rec_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM; 724033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_fill_mem_rec_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X; 725033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_fill_mem_rec_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y; 726033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 727033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(0, &s_fill_mem_rec_ip, &s_fill_mem_rec_op); 728033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 729033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 730033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Fill memory records failed = 0x%x\n", 731033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_fill_mem_rec_op.u4_error_code); 732033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 733033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 734033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 735033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 736033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Allocating Memory for Mem Records */ 737033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim { 738033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim WORD32 total_size; 739033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim iv_mem_rec_t *ps_mem_rec; 740033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim total_size = 0; 741033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_mem_rec = mMemRecords; 742033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 743033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim for (size_t i = 0; i < mNumMemRecords; i++) { 744033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_mem_rec->pv_base = ive_aligned_malloc( 745033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_mem_rec->u4_mem_alignment, ps_mem_rec->u4_mem_size); 746033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (ps_mem_rec->pv_base == NULL) { 747033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Allocation failure for mem record id %zu size %u\n", i, 748033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_mem_rec->u4_mem_size); 749033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 750033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 751033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 752033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim total_size += ps_mem_rec->u4_mem_size; 753033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 754033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_mem_rec++; 755033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 756033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 757033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 758033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Codec Instance Creation */ 759033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim { 760033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_init_ip_t s_init_ip; 761033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_init_op_t s_init_op; 762033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 763033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mCodecCtx = (iv_obj_t *)mMemRecords[0].pv_base; 764033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mCodecCtx->u4_size = sizeof(iv_obj_t); 765033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mCodecCtx->pv_fxns = (void *)ive_api_function; 766033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 767033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.u4_size = sizeof(ive_init_ip_t); 768033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_op.u4_size = sizeof(ive_init_op_t); 769033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 770033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.e_cmd = IV_CMD_INIT; 771033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.u4_num_mem_rec = mNumMemRecords; 772033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.ps_mem_rec = mMemRecords; 7739fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim s_init_ip.u4_max_wd = width; 7749fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim s_init_ip.u4_max_ht = height; 775033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM; 776033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM; 777033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.u4_max_level = mAVCEncLevel; 778033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.e_inp_color_fmt = mIvVideoColorFormat; 779033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 780033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mReconEnable || mPSNREnable) { 781033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.u4_enable_recon = 1; 782033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } else { 783033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.u4_enable_recon = 0; 784033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 785033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.e_recon_color_fmt = DEFAULT_RECON_COLOR_FORMAT; 786033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.e_rc_mode = DEFAULT_RC_MODE; 787033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.u4_max_framerate = DEFAULT_MAX_FRAMERATE; 788033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.u4_max_bitrate = DEFAULT_MAX_BITRATE; 789033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.u4_num_bframes = mBframes; 790033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.e_content_type = IV_PROGRESSIVE; 791033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X; 792033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y; 793033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.e_slice_mode = mSliceMode; 794033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.u4_slice_param = mSliceParam; 795033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.e_arch = mArch; 796033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_init_ip.e_soc = DEFAULT_SOC; 797033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 798033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_init_ip, &s_init_op); 799033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 800033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 801033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Init encoder failed = 0x%x\n", s_init_op.u4_error_code); 802033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 803033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 804033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 805033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 806033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Get Codec Version */ 807033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim logVersion(); 808033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 809033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* set processor details */ 810033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setNumCores(); 811033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 812033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Video control Set Frame dimensions */ 813033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setDimensions(); 814033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 815033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Video control Set Frame rates */ 816033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setFrameRate(); 817033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 818033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Video control Set IPE Params */ 819033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setIpeParams(); 820033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 821033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Video control Set Bitrate */ 822033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setBitRate(); 823033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 824033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Video control Set QP */ 825033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setQp(); 826033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 827033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Video control Set AIR params */ 828033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setAirParams(); 829033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 830033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Video control Set VBV params */ 831033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setVbvParams(); 832033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 833033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Video control Set Motion estimation params */ 834033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setMeParams(); 835033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 836033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Video control Set GOP params */ 837033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setGopParams(); 838033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 839033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Video control Set Deblock params */ 840033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setDeblockParams(); 841033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 842033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Video control Set Profile params */ 843033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setProfileParams(); 844033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 845033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Video control Set in Encode header mode */ 846033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setEncMode(IVE_ENC_MODE_HEADER); 847033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 848033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGV("init_codec successfull"); 849033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 850033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSpsPpsHeaderReceived = false; 851033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mStarted = true; 852033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 853033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 854033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 855033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 856033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::releaseEncoder() { 857033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status = IV_SUCCESS; 858033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim iv_retrieve_mem_rec_ip_t s_retrieve_mem_ip; 859033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim iv_retrieve_mem_rec_op_t s_retrieve_mem_op; 860033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim iv_mem_rec_t *ps_mem_rec; 861033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 862033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (!mStarted) { 863033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 864033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 865033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 866033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_retrieve_mem_ip.u4_size = sizeof(iv_retrieve_mem_rec_ip_t); 867033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_retrieve_mem_op.u4_size = sizeof(iv_retrieve_mem_rec_op_t); 868033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_retrieve_mem_ip.e_cmd = IV_CMD_RETRIEVE_MEMREC; 869033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_retrieve_mem_ip.ps_mem_rec = mMemRecords; 870033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 871033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_retrieve_mem_ip, &s_retrieve_mem_op); 872033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 873033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (status != IV_SUCCESS) { 874033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unable to retrieve memory records = 0x%x\n", 875033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_retrieve_mem_op.u4_error_code); 876033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_CORRUPTED; 877033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 878033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 879033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Free memory records */ 880033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_mem_rec = mMemRecords; 881033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim for (size_t i = 0; i < s_retrieve_mem_op.u4_num_mem_rec_filled; i++) { 882033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_aligned_free(ps_mem_rec->pv_base); 883033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_mem_rec++; 884033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 885033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 886033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim free(mMemRecords); 887033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 888033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // clear other pointers into the space being free()d 889033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mCodecCtx = NULL; 890033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 891033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mStarted = false; 892033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 893033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 894033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 895033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 896033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setEncodeArgs( 897033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_video_encode_ip_t *ps_encode_ip, 898033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_video_encode_op_t *ps_encode_op, 899033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim const C2GraphicView *const input, 900033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim uint8_t *base, 901033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim uint32_t capacity, 902033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim uint64_t timestamp) { 903033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim iv_raw_buf_t *ps_inp_raw_buf; 904033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 905033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf = &ps_encode_ip->s_inp_buf; 906033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_ip->s_out_buf.pv_buf = base; 907033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_ip->s_out_buf.u4_bytes = 0; 908033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_ip->s_out_buf.u4_bufsize = capacity; 909033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_ip->u4_size = sizeof(ive_video_encode_ip_t); 910033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_op->u4_size = sizeof(ive_video_encode_op_t); 911033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 912033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_ip->e_cmd = IVE_CMD_VIDEO_ENCODE; 913033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_ip->pv_bufs = NULL; 914033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_ip->pv_mb_info = NULL; 915033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_ip->pv_pic_info = NULL; 916033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_ip->u4_mb_info_type = 0; 917033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_ip->u4_pic_info_type = 0; 918033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_ip->u4_is_last = 0; 919033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_ip->u4_timestamp_high = timestamp >> 32; 920033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_ip->u4_timestamp_low = timestamp & 0xFFFFFFFF; 921033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_op->s_out_buf.pv_buf = NULL; 922033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 923033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Initialize color formats */ 924033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim memset(ps_inp_raw_buf, 0, sizeof(iv_raw_buf_t)); 925033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->u4_size = sizeof(iv_raw_buf_t); 926033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->e_color_fmt = mIvVideoColorFormat; 927033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (input == nullptr) { 928033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mSawInputEOS){ 929033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_encode_ip->u4_is_last = 1; 930033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 931033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 932033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 933033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 934033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGV("width = %d, height = %d", input->width(), input->height()); 935033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim const C2PlanarLayout &layout = input->layout(); 936033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim uint8_t *yPlane = const_cast<uint8_t *>(input->data()[C2PlanarLayout::PLANE_Y]); 937033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim uint8_t *uPlane = const_cast<uint8_t *>(input->data()[C2PlanarLayout::PLANE_U]); 938033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim uint8_t *vPlane = const_cast<uint8_t *>(input->data()[C2PlanarLayout::PLANE_V]); 939033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim int32_t yStride = layout.planes[C2PlanarLayout::PLANE_Y].rowInc; 940033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim int32_t uStride = layout.planes[C2PlanarLayout::PLANE_U].rowInc; 941033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim int32_t vStride = layout.planes[C2PlanarLayout::PLANE_V].rowInc; 942033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 9435d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar uint32_t width = mIntf->getWidth(); 9445d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar uint32_t height = mIntf->getHeight(); 9455d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar // width and height are always even (as block size is 16x16) 9465d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar CHECK_EQ((width & 1u), 0u); 9475d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar CHECK_EQ((height & 1u), 0u); 9485d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar size_t yPlaneSize = width * height; 9495d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar 950033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim switch (layout.type) { 951033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim case C2PlanarLayout::TYPE_RGB: 952033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // fall-through 953033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim case C2PlanarLayout::TYPE_RGBA: { 954f799956b4e3a9ac921363ac55afda212256f236fWonsik Kim ALOGV("yPlaneSize = %zu", yPlaneSize); 9555d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar MemoryBlock conversionBuffer = mConversionBuffers.fetch(yPlaneSize * 3 / 2); 9565d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar mConversionBuffersInUse.emplace(conversionBuffer.data(), conversionBuffer); 9575d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar yPlane = conversionBuffer.data(); 958033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim uPlane = yPlane + yPlaneSize; 959033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim vPlane = uPlane + yPlaneSize / 4; 9605d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar yStride = width; 961f799956b4e3a9ac921363ac55afda212256f236fWonsik Kim uStride = vStride = yStride / 2; 9625d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar ConvertRGBToPlanarYUV(yPlane, yStride, height, conversionBuffer.size(), *input); 963033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim break; 964033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 9655d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar case C2PlanarLayout::TYPE_YUV: { 9665d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar if (!IsYUV420(*input)) { 9675d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar ALOGE("input is not YUV420"); 9685d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar return C2_BAD_VALUE; 9695d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar } 9705d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar 9715d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar if (layout.planes[layout.PLANE_Y].colInc == 1 9725d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar && layout.planes[layout.PLANE_U].colInc == 1 9735d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar && layout.planes[layout.PLANE_V].colInc == 1) { 9745d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar // I420 compatible - already set up above 9755d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar break; 9765d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar } 9775d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar 9785d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar // copy to I420 9795d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar yStride = width; 9805d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar uStride = vStride = yStride / 2; 9815d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar MemoryBlock conversionBuffer = mConversionBuffers.fetch(yPlaneSize * 3 / 2); 9825d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar mConversionBuffersInUse.emplace(conversionBuffer.data(), conversionBuffer); 9835d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar MediaImage2 img = CreateYUV420PlanarMediaImage2(width, height, yStride, height); 9845d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar status_t err = ImageCopy(conversionBuffer.data(), &img, *input); 9855d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar if (err != OK) { 9865d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar ALOGE("Buffer conversion failed: %d", err); 9875d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar return C2_BAD_VALUE; 9885d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar } 9895d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar yPlane = conversionBuffer.data(); 9905d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar uPlane = yPlane + yPlaneSize; 9915d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar vPlane = uPlane + yPlaneSize / 4; 992033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim break; 9935d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar 9945d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar } 9955d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar 9965d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar case C2PlanarLayout::TYPE_YUVA: 9975d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar ALOGE("YUVA plane type is not supported"); 9985d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar return C2_BAD_VALUE; 9995d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar 1000033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim default: 1001033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Unrecognized plane type: %d", layout.type); 1002033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_BAD_VALUE; 1003033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1004033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1005033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim switch (mIvVideoColorFormat) { 1006033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim case IV_YUV_420P: 1007033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim { 1008033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // input buffer is supposed to be const but Ittiam API wants bare pointer. 1009033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->apv_bufs[0] = yPlane; 1010033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->apv_bufs[1] = uPlane; 1011033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->apv_bufs[2] = vPlane; 1012033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1013033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_wd[0] = input->width(); 1014033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_wd[1] = input->width() / 2; 1015033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_wd[2] = input->width() / 2; 1016033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1017033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_ht[0] = input->height(); 1018033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_ht[1] = input->height() / 2; 1019033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_ht[2] = input->height() / 2; 1020033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1021033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_strd[0] = yStride; 1022033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_strd[1] = uStride; 1023033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_strd[2] = vStride; 1024033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim break; 1025033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1026033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1027033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim case IV_YUV_422ILE: 1028033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim { 1029033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // TODO 1030033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // ps_inp_raw_buf->apv_bufs[0] = pu1_buf; 1031033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // ps_inp_raw_buf->au4_wd[0] = mWidth * 2; 1032033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // ps_inp_raw_buf->au4_ht[0] = mHeight; 1033033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // ps_inp_raw_buf->au4_strd[0] = mStride * 2; 1034033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim break; 1035033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1036033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1037033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim case IV_YUV_420SP_UV: 1038033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim case IV_YUV_420SP_VU: 1039033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim default: 1040033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim { 1041033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->apv_bufs[0] = yPlane; 1042033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->apv_bufs[1] = uPlane; 1043033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1044033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_wd[0] = input->width(); 1045033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_wd[1] = input->width(); 1046033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1047033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_ht[0] = input->height(); 1048033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_ht[1] = input->height() / 2; 1049033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1050033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_strd[0] = yStride; 1051033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ps_inp_raw_buf->au4_strd[1] = uStride; 1052033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim break; 1053033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1054033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1055033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 1056033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 1057033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1058033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimvoid C2SoftAvcEnc::process( 1059033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim const std::unique_ptr<C2Work> &work, 1060033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim const std::shared_ptr<C2BlockPool> &pool) { 1061033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->result = C2_OK; 1062033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->workletsProcessed = 0u; 1063033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1064033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim IV_STATUS_T status; 1065033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim WORD32 timeDelay, timeTaken; 1066033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim uint64_t timestamp = work->input.ordinal.timestamp.peekull(); 1067033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1068033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // Initialize encoder if not already initialized 1069033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mCodecCtx == NULL) { 1070033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (C2_OK != initEncoder()) { 1071033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Failed to initialize encoder"); 1072033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->workletsProcessed = 1u; 1073033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->result = C2_CORRUPTED; 1074033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return; 1075033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1076033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1077033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mSignalledError) { 1078033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return; 1079033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1080033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1081033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // while (!mSawOutputEOS && !outQueue.empty()) { 1082033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim c2_status_t error; 1083033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_video_encode_ip_t s_encode_ip; 1084033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ive_video_encode_op_t s_encode_op; 1085033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1086033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (!mSpsPpsHeaderReceived) { 1087033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim constexpr uint32_t kHeaderLength = MIN_STREAM_SIZE; 1088033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim uint8_t header[kHeaderLength]; 1089033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim error = setEncodeArgs( 1090033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim &s_encode_ip, &s_encode_op, NULL, header, kHeaderLength, timestamp); 1091033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (error != C2_OK) { 1092fd2d387fc1ee7d3e2ebcf86abb39912b6754b65aWonsik Kim ALOGE("setEncodeArgs failed: %d", error); 1093033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSignalledError = true; 1094033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->workletsProcessed = 1u; 1095033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->result = C2_CORRUPTED; 1096033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return; 1097033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1098033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_encode_ip, &s_encode_op); 1099033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1100033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (IV_SUCCESS != status) { 1101033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Encode header failed = 0x%x\n", 1102033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_encode_op.u4_error_code); 1103033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return; 1104033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } else { 1105033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGV("Bytes Generated in header %d\n", 1106033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_encode_op.s_out_buf.u4_bytes); 1107033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1108033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1109033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSpsPpsHeaderReceived = true; 1110033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1111033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim std::unique_ptr<C2StreamCsdInfo::output> csd = 1112033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim C2StreamCsdInfo::output::AllocUnique(s_encode_op.s_out_buf.u4_bytes, 0u); 1113033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim memcpy(csd->m.value, header, s_encode_op.s_out_buf.u4_bytes); 1114033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->worklets.front()->output.configUpdate.push_back(std::move(csd)); 1115033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1116033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim DUMP_TO_FILE( 1117033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mOutFile, csd->m.value, csd->flexCount()); 1118033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1119033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1120033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mUpdateFlag) { 1121033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mUpdateFlag & kUpdateBitrate) { 1122033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setBitRate(); 1123033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1124033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mUpdateFlag & kRequestKeyFrame) { 1125033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setFrameType(IV_IDR_FRAME); 1126033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1127033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mUpdateFlag & kUpdateAIRMode) { 1128033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim setAirParams(); 1129033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // notify(OMX_EventPortSettingsChanged, kOutputPortIndex, 1130033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // OMX_IndexConfigAndroidIntraRefresh, NULL); 1131033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1132033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mUpdateFlag = 0; 1133033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1134033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1135033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) { 1136033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSawInputEOS = true; 1137033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1138033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1139033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* In normal mode, store inputBufferInfo and this will be returned 1140033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim when encoder consumes this input */ 1141033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // if (!mInputDataIsMeta && (inputBufferInfo != NULL)) { 1142033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // for (size_t i = 0; i < MAX_INPUT_BUFFER_HEADERS; i++) { 1143033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // if (NULL == mInputBufferInfo[i]) { 1144033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // mInputBufferInfo[i] = inputBufferInfo; 1145033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // break; 1146033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // } 1147033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // } 1148033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // } 114984c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim std::shared_ptr<const C2GraphicView> view; 115084c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim std::shared_ptr<C2Buffer> inputBuffer; 115184c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim if (!work->input.buffers.empty()) { 115284c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim inputBuffer = work->input.buffers[0]; 115384c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim view = std::make_shared<const C2GraphicView>( 115484c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim inputBuffer->data().graphicBlocks().front().map().get()); 115584c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim if (view->error() != C2_OK) { 115684c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim ALOGE("graphic view map err = %d", view->error()); 115784c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim return; 115884c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim } 1159033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1160033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1161033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim std::shared_ptr<C2LinearBlock> block; 1162033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1163033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim do { 1164033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE }; 1165033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // TODO: error handling, proper usage, etc. 1166033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim c2_status_t err = pool->fetchLinearBlock(mOutBufferSize, usage, &block); 1167033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (err != C2_OK) { 1168033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("fetch linear block err = %d", err); 1169033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->workletsProcessed = 1u; 1170033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->result = err; 1171033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return; 1172033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1173033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim C2WriteView wView = block->map().get(); 1174033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (wView.error() != C2_OK) { 1175033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("write view map err = %d", wView.error()); 1176033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->workletsProcessed = 1u; 1177033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->result = wView.error(); 1178033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return; 1179033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1180033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1181033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim error = setEncodeArgs( 118284c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim &s_encode_ip, &s_encode_op, view.get(), wView.base(), wView.capacity(), timestamp); 1183033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (error != C2_OK) { 1184033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSignalledError = true; 1185033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("setEncodeArgs failed : %d", error); 1186033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->workletsProcessed = 1u; 1187033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->result = error; 1188033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return; 1189033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1190033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1191033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // DUMP_TO_FILE( 1192033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // mInFile, s_encode_ip.s_inp_buf.apv_bufs[0], 1193033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // (mHeight * mStride * 3 / 2)); 1194033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1195033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim GETTIME(&mTimeStart, NULL); 1196033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Compute time elapsed between end of previous decode() 1197033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * to start of current decode() */ 1198033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim TIME_DIFF(mTimeEnd, mTimeStart, timeDelay); 1199033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim status = ive_api_function(mCodecCtx, &s_encode_ip, &s_encode_op); 1200033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1201033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (IV_SUCCESS != status) { 1202033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if ((s_encode_op.u4_error_code & 0xFF) == IH264E_BITSTREAM_BUFFER_OVERFLOW) { 1203033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // TODO: use IVE_CMD_CTL_GETBUFINFO for proper max input size? 1204033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mOutBufferSize *= 2; 1205033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim continue; 1206033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1207033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Encode Frame failed = 0x%x\n", 1208033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_encode_op.u4_error_code); 1209033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSignalledError = true; 1210033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->workletsProcessed = 1u; 1211033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->result = C2_CORRUPTED; 1212033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return; 1213033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1214033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } while (IV_SUCCESS != status); 1215033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1216033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // Hold input buffer reference 121784c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim if (inputBuffer) { 121884c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim mBuffers[s_encode_ip.s_inp_buf.apv_bufs[0]] = inputBuffer; 121984c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim } 1220033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1221033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim GETTIME(&mTimeEnd, NULL); 1222033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* Compute time taken for decode() */ 1223033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim TIME_DIFF(mTimeStart, mTimeEnd, timeTaken); 1224033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1225033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGV("timeTaken=%6d delay=%6d numBytes=%6d", timeTaken, timeDelay, 1226033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim s_encode_op.s_out_buf.u4_bytes); 1227033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1228033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim void *freed = s_encode_op.s_inp_buf.apv_bufs[0]; 1229033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim /* If encoder frees up an input buffer, mark it as free */ 1230033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (freed != NULL) { 1231033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mBuffers.count(freed) == 0u) { 1232fd2d387fc1ee7d3e2ebcf86abb39912b6754b65aWonsik Kim ALOGD("buffer not tracked"); 1233fd2d387fc1ee7d3e2ebcf86abb39912b6754b65aWonsik Kim } else { 1234fd2d387fc1ee7d3e2ebcf86abb39912b6754b65aWonsik Kim // Release input buffer reference 1235fd2d387fc1ee7d3e2ebcf86abb39912b6754b65aWonsik Kim mBuffers.erase(freed); 12365d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar mConversionBuffersInUse.erase(freed); 1237033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1238033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1239033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1240033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->worklets.front()->output.flags = work->input.flags; 1241033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->worklets.front()->output.ordinal = work->input.ordinal; 1242033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->worklets.front()->output.ordinal.timestamp = 1243033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ((uint64_t)s_encode_op.u4_timestamp_high << 32) | s_encode_op.u4_timestamp_low; 1244033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->worklets.front()->output.buffers.clear(); 1245033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim std::shared_ptr<C2Buffer> buffer = 1246033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim createLinearBuffer(block, 0, s_encode_op.s_out_buf.u4_bytes); 1247033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->worklets.front()->output.buffers.push_back(buffer); 1248033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->workletsProcessed = 1u; 1249033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1250033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (IV_IDR_FRAME == s_encode_op.u4_encoded_frame_type) { 1251033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim buffer->setInfo(std::make_shared<C2StreamPictureTypeMaskInfo::output>( 1252033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 0u /* stream id */, C2PictureTypeKeyFrame)); 1253033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1254033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1255033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (s_encode_op.u4_is_last) { 1256033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // outputBufferHeader->nFlags |= OMX_BUFFERFLAG_EOS; 1257033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSawOutputEOS = true; 1258033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } else { 1259033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // outputBufferHeader->nFlags &= ~OMX_BUFFERFLAG_EOS; 1260033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1261033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 1262033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1263033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::drain( 1264033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim uint32_t drainMode, 1265033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim const std::shared_ptr<C2BlockPool> &pool) { 1266033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim // TODO: use IVE_CMD_CTL_FLUSH? 1267033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim (void)drainMode; 1268033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim (void)pool; 1269033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 1270033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 1271033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1272033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1273033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimclass C2SoftAvcEncFactory : public C2ComponentFactory { 1274033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimpublic: 12759fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim C2SoftAvcEncFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>( 1276e15da79378e753bbd20f1c0f5c6858cc89bd4141Wonsik Kim GetCodec2PlatformComponentStore()->getParamReflector())) { 12779fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim } 12789fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 1279033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim virtual c2_status_t createComponent( 1280033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim c2_node_id_t id, 1281033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim std::shared_ptr<C2Component>* const component, 1282033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim std::function<void(C2Component*)> deleter) override { 12839fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim *component = std::shared_ptr<C2Component>( 12849fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim new C2SoftAvcEnc(COMPONENT_NAME, 12859fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim id, 12869fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim std::make_shared<C2SoftAvcEnc::IntfImpl>(mHelper)), 12879fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim deleter); 1288033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 1289033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1290033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1291033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim virtual c2_status_t createInterface( 1292033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim c2_node_id_t id, 1293033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim std::shared_ptr<C2ComponentInterface>* const interface, 1294033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim std::function<void(C2ComponentInterface*)> deleter) override { 12959fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim *interface = std::shared_ptr<C2ComponentInterface>( 12969fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim new SimpleInterface<C2SoftAvcEnc::IntfImpl>( 12979fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim COMPONENT_NAME, id, std::make_shared<C2SoftAvcEnc::IntfImpl>(mHelper)), 12989fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim deleter); 1299033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 1300033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 1301033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1302033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim virtual ~C2SoftAvcEncFactory() override = default; 13039fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim 13049fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kimprivate: 13059fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim std::shared_ptr<C2ReflectorHelper> mHelper; 1306033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}; 1307033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1308033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} // namespace android 1309033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1310033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimextern "C" ::C2ComponentFactory* CreateCodec2Factory() { 1311033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGV("in %s", __func__); 1312033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return new ::android::C2SoftAvcEncFactory(); 1313033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 1314033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1315033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimextern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) { 1316033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGV("in %s", __func__); 1317033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim delete factory; 1318033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 1319