17c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* 27c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project 37c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 47c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License"); 57c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * you may not use this file except in compliance with the License. 67c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * You may obtain a copy of the License at 77c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 87c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * http://www.apache.org/licenses/LICENSE-2.0 97c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software 117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS, 127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * See the License for the specific language governing permissions and 147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * limitations under the License. 157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************* 187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @file VideoEditorAudioEncoder.cpp 197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief StageFright shell Audio Encoder 207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************* 217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/ 227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_NDEBUG 1 247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_TAG "VIDEOEDITOR_AUDIOENCODER" 257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h" 277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditorAudioEncoder.h" 287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditorUtils.h" 297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "utils/Log.h" 31c4689fae1bdb8d1c94eb28af1b2a1f30d2b1a3daJames Dong#include <media/stagefright/foundation/ADebug.h> 327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaSource.h> 337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaDefs.h> 347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MetaData.h> 357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/OMXClient.h> 367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/OMXCodec.h> 377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*** DEFINITIONS ***/ 397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi// Force using software encoder as engine does not support prefetch 407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define VIDEOEDITOR_FORCECODEC kSoftwareCodecsOnly 417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundarginamespace android { 437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistruct VideoEditorAudioEncoderSource : public MediaSource { 447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi public: 456d566304093bc0f79b47d96ed8d840620c163264Chih-Chung Chang static sp<VideoEditorAudioEncoderSource> Create( 466d566304093bc0f79b47d96ed8d840620c163264Chih-Chung Chang const sp<MetaData> &format); 477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi virtual status_t start(MetaData *params = NULL); 487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi virtual status_t stop(); 497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi virtual sp<MetaData> getFormat(); 507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi virtual status_t read(MediaBuffer **buffer, 517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi const ReadOptions *options = NULL); 527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi virtual int32_t storeBuffer(MediaBuffer *buffer); 537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi protected: 557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi virtual ~VideoEditorAudioEncoderSource(); 567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi private: 587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi struct MediaBufferChain { 597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBuffer* buffer; 607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBufferChain* nextLink; 617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi }; 627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi enum State { 637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CREATED, 647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi STARTED, 657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERROR 667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi }; 67e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong 687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBufferChain* mFirstBufferLink; 697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBufferChain* mLastBufferLink; 707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int32_t mNbBuffer; 717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi State mState; 726d566304093bc0f79b47d96ed8d840620c163264Chih-Chung Chang sp<MetaData> mEncFormat; 73e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong 746d566304093bc0f79b47d96ed8d840620c163264Chih-Chung Chang VideoEditorAudioEncoderSource(const sp<MetaData> &format); 75e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong 76e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong // Don't call me. 77e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong VideoEditorAudioEncoderSource(const VideoEditorAudioEncoderSource&); 78e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong VideoEditorAudioEncoderSource& operator=( 79e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong const VideoEditorAudioEncoderSource&); 807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 826d566304093bc0f79b47d96ed8d840620c163264Chih-Chung Changsp<VideoEditorAudioEncoderSource> VideoEditorAudioEncoderSource::Create( 836d566304093bc0f79b47d96ed8d840620c163264Chih-Chung Chang const sp<MetaData> &format) { 847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 852703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::Create"); 867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sp<VideoEditorAudioEncoderSource> aSource = 876d566304093bc0f79b47d96ed8d840620c163264Chih-Chung Chang new VideoEditorAudioEncoderSource(format); 887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return aSource; 907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 926d566304093bc0f79b47d96ed8d840620c163264Chih-Chung ChangVideoEditorAudioEncoderSource::VideoEditorAudioEncoderSource( 936d566304093bc0f79b47d96ed8d840620c163264Chih-Chung Chang const sp<MetaData> &format): 947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mFirstBufferLink(NULL), 957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mLastBufferLink(NULL), 967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mNbBuffer(0), 976d566304093bc0f79b47d96ed8d840620c163264Chih-Chung Chang mState(CREATED), 986d566304093bc0f79b47d96ed8d840620c163264Chih-Chung Chang mEncFormat(format) { 992703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::VideoEditorAudioEncoderSource"); 1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiVideoEditorAudioEncoderSource::~VideoEditorAudioEncoderSource() { 1042703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::~VideoEditorAudioEncoderSource"); 1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( STARTED == mState ) { 1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi stop(); 1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorAudioEncoderSource::start(MetaData *meta) { 1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi status_t err = OK; 1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1142703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::start"); 1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( CREATED != mState ) { 1172703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::start ERROR : invalid state %d", 1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mState); 1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return UNKNOWN_ERROR; 1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mState = STARTED; 1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp: 1252703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::start END (0x%x)", err); 1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorAudioEncoderSource::stop() { 1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi status_t err = OK; 1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1322703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::stop"); 1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( STARTED != mState ) { 1352703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::stop ERROR: invalid state %d", 1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mState); 1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return UNKNOWN_ERROR; 1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int32_t i = 0; 1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBufferChain* tmpLink = NULL; 1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi while( mFirstBufferLink ) { 1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i++; 1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpLink = mFirstBufferLink; 1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mFirstBufferLink = mFirstBufferLink->nextLink; 1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi delete tmpLink; 1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1482703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::stop : %d buffer remained", i); 1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mFirstBufferLink = NULL; 1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mLastBufferLink = NULL; 1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mState = CREATED; 1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1542703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::stop END (0x%x)", err); 1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargisp<MetaData> VideoEditorAudioEncoderSource::getFormat() { 1592703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::getFormat"); 1606d566304093bc0f79b47d96ed8d840620c163264Chih-Chung Chang return mEncFormat; 1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorAudioEncoderSource::read(MediaBuffer **buffer, 1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi const ReadOptions *options) { 1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaSource::ReadOptions readOptions; 1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi status_t err = OK; 1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBufferChain* tmpLink = NULL; 1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1692703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::read"); 1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( STARTED != mState ) { 1722703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::read ERROR : invalid state %d", 1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mState); 1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return UNKNOWN_ERROR; 1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( NULL == mFirstBufferLink ) { 1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *buffer = NULL; 1792703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::read : EOS"); 1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return ERROR_END_OF_STREAM; 1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *buffer = mFirstBufferLink->buffer; 1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpLink = mFirstBufferLink; 1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mFirstBufferLink = mFirstBufferLink->nextLink; 1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( NULL == mFirstBufferLink ) { 1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mLastBufferLink = NULL; 1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi delete tmpLink; 1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mNbBuffer--; 1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1922703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::read END (0x%x)", err); 1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiint32_t VideoEditorAudioEncoderSource::storeBuffer(MediaBuffer *buffer) { 1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi status_t err = OK; 1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1992703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::storeBuffer"); 2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBufferChain* newLink = new MediaBufferChain; 2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi newLink->buffer = buffer; 2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi newLink->nextLink = NULL; 2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( NULL != mLastBufferLink ) { 2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mLastBufferLink->nextLink = newLink; 2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mFirstBufferLink = newLink; 2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mLastBufferLink = newLink; 2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mNbBuffer++; 2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2122703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoderSource::storeBuffer END"); 2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return mNbBuffer; 2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/******************** 2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * ENGINE INTERFACE * 2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************/ 2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * structure VideoEditorAudioEncoder_Context 2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief This structure defines the context of the StageFright audio 2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * encoder shell 2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/ 2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargitypedef struct { 2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AudioFormat mFormat; 2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AudioParams* mCodecParams; 2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AudioDecSpecificInfo mDSI; 2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sp<VideoEditorAudioEncoderSource> mEncoderSource; 2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi OMXClient mClient; 2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sp<MediaSource> mEncoder; 2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uint32_t mNbInputFrames; 2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uint32_t mNbOutputFrames; 2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int64_t mFirstOutputCts; 2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int64_t mLastOutputCts; 2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} VideoEditorAudioEncoder_Context; 2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_cleanup(M4OSA_Context pContext) { 2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorAudioEncoder_Context* pEncoderContext = M4OSA_NULL; 2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2442703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_cleanup begin"); 2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER); 2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext = (VideoEditorAudioEncoder_Context*)pContext; 2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi SAFE_FREE(pEncoderContext->mDSI.pInfo); 2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi SAFE_FREE(pEncoderContext); 2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pContext = M4OSA_NULL; 2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp: 2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) { 2542703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_cleanup no error"); 2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 2562703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_cleanup ERROR 0x%X", err); 2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2582703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_cleanup end"); 2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_init(M4ENCODER_AudioFormat format, 2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Context* pContext, M4OSA_Void* pUserData) { 2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorAudioEncoder_Context* pEncoderContext = M4OSA_NULL; 2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2682703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV(" VideoEditorAudioEncoder_init begin: format %d", format); 2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER); 2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi SAFE_MALLOC(pEncoderContext, VideoEditorAudioEncoder_Context, 1, 2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "VideoEditorAudioEncoder"); 2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mFormat = format; 2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pContext = pEncoderContext; 2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp: 2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) { 2792703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_init no error"); 2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorAudioEncoder_cleanup(pEncoderContext); 2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pContext = M4OSA_NULL; 2832703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_init ERROR 0x%X", err); 2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2852703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_init end"); 2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_init_AAC(M4OSA_Context* pContext, 2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Void* pUserData) { 2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return VideoEditorAudioEncoder_init(M4ENCODER_kAAC, pContext, pUserData); 2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_init_AMRNB(M4OSA_Context* pContext, 2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Void* pUserData) { 2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return VideoEditorAudioEncoder_init(M4ENCODER_kAMRNB, pContext, pUserData); 2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_init_MP3(M4OSA_Context* pContext, 3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Void* pUserData) { 3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return VideoEditorAudioEncoder_init(M4ENCODER_kMP3, pContext, pUserData); 3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_close(M4OSA_Context pContext) { 3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorAudioEncoder_Context* pEncoderContext = M4OSA_NULL; 3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3092703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_close begin"); 3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER); 3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext = (VideoEditorAudioEncoder_Context*)pContext; 3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi SAFE_FREE(pEncoderContext->mCodecParams); 3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mEncoder->stop(); 3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mEncoder.clear(); 3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mClient.disconnect(); 3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mEncoderSource.clear(); 3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3212703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("AudioEncoder_close:IN %d frames,OUT %d frames from %lld to %lld", 3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mNbInputFrames, 3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mNbOutputFrames, pEncoderContext->mFirstOutputCts, 3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mLastOutputCts); 3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pEncoderContext->mNbInputFrames != pEncoderContext->mNbInputFrames ) { 3272703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_close:some frames were not encoded %d %d", 3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mNbInputFrames, pEncoderContext->mNbInputFrames); 3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp: 3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) { 3332703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_close no error"); 3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 3352703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_close ERROR 0x%X", err); 3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3372703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_close begin end"); 3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_open(M4OSA_Context pContext, 3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AudioParams *pParams, M4ENCODER_AudioDecSpecificInfo *pDSI, 3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Context pGrabberContext) { 3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorAudioEncoder_Context* pEncoderContext = M4OSA_NULL; 3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi status_t result = OK; 3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sp<MetaData> encoderMetadata = NULL; 3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi const char* mime = NULL; 3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int32_t iNbChannel = 0; 3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uint32_t codecFlags = 0; 3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3532703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_open begin"); 3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER); 3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pParams, M4ERR_PARAMETER); 3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pDSI, M4ERR_PARAMETER); 3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext = (VideoEditorAudioEncoder_Context*)pContext; 3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDSI->pInfo = M4OSA_NULL; 3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDSI->infoSize = 0; 3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mNbInputFrames = 0; 3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mNbOutputFrames = 0; 3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mFirstOutputCts = -1; 3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mLastOutputCts = -1; 3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Allocate & initialize the encoding parameters 3692703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_open : params F=%d CN=%d BR=%d F=%d", 3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pParams->Frequency, pParams->ChannelNum, pParams->Bitrate, 3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pParams->Format); 3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi SAFE_MALLOC(pEncoderContext->mCodecParams, M4ENCODER_AudioParams, 1, 3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "VIDEOEDITOR CodecParams"); 3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mCodecParams->Frequency = pParams->Frequency; 3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mCodecParams->ChannelNum = pParams->ChannelNum; 3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mCodecParams->Bitrate = pParams->Bitrate; 3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mCodecParams->Format = pParams->Format; 3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Check output format consistency 3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(pEncoderContext->mCodecParams->Format == 3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mFormat, M4ERR_PARAMETER); 3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * StageFright graph building 3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Create the meta data for the encoder 3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi encoderMetadata = new MetaData; 3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( pEncoderContext->mCodecParams->Format ) { 3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4ENCODER_kAAC: 3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mime = MEDIA_MIMETYPE_AUDIO_AAC; 3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4ENCODER_kAMRNB: 3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mime = MEDIA_MIMETYPE_AUDIO_AMR_NB; 3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(!"AudioEncoder_open : incorrect input format", 4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_PARAMETER); 4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi encoderMetadata->setCString(kKeyMIMEType, mime); 4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi encoderMetadata->setInt32(kKeySampleRate, 4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (int32_t)pEncoderContext->mCodecParams->Frequency); 4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi encoderMetadata->setInt32(kKeyBitRate, 4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (int32_t)pEncoderContext->mCodecParams->Bitrate); 4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( pEncoderContext->mCodecParams->ChannelNum ) { 4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4ENCODER_kMono: 4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iNbChannel = 1; 4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4ENCODER_kStereo: 4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iNbChannel = 2; 4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(!"AudioEncoder_open : incorrect channel number", 4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_STATE); 4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi encoderMetadata->setInt32(kKeyChannelCount, iNbChannel); 4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Create the encoder source 4336d566304093bc0f79b47d96ed8d840620c163264Chih-Chung Chang pEncoderContext->mEncoderSource = VideoEditorAudioEncoderSource::Create( 4346d566304093bc0f79b47d96ed8d840620c163264Chih-Chung Chang encoderMetadata); 4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(NULL != pEncoderContext->mEncoderSource.get(), 4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_STATE); 4377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Connect to the OMX client 4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi result = pEncoderContext->mClient.connect(); 4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE); 4417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Create the OMX codec 4437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef VIDEOEDITOR_FORCECODEC 4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi codecFlags |= OMXCodec::VIDEOEDITOR_FORCECODEC; 4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* VIDEOEDITOR_FORCECODEC */ 4468c31ae07a170746f408445b1c23937f14c19ec51James Dong // FIXME: 4478c31ae07a170746f408445b1c23937f14c19ec51James Dong // We are moving away to use software AACEncoder and instead use OMX-based 4488c31ae07a170746f408445b1c23937f14c19ec51James Dong // software AAC audio encoder. We want to use AACEncoder for now. After we 4498c31ae07a170746f408445b1c23937f14c19ec51James Dong // fix the interface issue with the OMX-based AAC audio encoder, we should 4508c31ae07a170746f408445b1c23937f14c19ec51James Dong // then set the component name back to NULL to allow the system to pick up 4518c31ae07a170746f408445b1c23937f14c19ec51James Dong // the right AAC audio encoder. 4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mEncoder = OMXCodec::Create( 4538c31ae07a170746f408445b1c23937f14c19ec51James Dong pEncoderContext->mClient.interface(), encoderMetadata, true, 4548c31ae07a170746f408445b1c23937f14c19ec51James Dong pEncoderContext->mEncoderSource, "AACEncoder" /* component name */, 4558c31ae07a170746f408445b1c23937f14c19ec51James Dong codecFlags); 4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(NULL != pEncoderContext->mEncoder.get(), M4ERR_STATE); 4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Start the graph 4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi result = pEncoderContext->mEncoder->start(); 4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE); 4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Get AAC DSI, this code can only work with software encoder 4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4ENCODER_kAAC == pEncoderContext->mCodecParams->Format ) { 4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int32_t isCodecConfig = 0; 4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBuffer* buffer = NULL; 4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Read once to get the DSI 4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi result = pEncoderContext->mEncoder->read(&buffer, NULL); 4697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE); 4707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(buffer->meta_data()->findInt32(kKeyIsCodecConfig, 4717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &isCodecConfig) && isCodecConfig, M4ERR_STATE); 4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Save the DSI 4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mDSI.infoSize = (M4OSA_UInt32)buffer->range_length(); 4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi SAFE_MALLOC(pEncoderContext->mDSI.pInfo, M4OSA_Int8, 4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mDSI.infoSize, "Encoder header"); 4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)pEncoderContext->mDSI.pInfo, 47932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)((M4OSA_MemAddr8)(buffer->data())+buffer->range_offset()), 4807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mDSI.infoSize); 4817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi buffer->release(); 4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pDSI = pEncoderContext->mDSI; 4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4852703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_open : DONE"); 4867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp: 4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) { 4892703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_open no error"); 4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorAudioEncoder_close(pEncoderContext); 4922703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_open ERROR 0x%X", err); 4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4942703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_open end"); 4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_processInputBuffer(M4OSA_Context pContext, 4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AudioBuffer* pInBuffer) { 5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorAudioEncoder_Context* pEncoderContext = M4OSA_NULL; 5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int8* pData = M4OSA_NULL; 5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBuffer* buffer = NULL; 5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int32_t nbBuffer = 0; 5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5072703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_processInputBuffer begin"); 5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER); 5097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext = (VideoEditorAudioEncoder_Context*)pContext; 5117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( pEncoderContext->mCodecParams->ChannelNum ) { 5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4ENCODER_kMono: 5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4ENCODER_kStereo: 5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Let the MediaBuffer own the data so we don't have to free it 5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi buffer = new MediaBuffer((size_t)pInBuffer->pTableBufferSize[0]); 5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pData = (M4OSA_Int8*)buffer->data() + buffer->range_offset(); 51832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)pData, (void *)pInBuffer->pTableBuffer[0], 5197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pInBuffer->pTableBufferSize[0]); 5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 5222703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VEAE_processInputBuffer unsupported channel configuration %d", 5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mCodecParams->ChannelNum); 5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER); 5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5282703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_processInputBuffer : store %d bytes", 5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi buffer->range_length()); 5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Push the buffer to the source 5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nbBuffer = pEncoderContext->mEncoderSource->storeBuffer(buffer); 5327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp: 5347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) { 5352703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_processInputBuffer no error"); 5367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 5377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( NULL != buffer ) { 5387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi buffer->release(); 5397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5402703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_processInputBuffer ERROR 0x%X", err); 5417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5422703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_processInputBuffer end"); 5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 5457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_processOutputBuffer(M4OSA_Context pContext, 5477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBuffer* buffer, M4ENCODER_AudioBuffer* pOutBuffer) { 5487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorAudioEncoder_Context* pEncoderContext = M4OSA_NULL; 5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 Cts = 0; 5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int32_t i32Tmp = 0; 5537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int64_t i64Tmp = 0; 5547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi status_t result = OK; 5557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5562703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_processOutputBuffer begin"); 5577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER); 5587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != buffer, M4ERR_PARAMETER); 5597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pOutBuffer, M4ERR_PARAMETER); 5607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext = (VideoEditorAudioEncoder_Context*)pContext; 5627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Process the returned AU 5647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( 0 == buffer->range_length() ) { 5657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Encoder has no data yet, nothing unusual 5662703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_processOutputBuffer : buffer is empty"); 5677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pOutBuffer->pTableBufferSize[0] = 0; 5687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanUp; 5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( buffer->meta_data()->findInt32(kKeyIsCodecConfig, &i32Tmp) && i32Tmp ) { 5717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* This should not happen with software encoder, 5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * DSI was retrieved beforehand */ 5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_STATE); 5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 5757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Check the CTS 5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(buffer->meta_data()->findInt64(kKeyTime, &i64Tmp), 5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_STATE); 5787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Cts = (M4OSA_Int32)(i64Tmp/1000); 5797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mNbOutputFrames++; 5817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( 0 > pEncoderContext->mFirstOutputCts ) { 5827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mFirstOutputCts = i64Tmp; 5837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mLastOutputCts = i64Tmp; 5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Format the AU 58732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)pOutBuffer->pTableBuffer[0], 58832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)((M4OSA_MemAddr8)(buffer->data())+buffer->range_offset()), 5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi buffer->range_length()); 5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pOutBuffer->pTableBufferSize[0] = (M4OSA_UInt32)buffer->range_length(); 5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp: 5947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Release the buffer 5957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi buffer->release(); 5967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) { 5972703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_processOutputBuffer no error"); 5987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 5992703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_processOutputBuffer ERROR 0x%X", err); 6007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6012703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_processOutputBuffer end"); 6027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 6037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 6047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_step(M4OSA_Context pContext, 6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AudioBuffer* pInBuffer, M4ENCODER_AudioBuffer* pOutBuffer) { 6077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorAudioEncoder_Context* pEncoderContext = M4OSA_NULL; 6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi status_t result = OK; 6107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBuffer* buffer = NULL; 6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6122703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_step begin"); 6137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER); 6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pInBuffer, M4ERR_PARAMETER); 6167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pOutBuffer, M4ERR_PARAMETER); 6177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext = (VideoEditorAudioEncoder_Context*)pContext; 6197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext->mNbInputFrames++; 6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Push the input buffer to the encoder source 6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = VideoEditorAudioEncoder_processInputBuffer(pEncoderContext,pInBuffer); 6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4NO_ERROR == err, err); 6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Read 6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi result = pEncoderContext->mEncoder->read(&buffer, NULL); 6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE); 6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Provide the encoded AU to the writer 6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = VideoEditorAudioEncoder_processOutputBuffer(pEncoderContext, buffer, 6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pOutBuffer); 6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4NO_ERROR == err, err); 6337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp: 6357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) { 6362703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_step no error"); 6377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 6382703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_step ERROR 0x%X", err); 6397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6402703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_step end"); 6417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 6427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 6437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_getOption(M4OSA_Context pContext, 6457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_OptionID optionID, M4OSA_DataOption* optionValue) { 6467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 6477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorAudioEncoder_Context* pEncoderContext = M4OSA_NULL; 6487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6492703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_getOption begin optionID 0x%X", optionID); 6507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER); 6517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderContext = (VideoEditorAudioEncoder_Context*)pContext; 6537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( optionID ) { 6557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 6562703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_getOption: unsupported optionId 0x%X", 6577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi optionID); 6587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID); 6597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 6607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp: 6637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) { 6642703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_getOption no error"); 6657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 6662703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_getOption ERROR 0x%X", err); 6677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6682703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_getOption end"); 6697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 6707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 6717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_getInterface( 6737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AudioFormat format, M4ENCODER_AudioFormat* pFormat, 6747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AudioGlobalInterface** pEncoderInterface) { 6757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 6767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Input parameters check 6787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pFormat, M4ERR_PARAMETER); 6797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pEncoderInterface, M4ERR_PARAMETER); 6807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6812703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_getInterface 0x%x 0x%x",pFormat, 6827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pEncoderInterface); 6837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi SAFE_MALLOC(*pEncoderInterface, M4ENCODER_AudioGlobalInterface, 1, 6847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "AudioEncoder"); 6857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pFormat = format; 6877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( format ) { 6897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4ENCODER_kAAC: 6907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (*pEncoderInterface)->pFctInit = VideoEditorAudioEncoder_init_AAC; 6927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 6937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4ENCODER_kAMRNB: 6957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (*pEncoderInterface)->pFctInit = VideoEditorAudioEncoder_init_AMRNB; 6977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 6987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4ENCODER_kMP3: 7007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (*pEncoderInterface)->pFctInit = VideoEditorAudioEncoder_init_MP3; 7027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 7037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 7057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7062703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_getInterface: unsupported format %d", 7077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi format); 7087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER); 7097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 7107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (*pEncoderInterface)->pFctCleanUp = VideoEditorAudioEncoder_cleanup; 7137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (*pEncoderInterface)->pFctOpen = VideoEditorAudioEncoder_open; 7147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (*pEncoderInterface)->pFctClose = VideoEditorAudioEncoder_close; 7157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (*pEncoderInterface)->pFctStep = VideoEditorAudioEncoder_step; 7167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (*pEncoderInterface)->pFctGetOption = VideoEditorAudioEncoder_getOption; 7177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp: 7197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) { 7202703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_getInterface no error"); 7217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 7227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pEncoderInterface = M4OSA_NULL; 7232703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_getInterface ERROR 0x%X", err); 7247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 7267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 7277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiextern "C" { 7287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_getInterface_AAC( 7307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AudioFormat* pFormat, 7317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AudioGlobalInterface** pEncoderInterface) { 7327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return VideoEditorAudioEncoder_getInterface( 7337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_kAAC, pFormat, pEncoderInterface); 7347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 7357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_getInterface_AMRNB( 7377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AudioFormat* pFormat, 7387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AudioGlobalInterface** pEncoderInterface) { 7397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return VideoEditorAudioEncoder_getInterface( 7417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_kAMRNB, pFormat, pEncoderInterface); 7427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 7437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorAudioEncoder_getInterface_MP3( 7457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AudioFormat* pFormat, 7467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_AudioGlobalInterface** pEncoderInterface) { 7472703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorAudioEncoder_getInterface_MP3 no error"); 7487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return VideoEditorAudioEncoder_getInterface( 7507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ENCODER_kMP3, pFormat, pEncoderInterface); 7517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 7527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} // extern "C" 7547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} // namespace android 756