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