17c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*
27c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
37c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
47c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License");
57c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * you may not use this file except in compliance with the License.
67c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * You may obtain a copy of the License at
77c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
87c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *      http://www.apache.org/licenses/LICENSE-2.0
97c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software
117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS,
127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * See the License for the specific language governing permissions and
147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * limitations under the License.
157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*************************************************************************
187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @file   VideoEditorAudioDecoder.cpp
197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief  StageFright shell Audio Decoder
207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*************************************************************************
217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_NDEBUG 1
247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_TAG "VIDEOEDITOR_AUDIODECODER"
257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h"
277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditorAudioDecoder.h"
287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditorUtils.h"
297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_InternalTypes.h"
307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "utils/Log.h"
32f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang#include "utils/Vector.h"
33c4689fae1bdb8d1c94eb28af1b2a1f30d2b1a3daJames Dong#include <media/stagefright/foundation/ADebug.h>
347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaSource.h>
357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaDefs.h>
367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MetaData.h>
377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/OMXClient.h>
387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/OMXCodec.h>
397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/********************
417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *   DEFINITIONS    *
427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************/
437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi// Version
447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define VIDEOEDITOR_AUDIO_DECODER_VERSION_MAJOR 1
457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define VIDEOEDITOR_AUDIO_DECODER_VERSION_MINOR 0
467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define VIDEOEDITOR_AUDIO_DECODER_VERSION_REV   0
477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi// Force using software decoder as engine does not support prefetch
497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define VIDEOEDITOR_FORCECODEC kSoftwareCodecsOnly
507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundarginamespace android {
527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistruct VideoEditorAudioDecoderSource : public MediaSource {
547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    public:
557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        static sp<VideoEditorAudioDecoderSource> Create(
56bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury                const sp<MetaData>& format, void *decoderShellContext);
577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual status_t start(MetaData *params = NULL);
587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual status_t stop();
597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual sp<MetaData> getFormat();
607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual status_t read(MediaBuffer **buffer,
617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        const ReadOptions *options = NULL);
62f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        virtual void storeBuffer(MediaBuffer *buffer);
637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    protected:
657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual ~VideoEditorAudioDecoderSource();
667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    private:
687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        enum State {
697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            CREATED,
707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            STARTED,
717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ERROR
727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        };
73bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        VideoEditorAudioDecoderSource(const sp<MetaData>& format,
74bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury         void *decoderShellContext);
757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sp<MetaData> mFormat;
76f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        Vector<MediaBuffer*> mBuffers;
77f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        Mutex mLock;  // protects mBuffers
787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bool mIsEOS;
797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        State mState;
80bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        void* mDecShellContext;
81e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong        // Don't call me.
82e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong        VideoEditorAudioDecoderSource(const VideoEditorAudioDecoderSource&);
83e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong        VideoEditorAudioDecoderSource& operator=(
84e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong            const VideoEditorAudioDecoderSource &);
857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi};
867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury/**
88bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury ******************************************************************************
89bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury * structure VideoEditorAudioDecoder_Context
90bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury * @brief    This structure defines the context of the StageFright audio decoder
91bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury *           shell
92bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury ******************************************************************************
93bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury*/
94bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
95bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdurytypedef struct {
96bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    M4AD_Type                          mDecoderType;
97bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    M4_AudioStreamHandler*             mAudioStreamHandler;
98bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    sp<VideoEditorAudioDecoderSource>  mDecoderSource;
99bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    OMXClient                          mClient;
100bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    sp<MediaSource>                    mDecoder;
101bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    int32_t                            mNbOutputChannels;
102bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    uint32_t                           mNbInputFrames;
103bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    uint32_t                           mNbOutputFrames;
104bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    M4READER_DataInterface  *m_pReader;
105bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    M4_AccessUnit* m_pNextAccessUnitToDecode;
106bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    M4OSA_ERR readerErrCode;
107bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    int32_t timeStampMs;
108bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
109bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury} VideoEditorAudioDecoder_Context;
110bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargisp<VideoEditorAudioDecoderSource> VideoEditorAudioDecoderSource::Create(
112bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        const sp<MetaData>& format, void *decoderShellContext) {
1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<VideoEditorAudioDecoderSource> aSource =
115bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        new VideoEditorAudioDecoderSource(format, decoderShellContext);
1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return aSource;
1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiVideoEditorAudioDecoderSource::VideoEditorAudioDecoderSource(
121bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        const sp<MetaData>& format, void* decoderShellContext):
1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mFormat(format),
1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mIsEOS(false),
124bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        mState(CREATED),
125bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        mDecShellContext(decoderShellContext) {
1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiVideoEditorAudioDecoderSource::~VideoEditorAudioDecoderSource() {
1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( STARTED == mState ) {
1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        stop();
1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorAudioDecoderSource::start(MetaData *meta) {
1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t err = OK;
1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( CREATED != mState ) {
1392703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoderSource::start: invalid state %d", mState);
1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return UNKNOWN_ERROR;
1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mState = STARTED;
1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
1462703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoderSource::start END (0x%x)", err);
1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorAudioDecoderSource::stop() {
151f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    Mutex::Autolock autolock(mLock);
1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t err = OK;
1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1542703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoderSource::stop begin");
1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( STARTED != mState ) {
1572703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoderSource::stop: invalid state %d", mState);
1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return UNKNOWN_ERROR;
1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
161f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    if (!mBuffers.empty()) {
162f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        int n = mBuffers.size();
163f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        for (int i = 0; i < n; i++) {
164f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang            mBuffers.itemAt(i)->release();
165f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        }
166e70ff37034fdb93f65d34704aec400ec9123e55cSteve Block        ALOGW("VideoEditorAudioDecoderSource::stop : %d buffer remained", n);
167f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        mBuffers.clear();
1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mState = CREATED;
1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1722703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoderSource::stop END (0x%x)", err);
1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargisp<MetaData> VideoEditorAudioDecoderSource::getFormat() {
1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1782703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoderSource::getFormat");
1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return mFormat;
1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
182f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Changstatic MediaBuffer* readBufferFromReader(
183f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        VideoEditorAudioDecoder_Context* pDecContext) {
184f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    M4OSA_ERR lerr = M4NO_ERROR;
185f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    M4_AccessUnit* pAccessUnit = pDecContext->m_pNextAccessUnitToDecode;
186f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang
187f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    // Get next AU from reader.
188f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    lerr = pDecContext->m_pReader->m_pFctGetNextAu(
189f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang               pDecContext->m_pReader->m_readerContext,
190f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang               (M4_StreamHandler*)pDecContext->mAudioStreamHandler,
191f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang               pAccessUnit);
192f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang
193f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    if (lerr == M4WAR_NO_MORE_AU) {
1942703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("readBufferFromReader : EOS");
195f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        return NULL;
196f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    }
197f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang
198f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    pDecContext->timeStampMs = pAccessUnit->m_CTS;
199f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang
200f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    MediaBuffer* newBuffer = new MediaBuffer((size_t)pAccessUnit->m_size);
201f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    memcpy((void *)((M4OSA_Int8*)newBuffer->data() + newBuffer->range_offset()),
202f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        (void *)pAccessUnit->m_dataAddress, pAccessUnit->m_size);
203f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    newBuffer->meta_data()->setInt64(kKeyTime, (pAccessUnit->m_CTS * 1000LL));
204f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    return newBuffer;
205f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang}
206f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang
2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorAudioDecoderSource::read(MediaBuffer **buffer,
2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        const ReadOptions *options) {
209f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    Mutex::Autolock autolock(mLock);
2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaSource::ReadOptions readOptions;
211bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
212bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    VideoEditorAudioDecoder_Context* pDecContext =
213bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury     (VideoEditorAudioDecoder_Context *)mDecShellContext;
2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( STARTED != mState ) {
2162703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoderSource::read invalid state %d", mState);
2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return UNKNOWN_ERROR;
2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
220f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    // Get a buffer from the reader if we don't have any
221f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    if(mBuffers.empty()) {
222f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        MediaBuffer* newBuffer = readBufferFromReader(pDecContext);
223f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        if (!newBuffer) {
224bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            *buffer = NULL;
225bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            pDecContext->readerErrCode = M4WAR_NO_MORE_AU;
2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return ERROR_END_OF_STREAM;
227bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        }
228f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        mBuffers.push(newBuffer);
2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
230f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    *buffer = mBuffers.itemAt(0);
231f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    mBuffers.removeAt(0);
2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
233f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    return OK;
2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
236f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Changvoid VideoEditorAudioDecoderSource::storeBuffer(MediaBuffer *buffer) {
237f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    Mutex::Autolock autolock(mLock);
238bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    VideoEditorAudioDecoder_Context* pDecContext =
239bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury     (VideoEditorAudioDecoder_Context *)mDecShellContext;
2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2412703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoderSource::storeBuffer begin");
2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
243f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    // If the user didn't give us a buffer, get it from the reader.
244f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    if(buffer == NULL) {
245f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        MediaBuffer* newBuffer = readBufferFromReader(pDecContext);
246f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        if (!newBuffer) {
247bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            pDecContext->readerErrCode = M4WAR_NO_MORE_AU;
248f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang            return;
249bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        }
250f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang        buffer = newBuffer;
251bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    }
252bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
253f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    mBuffers.push(buffer);
2542703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoderSource::storeBuffer END");
2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/********************
2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *      TOOLS       *
2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************/
2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getBits(M4OSA_Int8* pData,
2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 dataSize, M4OSA_UInt8 nbBits, M4OSA_Int32* pResult,
2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32* pOffset) {
2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 startByte = 0;
2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 startBit = 0;
2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 endByte = 0;
2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 endBit = 0;
2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 currentByte = 0;
2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 result = 0;
2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 ui32Tmp = 0;
2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 ui32Mask = 0;
2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pData, M4ERR_PARAMETER);
2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pOffset, M4ERR_PARAMETER);
2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(32 >= nbBits, M4ERR_PARAMETER);
2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK((*pOffset + nbBits) <= 8*dataSize, M4ERR_PARAMETER);
2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2812703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_getBits begin");
2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    startByte   = (*pOffset) >> 3;
2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    endByte     = (*pOffset + nbBits) >> 3;
2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    startBit    = (*pOffset) % 8;
2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    endBit      = (*pOffset + nbBits) % 8;
2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    currentByte = startByte;
2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Extract the requested nunber of bits from memory
2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while( currentByte <= endByte) {
2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ui32Mask = 0x000000FF;
2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( currentByte == startByte ) {
2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ui32Mask >>= startBit;
2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ui32Tmp = ui32Mask & ((M4OSA_UInt32)pData[currentByte]);
2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( currentByte == endByte ) {
2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ui32Tmp >>= (8-endBit);
2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            result <<= endBit;
2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            result <<= 8;
3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        result |= ui32Tmp;
3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        currentByte++;
3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pResult = result;
3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pOffset += nbBits;
3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
3112703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_getBits no error");
3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
3132703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_getBits ERROR 0x%X", err);
3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3152703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_getBits end");
3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define FREQ_TABLE_SIZE 16
3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UInt32 AD_AAC_FREQ_TABLE[FREQ_TABLE_SIZE] =
3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {96000, 88200, 64000, 48000, 44100,
3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0};
3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_parse_AAC_DSI(M4OSA_Int8* pDSI,
3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 dsiSize, AAC_DEC_STREAM_PROPS* pProperties) {
3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 offset = 0;
3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 result = 0;
3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3332703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_parse_AAC_DSI begin");
3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pDSI, M4ERR_PARAMETER);
3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pProperties, M4ERR_PARAMETER);
3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Get the object type
3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = VideoEditorAudioDecoder_getBits(pDSI, dsiSize, 5, &result, &offset);
3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( result ) {
3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 2:
344799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury            /* Audio Object Type is 2 (AAC Low Complexity) */
3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pProperties->aPSPresent  = 0;
3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pProperties->aSBRPresent = 0;
3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
348799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury        case 5:
349799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury            /* Audio Object Type is 5 (Spectral Band Replication) */
350799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury            pProperties->aPSPresent  = 0;
351799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury            pProperties->aSBRPresent = 1;
352799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury            break;
353799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury        case 29:
354799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury            /* Audio Object Type is 29 (Parametric Stereo) */
355799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury            pProperties->aPSPresent  = 1;
356799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury            pProperties->aSBRPresent = 1;
357799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury            break;
3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
3592703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("parse_AAC_DSI ERROR : object type %d is not supported",
3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                result);
3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(!"invalid AAC object type", M4ERR_BAD_OPTION_ID);
3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pProperties->aAudioObjectType = (M4OSA_Int32)result;
3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Get the frequency index
3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = VideoEditorAudioDecoder_getBits(pDSI, dsiSize, 4, &result, &offset);
3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK((0 <= result) && (FREQ_TABLE_SIZE > result),
3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ERR_PARAMETER);
3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pProperties->aSampFreq = AD_AAC_FREQ_TABLE[result];
3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pProperties->aExtensionSampFreq = 0;
3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Get the number of channels
3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = VideoEditorAudioDecoder_getBits(pDSI, dsiSize, 4, &result, &offset);
3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pProperties->aNumChan = (M4OSA_UInt32)result;
3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Set the max PCM samples per channel
3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pProperties->aMaxPCMSamplesPerCh = (pProperties->aSBRPresent) ? 2048 : 1024;
3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
3842703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_parse_AAC_DSI no error");
3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
3862703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_parse_AAC_DSI ERROR 0x%X", err);
3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3882703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_parse_AAC_DSI end");
3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/********************
3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * ENGINE INTERFACE *
3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************/
3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_destroy(M4AD_Context pContext) {
3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4002703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_destroy begin");
4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Stop the graph
4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pDecoderContext->mDecoder.get() ) {
4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pDecoderContext->mDecoder->stop();
4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Destroy the graph
4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mDecoderSource.clear();
4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mDecoder.clear();
4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mClient.disconnect();
4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_FREE(pDecoderContext);
4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pContext = M4OSA_NULL;
4182703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_destroy : DONE");
4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
4222703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_destroy no error");
4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
4242703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_destroy ERROR 0x%X", err);
4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4262703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_destroy : end");
4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create(M4AD_Type decoderType,
4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Context* pContext, M4_AudioStreamHandler* pStreamHandler,
4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        void* pUserData) {
4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    AAC_DEC_STREAM_PROPS aacProperties;
4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t result = OK;
4377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<MetaData> decoderMetaData = NULL;
4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    const char* mime = NULL;
4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint32_t codecFlags = 0;
4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4412703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_create begin: decoderType %d", decoderType);
4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext,       M4ERR_PARAMETER);
4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pStreamHandler, M4ERR_PARAMETER);
4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Context allocation & initialization
4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_MALLOC(pDecoderContext, VideoEditorAudioDecoder_Context, 1,
4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "AudioDecoder");
4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mDecoderType = decoderType;
4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mAudioStreamHandler = pStreamHandler;
4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mNbInputFrames  = 0;
4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mNbOutputFrames = 0;
455bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    pDecoderContext->readerErrCode = M4NO_ERROR;
456bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    pDecoderContext->timeStampMs = -1;
4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4582703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_create : maxAUSize %d",
4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pDecoderContext->mAudioStreamHandler->m_basicProperties.m_maxAUSize);
4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Create the meta data for the decoder
4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    decoderMetaData = new MetaData;
4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( pDecoderContext->mDecoderType ) {
4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeAMRNB:
4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // StageFright parameters
4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_AMR_NB;
4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // Engine parameters
4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteFrameLength = 160;
469ec380153defefa617d1f83e2910fd9e58a641c12Dheeraj Sharma            // Number of bytes per sample
470ec380153defefa617d1f83e2910fd9e58a641c12Dheeraj Sharma            pDecoderContext->mAudioStreamHandler->m_byteSampleSize = 2;
4717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_samplingFrequency = 8000;
4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_nbChannels = 1;
4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeAMRWB:
4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // StageFright parameters
4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_AMR_WB;
4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteFrameLength = 160;
480ec380153defefa617d1f83e2910fd9e58a641c12Dheeraj Sharma            // Number of bytes per sample
481ec380153defefa617d1f83e2910fd9e58a641c12Dheeraj Sharma            pDecoderContext->mAudioStreamHandler->m_byteSampleSize = 2;
4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_samplingFrequency = 16000;
4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_nbChannels = 1;
4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeAAC:
4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // Reject ADTS & ADIF (or any incorrect type)
4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4DA_StreamTypeAudioAac ==
4897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pDecoderContext->mAudioStreamHandler->\
4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_basicProperties.m_streamType,M4ERR_PARAMETER);
4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // StageFright parameters
4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_AAC;
4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            decoderMetaData->setData(kKeyESDS, kTypeESDS,
4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pStreamHandler->m_basicProperties.m_pESDSInfo,
4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pStreamHandler->m_basicProperties.m_ESDSInfoSize);
4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // Engine parameters
5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // Retrieve sampling frequency and number of channels from the DSI
5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = VideoEditorAudioDecoder_parse_AAC_DSI(
5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_Int8*)pStreamHandler->m_basicProperties.\
5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    m_pDecoderSpecificInfo,
5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pStreamHandler->m_basicProperties.m_decoderSpecificInfoSize,
5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                &aacProperties);
5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteFrameLength = 1024;
509ec380153defefa617d1f83e2910fd9e58a641c12Dheeraj Sharma            // Number of bytes per sample
510ec380153defefa617d1f83e2910fd9e58a641c12Dheeraj Sharma            pDecoderContext->mAudioStreamHandler->m_byteSampleSize = 2;
5117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_samplingFrequency =
5127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                aacProperties.aSampFreq;
5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_nbChannels =
5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                aacProperties.aNumChan;
5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // Copy the stream properties into userdata
5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4OSA_NULL != pUserData ) {
51832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                memcpy((void *)pUserData,
51932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    (void *)&aacProperties,
5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    sizeof(AAC_DEC_STREAM_PROPS));
5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
5227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeMP3:
5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // StageFright parameters
5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_MPEG;
5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
5287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(!"AudioDecoder_open : incorrect input format",
5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4ERR_STATE);
5327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
5337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    decoderMetaData->setCString(kKeyMIMEType, mime);
5357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    decoderMetaData->setInt32(kKeySampleRate,
5367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (int32_t)pDecoderContext->mAudioStreamHandler->m_samplingFrequency);
5377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    decoderMetaData->setInt32(kKeyChannelCount,
5387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pDecoderContext->mAudioStreamHandler->m_nbChannels);
5397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    decoderMetaData->setInt64(kKeyDuration,
5407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (int64_t)pDecoderContext->mAudioStreamHandler->\
5417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        m_basicProperties.m_duration);
5427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Create the decoder source
5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mDecoderSource = VideoEditorAudioDecoderSource::Create(
545bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        decoderMetaData, (void *)pDecoderContext);
5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(NULL != pDecoderContext->mDecoderSource.get(),
5477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ERR_STATE);
5487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Connect to the OMX client
5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    result = pDecoderContext->mClient.connect();
5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Create the OMX codec
5547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef VIDEOEDITOR_FORCECODEC
5557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    codecFlags |= OMXCodec::VIDEOEDITOR_FORCECODEC;
5567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* VIDEOEDITOR_FORCECODEC */
5577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mDecoder = OMXCodec::Create(pDecoderContext->\
5597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mClient.interface(),
5607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        decoderMetaData, false, pDecoderContext->mDecoderSource, NULL,
5617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            codecFlags);
5627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(NULL != pDecoderContext->mDecoder.get(), M4ERR_STATE);
5637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Get the output channels, the decoder might overwrite the input metadata
5657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mDecoder->getFormat()->findInt32(kKeyChannelCount,
5667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        &pDecoderContext->mNbOutputChannels);
5672703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_create : output chan %d",
5687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pDecoderContext->mNbOutputChannels);
5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Start the decoder
5717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    result = pDecoderContext->mDecoder->start();
5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pContext = pDecoderContext;
5752703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_create : DONE");
5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
5787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
5792703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_create no error");
5807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
5817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorAudioDecoder_destroy(pDecoderContext);
5827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pContext = M4OSA_NULL;
5832703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_create ERROR 0x%X", err);
5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
5867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
5877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_AAC(M4AD_Context* pContext,
5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
5927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeAAC, pContext, pStreamHandler,pUserData);
5937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
5947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_AMRNB(M4AD_Context* pContext,
5977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
5987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
6007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeAMRNB, pContext, pStreamHandler, pUserData);
6017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
6027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_AMRWB(M4AD_Context* pContext,
6057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeAMRWB, pContext, pStreamHandler, pUserData);
6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
6107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_MP3(M4AD_Context* pContext,
6137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
6167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeMP3, pContext, pStreamHandler, pUserData);
6177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_processInputBuffer(
6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Context pContext, M4AD_Buffer* pInputBuffer) {
6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBuffer* buffer = NULL;
6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6252703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_processInputBuffer begin");
6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pInputBuffer ) {
6337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        buffer = new MediaBuffer((size_t)pInputBuffer->m_bufferSize);
63432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)((M4OSA_Int8*)buffer->data() + buffer->range_offset()),
63532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (void *)pInputBuffer->m_dataAddress, pInputBuffer->m_bufferSize);
63601158eac3464fc6e7837be594d6a8d14172154bcRajneesh Chowdury        buffer->meta_data()->setInt64(kKeyTime, pInputBuffer->m_timeStampUs);
6377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
638f80b313837cca881971bb0afebf23a0381fb99a0Chih-Chung Chang    pDecoderContext->mDecoderSource->storeBuffer(buffer);
6397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
6417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
6422703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_processInputBuffer no error");
6437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
6442703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_processInputBuffer ERROR 0x%X", err);
6457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6462703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_processInputBuffer end");
6477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
6487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
6497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_processOutputBuffer(M4AD_Context pContext,
6517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        MediaBuffer* buffer, M4AD_Buffer* pOuputBuffer) {
6527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
6537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
6547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t i32Tmp = 0;
6557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int64_t i64Tmp = 0;
6567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t result = OK;
6577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6582703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_processOutputBuffer begin");
6597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
6607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
6617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != buffer, M4ERR_PARAMETER);
6627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pOuputBuffer, M4ERR_PARAMETER);
6637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
6657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Process the returned data
6677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( 0 == buffer->range_length() ) {
6687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Decoder has no data yet, nothing unusual
6697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        goto cleanUp;
6707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mNbOutputFrames++;
6737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pDecoderContext->mAudioStreamHandler->m_nbChannels ==
6757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt32)pDecoderContext->mNbOutputChannels ) {
6767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Just copy the PCMs
6777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOuputBuffer->m_bufferSize = (M4OSA_UInt32)buffer->range_length();
67832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)pOuputBuffer->m_dataAddress,
67932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (void *)(((M4OSA_MemAddr8)buffer->data())+buffer->range_offset()),
6807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            buffer->range_length());
6817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else if( pDecoderContext->mAudioStreamHandler->m_nbChannels <
6827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt32)pDecoderContext->mNbOutputChannels ) {
6837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // The decoder forces stereo output, downsample
6847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOuputBuffer->m_bufferSize = (M4OSA_UInt32)(buffer->range_length()/2);
6857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int16* pDataIn  = ((M4OSA_Int16*)buffer->data()) +
6867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            buffer->range_offset();
6877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int16* pDataOut = (M4OSA_Int16*)pOuputBuffer->m_dataAddress;
6887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int16* pDataEnd = pDataIn + \
6897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (buffer->range_length()/sizeof(M4OSA_Int16));
6907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        while( pDataIn < pDataEnd ) {
6917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pDataOut = *pDataIn;
6927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDataIn+=2;
6937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDataOut++;
6947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
6957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
6967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // The decoder forces mono output, not supported
6977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER);
6987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
7017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Release the buffer
7027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    buffer->release();
7037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
7042703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_processOutputBuffer no error");
7057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
7067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOuputBuffer->m_bufferSize = 0;
7072703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_processOutputBuffer ERROR 0x%X", err);
7087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7092703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_processOutputBuffer end");
7107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
7117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
7127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_step(M4AD_Context pContext,
7147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Buffer* pInputBuffer, M4AD_Buffer* pOutputBuffer,
7157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Bool bJump) {
7167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
7177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
7187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t result = OK;
7197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBuffer* outputBuffer = NULL;
7207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7212703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_step begin");
7227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
7237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
7247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
7267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mNbInputFrames++;
7277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Push the input buffer to the decoder source
7297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = VideoEditorAudioDecoder_processInputBuffer(pDecoderContext,
7307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pInputBuffer);
7317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
7327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Read
7347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    result = pDecoderContext->mDecoder->read(&outputBuffer, NULL);
735bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    if (INFO_FORMAT_CHANGED == result) {
7362703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_step: Audio decoder \
737bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury         returned INFO_FORMAT_CHANGED");
738bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        CHECK(outputBuffer == NULL);
739bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        sp<MetaData> meta = pDecoderContext->mDecoder->getFormat();
740bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        int32_t sampleRate, channelCount;
741bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
742bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        CHECK(meta->findInt32(kKeySampleRate, &sampleRate));
743bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        CHECK(meta->findInt32(kKeyChannelCount, &channelCount));
7442703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_step: samplingFreq = %d", sampleRate);
7452703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_step: channelCnt = %d", channelCount);
746bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        pDecoderContext->mAudioStreamHandler->m_samplingFrequency =
747bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury         (uint32_t)sampleRate;
748bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        pDecoderContext->mAudioStreamHandler->m_nbChannels =
749bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury         (uint32_t)channelCount;
750bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        pDecoderContext->mNbOutputChannels = channelCount;
751bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
752bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        return M4WAR_INFO_FORMAT_CHANGE;
753bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    } else if (ERROR_END_OF_STREAM == result) {
7542703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_step: Audio decoder \
755bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury         returned ERROR_END_OF_STREAM");
756bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        pDecoderContext->readerErrCode = M4WAR_NO_MORE_AU;
757bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        return M4WAR_NO_MORE_AU;
758bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    } else if (OK != result) {
759bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        return M4ERR_STATE;
7607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Convert the PCM buffer
7637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = VideoEditorAudioDecoder_processOutputBuffer(pDecoderContext,
7647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outputBuffer, pOutputBuffer);
7657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
7667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
7687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
7692703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_step no error");
7707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
7712703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_step ERROR 0x%X", err);
7727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7732703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_step end");
7747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
7757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
7767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getVersion(M4_VersionInfo* pVersionInfo) {
7787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
7797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7802703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_getVersion begin");
7817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
7827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pVersionInfo, M4ERR_PARAMETER);
7837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pVersionInfo->m_major      = VIDEOEDITOR_AUDIO_DECODER_VERSION_MAJOR;
7857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pVersionInfo->m_minor      = VIDEOEDITOR_AUDIO_DECODER_VERSION_MINOR;
7867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pVersionInfo->m_revision   = VIDEOEDITOR_AUDIO_DECODER_VERSION_REV;
7877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pVersionInfo->m_structSize = sizeof(M4_VersionInfo);
7887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
7907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
7912703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_getVersion no error");
7927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
7932703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_getVersion ERROR 0x%X", err);
7947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7952703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_getVersion end");
7967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
7977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
7987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_setOption(M4AD_Context pContext,
8007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 optionID, M4OSA_DataOption optionValue) {
8017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
8037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
8047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8052703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_setOption begin 0x%X", optionID);
8067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
8077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
8087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
8107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( optionID ) {
8127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kOptionID_UserParam:
8132703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditorAudioDecodersetOption UserParam is not supported");
8147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4ERR_NOT_IMPLEMENTED;
8157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
816bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
817bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        case M4AD_kOptionID_3gpReaderInterface:
8182703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditorAudioDecodersetOption 3gpReaderInterface");
819bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            pDecoderContext->m_pReader =
820bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury             (M4READER_DataInterface *)optionValue;
821bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            break;
822bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
823bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        case M4AD_kOptionID_AudioAU:
8242703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditorAudioDecodersetOption AudioAU");
825bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            pDecoderContext->m_pNextAccessUnitToDecode =
826bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury             (M4_AccessUnit *)optionValue;
827bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            break;
828bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
8297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
8302703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditorAudioDecoder_setOption  unsupported optionId 0x%X",
8317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                optionID);
8327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
8337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
8347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
8357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
8377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ((M4OSA_UInt32)M4NO_ERROR == err) || ((M4OSA_UInt32)M4ERR_NOT_IMPLEMENTED == err) ) {
8382703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_setOption error 0x%X", err);
8397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
8402703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_setOption ERROR 0x%X", err);
8417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
8422703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_setOption end");
8437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
8447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
8457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getOption(M4AD_Context pContext,
8477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 optionID, M4OSA_DataOption optionValue) {
8487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
8507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
8517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8522703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_getOption begin: optionID 0x%X", optionID);
8537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
8547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
8557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
8577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( optionID ) {
859bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
860bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        case M4AD_kOptionID_GetAudioAUErrCode:
861bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            *(uint32_t *)optionValue = pDecoderContext->readerErrCode;
862bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            break;
863bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
864bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        case M4AD_kOptionID_AudioNbChannels:
865bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            *(uint32_t *)optionValue =
866bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury             pDecoderContext->mAudioStreamHandler->m_nbChannels;
867bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            break;
868bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
869bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        case M4AD_kOptionID_AudioSampFrequency:
870bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            *(uint32_t *)optionValue =
871bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury             pDecoderContext->mAudioStreamHandler->m_samplingFrequency;
872bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            break;
873bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
874bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        case M4AD_kOptionID_AuCTS:
875bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            *(uint32_t *)optionValue = pDecoderContext->timeStampMs;
876bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            break;
877bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
8787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
8792703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditorAudioDecoder_getOption unsupported optionId 0x%X",
8807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                optionID);
8817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
8827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
8837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
8847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
8867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
8872703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_getOption no error");
8887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
8892703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_getOption ERROR 0x%X", err);
8907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
8912703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_getOption end");
8927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
8937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
8947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface(M4AD_Type decoderType,
8967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Type* pDecoderType, M4AD_Interface** pDecoderInterface) {
8977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
8997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
9017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pDecoderType, M4ERR_PARAMETER);
9027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pDecoderInterface, M4ERR_PARAMETER);
9037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9042703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_getInterface begin %d 0x%x 0x%x",
9057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        decoderType, pDecoderType, pDecoderInterface);
9067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_MALLOC(*pDecoderInterface, M4AD_Interface, 1,
9087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditorAudioDecoder");
9097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pDecoderType = decoderType;
9117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( decoderType ) {
9137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeAMRNB:
9147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
9157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditorAudioDecoder_create_AMRNB;
9167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
9177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeAMRWB:
9187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
9197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditorAudioDecoder_create_AMRWB;
9207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
9217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeAAC:
9227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
9237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditorAudioDecoder_create_AAC;
9247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
9257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeMP3:
9267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
9277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditorAudioDecoder_create_MP3;
9287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
9297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
9302703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VEAD_getInterface ERROR: unsupported type %d", decoderType);
9317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER);
9327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
9337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
9347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pDecoderInterface)->m_pFctDestroyAudioDec   =
9357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorAudioDecoder_destroy;
9367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pDecoderInterface)->m_pFctResetAudioDec     = M4OSA_NULL;
9377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pDecoderInterface)->m_pFctStartAudioDec     = M4OSA_NULL;
9387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pDecoderInterface)->m_pFctStepAudioDec      =
9397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorAudioDecoder_step;
9407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pDecoderInterface)->m_pFctGetVersionAudioDec =
9417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorAudioDecoder_getVersion;
9427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pDecoderInterface)->m_pFctSetOptionAudioDec =
9437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorAudioDecoder_setOption;
9447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pDecoderInterface)->m_pFctGetOptionAudioDec =
9457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorAudioDecoder_getOption;
9467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
9487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
9492703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_getInterface no error");
9507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
9517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pDecoderInterface = M4OSA_NULL;
9522703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorAudioDecoder_getInterface ERROR 0x%X", err);
9537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
9542703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorAudioDecoder_getInterface end");
9557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
9567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
9577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiextern "C" {
9607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_AAC(M4AD_Type* pDecoderType,
9627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
9632703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("TEST: AAC VideoEditorAudioDecoder_getInterface no error");
9647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
9657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeAAC, pDecoderType, pDecoderInterface);
9667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
9677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_AMRNB(M4AD_Type* pDecoderType,
9697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
9702703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("TEST: AMR VideoEditorAudioDecoder_getInterface no error");
9717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
9727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeAMRNB, pDecoderType, pDecoderInterface);
9737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
9747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_AMRWB(M4AD_Type* pDecoderType,
9767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
9777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
9797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeAMRWB, pDecoderType, pDecoderInterface);
9807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
9817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_MP3(M4AD_Type* pDecoderType,
9837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
9847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
9867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeMP3, pDecoderType, pDecoderInterface);
9877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
9887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}  // extern "C"
9907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}  // namespace android
992