10c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/*
20c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
30c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *
40c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License");
50c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * you may not use this file except in compliance with the License.
60c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * You may obtain a copy of the License at
70c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *
80c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *      http://www.apache.org/licenses/LICENSE-2.0
90c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *
100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software
110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS,
120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * See the License for the specific language governing permissions and
140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * limitations under the License.
150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi */
160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*************************************************************************
180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @file   VideoEditorAudioDecoder.cpp
190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @brief  StageFright shell Audio Decoder
200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*************************************************************************
210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define LOG_NDEBUG 1
240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define LOG_TAG "VIDEOEDITOR_AUDIODECODER"
250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4OSA_Debug.h"
270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "VideoEditorAudioDecoder.h"
280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "VideoEditorUtils.h"
290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4MCS_InternalTypes.h"
300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "utils/Log.h"
3235ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang#include "utils/Vector.h"
330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MediaSource.h>
340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MediaDebug.h>
350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MediaDefs.h>
360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MetaData.h>
370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/OMXClient.h>
380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/OMXCodec.h>
390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/********************
410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *   DEFINITIONS    *
420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ********************/
430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi// Version
440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define VIDEOEDITOR_AUDIO_DECODER_VERSION_MAJOR 1
450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define VIDEOEDITOR_AUDIO_DECODER_VERSION_MINOR 0
460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define VIDEOEDITOR_AUDIO_DECODER_VERSION_REV   0
470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi// Force using software decoder as engine does not support prefetch
490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define VIDEOEDITOR_FORCECODEC kSoftwareCodecsOnly
500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundarginamespace android {
520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistruct VideoEditorAudioDecoderSource : public MediaSource {
540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    public:
550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        static sp<VideoEditorAudioDecoderSource> Create(
562b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury                const sp<MetaData>& format, void *decoderShellContext);
570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        virtual status_t start(MetaData *params = NULL);
580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        virtual status_t stop();
590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        virtual sp<MetaData> getFormat();
600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        virtual status_t read(MediaBuffer **buffer,
610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        const ReadOptions *options = NULL);
6235ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        virtual void storeBuffer(MediaBuffer *buffer);
630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    protected:
650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        virtual ~VideoEditorAudioDecoderSource();
660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    private:
680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        enum State {
690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            CREATED,
700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            STARTED,
710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            ERROR
720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        };
732b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        VideoEditorAudioDecoderSource(const sp<MetaData>& format,
742b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury         void *decoderShellContext);
750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        sp<MetaData> mFormat;
7635ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        Vector<MediaBuffer*> mBuffers;
7735ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        Mutex mLock;  // protects mBuffers
780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        bool mIsEOS;
790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        State mState;
802b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        void* mDecShellContext;
8130e3046dbb4125360d11d5fdbf938975a99577f8James Dong        // Don't call me.
8230e3046dbb4125360d11d5fdbf938975a99577f8James Dong        VideoEditorAudioDecoderSource(const VideoEditorAudioDecoderSource&);
8330e3046dbb4125360d11d5fdbf938975a99577f8James Dong        VideoEditorAudioDecoderSource& operator=(
8430e3046dbb4125360d11d5fdbf938975a99577f8James Dong            const VideoEditorAudioDecoderSource &);
850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi};
860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
872b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury/**
882b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury ******************************************************************************
892b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury * structure VideoEditorAudioDecoder_Context
902b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury * @brief    This structure defines the context of the StageFright audio decoder
912b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury *           shell
922b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury ******************************************************************************
932b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury*/
942b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
952b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdurytypedef struct {
962b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    M4AD_Type                          mDecoderType;
972b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    M4_AudioStreamHandler*             mAudioStreamHandler;
982b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    sp<VideoEditorAudioDecoderSource>  mDecoderSource;
992b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    OMXClient                          mClient;
1002b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    sp<MediaSource>                    mDecoder;
1012b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    int32_t                            mNbOutputChannels;
1022b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    uint32_t                           mNbInputFrames;
1032b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    uint32_t                           mNbOutputFrames;
1042b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    M4READER_DataInterface  *m_pReader;
1052b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    M4_AccessUnit* m_pNextAccessUnitToDecode;
1062b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    M4OSA_ERR readerErrCode;
1072b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    int32_t timeStampMs;
1082b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
1092b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury} VideoEditorAudioDecoder_Context;
1102b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
1110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargisp<VideoEditorAudioDecoderSource> VideoEditorAudioDecoderSource::Create(
1122b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        const sp<MetaData>& format, void *decoderShellContext) {
1130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    sp<VideoEditorAudioDecoderSource> aSource =
1152b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        new VideoEditorAudioDecoderSource(format, decoderShellContext);
1160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return aSource;
1180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
1190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiVideoEditorAudioDecoderSource::VideoEditorAudioDecoderSource(
1212b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        const sp<MetaData>& format, void* decoderShellContext):
1220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mFormat(format),
1230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mIsEOS(false),
1242b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        mState(CREATED),
1252b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        mDecShellContext(decoderShellContext) {
1260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
1270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiVideoEditorAudioDecoderSource::~VideoEditorAudioDecoderSource() {
1290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( STARTED == mState ) {
1310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        stop();
1320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
1330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
1340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatus_t VideoEditorAudioDecoderSource::start(MetaData *meta) {
1360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    status_t err = OK;
1370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( CREATED != mState ) {
1390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoderSource::start: invalid state %d", mState);
1400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return UNKNOWN_ERROR;
1410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
1420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    mState = STARTED;
1440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
1460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::start END (0x%x)", err);
1470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
1480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
1490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatus_t VideoEditorAudioDecoderSource::stop() {
15135ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    Mutex::Autolock autolock(mLock);
1520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    status_t err = OK;
1530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::stop begin");
1550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( STARTED != mState ) {
1570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoderSource::stop: invalid state %d", mState);
1580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return UNKNOWN_ERROR;
1590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
1600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
16135ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    if (!mBuffers.empty()) {
16235ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        int n = mBuffers.size();
16335ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        for (int i = 0; i < n; i++) {
16435ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang            mBuffers.itemAt(i)->release();
16535ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        }
16635ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        LOGW("VideoEditorAudioDecoderSource::stop : %d buffer remained", n);
16735ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        mBuffers.clear();
1680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
1690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    mState = CREATED;
1710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::stop END (0x%x)", err);
1730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
1740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
1750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargisp<MetaData> VideoEditorAudioDecoderSource::getFormat() {
1770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::getFormat");
1790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return mFormat;
1800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
1810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
18235ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Changstatic MediaBuffer* readBufferFromReader(
18335ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        VideoEditorAudioDecoder_Context* pDecContext) {
18435ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    M4OSA_ERR lerr = M4NO_ERROR;
18535ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    M4_AccessUnit* pAccessUnit = pDecContext->m_pNextAccessUnitToDecode;
18635ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang
18735ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    // Get next AU from reader.
18835ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    lerr = pDecContext->m_pReader->m_pFctGetNextAu(
18935ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang               pDecContext->m_pReader->m_readerContext,
19035ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang               (M4_StreamHandler*)pDecContext->mAudioStreamHandler,
19135ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang               pAccessUnit);
19235ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang
19335ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    if (lerr == M4WAR_NO_MORE_AU) {
19435ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        LOGV("readBufferFromReader : EOS");
19535ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        return NULL;
19635ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    }
19735ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang
19835ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    pDecContext->timeStampMs = pAccessUnit->m_CTS;
19935ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang
20035ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    MediaBuffer* newBuffer = new MediaBuffer((size_t)pAccessUnit->m_size);
20135ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    memcpy((void *)((M4OSA_Int8*)newBuffer->data() + newBuffer->range_offset()),
20235ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        (void *)pAccessUnit->m_dataAddress, pAccessUnit->m_size);
20335ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    newBuffer->meta_data()->setInt64(kKeyTime, (pAccessUnit->m_CTS * 1000LL));
20435ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    return newBuffer;
20535ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang}
20635ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang
2070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatus_t VideoEditorAudioDecoderSource::read(MediaBuffer **buffer,
2080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        const ReadOptions *options) {
20935ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    Mutex::Autolock autolock(mLock);
2100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    MediaSource::ReadOptions readOptions;
2112b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
2122b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    VideoEditorAudioDecoder_Context* pDecContext =
2132b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury     (VideoEditorAudioDecoder_Context *)mDecShellContext;
2140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if ( STARTED != mState ) {
2160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoderSource::read invalid state %d", mState);
2170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return UNKNOWN_ERROR;
2180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
2190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
22035ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    // Get a buffer from the reader if we don't have any
22135ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    if(mBuffers.empty()) {
22235ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        MediaBuffer* newBuffer = readBufferFromReader(pDecContext);
22335ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        if (!newBuffer) {
2242b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            *buffer = NULL;
2252b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            pDecContext->readerErrCode = M4WAR_NO_MORE_AU;
2260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            return ERROR_END_OF_STREAM;
2272b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        }
22835ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        mBuffers.push(newBuffer);
2290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
23035ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    *buffer = mBuffers.itemAt(0);
23135ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    mBuffers.removeAt(0);
2320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
23335ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    return OK;
2340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
2350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
23635ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Changvoid VideoEditorAudioDecoderSource::storeBuffer(MediaBuffer *buffer) {
23735ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    Mutex::Autolock autolock(mLock);
2382b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    VideoEditorAudioDecoder_Context* pDecContext =
2392b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury     (VideoEditorAudioDecoder_Context *)mDecShellContext;
2400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::storeBuffer begin");
2420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
24335ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    // If the user didn't give us a buffer, get it from the reader.
24435ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    if(buffer == NULL) {
24535ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        MediaBuffer* newBuffer = readBufferFromReader(pDecContext);
24635ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        if (!newBuffer) {
2472b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            pDecContext->readerErrCode = M4WAR_NO_MORE_AU;
24835ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang            return;
2492b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        }
25035ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang        buffer = newBuffer;
2512b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    }
2522b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
25335ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    mBuffers.push(buffer);
2540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::storeBuffer END");
2550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
2560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/********************
2580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *      TOOLS       *
2590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ********************/
2600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getBits(M4OSA_Int8* pData,
2620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 dataSize, M4OSA_UInt8 nbBits, M4OSA_Int32* pResult,
2630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32* pOffset) {
2640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
2660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 startByte = 0;
2670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 startBit = 0;
2680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 endByte = 0;
2690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 endBit = 0;
2700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 currentByte = 0;
2710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 result = 0;
2720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 ui32Tmp = 0;
2730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 ui32Mask = 0;
2740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
2760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pData, M4ERR_PARAMETER);
2770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pOffset, M4ERR_PARAMETER);
2780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(32 >= nbBits, M4ERR_PARAMETER);
2790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK((*pOffset + nbBits) <= 8*dataSize, M4ERR_PARAMETER);
2800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getBits begin");
2820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    startByte   = (*pOffset) >> 3;
2840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    endByte     = (*pOffset + nbBits) >> 3;
2850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    startBit    = (*pOffset) % 8;
2860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    endBit      = (*pOffset + nbBits) % 8;
2870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    currentByte = startByte;
2880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Extract the requested nunber of bits from memory
2900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    while( currentByte <= endByte) {
2910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        ui32Mask = 0x000000FF;
2920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if( currentByte == startByte ) {
2930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            ui32Mask >>= startBit;
2940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
2950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        ui32Tmp = ui32Mask & ((M4OSA_UInt32)pData[currentByte]);
2960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if( currentByte == endByte ) {
2970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            ui32Tmp >>= (8-endBit);
2980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            result <<= endBit;
2990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        } else {
3000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            result <<= 8;
3010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
3020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        result |= ui32Tmp;
3030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        currentByte++;
3040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
3050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    *pResult = result;
3070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    *pOffset += nbBits;
3080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
3100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
3110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getBits no error");
3120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
3130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getBits ERROR 0x%X", err);
3140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
3150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getBits end");
3160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
3170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
3180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define FREQ_TABLE_SIZE 16
3210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargiconst M4OSA_UInt32 AD_AAC_FREQ_TABLE[FREQ_TABLE_SIZE] =
3220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    {96000, 88200, 64000, 48000, 44100,
3230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0};
3240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_parse_AAC_DSI(M4OSA_Int8* pDSI,
3270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 dsiSize, AAC_DEC_STREAM_PROPS* pProperties) {
3280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
3300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 offset = 0;
3310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Int32 result = 0;
3320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_parse_AAC_DSI begin");
3340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
3360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pDSI, M4ERR_PARAMETER);
3370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pProperties, M4ERR_PARAMETER);
3380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Get the object type
3400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    err = VideoEditorAudioDecoder_getBits(pDSI, dsiSize, 5, &result, &offset);
3410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
3420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    switch( result ) {
3430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case 2:
34420db0a4ef7996f9b36f28aa1c0bd296549da526aRajneesh Chowdury            /* Audio Object Type is 2 (AAC Low Complexity) */
3450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pProperties->aPSPresent  = 0;
3460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pProperties->aSBRPresent = 0;
3470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
34820db0a4ef7996f9b36f28aa1c0bd296549da526aRajneesh Chowdury        case 5:
34920db0a4ef7996f9b36f28aa1c0bd296549da526aRajneesh Chowdury            /* Audio Object Type is 5 (Spectral Band Replication) */
35020db0a4ef7996f9b36f28aa1c0bd296549da526aRajneesh Chowdury            pProperties->aPSPresent  = 0;
35120db0a4ef7996f9b36f28aa1c0bd296549da526aRajneesh Chowdury            pProperties->aSBRPresent = 1;
35220db0a4ef7996f9b36f28aa1c0bd296549da526aRajneesh Chowdury            break;
35320db0a4ef7996f9b36f28aa1c0bd296549da526aRajneesh Chowdury        case 29:
35420db0a4ef7996f9b36f28aa1c0bd296549da526aRajneesh Chowdury            /* Audio Object Type is 29 (Parametric Stereo) */
35520db0a4ef7996f9b36f28aa1c0bd296549da526aRajneesh Chowdury            pProperties->aPSPresent  = 1;
35620db0a4ef7996f9b36f28aa1c0bd296549da526aRajneesh Chowdury            pProperties->aSBRPresent = 1;
35720db0a4ef7996f9b36f28aa1c0bd296549da526aRajneesh Chowdury            break;
3580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        default:
3590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("parse_AAC_DSI ERROR : object type %d is not supported",
3600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                result);
3610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VIDEOEDITOR_CHECK(!"invalid AAC object type", M4ERR_BAD_OPTION_ID);
3620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
3630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
3640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pProperties->aAudioObjectType = (M4OSA_Int32)result;
3650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Get the frequency index
3670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    err = VideoEditorAudioDecoder_getBits(pDSI, dsiSize, 4, &result, &offset);
3680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
3690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK((0 <= result) && (FREQ_TABLE_SIZE > result),
3700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4ERR_PARAMETER);
3710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pProperties->aSampFreq = AD_AAC_FREQ_TABLE[result];
3720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pProperties->aExtensionSampFreq = 0;
3730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Get the number of channels
3750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    err = VideoEditorAudioDecoder_getBits(pDSI, dsiSize, 4, &result, &offset);
3760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
3770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pProperties->aNumChan = (M4OSA_UInt32)result;
3780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Set the max PCM samples per channel
3800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pProperties->aMaxPCMSamplesPerCh = (pProperties->aSBRPresent) ? 2048 : 1024;
3810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
3830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
3840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_parse_AAC_DSI no error");
3850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
3860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_parse_AAC_DSI ERROR 0x%X", err);
3870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
3880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_parse_AAC_DSI end");
3890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
3900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
3910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/********************
3930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * ENGINE INTERFACE *
3940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ********************/
3950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_destroy(M4AD_Context pContext) {
3970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
3980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
3990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_destroy begin");
4010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
4020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
4030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
4050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Stop the graph
4070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4OSA_NULL != pDecoderContext->mDecoder.get() ) {
4080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pDecoderContext->mDecoder->stop();
4090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
4100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Destroy the graph
4120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mDecoderSource.clear();
4130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mDecoder.clear();
4140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mClient.disconnect();
4150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    SAFE_FREE(pDecoderContext);
4170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pContext = M4OSA_NULL;
4180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_destroy : DONE");
4190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
4210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
4220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_destroy no error");
4230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
4240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_destroy ERROR 0x%X", err);
4250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
4260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_destroy : end");
4270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
4280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
4290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create(M4AD_Type decoderType,
4310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Context* pContext, M4_AudioStreamHandler* pStreamHandler,
4320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        void* pUserData) {
4330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
4340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
4350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    AAC_DEC_STREAM_PROPS aacProperties;
4360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    status_t result = OK;
4370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    sp<MetaData> decoderMetaData = NULL;
4380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    const char* mime = NULL;
4390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    uint32_t codecFlags = 0;
4400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_create begin: decoderType %d", decoderType);
4420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
4440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext,       M4ERR_PARAMETER);
4450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pStreamHandler, M4ERR_PARAMETER);
4460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Context allocation & initialization
4480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    SAFE_MALLOC(pDecoderContext, VideoEditorAudioDecoder_Context, 1,
4490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "AudioDecoder");
4500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mDecoderType = decoderType;
4510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mAudioStreamHandler = pStreamHandler;
4520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mNbInputFrames  = 0;
4540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mNbOutputFrames = 0;
4552b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    pDecoderContext->readerErrCode = M4NO_ERROR;
4562b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    pDecoderContext->timeStampMs = -1;
4570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_create : maxAUSize %d",
4590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pDecoderContext->mAudioStreamHandler->m_basicProperties.m_maxAUSize);
4600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Create the meta data for the decoder
4620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    decoderMetaData = new MetaData;
4630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    switch( pDecoderContext->mDecoderType ) {
4640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeAMRNB:
4650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // StageFright parameters
4660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_AMR_NB;
4670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // Engine parameters
4680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteFrameLength = 160;
4690f0c93006ad63439a06b5f706cb86e14f924b1caDheeraj Sharma            // Number of bytes per sample
4700f0c93006ad63439a06b5f706cb86e14f924b1caDheeraj Sharma            pDecoderContext->mAudioStreamHandler->m_byteSampleSize = 2;
4710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_samplingFrequency = 8000;
4720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_nbChannels = 1;
4730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
4740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeAMRWB:
4760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // StageFright parameters
4770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_AMR_WB;
4780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteFrameLength = 160;
4800f0c93006ad63439a06b5f706cb86e14f924b1caDheeraj Sharma            // Number of bytes per sample
4810f0c93006ad63439a06b5f706cb86e14f924b1caDheeraj Sharma            pDecoderContext->mAudioStreamHandler->m_byteSampleSize = 2;
4820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_samplingFrequency = 16000;
4830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_nbChannels = 1;
4840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
4850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeAAC:
4870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // Reject ADTS & ADIF (or any incorrect type)
4880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4DA_StreamTypeAudioAac ==
4890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pDecoderContext->mAudioStreamHandler->\
4900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                m_basicProperties.m_streamType,M4ERR_PARAMETER);
4910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // StageFright parameters
4930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_AAC;
4940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            decoderMetaData->setData(kKeyESDS, kTypeESDS,
4960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pStreamHandler->m_basicProperties.m_pESDSInfo,
4970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pStreamHandler->m_basicProperties.m_ESDSInfoSize);
4980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // Engine parameters
5000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // Retrieve sampling frequency and number of channels from the DSI
5010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            err = VideoEditorAudioDecoder_parse_AAC_DSI(
5020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (M4OSA_Int8*)pStreamHandler->m_basicProperties.\
5030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    m_pDecoderSpecificInfo,
5040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pStreamHandler->m_basicProperties.m_decoderSpecificInfoSize,
5050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                &aacProperties);
5060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
5080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteFrameLength = 1024;
5090f0c93006ad63439a06b5f706cb86e14f924b1caDheeraj Sharma            // Number of bytes per sample
5100f0c93006ad63439a06b5f706cb86e14f924b1caDheeraj Sharma            pDecoderContext->mAudioStreamHandler->m_byteSampleSize = 2;
5110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_samplingFrequency =
5120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                aacProperties.aSampFreq;
5130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_nbChannels =
5140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                aacProperties.aNumChan;
5150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // Copy the stream properties into userdata
5170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if( M4OSA_NULL != pUserData ) {
5189d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                memcpy((void *)pUserData,
5199d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                    (void *)&aacProperties,
5200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    sizeof(AAC_DEC_STREAM_PROPS));
5210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
5220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
5230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeMP3:
5250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // StageFright parameters
5260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_MPEG;
5270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
5280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        default:
5300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VIDEOEDITOR_CHECK(!"AudioDecoder_open : incorrect input format",
5310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                M4ERR_STATE);
5320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
5330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
5340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    decoderMetaData->setCString(kKeyMIMEType, mime);
5350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    decoderMetaData->setInt32(kKeySampleRate,
5360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (int32_t)pDecoderContext->mAudioStreamHandler->m_samplingFrequency);
5370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    decoderMetaData->setInt32(kKeyChannelCount,
5380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pDecoderContext->mAudioStreamHandler->m_nbChannels);
5390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    decoderMetaData->setInt64(kKeyDuration,
5400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (int64_t)pDecoderContext->mAudioStreamHandler->\
5410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        m_basicProperties.m_duration);
5420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Create the decoder source
5440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mDecoderSource = VideoEditorAudioDecoderSource::Create(
5452b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        decoderMetaData, (void *)pDecoderContext);
5460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(NULL != pDecoderContext->mDecoderSource.get(),
5470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4ERR_STATE);
5480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Connect to the OMX client
5500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    result = pDecoderContext->mClient.connect();
5510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
5520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Create the OMX codec
5540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#ifdef VIDEOEDITOR_FORCECODEC
5550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    codecFlags |= OMXCodec::VIDEOEDITOR_FORCECODEC;
5560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#endif /* VIDEOEDITOR_FORCECODEC */
5570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mDecoder = OMXCodec::Create(pDecoderContext->\
5590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mClient.interface(),
5600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        decoderMetaData, false, pDecoderContext->mDecoderSource, NULL,
5610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            codecFlags);
5620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(NULL != pDecoderContext->mDecoder.get(), M4ERR_STATE);
5630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Get the output channels, the decoder might overwrite the input metadata
5650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mDecoder->getFormat()->findInt32(kKeyChannelCount,
5660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        &pDecoderContext->mNbOutputChannels);
5670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_create : output chan %d",
5680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pDecoderContext->mNbOutputChannels);
5690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Start the decoder
5710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    result = pDecoderContext->mDecoder->start();
5720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
5730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    *pContext = pDecoderContext;
5750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_create : DONE");
5760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
5780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
5790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_create no error");
5800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
5810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditorAudioDecoder_destroy(pDecoderContext);
5820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        *pContext = M4OSA_NULL;
5830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_create ERROR 0x%X", err);
5840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
5850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
5860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
5870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_AAC(M4AD_Context* pContext,
5890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
5900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
5920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeAAC, pContext, pStreamHandler,pUserData);
5930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
5940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_AMRNB(M4AD_Context* pContext,
5970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
5980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
6000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeAMRNB, pContext, pStreamHandler, pUserData);
6010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
6020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_AMRWB(M4AD_Context* pContext,
6050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
6060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
6080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeAMRWB, pContext, pStreamHandler, pUserData);
6090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
6100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_MP3(M4AD_Context* pContext,
6130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
6140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
6160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeMP3, pContext, pStreamHandler, pUserData);
6170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
6180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_processInputBuffer(
6200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Context pContext, M4AD_Buffer* pInputBuffer) {
6210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
6220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
6230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    MediaBuffer* buffer = NULL;
6240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_processInputBuffer begin");
6260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
6270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
6280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
6310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4OSA_NULL != pInputBuffer ) {
6330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        buffer = new MediaBuffer((size_t)pInputBuffer->m_bufferSize);
6349d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu        memcpy((void *)((M4OSA_Int8*)buffer->data() + buffer->range_offset()),
6359d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu            (void *)pInputBuffer->m_dataAddress, pInputBuffer->m_bufferSize);
636da8497c15550bae49e0f9031c1baa6fa6a6b1190Rajneesh Chowdury        buffer->meta_data()->setInt64(kKeyTime, pInputBuffer->m_timeStampUs);
6370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
63835ee100026726f4b23a6ee8e2df7f64ae493d963Chih-Chung Chang    pDecoderContext->mDecoderSource->storeBuffer(buffer);
6390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
6410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
6420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_processInputBuffer no error");
6430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
6440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_processInputBuffer ERROR 0x%X", err);
6450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
6460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_processInputBuffer end");
6470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
6480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
6490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_processOutputBuffer(M4AD_Context pContext,
6510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        MediaBuffer* buffer, M4AD_Buffer* pOuputBuffer) {
6520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
6530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
6540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    int32_t i32Tmp = 0;
6550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    int64_t i64Tmp = 0;
6560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    status_t result = OK;
6570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_processOutputBuffer begin");
6590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
6600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
6610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != buffer, M4ERR_PARAMETER);
6620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pOuputBuffer, M4ERR_PARAMETER);
6630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
6650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Process the returned data
6670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( 0 == buffer->range_length() ) {
6680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        // Decoder has no data yet, nothing unusual
6690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        goto cleanUp;
6700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
6710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mNbOutputFrames++;
6730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( pDecoderContext->mAudioStreamHandler->m_nbChannels ==
6750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (M4OSA_UInt32)pDecoderContext->mNbOutputChannels ) {
6760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        // Just copy the PCMs
6770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pOuputBuffer->m_bufferSize = (M4OSA_UInt32)buffer->range_length();
6789d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu        memcpy((void *)pOuputBuffer->m_dataAddress,
6799d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu            (void *)(((M4OSA_MemAddr8)buffer->data())+buffer->range_offset()),
6800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            buffer->range_length());
6810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else if( pDecoderContext->mAudioStreamHandler->m_nbChannels <
6820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (M4OSA_UInt32)pDecoderContext->mNbOutputChannels ) {
6830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        // The decoder forces stereo output, downsample
6840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pOuputBuffer->m_bufferSize = (M4OSA_UInt32)(buffer->range_length()/2);
6850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Int16* pDataIn  = ((M4OSA_Int16*)buffer->data()) +
6860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            buffer->range_offset();
6870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Int16* pDataOut = (M4OSA_Int16*)pOuputBuffer->m_dataAddress;
6880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Int16* pDataEnd = pDataIn + \
6890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (buffer->range_length()/sizeof(M4OSA_Int16));
6900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        while( pDataIn < pDataEnd ) {
6910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            *pDataOut = *pDataIn;
6920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDataIn+=2;
6930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDataOut++;
6940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
6950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
6960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        // The decoder forces mono output, not supported
6970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER);
6980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
6990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
7010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Release the buffer
7020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    buffer->release();
7030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
7040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_processOutputBuffer no error");
7050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
7060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pOuputBuffer->m_bufferSize = 0;
7070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_processOutputBuffer ERROR 0x%X", err);
7080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
7090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_processOutputBuffer end");
7100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
7110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
7120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_step(M4AD_Context pContext,
7140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Buffer* pInputBuffer, M4AD_Buffer* pOutputBuffer,
7150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Bool bJump) {
7160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
7170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
7180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    status_t result = OK;
7190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    MediaBuffer* outputBuffer = NULL;
7200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_step begin");
7220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
7230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
7240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
7260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mNbInputFrames++;
7270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Push the input buffer to the decoder source
7290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    err = VideoEditorAudioDecoder_processInputBuffer(pDecoderContext,
7300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pInputBuffer);
7310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
7320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Read
7340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    result = pDecoderContext->mDecoder->read(&outputBuffer, NULL);
7352b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    if (INFO_FORMAT_CHANGED == result) {
7362b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        LOGV("VideoEditorAudioDecoder_step: Audio decoder \
7372b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury         returned INFO_FORMAT_CHANGED");
7382b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        CHECK(outputBuffer == NULL);
7392b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        sp<MetaData> meta = pDecoderContext->mDecoder->getFormat();
7402b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        int32_t sampleRate, channelCount;
7412b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
7422b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        CHECK(meta->findInt32(kKeySampleRate, &sampleRate));
7432b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        CHECK(meta->findInt32(kKeyChannelCount, &channelCount));
7442b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        LOGV("VideoEditorAudioDecoder_step: samplingFreq = %d", sampleRate);
7452b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        LOGV("VideoEditorAudioDecoder_step: channelCnt = %d", channelCount);
7462b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        pDecoderContext->mAudioStreamHandler->m_samplingFrequency =
7472b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury         (uint32_t)sampleRate;
7482b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        pDecoderContext->mAudioStreamHandler->m_nbChannels =
7492b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury         (uint32_t)channelCount;
7502b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        pDecoderContext->mNbOutputChannels = channelCount;
7512b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
7522b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        return M4WAR_INFO_FORMAT_CHANGE;
7532b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    } else if (ERROR_END_OF_STREAM == result) {
7542b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        LOGV("VideoEditorAudioDecoder_step: Audio decoder \
7552b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury         returned ERROR_END_OF_STREAM");
7562b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        pDecoderContext->readerErrCode = M4WAR_NO_MORE_AU;
7572b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        return M4WAR_NO_MORE_AU;
7582b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury    } else if (OK != result) {
7592b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        return M4ERR_STATE;
7600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
7610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Convert the PCM buffer
7630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    err = VideoEditorAudioDecoder_processOutputBuffer(pDecoderContext,
7640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        outputBuffer, pOutputBuffer);
7650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
7660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
7680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
7690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_step no error");
7700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
7710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_step ERROR 0x%X", err);
7720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
7730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_step end");
7740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
7750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
7760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getVersion(M4_VersionInfo* pVersionInfo) {
7780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
7790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getVersion begin");
7810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
7820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pVersionInfo, M4ERR_PARAMETER);
7830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pVersionInfo->m_major      = VIDEOEDITOR_AUDIO_DECODER_VERSION_MAJOR;
7850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pVersionInfo->m_minor      = VIDEOEDITOR_AUDIO_DECODER_VERSION_MINOR;
7860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pVersionInfo->m_revision   = VIDEOEDITOR_AUDIO_DECODER_VERSION_REV;
7870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pVersionInfo->m_structSize = sizeof(M4_VersionInfo);
7880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
7900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
7910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getVersion no error");
7920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
7930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getVersion ERROR 0x%X", err);
7940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
7950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getVersion end");
7960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
7970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
7980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_setOption(M4AD_Context pContext,
8000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 optionID, M4OSA_DataOption optionValue) {
8010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
8030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
8040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_setOption begin 0x%X", optionID);
8060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
8070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
8080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
8100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    switch( optionID ) {
8120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kOptionID_UserParam:
8130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditorAudioDecodersetOption UserParam is not supported");
8140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            err = M4ERR_NOT_IMPLEMENTED;
8150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
8162b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
8172b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        case M4AD_kOptionID_3gpReaderInterface:
8182b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            LOGV("VideoEditorAudioDecodersetOption 3gpReaderInterface");
8192b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            pDecoderContext->m_pReader =
8202b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury             (M4READER_DataInterface *)optionValue;
8212b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            break;
8222b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
8232b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        case M4AD_kOptionID_AudioAU:
8242b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            LOGV("VideoEditorAudioDecodersetOption AudioAU");
8252b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            pDecoderContext->m_pNextAccessUnitToDecode =
8262b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury             (M4_AccessUnit *)optionValue;
8272b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            break;
8282b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
8290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        default:
8300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditorAudioDecoder_setOption  unsupported optionId 0x%X",
8310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                optionID);
8320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
8330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
8340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
8350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
8370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( ((M4OSA_UInt32)M4NO_ERROR == err) || ((M4OSA_UInt32)M4ERR_NOT_IMPLEMENTED == err) ) {
8380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_setOption error 0x%X", err);
8390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
8400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_setOption ERROR 0x%X", err);
8410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
8420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_setOption end");
8430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
8440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
8450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getOption(M4AD_Context pContext,
8470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 optionID, M4OSA_DataOption optionValue) {
8480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
8500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
8510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getOption begin: optionID 0x%X", optionID);
8530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
8540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
8550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
8570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    switch( optionID ) {
8592b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
8602b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        case M4AD_kOptionID_GetAudioAUErrCode:
8612b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            *(uint32_t *)optionValue = pDecoderContext->readerErrCode;
8622b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            break;
8632b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
8642b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        case M4AD_kOptionID_AudioNbChannels:
8652b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            *(uint32_t *)optionValue =
8662b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury             pDecoderContext->mAudioStreamHandler->m_nbChannels;
8672b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            break;
8682b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
8692b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        case M4AD_kOptionID_AudioSampFrequency:
8702b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            *(uint32_t *)optionValue =
8712b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury             pDecoderContext->mAudioStreamHandler->m_samplingFrequency;
8722b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            break;
8732b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
8742b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury        case M4AD_kOptionID_AuCTS:
8752b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            *(uint32_t *)optionValue = pDecoderContext->timeStampMs;
8762b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury            break;
8772b421029254f3149928646def0a84e6f380a47a9Rajneesh Chowdury
8780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        default:
8790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditorAudioDecoder_getOption unsupported optionId 0x%X",
8800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                optionID);
8810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
8820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
8830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
8840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
8860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
8870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getOption no error");
8880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
8890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getOption ERROR 0x%X", err);
8900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
8910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getOption end");
8920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
8930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
8940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface(M4AD_Type decoderType,
8960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Type* pDecoderType, M4AD_Interface** pDecoderInterface) {
8970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
8990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
9010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pDecoderType, M4ERR_PARAMETER);
9020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pDecoderInterface, M4ERR_PARAMETER);
9030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getInterface begin %d 0x%x 0x%x",
9050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        decoderType, pDecoderType, pDecoderInterface);
9060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    SAFE_MALLOC(*pDecoderInterface, M4AD_Interface, 1,
9080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditorAudioDecoder");
9090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    *pDecoderType = decoderType;
9110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    switch( decoderType ) {
9130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeAMRNB:
9140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
9150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                VideoEditorAudioDecoder_create_AMRNB;
9160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
9170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeAMRWB:
9180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
9190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                VideoEditorAudioDecoder_create_AMRWB;
9200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
9210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeAAC:
9220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
9230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                VideoEditorAudioDecoder_create_AAC;
9240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
9250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeMP3:
9260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
9270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                VideoEditorAudioDecoder_create_MP3;
9280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
9290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        default:
9300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VEAD_getInterface ERROR: unsupported type %d", decoderType);
9310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER);
9320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
9330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
9340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pDecoderInterface)->m_pFctDestroyAudioDec   =
9350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditorAudioDecoder_destroy;
9360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pDecoderInterface)->m_pFctResetAudioDec     = M4OSA_NULL;
9370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pDecoderInterface)->m_pFctStartAudioDec     = M4OSA_NULL;
9380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pDecoderInterface)->m_pFctStepAudioDec      =
9390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditorAudioDecoder_step;
9400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pDecoderInterface)->m_pFctGetVersionAudioDec =
9410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditorAudioDecoder_getVersion;
9420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pDecoderInterface)->m_pFctSetOptionAudioDec =
9430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditorAudioDecoder_setOption;
9440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pDecoderInterface)->m_pFctGetOptionAudioDec =
9450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditorAudioDecoder_getOption;
9460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
9480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
9490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getInterface no error");
9500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
9510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        *pDecoderInterface = M4OSA_NULL;
9520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getInterface ERROR 0x%X", err);
9530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
9540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getInterface end");
9550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
9560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
9570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargiextern "C" {
9600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_AAC(M4AD_Type* pDecoderType,
9620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
9630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("TEST: AAC VideoEditorAudioDecoder_getInterface no error");
9640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
9650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeAAC, pDecoderType, pDecoderInterface);
9660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
9670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_AMRNB(M4AD_Type* pDecoderType,
9690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
9700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("TEST: AMR VideoEditorAudioDecoder_getInterface no error");
9710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
9720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeAMRNB, pDecoderType, pDecoderInterface);
9730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
9740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_AMRWB(M4AD_Type* pDecoderType,
9760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
9770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
9790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeAMRWB, pDecoderType, pDecoderInterface);
9800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
9810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_MP3(M4AD_Type* pDecoderType,
9830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
9840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
9860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeMP3, pDecoderType, pDecoderInterface);
9870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
9880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}  // extern "C"
9900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}  // namespace android
992