VideoEditorAudioDecoder.cpp revision 7c9d8018755adf1857571125ba1b3598c96ea506
17c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*
27c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 NXP Software
37c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
47c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
57c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License");
67c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * you may not use this file except in compliance with the License.
77c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * You may obtain a copy of the License at
87c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
97c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *      http://www.apache.org/licenses/LICENSE-2.0
107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software
127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS,
137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * See the License for the specific language governing permissions and
157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * limitations under the License.
167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*************************************************************************
197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @file   VideoEditorAudioDecoder.cpp
207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief  StageFright shell Audio Decoder
217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*************************************************************************
227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_NDEBUG 1
257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_TAG "VIDEOEDITOR_AUDIODECODER"
267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h"
287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditorAudioDecoder.h"
297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditorUtils.h"
307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_InternalTypes.h"
317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "utils/Log.h"
337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaSource.h>
347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaDebug.h>
357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaDefs.h>
367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MetaData.h>
377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/OMXClient.h>
387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/OMXCodec.h>
397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/********************
417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *   DEFINITIONS    *
427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************/
437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi// Version
447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define VIDEOEDITOR_AUDIO_DECODER_VERSION_MAJOR 1
457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define VIDEOEDITOR_AUDIO_DECODER_VERSION_MINOR 0
467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define VIDEOEDITOR_AUDIO_DECODER_VERSION_REV   0
477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi// Force using software decoder as engine does not support prefetch
497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define VIDEOEDITOR_FORCECODEC kSoftwareCodecsOnly
507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundarginamespace android {
527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistruct VideoEditorAudioDecoderSource : public MediaSource {
547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    public:
557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        static sp<VideoEditorAudioDecoderSource> Create(
567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                const sp<MetaData>& format);
577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual status_t start(MetaData *params = NULL);
587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual status_t stop();
597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual sp<MetaData> getFormat();
607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual status_t read(MediaBuffer **buffer,
617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        const ReadOptions *options = NULL);
627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual int32_t storeBuffer(MediaBuffer *buffer);
637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    protected:
657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual ~VideoEditorAudioDecoderSource();
667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    private:
687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        struct MediaBufferChain {
697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            MediaBuffer* buffer;
707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            MediaBufferChain* nextLink;
717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        };
727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        enum State {
737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            CREATED,
747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            STARTED,
757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ERROR
767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        };
777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorAudioDecoderSource(const sp<MetaData>& format);
787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sp<MetaData> mFormat;
797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        MediaBufferChain* mFirstBufferLink;
807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        MediaBufferChain* mLastBufferLink;
817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        int32_t mNbBuffer;
827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bool mIsEOS;
837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        State mState;
847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi};
857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargisp<VideoEditorAudioDecoderSource> VideoEditorAudioDecoderSource::Create(
877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        const sp<MetaData>& format) {
887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<VideoEditorAudioDecoderSource> aSource =
907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        new VideoEditorAudioDecoderSource(format);
917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return aSource;
937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiVideoEditorAudioDecoderSource::VideoEditorAudioDecoderSource(
967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        const sp<MetaData>& format):
977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mFormat(format),
987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mFirstBufferLink(NULL),
997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mLastBufferLink(NULL),
1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mNbBuffer(0),
1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mIsEOS(false),
1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mState(CREATED) {
1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiVideoEditorAudioDecoderSource::~VideoEditorAudioDecoderSource() {
1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( STARTED == mState ) {
1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        stop();
1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorAudioDecoderSource::start(MetaData *meta) {
1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t err = OK;
1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( CREATED != mState ) {
1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoderSource::start: invalid state %d", mState);
1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return UNKNOWN_ERROR;
1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mState = STARTED;
1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::start END (0x%x)", err);
1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorAudioDecoderSource::stop() {
1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t err = OK;
1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t i = 0;
1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::stop begin");
1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( STARTED != mState ) {
1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoderSource::stop: invalid state %d", mState);
1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return UNKNOWN_ERROR;
1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Release the buffer chain
1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBufferChain* tmpLink = NULL;
1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while( mFirstBufferLink ) {
1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        i++;
1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        tmpLink = mFirstBufferLink;
1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mFirstBufferLink = mFirstBufferLink->nextLink;
1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        delete tmpLink;
1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::stop : %d buffer remained", i);
1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mFirstBufferLink = NULL;
1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mLastBufferLink = NULL;
1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mState = CREATED;
1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::stop END (0x%x)", err);
1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargisp<MetaData> VideoEditorAudioDecoderSource::getFormat() {
1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::getFormat");
1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return mFormat;
1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorAudioDecoderSource::read(MediaBuffer **buffer,
1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        const ReadOptions *options) {
1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaSource::ReadOptions readOptions;
1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t err = OK;
1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBufferChain* tmpLink = NULL;
1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::read begin");
1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( STARTED != mState ) {
1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoderSource::read invalid state %d", mState);
1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return UNKNOWN_ERROR;
1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Get a buffer from the chain
1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( NULL == mFirstBufferLink ) {
1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *buffer = NULL;
1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( mIsEOS ) {
1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditorAudioDecoderSource::read : EOS");
1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return ERROR_END_OF_STREAM;
1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditorAudioDecoderSource::read : no buffer available");
1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return UNKNOWN_ERROR;
1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *buffer = mFirstBufferLink->buffer;
1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    tmpLink = mFirstBufferLink;
1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mFirstBufferLink = mFirstBufferLink->nextLink;
1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( NULL == mFirstBufferLink ) {
1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mLastBufferLink = NULL;
1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    delete tmpLink;
1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mNbBuffer--;
1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::read END (0x%x)", err);
1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiint32_t VideoEditorAudioDecoderSource::storeBuffer(MediaBuffer *buffer) {
2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t err = OK;
2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::storeBuffer begin");
2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // A NULL input buffer means that the end of stream was reached
2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( NULL == buffer ) {
2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mIsEOS = true;
2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        MediaBufferChain* newLink = new MediaBufferChain;
2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        newLink->buffer = buffer;
2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        newLink->nextLink = NULL;
2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( NULL != mLastBufferLink ) {
2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mLastBufferLink->nextLink = newLink;
2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mFirstBufferLink = newLink;
2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mLastBufferLink = newLink;
2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mNbBuffer++;
2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::storeBuffer END");
2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return mNbBuffer;
2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/********************
2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *      TOOLS       *
2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************/
2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getBits(M4OSA_Int8* pData,
2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 dataSize, M4OSA_UInt8 nbBits, M4OSA_Int32* pResult,
2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32* pOffset) {
2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 startByte = 0;
2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 startBit = 0;
2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 endByte = 0;
2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 endBit = 0;
2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 currentByte = 0;
2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 result = 0;
2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 ui32Tmp = 0;
2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 ui32Mask = 0;
2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pData, M4ERR_PARAMETER);
2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pOffset, M4ERR_PARAMETER);
2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(32 >= nbBits, M4ERR_PARAMETER);
2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK((*pOffset + nbBits) <= 8*dataSize, M4ERR_PARAMETER);
2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getBits begin");
2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    startByte   = (*pOffset) >> 3;
2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    endByte     = (*pOffset + nbBits) >> 3;
2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    startBit    = (*pOffset) % 8;
2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    endBit      = (*pOffset + nbBits) % 8;
2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    currentByte = startByte;
2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Extract the requested nunber of bits from memory
2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while( currentByte <= endByte) {
2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ui32Mask = 0x000000FF;
2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( currentByte == startByte ) {
2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ui32Mask >>= startBit;
2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ui32Tmp = ui32Mask & ((M4OSA_UInt32)pData[currentByte]);
2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( currentByte == endByte ) {
2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ui32Tmp >>= (8-endBit);
2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            result <<= endBit;
2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            result <<= 8;
2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        result |= ui32Tmp;
2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        currentByte++;
2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pResult = result;
2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pOffset += nbBits;
2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getBits no error");
2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getBits ERROR 0x%X", err);
2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getBits end");
2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define FREQ_TABLE_SIZE 16
2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UInt32 AD_AAC_FREQ_TABLE[FREQ_TABLE_SIZE] =
2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {96000, 88200, 64000, 48000, 44100,
2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0};
2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_parse_AAC_DSI(M4OSA_Int8* pDSI,
2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 dsiSize, AAC_DEC_STREAM_PROPS* pProperties) {
2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 offset = 0;
2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 result = 0;
2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_parse_AAC_DSI begin");
3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pDSI, M4ERR_PARAMETER);
3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pProperties, M4ERR_PARAMETER);
3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Get the object type
3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = VideoEditorAudioDecoder_getBits(pDSI, dsiSize, 5, &result, &offset);
3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( result ) {
3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 2:
3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pProperties->aPSPresent  = 0;
3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pProperties->aSBRPresent = 0;
3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("parse_AAC_DSI ERROR : object type %d is not supported",
3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                result);
3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(!"invalid AAC object type", M4ERR_BAD_OPTION_ID);
3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pProperties->aAudioObjectType = (M4OSA_Int32)result;
3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Get the frequency index
3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = VideoEditorAudioDecoder_getBits(pDSI, dsiSize, 4, &result, &offset);
3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK((0 <= result) && (FREQ_TABLE_SIZE > result),
3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ERR_PARAMETER);
3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pProperties->aSampFreq = AD_AAC_FREQ_TABLE[result];
3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pProperties->aExtensionSampFreq = 0;
3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Get the number of channels
3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = VideoEditorAudioDecoder_getBits(pDSI, dsiSize, 4, &result, &offset);
3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pProperties->aNumChan = (M4OSA_UInt32)result;
3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Set the max PCM samples per channel
3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pProperties->aMaxPCMSamplesPerCh = (pProperties->aSBRPresent) ? 2048 : 1024;
3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_parse_AAC_DSI no error");
3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_parse_AAC_DSI ERROR 0x%X", err);
3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_parse_AAC_DSI end");
3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/********************
3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * ENGINE INTERFACE *
3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************/
3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * structure VideoEditorAudioDecoder_Context
3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    This structure defines the context of the StageFright audio decoder
3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *           shell
3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargitypedef struct {
3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4AD_Type                          mDecoderType;
3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_AudioStreamHandler*             mAudioStreamHandler;
3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<VideoEditorAudioDecoderSource>  mDecoderSource;
3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    OMXClient                          mClient;
3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<MediaSource>                    mDecoder;
3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t                            mNbOutputChannels;
3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint32_t                           mNbInputFrames;
3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint32_t                           mNbOutputFrames;
3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} VideoEditorAudioDecoder_Context;
3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_destroy(M4AD_Context pContext) {
3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_destroy begin");
3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Stop the graph
3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pDecoderContext->mDecoder.get() ) {
3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pDecoderContext->mDecoder->stop();
3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Destroy the graph
3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mDecoderSource.clear();
3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mDecoder.clear();
3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mClient.disconnect();
3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_FREE(pDecoderContext);
3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pContext = M4OSA_NULL;
3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_destroy : DONE");
3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_destroy no error");
3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_destroy ERROR 0x%X", err);
3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_destroy : end");
4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create(M4AD_Type decoderType,
4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Context* pContext, M4_AudioStreamHandler* pStreamHandler,
4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        void* pUserData) {
4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    AAC_DEC_STREAM_PROPS aacProperties;
4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t result = OK;
4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<MetaData> decoderMetaData = NULL;
4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    const char* mime = NULL;
4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint32_t codecFlags = 0;
4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_create begin: decoderType %d", decoderType);
4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext,       M4ERR_PARAMETER);
4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pStreamHandler, M4ERR_PARAMETER);
4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Context allocation & initialization
4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_MALLOC(pDecoderContext, VideoEditorAudioDecoder_Context, 1,
4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "AudioDecoder");
4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mDecoderType = decoderType;
4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mAudioStreamHandler = pStreamHandler;
4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mNbInputFrames  = 0;
4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mNbOutputFrames = 0;
4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_create : maxAUSize %d",
4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pDecoderContext->mAudioStreamHandler->m_basicProperties.m_maxAUSize);
4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Create the meta data for the decoder
4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    decoderMetaData = new MetaData;
4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( pDecoderContext->mDecoderType ) {
4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeAMRNB:
4377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // StageFright parameters
4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_AMR_NB;
4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // Engine parameters
4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteFrameLength = 160;
4417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteSampleSize = 16;
4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_samplingFrequency = 8000;
4437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_nbChannels = 1;
4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeAMRWB:
4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // StageFright parameters
4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_AMR_WB;
4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteFrameLength = 160;
4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteSampleSize = 16;
4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_samplingFrequency = 16000;
4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_nbChannels = 1;
4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeAAC:
4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // Reject ADTS & ADIF (or any incorrect type)
4587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4DA_StreamTypeAudioAac ==
4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pDecoderContext->mAudioStreamHandler->\
4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_basicProperties.m_streamType,M4ERR_PARAMETER);
4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // StageFright parameters
4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_AAC;
4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            decoderMetaData->setData(kKeyESDS, kTypeESDS,
4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pStreamHandler->m_basicProperties.m_pESDSInfo,
4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pStreamHandler->m_basicProperties.m_ESDSInfoSize);
4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // Engine parameters
4707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // Retrieve sampling frequency and number of channels from the DSI
4717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = VideoEditorAudioDecoder_parse_AAC_DSI(
4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_Int8*)pStreamHandler->m_basicProperties.\
4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    m_pDecoderSpecificInfo,
4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pStreamHandler->m_basicProperties.m_decoderSpecificInfoSize,
4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                &aacProperties);
4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteFrameLength = 1024;
4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteSampleSize = 16;
4807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_samplingFrequency =
4817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                aacProperties.aSampFreq;
4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_nbChannels =
4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                aacProperties.aNumChan;
4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // Copy the stream properties into userdata
4867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4OSA_NULL != pUserData ) {
4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_memcpy((M4OSA_MemAddr8)pUserData,
4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_MemAddr8)&aacProperties,
4897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    sizeof(AAC_DEC_STREAM_PROPS));
4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
4927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeMP3:
4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // StageFright parameters
4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_MPEG;
4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(!"AudioDecoder_open : incorrect input format",
5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4ERR_STATE);
5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    decoderMetaData->setCString(kKeyMIMEType, mime);
5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    decoderMetaData->setInt32(kKeySampleRate,
5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (int32_t)pDecoderContext->mAudioStreamHandler->m_samplingFrequency);
5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    decoderMetaData->setInt32(kKeyChannelCount,
5077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pDecoderContext->mAudioStreamHandler->m_nbChannels);
5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    decoderMetaData->setInt64(kKeyDuration,
5097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (int64_t)pDecoderContext->mAudioStreamHandler->\
5107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        m_basicProperties.m_duration);
5117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Create the decoder source
5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mDecoderSource = VideoEditorAudioDecoderSource::Create(
5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        decoderMetaData);
5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(NULL != pDecoderContext->mDecoderSource.get(),
5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ERR_STATE);
5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Connect to the OMX client
5197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    result = pDecoderContext->mClient.connect();
5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Create the OMX codec
5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef VIDEOEDITOR_FORCECODEC
5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    codecFlags |= OMXCodec::VIDEOEDITOR_FORCECODEC;
5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* VIDEOEDITOR_FORCECODEC */
5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mDecoder = OMXCodec::Create(pDecoderContext->\
5287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mClient.interface(),
5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        decoderMetaData, false, pDecoderContext->mDecoderSource, NULL,
5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            codecFlags);
5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(NULL != pDecoderContext->mDecoder.get(), M4ERR_STATE);
5327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Get the output channels, the decoder might overwrite the input metadata
5347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mDecoder->getFormat()->findInt32(kKeyChannelCount,
5357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        &pDecoderContext->mNbOutputChannels);
5367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_create : output chan %d",
5377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pDecoderContext->mNbOutputChannels);
5387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Start the decoder
5407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    result = pDecoderContext->mDecoder->start();
5417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
5427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pContext = pDecoderContext;
5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_create : DONE");
5457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
5477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
5487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_create no error");
5497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorAudioDecoder_destroy(pDecoderContext);
5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pContext = M4OSA_NULL;
5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_create ERROR 0x%X", err);
5537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
5557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
5567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_AAC(M4AD_Context* pContext,
5587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
5597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
5617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeAAC, pContext, pStreamHandler,pUserData);
5627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
5637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_AMRNB(M4AD_Context* pContext,
5667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
5677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeAMRNB, pContext, pStreamHandler, pUserData);
5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
5717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_AMRWB(M4AD_Context* pContext,
5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
5757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeAMRWB, pContext, pStreamHandler, pUserData);
5787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
5797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_MP3(M4AD_Context* pContext,
5827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
5837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeMP3, pContext, pStreamHandler, pUserData);
5867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
5877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_processInputBuffer(
5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Context pContext, M4AD_Buffer* pInputBuffer) {
5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
5927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBuffer* buffer = NULL;
5937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t nbBuffer = 0;
5947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_processInputBuffer begin");
5967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
5977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
5987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
6017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pInputBuffer ) {
6037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        buffer = new MediaBuffer((size_t)pInputBuffer->m_bufferSize);
6047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_memcpy((M4OSA_Int8*)buffer->data() + buffer->range_offset(),
6057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pInputBuffer->m_dataAddress, pInputBuffer->m_bufferSize);
6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    nbBuffer = pDecoderContext->mDecoderSource->storeBuffer(buffer);
6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
6107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_processInputBuffer no error");
6127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
6137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_processInputBuffer ERROR 0x%X", err);
6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_processInputBuffer end");
6167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
6177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_processOutputBuffer(M4AD_Context pContext,
6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        MediaBuffer* buffer, M4AD_Buffer* pOuputBuffer) {
6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t i32Tmp = 0;
6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int64_t i64Tmp = 0;
6257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t result = OK;
6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_processOutputBuffer begin");
6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != buffer, M4ERR_PARAMETER);
6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pOuputBuffer, M4ERR_PARAMETER);
6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
6347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Process the returned data
6367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( 0 == buffer->range_length() ) {
6377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Decoder has no data yet, nothing unusual
6387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        goto cleanUp;
6397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mNbOutputFrames++;
6427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pDecoderContext->mAudioStreamHandler->m_nbChannels ==
6447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt32)pDecoderContext->mNbOutputChannels ) {
6457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Just copy the PCMs
6467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOuputBuffer->m_bufferSize = (M4OSA_UInt32)buffer->range_length();
6477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_memcpy(pOuputBuffer->m_dataAddress,
6487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ((M4OSA_MemAddr8)buffer->data())+buffer->range_offset(),
6497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            buffer->range_length());
6507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else if( pDecoderContext->mAudioStreamHandler->m_nbChannels <
6517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt32)pDecoderContext->mNbOutputChannels ) {
6527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // The decoder forces stereo output, downsample
6537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOuputBuffer->m_bufferSize = (M4OSA_UInt32)(buffer->range_length()/2);
6547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int16* pDataIn  = ((M4OSA_Int16*)buffer->data()) +
6557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            buffer->range_offset();
6567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int16* pDataOut = (M4OSA_Int16*)pOuputBuffer->m_dataAddress;
6577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int16* pDataEnd = pDataIn + \
6587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (buffer->range_length()/sizeof(M4OSA_Int16));
6597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        while( pDataIn < pDataEnd ) {
6607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pDataOut = *pDataIn;
6617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDataIn+=2;
6627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDataOut++;
6637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
6647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
6657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // The decoder forces mono output, not supported
6667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER);
6677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
6707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Release the buffer
6717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    buffer->release();
6727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
6737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_processOutputBuffer no error");
6747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
6757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOuputBuffer->m_bufferSize = 0;
6767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_processOutputBuffer ERROR 0x%X", err);
6777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_processOutputBuffer end");
6797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
6807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
6817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_step(M4AD_Context pContext,
6837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Buffer* pInputBuffer, M4AD_Buffer* pOutputBuffer,
6847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Bool bJump) {
6857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
6867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
6877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t result = OK;
6887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBuffer* outputBuffer = NULL;
6897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_step begin");
6917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
6927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
6937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
6957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext->mNbInputFrames++;
6967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Push the input buffer to the decoder source
6987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = VideoEditorAudioDecoder_processInputBuffer(pDecoderContext,
6997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pInputBuffer);
7007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
7017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Read
7037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    result = pDecoderContext->mDecoder->read(&outputBuffer, NULL);
7047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(OK != result) {
7057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGE("VideoEditorAudioDecoder_step  result = %d",result);
7067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
7097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Convert the PCM buffer
7117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = VideoEditorAudioDecoder_processOutputBuffer(pDecoderContext,
7127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outputBuffer, pOutputBuffer);
7137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
7147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
7167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
7177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_step no error");
7187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
7197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_step ERROR 0x%X", err);
7207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_step end");
7227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
7237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
7247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getVersion(M4_VersionInfo* pVersionInfo) {
7267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
7277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getVersion begin");
7297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
7307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pVersionInfo, M4ERR_PARAMETER);
7317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pVersionInfo->m_major      = VIDEOEDITOR_AUDIO_DECODER_VERSION_MAJOR;
7337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pVersionInfo->m_minor      = VIDEOEDITOR_AUDIO_DECODER_VERSION_MINOR;
7347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pVersionInfo->m_revision   = VIDEOEDITOR_AUDIO_DECODER_VERSION_REV;
7357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pVersionInfo->m_structSize = sizeof(M4_VersionInfo);
7367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
7387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
7397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getVersion no error");
7407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
7417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getVersion ERROR 0x%X", err);
7427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getVersion end");
7447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
7457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
7467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_setOption(M4AD_Context pContext,
7487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 optionID, M4OSA_DataOption optionValue) {
7497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
7517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
7527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_setOption begin 0x%X", optionID);
7547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
7557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
7567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
7587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( optionID ) {
7607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kOptionID_UserParam:
7617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditorAudioDecodersetOption UserParam is not supported");
7627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4ERR_NOT_IMPLEMENTED;
7637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
7647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
7657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditorAudioDecoder_setOption  unsupported optionId 0x%X",
7667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                optionID);
7677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
7687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
7697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
7727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ((M4OSA_UInt32)M4NO_ERROR == err) || ((M4OSA_UInt32)M4ERR_NOT_IMPLEMENTED == err) ) {
7737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_setOption error 0x%X", err);
7747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
7757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_setOption ERROR 0x%X", err);
7767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_setOption end");
7787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
7797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
7807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getOption(M4AD_Context pContext,
7827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 optionID, M4OSA_DataOption optionValue) {
7837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
7857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
7867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getOption begin: optionID 0x%X", optionID);
7887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
7897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
7907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
7927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( optionID ) {
7947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
7957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditorAudioDecoder_getOption unsupported optionId 0x%X",
7967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                optionID);
7977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
7987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
7997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
8007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
8027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
8037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getOption no error");
8047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
8057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getOption ERROR 0x%X", err);
8067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
8077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getOption end");
8087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
8097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
8107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface(M4AD_Type decoderType,
8127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Type* pDecoderType, M4AD_Interface** pDecoderInterface) {
8137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
8157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
8177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pDecoderType, M4ERR_PARAMETER);
8187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pDecoderInterface, M4ERR_PARAMETER);
8197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getInterface begin %d 0x%x 0x%x",
8217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        decoderType, pDecoderType, pDecoderInterface);
8227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_MALLOC(*pDecoderInterface, M4AD_Interface, 1,
8247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditorAudioDecoder");
8257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pDecoderType = decoderType;
8277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( decoderType ) {
8297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeAMRNB:
8307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
8317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditorAudioDecoder_create_AMRNB;
8327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
8337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeAMRWB:
8347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
8357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditorAudioDecoder_create_AMRWB;
8367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
8377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeAAC:
8387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
8397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditorAudioDecoder_create_AAC;
8407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
8417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4AD_kTypeMP3:
8427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
8437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditorAudioDecoder_create_MP3;
8447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
8457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
8467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VEAD_getInterface ERROR: unsupported type %d", decoderType);
8477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER);
8487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
8497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
8507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pDecoderInterface)->m_pFctDestroyAudioDec   =
8517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorAudioDecoder_destroy;
8527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pDecoderInterface)->m_pFctResetAudioDec     = M4OSA_NULL;
8537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pDecoderInterface)->m_pFctStartAudioDec     = M4OSA_NULL;
8547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pDecoderInterface)->m_pFctStepAudioDec      =
8557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorAudioDecoder_step;
8567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pDecoderInterface)->m_pFctGetVersionAudioDec =
8577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorAudioDecoder_getVersion;
8587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pDecoderInterface)->m_pFctSetOptionAudioDec =
8597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorAudioDecoder_setOption;
8607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pDecoderInterface)->m_pFctGetOptionAudioDec =
8617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorAudioDecoder_getOption;
8627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
8647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
8657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getInterface no error");
8667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
8677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pDecoderInterface = M4OSA_NULL;
8687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getInterface ERROR 0x%X", err);
8697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
8707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getInterface end");
8717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
8727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
8737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiextern "C" {
8767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_AAC(M4AD_Type* pDecoderType,
8787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
8797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("TEST: AAC VideoEditorAudioDecoder_getInterface no error");
8807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
8817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeAAC, pDecoderType, pDecoderInterface);
8827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
8837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_AMRNB(M4AD_Type* pDecoderType,
8857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
8867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("TEST: AMR VideoEditorAudioDecoder_getInterface no error");
8877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
8887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeAMRNB, pDecoderType, pDecoderInterface);
8897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
8907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_AMRWB(M4AD_Type* pDecoderType,
8927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
8937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
8957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeAMRWB, pDecoderType, pDecoderInterface);
8967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
8977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_MP3(M4AD_Type* pDecoderType,
8997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
9007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
9027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4AD_kTypeMP3, pDecoderType, pDecoderInterface);
9037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
9047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}  // extern "C"
9067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}  // namespace android
908