1033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim/* 2033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * Copyright (C) 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 "C2SoftAmrWbEnc" 19d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include <log/log.h> 20033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 21d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include <media/stagefright/foundation/MediaDefs.h> 22033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 23d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include <C2Debug.h> 24033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <C2PlatformSupport.h> 2572dc0b6eea5a305d58537dcd2ee28e23c72b6e44Lajos Molnar#include <SimpleC2Interface.h> 26033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 27d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include "C2SoftAmrWbEnc.h" 28d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include "cmnMemory.h" 29033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 30033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimnamespace android { 31033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 325c2c3d46fc95a4e08dbd7a7a3304e389d85faa86Lajos Molnarconstexpr char COMPONENT_NAME[] = "c2.android.amrwb.encoder"; 339bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo 349bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajooclass C2SoftAmrWbEnc::IntfImpl : public C2InterfaceHelper { 359bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo public: 369bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper>& helper) 379bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo : C2InterfaceHelper(helper) { 389bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo setDerivedInstance(this); 399bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo 409bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo addParameter( 419bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING) 429bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .withConstValue( 439bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo new C2StreamFormatConfig::input(0u, C2FormatAudio)) 449bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .build()); 459bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo 469bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo addParameter( 479bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING) 489bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .withConstValue( 499bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo new C2StreamFormatConfig::output(0u, C2FormatCompressed)) 509bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .build()); 519bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo 529bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo addParameter( 539bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING) 549bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .withConstValue(AllocSharedString<C2PortMimeConfig::input>( 559bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo MEDIA_MIMETYPE_AUDIO_RAW)) 569bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .build()); 579bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo 589bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo addParameter( 599bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING) 609bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .withConstValue(AllocSharedString<C2PortMimeConfig::output>( 619bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo MEDIA_MIMETYPE_AUDIO_AMR_WB)) 629bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .build()); 639bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo 649bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo addParameter( 659bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING) 669bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .withDefault(new C2StreamChannelCountInfo::input(0u, 1)) 679bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .withFields({C2F(mChannelCount, value).equalTo(1)}) 689bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .withSetter((Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps)) 699bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .build()); 709bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo 719bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo addParameter( 729bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING) 739bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .withDefault(new C2StreamSampleRateInfo::input(0u, 16000)) 749bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .withFields({C2F(mSampleRate, value).equalTo(16000)}) 759bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .withSetter( 769bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo (Setter<decltype(*mSampleRate)>::StrictValueWithNoDeps)) 779bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .build()); 789bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo 799bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo addParameter( 809bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING) 819bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .withDefault(new C2BitrateTuning::output(0u, 6600)) 829bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .withFields({C2F(mBitrate, value).inRange(6600, 23850)}) 839bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps) 849bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo .build()); 851e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo 861e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo addParameter( 871e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE) 881e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo .withConstValue(new C2StreamMaxBufferSizeInfo::input(0u, 8192)) 891e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo .build()); 909bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo } 919bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo 929bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo uint32_t getSampleRate() const { return mSampleRate->value; } 939bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo uint32_t getChannelCount() const { return mChannelCount->value; } 949bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo uint32_t getBitrate() const { return mBitrate->value; } 959bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo 969bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo private: 979bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo std::shared_ptr<C2StreamFormatConfig::input> mInputFormat; 989bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat; 999bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo std::shared_ptr<C2PortMimeConfig::input> mInputMediaType; 1009bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType; 1019bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo std::shared_ptr<C2StreamSampleRateInfo::input> mSampleRate; 1029bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo std::shared_ptr<C2StreamChannelCountInfo::input> mChannelCount; 1039bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo std::shared_ptr<C2BitrateTuning::output> mBitrate; 1041e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize; 1059bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo}; 106033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 1079bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha JajooC2SoftAmrWbEnc::C2SoftAmrWbEnc(const char* name, c2_node_id_t id, 1089bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo const std::shared_ptr<IntfImpl>& intfImpl) 1099bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo : SimpleC2Component( 1109bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)), 1119bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo mIntf(intfImpl), 112033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mEncoderHandle(nullptr), 113033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mApiHandle(nullptr), 114033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mMemOperator(nullptr) { 115033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 116033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 117033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik KimC2SoftAmrWbEnc::~C2SoftAmrWbEnc() { 118033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim onRelease(); 119033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 120033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 121033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAmrWbEnc::onInit() { 1221e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo // TODO: get mode directly from config 1231e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo switch(mIntf->getBitrate()) { 1241e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo case 6600: mMode = VOAMRWB_MD66; 1251e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo break; 1261e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo case 8850: mMode = VOAMRWB_MD885; 1271e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo break; 1281e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo case 12650: mMode = VOAMRWB_MD1265; 1291e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo break; 1301e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo case 14250: mMode = VOAMRWB_MD1425; 1311e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo break; 1321e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo case 15850: mMode = VOAMRWB_MD1585; 1331e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo break; 1341e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo case 18250: mMode = VOAMRWB_MD1825; 1351e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo break; 1361e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo case 19850: mMode = VOAMRWB_MD1985; 1371e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo break; 1381e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo case 23050: mMode = VOAMRWB_MD2305; 1391e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo break; 1401e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo case 23850: mMode = VOAMRWB_MD2385; 1411e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo break; 1421e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo default: mMode = VOAMRWB_MD2305; 1431e788d8f4897bd602800c74e23371ce3d83e50e9Manisha Jajoo } 1445de85e7096a9a0ecf9c442ad00a9cd097d46d3dfWonsik Kim status_t err = initEncoder(); 145033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mIsFirst = true; 146033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSignalledError = false; 147033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSignalledOutputEos = false; 148033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mAnchorTimeStamp = 0; 149033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mProcessedSamples = 0; 150033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mFilledLen = 0; 151033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 152033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return err == OK ? C2_OK : C2_NO_MEMORY; 153033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 154033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 155033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimvoid C2SoftAmrWbEnc::onRelease() { 156033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mEncoderHandle) { 157033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim CHECK_EQ((VO_U32)VO_ERR_NONE, mApiHandle->Uninit(mEncoderHandle)); 158033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mEncoderHandle = nullptr; 159033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 160033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mApiHandle) { 161033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim delete mApiHandle; 162033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mApiHandle = nullptr; 163033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 164033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mMemOperator) { 165033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim delete mMemOperator; 166033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mMemOperator = nullptr; 167033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 168033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 169033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 170033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAmrWbEnc::onStop() { 171033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim for (int i = 0; i < kNumSamplesPerFrame; i++) { 172033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mInputFrame[i] = 0x0008; /* EHF_MASK */ 173033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 174033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim uint8_t outBuffer[kNumBytesPerInputFrame]; 175033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim (void) encodeInput(outBuffer, kNumBytesPerInputFrame); 176033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mIsFirst = true; 177033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSignalledError = false; 178033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSignalledOutputEos = false; 179033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mAnchorTimeStamp = 0; 180033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mProcessedSamples = 0; 181033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mFilledLen = 0; 182033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 183033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 184033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 185033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 186033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimvoid C2SoftAmrWbEnc::onReset() { 187033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim (void) onStop(); 188033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 189033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 190033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAmrWbEnc::onFlush_sm() { 191033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return onStop(); 192033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 193033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 194033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimstatus_t C2SoftAmrWbEnc::initEncoder() { 195033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mApiHandle = new VO_AUDIO_CODECAPI; 196033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (!mApiHandle) return NO_MEMORY; 197033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 198033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (VO_ERR_NONE != voGetAMRWBEncAPI(mApiHandle)) { 199033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Failed to get api handle"); 200033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return UNKNOWN_ERROR; 201033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 202033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 203033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mMemOperator = new VO_MEM_OPERATOR; 204033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (!mMemOperator) return NO_MEMORY; 205033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 206033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mMemOperator->Alloc = cmnMemAlloc; 207033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mMemOperator->Copy = cmnMemCopy; 208033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mMemOperator->Free = cmnMemFree; 209033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mMemOperator->Set = cmnMemSet; 210033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mMemOperator->Check = cmnMemCheck; 211033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 212033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim VO_CODEC_INIT_USERDATA userData; 213033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim memset(&userData, 0, sizeof(userData)); 214033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim userData.memflag = VO_IMF_USERMEMOPERATOR; 215033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim userData.memData = (VO_PTR) mMemOperator; 216033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 217033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (VO_ERR_NONE != mApiHandle->Init( 218033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim &mEncoderHandle, VO_AUDIO_CodingAMRWB, &userData)) { 219033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Failed to init AMRWB encoder"); 220033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return UNKNOWN_ERROR; 221033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 222033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 223033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim VOAMRWBFRAMETYPE type = VOAMRWB_RFC3267; 224033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (VO_ERR_NONE != mApiHandle->SetParam( 225033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mEncoderHandle, VO_PID_AMRWB_FRAMETYPE, &type)) { 226033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Failed to set AMRWB encoder frame type to %d", type); 227033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return UNKNOWN_ERROR; 228033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 229033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 230033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (VO_ERR_NONE != 231033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mApiHandle->SetParam( 232033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mEncoderHandle, VO_PID_AMRWB_MODE, &mMode)) { 233033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("Failed to set AMRWB encoder mode to %d", mMode); 234033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return UNKNOWN_ERROR; 235033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 236033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 237033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return OK; 238033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 239033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 240033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimint C2SoftAmrWbEnc::encodeInput(uint8_t *buffer, uint32_t length) { 241033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim VO_CODECBUFFER inputData; 242033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim memset(&inputData, 0, sizeof(inputData)); 243033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim inputData.Buffer = (unsigned char *) mInputFrame; 244033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim inputData.Length = kNumBytesPerInputFrame; 245033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 246033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim CHECK_EQ((VO_U32)VO_ERR_NONE, 247033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mApiHandle->SetInputData(mEncoderHandle, &inputData)); 248033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 249033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim VO_AUDIO_OUTPUTINFO outputInfo; 250033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim memset(&outputInfo, 0, sizeof(outputInfo)); 251033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim VO_CODECBUFFER outputData; 252033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim memset(&outputData, 0, sizeof(outputData)); 253033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim outputData.Buffer = buffer; 254033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim outputData.Length = length; 255033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim VO_U32 ret = mApiHandle->GetOutputData( 256033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mEncoderHandle, &outputData, &outputInfo); 257033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (ret != VO_ERR_NONE && ret != VO_ERR_INPUT_BUFFER_SMALL) { 258033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGD("encountered error during encode call"); 259033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return -1; 260033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 261033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return outputData.Length; 262033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 263033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 264033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimstatic void fillEmptyWork(const std::unique_ptr<C2Work> &work) { 265033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->worklets.front()->output.flags = work->input.flags; 266033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->worklets.front()->output.buffers.clear(); 267033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->worklets.front()->output.ordinal = work->input.ordinal; 268033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->workletsProcessed = 1u; 269033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 270033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 271033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimvoid C2SoftAmrWbEnc::process( 272033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim const std::unique_ptr<C2Work> &work, 273033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim const std::shared_ptr<C2BlockPool> &pool) { 274033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->result = C2_OK; 275033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->workletsProcessed = 0u; 276033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mSignalledError || mSignalledOutputEos) { 277033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->result = C2_BAD_VALUE; 278033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return; 279033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 280033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 28145c52538eab8ff337687d374f657cff5d6c51912Wonsik Kim size_t inOffset = 0u; 28245c52538eab8ff337687d374f657cff5d6c51912Wonsik Kim size_t inSize = 0u; 28345c52538eab8ff337687d374f657cff5d6c51912Wonsik Kim C2ReadView rView = mDummyReadView; 28445c52538eab8ff337687d374f657cff5d6c51912Wonsik Kim if (!work->input.buffers.empty()) { 28545c52538eab8ff337687d374f657cff5d6c51912Wonsik Kim rView = work->input.buffers[0]->data().linearBlocks().front().map().get(); 28645c52538eab8ff337687d374f657cff5d6c51912Wonsik Kim inSize = rView.capacity(); 28745c52538eab8ff337687d374f657cff5d6c51912Wonsik Kim if (inSize && rView.error()) { 28845c52538eab8ff337687d374f657cff5d6c51912Wonsik Kim ALOGE("read view map failed %d", rView.error()); 28945c52538eab8ff337687d374f657cff5d6c51912Wonsik Kim work->result = rView.error(); 29045c52538eab8ff337687d374f657cff5d6c51912Wonsik Kim return; 29145c52538eab8ff337687d374f657cff5d6c51912Wonsik Kim } 292033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 29345c52538eab8ff337687d374f657cff5d6c51912Wonsik Kim bool eos = (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0; 294033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 295033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGV("in buffer attr. size %zu timestamp %d frameindex %d, flags %x", 296033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim inSize, (int)work->input.ordinal.timestamp.peeku(), 297033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim (int)work->input.ordinal.frameIndex.peeku(), work->input.flags); 298033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 299033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim size_t outCapacity = kNumBytesPerInputFrame; 300033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim outCapacity += mFilledLen + inSize; 301033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim std::shared_ptr<C2LinearBlock> outputBlock; 302033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE }; 303033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim c2_status_t err = pool->fetchLinearBlock(outCapacity, usage, &outputBlock); 304033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (err != C2_OK) { 305033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("fetchLinearBlock for Output failed with status %d", err); 306033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->result = C2_NO_MEMORY; 307033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return; 308033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 309033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim C2WriteView wView = outputBlock->map().get(); 310033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (wView.error()) { 311033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("write view map failed %d", wView.error()); 312033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->result = wView.error(); 313033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return; 314033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 3159bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo uint64_t outTimeStamp = 3169bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo mProcessedSamples * 1000000ll / mIntf->getSampleRate(); 317033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim size_t inPos = 0; 318033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim size_t outPos = 0; 319033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim while (inPos < inSize) { 32045c52538eab8ff337687d374f657cff5d6c51912Wonsik Kim const uint8_t *inPtr = rView.data() + inOffset; 321033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim int validSamples = mFilledLen / sizeof(int16_t); 322033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if ((inPos + (kNumBytesPerInputFrame - mFilledLen)) <= inSize) { 323033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim memcpy(mInputFrame + validSamples, inPtr + inPos, 324033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim (kNumBytesPerInputFrame - mFilledLen)); 325033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim inPos += (kNumBytesPerInputFrame - mFilledLen); 326033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } else { 327033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim memcpy(mInputFrame + validSamples, inPtr + inPos, (inSize - inPos)); 328033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mFilledLen += (inSize - inPos); 329033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim inPos += (inSize - inPos); 330033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (eos) { 331033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim validSamples = mFilledLen / sizeof(int16_t); 332033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim memset(mInputFrame + validSamples, 0, (kNumBytesPerInputFrame - mFilledLen)); 333033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } else break; 334033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 335033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim int numEncBytes = encodeInput((wView.data() + outPos), outCapacity - outPos); 336033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (numEncBytes < 0) { 337033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGE("encodeFrame call failed, state [%d %zu %zu]", numEncBytes, outPos, outCapacity); 338033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSignalledError = true; 339033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->result = C2_CORRUPTED; 340033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return; 341033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 342033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim outPos += numEncBytes; 343033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mProcessedSamples += kNumSamplesPerFrame; 344033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mFilledLen = 0; 345033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 346033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGV("causal sample size %d", mFilledLen); 347033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mIsFirst) { 348033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mIsFirst = false; 349033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mAnchorTimeStamp = work->input.ordinal.timestamp.peekull(); 350033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 351033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim fillEmptyWork(work); 352033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (outPos != 0) { 353033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->worklets.front()->output.buffers.push_back( 354033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim createLinearBuffer(std::move(outputBlock), 0, outPos)); 355033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim work->worklets.front()->output.ordinal.timestamp = mAnchorTimeStamp + outTimeStamp; 356033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 357033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (eos) { 358033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim mSignalledOutputEos = true; 359033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGV("signalled EOS"); 360033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (mFilledLen) ALOGV("Discarding trailing %d bytes", mFilledLen); 361033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 362033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 363033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 364033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAmrWbEnc::drain( 365033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim uint32_t drainMode, 366033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim const std::shared_ptr<C2BlockPool> &pool) { 367033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim (void) pool; 368033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (drainMode == NO_DRAIN) { 369033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGW("drain with NO_DRAIN: no-op"); 370033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 371033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 372033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim if (drainMode == DRAIN_CHAIN) { 373033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGW("DRAIN_CHAIN not supported"); 374033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OMITTED; 375033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 376033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 377033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim onFlush_sm(); 378033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 379033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 380033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 381033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimclass C2SoftAmrWbEncFactory : public C2ComponentFactory { 382033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimpublic: 3839bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo C2SoftAmrWbEncFactory() 3849bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo : mHelper(std::static_pointer_cast<C2ReflectorHelper>( 3859bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo GetCodec2PlatformComponentStore()->getParamReflector())) {} 3869bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo 387033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim virtual c2_status_t createComponent( 388033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim c2_node_id_t id, 389033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim std::shared_ptr<C2Component>* const component, 390033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim std::function<void(C2Component*)> deleter) override { 3919bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo *component = std::shared_ptr<C2Component>( 3929bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo new C2SoftAmrWbEnc( 3939bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo COMPONENT_NAME, id, 3949bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo std::make_shared<C2SoftAmrWbEnc::IntfImpl>(mHelper)), 3959bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo deleter); 396033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 397033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 398033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 399033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim virtual c2_status_t createInterface( 400033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim c2_node_id_t id, 401033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim std::shared_ptr<C2ComponentInterface>* const interface, 402033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim std::function<void(C2ComponentInterface*)> deleter) override { 4039bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo *interface = std::shared_ptr<C2ComponentInterface>( 4049bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo new SimpleInterface<C2SoftAmrWbEnc::IntfImpl>( 4059bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo COMPONENT_NAME, id, 4069bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo std::make_shared<C2SoftAmrWbEnc::IntfImpl>(mHelper)), 4079bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo deleter); 408033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return C2_OK; 409033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim } 410033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 411033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim virtual ~C2SoftAmrWbEncFactory() override = default; 4129bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo 4139bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajooprivate: 4149bc64b3fb95fd189f9ad1696df6d709eb3ac47ffManisha Jajoo std::shared_ptr<C2ReflectorHelper> mHelper; 415033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}; 416033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 417033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} // namespace android 418033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 419033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimextern "C" ::C2ComponentFactory* CreateCodec2Factory() { 420033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGV("in %s", __func__); 421033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim return new ::android::C2SoftAmrWbEncFactory(); 422033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 423033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim 424033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimextern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) { 425033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim ALOGV("in %s", __func__); 426033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim delete factory; 427033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim} 428