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