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