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