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