VideoEditorAudioDecoder.cpp revision da8497c15550bae49e0f9031c1baa6fa6a6b1190
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"
320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MediaSource.h>
330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MediaDebug.h>
340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MediaDefs.h>
350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MetaData.h>
360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/OMXClient.h>
370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/OMXCodec.h>
380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/********************
400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *   DEFINITIONS    *
410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ********************/
420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi// Version
430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define VIDEOEDITOR_AUDIO_DECODER_VERSION_MAJOR 1
440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define VIDEOEDITOR_AUDIO_DECODER_VERSION_MINOR 0
450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define VIDEOEDITOR_AUDIO_DECODER_VERSION_REV   0
460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi// Force using software decoder as engine does not support prefetch
480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define VIDEOEDITOR_FORCECODEC kSoftwareCodecsOnly
490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundarginamespace android {
510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistruct VideoEditorAudioDecoderSource : public MediaSource {
530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    public:
540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        static sp<VideoEditorAudioDecoderSource> Create(
550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                const sp<MetaData>& format);
560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        virtual status_t start(MetaData *params = NULL);
570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        virtual status_t stop();
580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        virtual sp<MetaData> getFormat();
590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        virtual status_t read(MediaBuffer **buffer,
600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        const ReadOptions *options = NULL);
610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        virtual int32_t storeBuffer(MediaBuffer *buffer);
620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    protected:
640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        virtual ~VideoEditorAudioDecoderSource();
650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    private:
670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        struct MediaBufferChain {
680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            MediaBuffer* buffer;
690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            MediaBufferChain* nextLink;
700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        };
710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        enum State {
720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            CREATED,
730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            STARTED,
740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            ERROR
750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        };
760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditorAudioDecoderSource(const sp<MetaData>& format);
770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        sp<MetaData> mFormat;
780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        MediaBufferChain* mFirstBufferLink;
790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        MediaBufferChain* mLastBufferLink;
800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        int32_t mNbBuffer;
810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        bool mIsEOS;
820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        State mState;
830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi};
840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargisp<VideoEditorAudioDecoderSource> VideoEditorAudioDecoderSource::Create(
860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        const sp<MetaData>& format) {
870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    sp<VideoEditorAudioDecoderSource> aSource =
890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        new VideoEditorAudioDecoderSource(format);
900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return aSource;
920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiVideoEditorAudioDecoderSource::VideoEditorAudioDecoderSource(
950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        const sp<MetaData>& format):
960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mFormat(format),
970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mFirstBufferLink(NULL),
980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mLastBufferLink(NULL),
990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mNbBuffer(0),
1000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mIsEOS(false),
1010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mState(CREATED) {
1020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
1030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiVideoEditorAudioDecoderSource::~VideoEditorAudioDecoderSource() {
1050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( STARTED == mState ) {
1070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        stop();
1080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
1090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
1100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatus_t VideoEditorAudioDecoderSource::start(MetaData *meta) {
1120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    status_t err = OK;
1130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( CREATED != mState ) {
1150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoderSource::start: invalid state %d", mState);
1160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return UNKNOWN_ERROR;
1170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
1180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    mState = STARTED;
1200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
1220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::start END (0x%x)", err);
1230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
1240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
1250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatus_t VideoEditorAudioDecoderSource::stop() {
1270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    status_t err = OK;
1280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    int32_t i = 0;
1290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::stop begin");
1310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( STARTED != mState ) {
1330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoderSource::stop: invalid state %d", mState);
1340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return UNKNOWN_ERROR;
1350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
1360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Release the buffer chain
1380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    MediaBufferChain* tmpLink = NULL;
1390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    while( mFirstBufferLink ) {
1400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        i++;
1410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        tmpLink = mFirstBufferLink;
1420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mFirstBufferLink = mFirstBufferLink->nextLink;
1430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        delete tmpLink;
1440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
1450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::stop : %d buffer remained", i);
1460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    mFirstBufferLink = NULL;
1470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    mLastBufferLink = NULL;
1480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    mState = CREATED;
1500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::stop END (0x%x)", err);
1520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
1530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
1540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargisp<MetaData> VideoEditorAudioDecoderSource::getFormat() {
1560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::getFormat");
1580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return mFormat;
1590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
1600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatus_t VideoEditorAudioDecoderSource::read(MediaBuffer **buffer,
1620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        const ReadOptions *options) {
1630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    MediaSource::ReadOptions readOptions;
1640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    status_t err = OK;
1650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    MediaBufferChain* tmpLink = NULL;
1660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::read begin");
1680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if ( STARTED != mState ) {
1700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoderSource::read invalid state %d", mState);
1710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return UNKNOWN_ERROR;
1720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
1730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Get a buffer from the chain
1750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( NULL == mFirstBufferLink ) {
1760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        *buffer = NULL;
1770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if( mIsEOS ) {
1780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditorAudioDecoderSource::read : EOS");
1790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            return ERROR_END_OF_STREAM;
1800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        } else {
1810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditorAudioDecoderSource::read : no buffer available");
1820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            return UNKNOWN_ERROR;
1830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
1840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
1850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    *buffer = mFirstBufferLink->buffer;
1860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    tmpLink = mFirstBufferLink;
1880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    mFirstBufferLink = mFirstBufferLink->nextLink;
1890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( NULL == mFirstBufferLink ) {
1900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mLastBufferLink = NULL;
1910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
1920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    delete tmpLink;
1930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    mNbBuffer--;
1940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::read END (0x%x)", err);
1960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
1970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
1980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargiint32_t VideoEditorAudioDecoderSource::storeBuffer(MediaBuffer *buffer) {
2000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    status_t err = OK;
2010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::storeBuffer begin");
2030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // A NULL input buffer means that the end of stream was reached
2050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( NULL == buffer ) {
2060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mIsEOS = true;
2070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
2080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        MediaBufferChain* newLink = new MediaBufferChain;
2090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        newLink->buffer = buffer;
2100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        newLink->nextLink = NULL;
2110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if( NULL != mLastBufferLink ) {
2120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            mLastBufferLink->nextLink = newLink;
2130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        } else {
2140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            mFirstBufferLink = newLink;
2150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
2160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mLastBufferLink = newLink;
2170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mNbBuffer++;
2180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
2190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoderSource::storeBuffer END");
2200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return mNbBuffer;
2210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
2220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/********************
2240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *      TOOLS       *
2250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ********************/
2260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getBits(M4OSA_Int8* pData,
2280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 dataSize, M4OSA_UInt8 nbBits, M4OSA_Int32* pResult,
2290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32* pOffset) {
2300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
2320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 startByte = 0;
2330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 startBit = 0;
2340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 endByte = 0;
2350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 endBit = 0;
2360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 currentByte = 0;
2370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 result = 0;
2380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 ui32Tmp = 0;
2390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 ui32Mask = 0;
2400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
2420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pData, M4ERR_PARAMETER);
2430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pOffset, M4ERR_PARAMETER);
2440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(32 >= nbBits, M4ERR_PARAMETER);
2450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK((*pOffset + nbBits) <= 8*dataSize, M4ERR_PARAMETER);
2460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getBits begin");
2480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    startByte   = (*pOffset) >> 3;
2500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    endByte     = (*pOffset + nbBits) >> 3;
2510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    startBit    = (*pOffset) % 8;
2520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    endBit      = (*pOffset + nbBits) % 8;
2530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    currentByte = startByte;
2540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Extract the requested nunber of bits from memory
2560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    while( currentByte <= endByte) {
2570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        ui32Mask = 0x000000FF;
2580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if( currentByte == startByte ) {
2590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            ui32Mask >>= startBit;
2600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
2610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        ui32Tmp = ui32Mask & ((M4OSA_UInt32)pData[currentByte]);
2620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if( currentByte == endByte ) {
2630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            ui32Tmp >>= (8-endBit);
2640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            result <<= endBit;
2650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        } else {
2660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            result <<= 8;
2670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
2680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        result |= ui32Tmp;
2690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        currentByte++;
2700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
2710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    *pResult = result;
2730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    *pOffset += nbBits;
2740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
2760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
2770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getBits no error");
2780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
2790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getBits ERROR 0x%X", err);
2800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
2810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getBits end");
2820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
2830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
2840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define FREQ_TABLE_SIZE 16
2870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargiconst M4OSA_UInt32 AD_AAC_FREQ_TABLE[FREQ_TABLE_SIZE] =
2880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    {96000, 88200, 64000, 48000, 44100,
2890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0};
2900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_parse_AAC_DSI(M4OSA_Int8* pDSI,
2930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 dsiSize, AAC_DEC_STREAM_PROPS* pProperties) {
2940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
2960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 offset = 0;
2970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Int32 result = 0;
2980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_parse_AAC_DSI begin");
3000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
3020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pDSI, M4ERR_PARAMETER);
3030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pProperties, M4ERR_PARAMETER);
3040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Get the object type
3060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    err = VideoEditorAudioDecoder_getBits(pDSI, dsiSize, 5, &result, &offset);
3070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
3080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    switch( result ) {
3090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case 2:
3100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pProperties->aPSPresent  = 0;
3110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pProperties->aSBRPresent = 0;
3120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
3130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        default:
3140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("parse_AAC_DSI ERROR : object type %d is not supported",
3150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                result);
3160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VIDEOEDITOR_CHECK(!"invalid AAC object type", M4ERR_BAD_OPTION_ID);
3170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
3180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
3190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pProperties->aAudioObjectType = (M4OSA_Int32)result;
3200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Get the frequency index
3220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    err = VideoEditorAudioDecoder_getBits(pDSI, dsiSize, 4, &result, &offset);
3230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
3240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK((0 <= result) && (FREQ_TABLE_SIZE > result),
3250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4ERR_PARAMETER);
3260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pProperties->aSampFreq = AD_AAC_FREQ_TABLE[result];
3270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pProperties->aExtensionSampFreq = 0;
3280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Get the number of channels
3300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    err = VideoEditorAudioDecoder_getBits(pDSI, dsiSize, 4, &result, &offset);
3310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
3320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pProperties->aNumChan = (M4OSA_UInt32)result;
3330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Set the max PCM samples per channel
3350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pProperties->aMaxPCMSamplesPerCh = (pProperties->aSBRPresent) ? 2048 : 1024;
3360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
3380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
3390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_parse_AAC_DSI no error");
3400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
3410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_parse_AAC_DSI ERROR 0x%X", err);
3420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
3430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_parse_AAC_DSI end");
3440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
3450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
3460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/********************
3480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * ENGINE INTERFACE *
3490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ********************/
3500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
3520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ******************************************************************************
3530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * structure VideoEditorAudioDecoder_Context
3540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief    This structure defines the context of the StageFright audio decoder
3550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *           shell
3560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ******************************************************************************
3570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
3580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargitypedef struct {
3590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4AD_Type                          mDecoderType;
3600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4_AudioStreamHandler*             mAudioStreamHandler;
3610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    sp<VideoEditorAudioDecoderSource>  mDecoderSource;
3620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    OMXClient                          mClient;
3630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    sp<MediaSource>                    mDecoder;
3640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    int32_t                            mNbOutputChannels;
3650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    uint32_t                           mNbInputFrames;
3660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    uint32_t                           mNbOutputFrames;
3670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi} VideoEditorAudioDecoder_Context;
3680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_destroy(M4AD_Context pContext) {
3700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
3710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
3720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_destroy begin");
3740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
3750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
3760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
3780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Stop the graph
3800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4OSA_NULL != pDecoderContext->mDecoder.get() ) {
3810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pDecoderContext->mDecoder->stop();
3820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
3830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Destroy the graph
3850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mDecoderSource.clear();
3860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mDecoder.clear();
3870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mClient.disconnect();
3880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    SAFE_FREE(pDecoderContext);
3900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pContext = M4OSA_NULL;
3910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_destroy : DONE");
3920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
3940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
3950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_destroy no error");
3960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
3970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_destroy ERROR 0x%X", err);
3980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
3990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_destroy : end");
4000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
4010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
4020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create(M4AD_Type decoderType,
4040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Context* pContext, M4_AudioStreamHandler* pStreamHandler,
4050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        void* pUserData) {
4060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
4070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
4080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    AAC_DEC_STREAM_PROPS aacProperties;
4090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    status_t result = OK;
4100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    sp<MetaData> decoderMetaData = NULL;
4110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    const char* mime = NULL;
4120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    uint32_t codecFlags = 0;
4130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_create begin: decoderType %d", decoderType);
4150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
4170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext,       M4ERR_PARAMETER);
4180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pStreamHandler, M4ERR_PARAMETER);
4190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Context allocation & initialization
4210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    SAFE_MALLOC(pDecoderContext, VideoEditorAudioDecoder_Context, 1,
4220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "AudioDecoder");
4230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mDecoderType = decoderType;
4240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mAudioStreamHandler = pStreamHandler;
4250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mNbInputFrames  = 0;
4270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mNbOutputFrames = 0;
4280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_create : maxAUSize %d",
4300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pDecoderContext->mAudioStreamHandler->m_basicProperties.m_maxAUSize);
4310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Create the meta data for the decoder
4330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    decoderMetaData = new MetaData;
4340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    switch( pDecoderContext->mDecoderType ) {
4350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeAMRNB:
4360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // StageFright parameters
4370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_AMR_NB;
4380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // Engine parameters
4390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteFrameLength = 160;
4400f0c93006ad63439a06b5f706cb86e14f924b1caDheeraj Sharma            // Number of bytes per sample
4410f0c93006ad63439a06b5f706cb86e14f924b1caDheeraj Sharma            pDecoderContext->mAudioStreamHandler->m_byteSampleSize = 2;
4420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_samplingFrequency = 8000;
4430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_nbChannels = 1;
4440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
4450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeAMRWB:
4470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // StageFright parameters
4480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_AMR_WB;
4490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteFrameLength = 160;
4510f0c93006ad63439a06b5f706cb86e14f924b1caDheeraj Sharma            // Number of bytes per sample
4520f0c93006ad63439a06b5f706cb86e14f924b1caDheeraj Sharma            pDecoderContext->mAudioStreamHandler->m_byteSampleSize = 2;
4530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_samplingFrequency = 16000;
4540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_nbChannels = 1;
4550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
4560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeAAC:
4580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // Reject ADTS & ADIF (or any incorrect type)
4590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4DA_StreamTypeAudioAac ==
4600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pDecoderContext->mAudioStreamHandler->\
4610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                m_basicProperties.m_streamType,M4ERR_PARAMETER);
4620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // StageFright parameters
4640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_AAC;
4650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            decoderMetaData->setData(kKeyESDS, kTypeESDS,
4670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pStreamHandler->m_basicProperties.m_pESDSInfo,
4680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pStreamHandler->m_basicProperties.m_ESDSInfoSize);
4690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // Engine parameters
4710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // Retrieve sampling frequency and number of channels from the DSI
4720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            err = VideoEditorAudioDecoder_parse_AAC_DSI(
4730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (M4OSA_Int8*)pStreamHandler->m_basicProperties.\
4740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    m_pDecoderSpecificInfo,
4750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pStreamHandler->m_basicProperties.m_decoderSpecificInfoSize,
4760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                &aacProperties);
4770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
4790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_byteFrameLength = 1024;
4800f0c93006ad63439a06b5f706cb86e14f924b1caDheeraj Sharma            // Number of bytes per sample
4810f0c93006ad63439a06b5f706cb86e14f924b1caDheeraj Sharma            pDecoderContext->mAudioStreamHandler->m_byteSampleSize = 2;
4820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_samplingFrequency =
4830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                aacProperties.aSampFreq;
4840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderContext->mAudioStreamHandler->m_nbChannels =
4850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                aacProperties.aNumChan;
4860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // Copy the stream properties into userdata
4880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if( M4OSA_NULL != pUserData ) {
4899d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                memcpy((void *)pUserData,
4909d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                    (void *)&aacProperties,
4910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    sizeof(AAC_DEC_STREAM_PROPS));
4920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
4930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
4940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeMP3:
4960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            // StageFright parameters
4970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            mime = MEDIA_MIMETYPE_AUDIO_MPEG;
4980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
4990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        default:
5010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VIDEOEDITOR_CHECK(!"AudioDecoder_open : incorrect input format",
5020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                M4ERR_STATE);
5030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
5040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
5050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    decoderMetaData->setCString(kKeyMIMEType, mime);
5060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    decoderMetaData->setInt32(kKeySampleRate,
5070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (int32_t)pDecoderContext->mAudioStreamHandler->m_samplingFrequency);
5080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    decoderMetaData->setInt32(kKeyChannelCount,
5090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pDecoderContext->mAudioStreamHandler->m_nbChannels);
5100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    decoderMetaData->setInt64(kKeyDuration,
5110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (int64_t)pDecoderContext->mAudioStreamHandler->\
5120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        m_basicProperties.m_duration);
5130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Create the decoder source
5150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mDecoderSource = VideoEditorAudioDecoderSource::Create(
5160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        decoderMetaData);
5170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(NULL != pDecoderContext->mDecoderSource.get(),
5180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4ERR_STATE);
5190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Connect to the OMX client
5210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    result = pDecoderContext->mClient.connect();
5220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
5230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Create the OMX codec
5250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#ifdef VIDEOEDITOR_FORCECODEC
5260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    codecFlags |= OMXCodec::VIDEOEDITOR_FORCECODEC;
5270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#endif /* VIDEOEDITOR_FORCECODEC */
5280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mDecoder = OMXCodec::Create(pDecoderContext->\
5300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mClient.interface(),
5310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        decoderMetaData, false, pDecoderContext->mDecoderSource, NULL,
5320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            codecFlags);
5330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(NULL != pDecoderContext->mDecoder.get(), M4ERR_STATE);
5340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Get the output channels, the decoder might overwrite the input metadata
5360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mDecoder->getFormat()->findInt32(kKeyChannelCount,
5370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        &pDecoderContext->mNbOutputChannels);
5380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_create : output chan %d",
5390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pDecoderContext->mNbOutputChannels);
5400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Start the decoder
5420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    result = pDecoderContext->mDecoder->start();
5430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
5440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    *pContext = pDecoderContext;
5460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_create : DONE");
5470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
5490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
5500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_create no error");
5510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
5520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditorAudioDecoder_destroy(pDecoderContext);
5530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        *pContext = M4OSA_NULL;
5540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_create ERROR 0x%X", err);
5550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
5560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
5570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
5580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_AAC(M4AD_Context* pContext,
5600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
5610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
5630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeAAC, pContext, pStreamHandler,pUserData);
5640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
5650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_AMRNB(M4AD_Context* pContext,
5680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
5690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
5710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeAMRNB, pContext, pStreamHandler, pUserData);
5720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
5730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_AMRWB(M4AD_Context* pContext,
5760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
5770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
5790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeAMRWB, pContext, pStreamHandler, pUserData);
5800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
5810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_create_MP3(M4AD_Context* pContext,
5840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4_AudioStreamHandler* pStreamHandler, void* pUserData) {
5850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_create(
5870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeMP3, pContext, pStreamHandler, pUserData);
5880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
5890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_processInputBuffer(
5910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Context pContext, M4AD_Buffer* pInputBuffer) {
5920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
5930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
5940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    MediaBuffer* buffer = NULL;
5950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    int32_t nbBuffer = 0;
5960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_processInputBuffer begin");
5980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
5990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
6000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
6030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4OSA_NULL != pInputBuffer ) {
6050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        buffer = new MediaBuffer((size_t)pInputBuffer->m_bufferSize);
6069d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu        memcpy((void *)((M4OSA_Int8*)buffer->data() + buffer->range_offset()),
6079d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu            (void *)pInputBuffer->m_dataAddress, pInputBuffer->m_bufferSize);
608da8497c15550bae49e0f9031c1baa6fa6a6b1190Rajneesh Chowdury        buffer->meta_data()->setInt64(kKeyTime, pInputBuffer->m_timeStampUs);
6090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
6100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    nbBuffer = pDecoderContext->mDecoderSource->storeBuffer(buffer);
6110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
6130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
6140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_processInputBuffer no error");
6150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
6160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_processInputBuffer ERROR 0x%X", err);
6170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
6180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_processInputBuffer end");
6190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
6200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
6210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_processOutputBuffer(M4AD_Context pContext,
6230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        MediaBuffer* buffer, M4AD_Buffer* pOuputBuffer) {
6240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
6250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
6260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    int32_t i32Tmp = 0;
6270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    int64_t i64Tmp = 0;
6280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    status_t result = OK;
6290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_processOutputBuffer begin");
6310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
6320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
6330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != buffer, M4ERR_PARAMETER);
6340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pOuputBuffer, M4ERR_PARAMETER);
6350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
6370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Process the returned data
6390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( 0 == buffer->range_length() ) {
6400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        // Decoder has no data yet, nothing unusual
6410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        goto cleanUp;
6420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
6430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mNbOutputFrames++;
6450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( pDecoderContext->mAudioStreamHandler->m_nbChannels ==
6470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (M4OSA_UInt32)pDecoderContext->mNbOutputChannels ) {
6480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        // Just copy the PCMs
6490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pOuputBuffer->m_bufferSize = (M4OSA_UInt32)buffer->range_length();
6509d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu        memcpy((void *)pOuputBuffer->m_dataAddress,
6519d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu            (void *)(((M4OSA_MemAddr8)buffer->data())+buffer->range_offset()),
6520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            buffer->range_length());
6530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else if( pDecoderContext->mAudioStreamHandler->m_nbChannels <
6540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (M4OSA_UInt32)pDecoderContext->mNbOutputChannels ) {
6550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        // The decoder forces stereo output, downsample
6560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pOuputBuffer->m_bufferSize = (M4OSA_UInt32)(buffer->range_length()/2);
6570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Int16* pDataIn  = ((M4OSA_Int16*)buffer->data()) +
6580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            buffer->range_offset();
6590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Int16* pDataOut = (M4OSA_Int16*)pOuputBuffer->m_dataAddress;
6600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Int16* pDataEnd = pDataIn + \
6610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (buffer->range_length()/sizeof(M4OSA_Int16));
6620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        while( pDataIn < pDataEnd ) {
6630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            *pDataOut = *pDataIn;
6640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDataIn+=2;
6650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDataOut++;
6660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
6670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
6680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        // The decoder forces mono output, not supported
6690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER);
6700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
6710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
6730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Release the buffer
6740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    buffer->release();
6750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
6760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_processOutputBuffer no error");
6770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
6780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pOuputBuffer->m_bufferSize = 0;
6790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_processOutputBuffer ERROR 0x%X", err);
6800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
6810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_processOutputBuffer end");
6820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
6830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
6840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_step(M4AD_Context pContext,
6860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Buffer* pInputBuffer, M4AD_Buffer* pOutputBuffer,
6870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Bool bJump) {
6880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
6890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
6900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    status_t result = OK;
6910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    MediaBuffer* outputBuffer = NULL;
6920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_step begin");
6940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
6950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
6960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
6980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext->mNbInputFrames++;
6990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Push the input buffer to the decoder source
7010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    err = VideoEditorAudioDecoder_processInputBuffer(pDecoderContext,
7020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pInputBuffer);
7030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
7040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Read
7060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    result = pDecoderContext->mDecoder->read(&outputBuffer, NULL);
7070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if(OK != result) {
7080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGE("VideoEditorAudioDecoder_step  result = %d",result);
7090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
7110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
7120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Convert the PCM buffer
7140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    err = VideoEditorAudioDecoder_processOutputBuffer(pDecoderContext,
7150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        outputBuffer, pOutputBuffer);
7160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
7170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
7190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
7200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_step no error");
7210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
7220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_step ERROR 0x%X", err);
7230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
7240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_step end");
7250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
7260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
7270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getVersion(M4_VersionInfo* pVersionInfo) {
7290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
7300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getVersion begin");
7320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
7330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pVersionInfo, M4ERR_PARAMETER);
7340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pVersionInfo->m_major      = VIDEOEDITOR_AUDIO_DECODER_VERSION_MAJOR;
7360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pVersionInfo->m_minor      = VIDEOEDITOR_AUDIO_DECODER_VERSION_MINOR;
7370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pVersionInfo->m_revision   = VIDEOEDITOR_AUDIO_DECODER_VERSION_REV;
7380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pVersionInfo->m_structSize = sizeof(M4_VersionInfo);
7390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
7410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
7420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getVersion no error");
7430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
7440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getVersion ERROR 0x%X", err);
7450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
7460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getVersion end");
7470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
7480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
7490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_setOption(M4AD_Context pContext,
7510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 optionID, M4OSA_DataOption optionValue) {
7520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
7540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
7550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_setOption begin 0x%X", optionID);
7570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
7580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
7590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
7610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    switch( optionID ) {
7630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kOptionID_UserParam:
7640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditorAudioDecodersetOption UserParam is not supported");
7650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            err = M4ERR_NOT_IMPLEMENTED;
7660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
7670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        default:
7680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditorAudioDecoder_setOption  unsupported optionId 0x%X",
7690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                optionID);
7700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
7710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
7720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
7730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
7750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( ((M4OSA_UInt32)M4NO_ERROR == err) || ((M4OSA_UInt32)M4ERR_NOT_IMPLEMENTED == err) ) {
7760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_setOption error 0x%X", err);
7770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
7780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_setOption ERROR 0x%X", err);
7790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
7800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_setOption end");
7810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
7820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
7830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getOption(M4AD_Context pContext,
7850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 optionID, M4OSA_DataOption optionValue) {
7860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
7880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditorAudioDecoder_Context* pDecoderContext = M4OSA_NULL;
7890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getOption begin: optionID 0x%X", optionID);
7910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
7920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
7930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pDecoderContext = (VideoEditorAudioDecoder_Context*)pContext;
7950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    switch( optionID ) {
7970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        default:
7980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditorAudioDecoder_getOption unsupported optionId 0x%X",
7990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                optionID);
8000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
8010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
8020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
8030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
8050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
8060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getOption no error");
8070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
8080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getOption ERROR 0x%X", err);
8090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
8100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getOption end");
8110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
8120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
8130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface(M4AD_Type decoderType,
8150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Type* pDecoderType, M4AD_Interface** pDecoderInterface) {
8160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
8180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    // Input parameters check
8200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pDecoderType, M4ERR_PARAMETER);
8210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pDecoderInterface, M4ERR_PARAMETER);
8220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getInterface begin %d 0x%x 0x%x",
8240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        decoderType, pDecoderType, pDecoderInterface);
8250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    SAFE_MALLOC(*pDecoderInterface, M4AD_Interface, 1,
8270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditorAudioDecoder");
8280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    *pDecoderType = decoderType;
8300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    switch( decoderType ) {
8320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeAMRNB:
8330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
8340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                VideoEditorAudioDecoder_create_AMRNB;
8350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
8360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeAMRWB:
8370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
8380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                VideoEditorAudioDecoder_create_AMRWB;
8390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
8400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeAAC:
8410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
8420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                VideoEditorAudioDecoder_create_AAC;
8430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
8440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4AD_kTypeMP3:
8450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (*pDecoderInterface)->m_pFctCreateAudioDec =
8460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                VideoEditorAudioDecoder_create_MP3;
8470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            break;
8480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        default:
8490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VEAD_getInterface ERROR: unsupported type %d", decoderType);
8500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER);
8510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
8520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
8530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pDecoderInterface)->m_pFctDestroyAudioDec   =
8540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditorAudioDecoder_destroy;
8550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pDecoderInterface)->m_pFctResetAudioDec     = M4OSA_NULL;
8560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pDecoderInterface)->m_pFctStartAudioDec     = M4OSA_NULL;
8570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pDecoderInterface)->m_pFctStepAudioDec      =
8580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditorAudioDecoder_step;
8590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pDecoderInterface)->m_pFctGetVersionAudioDec =
8600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditorAudioDecoder_getVersion;
8610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pDecoderInterface)->m_pFctSetOptionAudioDec =
8620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditorAudioDecoder_setOption;
8630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pDecoderInterface)->m_pFctGetOptionAudioDec =
8640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditorAudioDecoder_getOption;
8650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
8670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
8680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getInterface no error");
8690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
8700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        *pDecoderInterface = M4OSA_NULL;
8710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditorAudioDecoder_getInterface ERROR 0x%X", err);
8720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
8730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditorAudioDecoder_getInterface end");
8740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
8750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
8760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargiextern "C" {
8790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_AAC(M4AD_Type* pDecoderType,
8810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
8820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("TEST: AAC VideoEditorAudioDecoder_getInterface no error");
8830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
8840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeAAC, pDecoderType, pDecoderInterface);
8850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
8860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_AMRNB(M4AD_Type* pDecoderType,
8880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
8890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("TEST: AMR VideoEditorAudioDecoder_getInterface no error");
8900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
8910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeAMRNB, pDecoderType, pDecoderInterface);
8920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
8930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_AMRWB(M4AD_Type* pDecoderType,
8950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
8960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
8980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeAMRWB, pDecoderType, pDecoderInterface);
8990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
9000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditorAudioDecoder_getInterface_MP3(M4AD_Type* pDecoderType,
9020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_Interface** pDecoderInterface) {
9030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return VideoEditorAudioDecoder_getInterface(
9050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4AD_kTypeMP3, pDecoderType, pDecoderInterface);
9060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
9070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}  // extern "C"
9090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}  // namespace android
911