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