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   VideoEditorVideoEncoder.cpp
197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief  StageFright shell video encoder
207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*************************************************************************
217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_NDEBUG 1
237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_TAG "VIDEOEDITOR_VIDEOENCODER"
247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************
267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *     HEADERS     *
277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************/
287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h"
297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4SYS_AccessUnit.h"
307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditorVideoEncoder.h"
317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditorUtils.h"
32427e38084a16ec063983346347decf3ec461eed1James Dong#include "MediaBufferPuller.h"
332aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang#include <I420ColorConverter.h>
347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35427e38084a16ec063983346347decf3ec461eed1James Dong#include <unistd.h>
367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "utils/Log.h"
371b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang#include "utils/Vector.h"
38c4689fae1bdb8d1c94eb28af1b2a1f30d2b1a3daJames Dong#include <media/stagefright/foundation/ADebug.h>
397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaSource.h>
407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaDefs.h>
417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MetaData.h>
427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/OMXClient.h>
437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/OMXCodec.h>
4472425b1109ddd092048b5280889f972626a61b7eHong Teng#include <media/MediaProfiles.h>
457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "OMX_Video.h"
467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/********************
487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *   DEFINITIONS    *
497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************/
507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi// Force using hardware encoder
527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define VIDEOEDITOR_FORCECODEC kHardwareCodecsOnly
537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
541b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang#if !defined(VIDEOEDITOR_FORCECODEC)
557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    #error "Cannot force DSI retrieval if codec type is not fixed"
567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/********************
597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *   SOURCE CLASS   *
607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************/
617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundarginamespace android {
637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistruct VideoEditorVideoEncoderSource : public MediaSource {
657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    public:
669540d81f926a92b2c44618c212b9efff359dc090Rajneesh Chowdury        static sp<VideoEditorVideoEncoderSource> Create(
679540d81f926a92b2c44618c212b9efff359dc090Rajneesh Chowdury            const sp<MetaData> &format);
687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual status_t start(MetaData *params = NULL);
697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual status_t stop();
707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual sp<MetaData> getFormat();
717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual status_t read(MediaBuffer **buffer,
727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            const ReadOptions *options = NULL);
737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual int32_t storeBuffer(MediaBuffer *buffer);
7472425b1109ddd092048b5280889f972626a61b7eHong Teng        virtual int32_t getNumberOfBuffersInQueue();
757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    protected:
777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        virtual ~VideoEditorVideoEncoderSource();
787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    private:
807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        struct MediaBufferChain {
817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            MediaBuffer* buffer;
827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            MediaBufferChain* nextLink;
837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        };
847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        enum State {
857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            CREATED,
867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            STARTED,
877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ERROR
887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        };
899540d81f926a92b2c44618c212b9efff359dc090Rajneesh Chowdury        VideoEditorVideoEncoderSource(const sp<MetaData> &format);
90e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong
91e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong        // Don't call me
92e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong        VideoEditorVideoEncoderSource(const VideoEditorVideoEncoderSource &);
93e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong        VideoEditorVideoEncoderSource &operator=(
94e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong                const VideoEditorVideoEncoderSource &);
95e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong
967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        MediaBufferChain* mFirstBufferLink;
977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        MediaBufferChain* mLastBufferLink;
987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        int32_t           mNbBuffer;
997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bool              mIsEOS;
1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        State             mState;
1019540d81f926a92b2c44618c212b9efff359dc090Rajneesh Chowdury        sp<MetaData>      mEncFormat;
1021b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang        Mutex             mLock;
1031b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang        Condition         mBufferCond;
1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi};
1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1069540d81f926a92b2c44618c212b9efff359dc090Rajneesh Chowdurysp<VideoEditorVideoEncoderSource> VideoEditorVideoEncoderSource::Create(
1079540d81f926a92b2c44618c212b9efff359dc090Rajneesh Chowdury    const sp<MetaData> &format) {
1083b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng
1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<VideoEditorVideoEncoderSource> aSource =
1109540d81f926a92b2c44618c212b9efff359dc090Rajneesh Chowdury        new VideoEditorVideoEncoderSource(format);
1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return aSource;
1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1149540d81f926a92b2c44618c212b9efff359dc090Rajneesh ChowduryVideoEditorVideoEncoderSource::VideoEditorVideoEncoderSource(
1159540d81f926a92b2c44618c212b9efff359dc090Rajneesh Chowdury    const sp<MetaData> &format):
1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mFirstBufferLink(NULL),
1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mLastBufferLink(NULL),
1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mNbBuffer(0),
1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mIsEOS(false),
1209540d81f926a92b2c44618c212b9efff359dc090Rajneesh Chowdury        mState(CREATED),
1219540d81f926a92b2c44618c212b9efff359dc090Rajneesh Chowdury        mEncFormat(format) {
1222703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoderSource::VideoEditorVideoEncoderSource");
1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiVideoEditorVideoEncoderSource::~VideoEditorVideoEncoderSource() {
1263b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng
1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Safety clean up
1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( STARTED == mState ) {
1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        stop();
1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorVideoEncoderSource::start(MetaData *meta) {
1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t err = OK;
1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1362703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoderSource::start() begin");
1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( CREATED != mState ) {
1392703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoderSource::start: invalid state %d", mState);
1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return UNKNOWN_ERROR;
1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mState = STARTED;
1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1442703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoderSource::start() END (0x%x)", err);
1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorVideoEncoderSource::stop() {
1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t err = OK;
1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1512703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoderSource::stop() begin");
1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( STARTED != mState ) {
1542703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoderSource::stop: invalid state %d", mState);
1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return UNKNOWN_ERROR;
1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Release the buffer chain
1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t i = 0;
1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBufferChain* tmpLink = NULL;
1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while( mFirstBufferLink ) {
1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        i++;
1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        tmpLink = mFirstBufferLink;
1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mFirstBufferLink = mFirstBufferLink->nextLink;
1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        delete tmpLink;
1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1672703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoderSource::stop : %d buffer remained", i);
1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mFirstBufferLink = NULL;
1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mLastBufferLink = NULL;
1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mState = CREATED;
1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1732703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoderSource::stop() END (0x%x)", err);
1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargisp<MetaData> VideoEditorVideoEncoderSource::getFormat() {
1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1792703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoderSource::getFormat");
1809540d81f926a92b2c44618c212b9efff359dc090Rajneesh Chowdury    return mEncFormat;
1813b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng}
1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorVideoEncoderSource::read(MediaBuffer **buffer,
1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        const ReadOptions *options) {
1851b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    Mutex::Autolock autolock(mLock);
1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaSource::ReadOptions readOptions;
1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t err = OK;
1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBufferChain* tmpLink = NULL;
1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1902703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoderSource::read() begin");
1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( STARTED != mState ) {
1932703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoderSource::read: invalid state %d", mState);
1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return UNKNOWN_ERROR;
1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1971b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    while (mFirstBufferLink == NULL && !mIsEOS) {
1981b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang        mBufferCond.wait(mLock);
1991b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    }
2001b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang
2011b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    // End of stream?
2021b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    if (mFirstBufferLink == NULL) {
2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *buffer = NULL;
2042703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoderSource::read : EOS");
2051b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang        return ERROR_END_OF_STREAM;
2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2071b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang
2081b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    // Get a buffer from the chain
2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *buffer = mFirstBufferLink->buffer;
2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    tmpLink = mFirstBufferLink;
2113b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng    mFirstBufferLink = mFirstBufferLink->nextLink;
2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( NULL == mFirstBufferLink ) {
2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mLastBufferLink = NULL;
2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    delete tmpLink;
2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mNbBuffer--;
2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2192703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoderSource::read() END (0x%x)", err);
2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiint32_t VideoEditorVideoEncoderSource::storeBuffer(MediaBuffer *buffer) {
2241b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    Mutex::Autolock autolock(mLock);
2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t err = OK;
2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2272703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoderSource::storeBuffer() begin");
2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( NULL == buffer ) {
2302703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoderSource::storeBuffer : reached EOS");
2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mIsEOS = true;
2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        MediaBufferChain* newLink = new MediaBufferChain;
2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        newLink->buffer = buffer;
2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        newLink->nextLink = NULL;
2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( NULL != mLastBufferLink ) {
2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mLastBufferLink->nextLink = newLink;
2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mFirstBufferLink = newLink;
2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mLastBufferLink = newLink;
2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mNbBuffer++;
2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2441b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    mBufferCond.signal();
2452703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoderSource::storeBuffer() end");
2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return mNbBuffer;
2473b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng}
2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24972425b1109ddd092048b5280889f972626a61b7eHong Tengint32_t VideoEditorVideoEncoderSource::getNumberOfBuffersInQueue() {
25072425b1109ddd092048b5280889f972626a61b7eHong Teng    Mutex::Autolock autolock(mLock);
25172425b1109ddd092048b5280889f972626a61b7eHong Teng    return mNbBuffer;
25272425b1109ddd092048b5280889f972626a61b7eHong Teng}
2531b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang
2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * structure VideoEditorVideoEncoder_Context
2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    This structure defines the context of the StageFright video encoder
2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *           shell
2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargitypedef enum {
2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    CREATED   = 0x1,
2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    OPENED    = 0x2,
2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    STARTED   = 0x4,
2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    BUFFERING = 0x8,
2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    READING   = 0x10
2673b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng} VideoEditorVideoEncoder_State;
2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargitypedef struct {
2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorVideoEncoder_State     mState;
2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_Format                  mFormat;
2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4WRITER_DataInterface*           mWriterDataInterface;
2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VPP_apply_fct*                  mPreProcFunction;
2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VPP_Context                     mPreProcContext;
2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_AccessUnit*                 mAccessUnit;
2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_Params*                 mCodecParams;
2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_Header                  mHeader;
2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    H264MCS_ProcessEncodedNALU_fct*   mH264NALUPostProcessFct;
2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Context                     mH264NALUPostProcessCtx;
2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32                      mLastCTS;
2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<VideoEditorVideoEncoderSource> mEncoderSource;
2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    OMXClient                         mClient;
2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<MediaSource>                   mEncoder;
2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    OMX_COLOR_FORMATTYPE              mEncoderColorFormat;
285427e38084a16ec063983346347decf3ec461eed1James Dong    MediaBufferPuller*                mPuller;
2862aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang    I420ColorConverter*               mI420ColorConverter;
2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint32_t                          mNbInputFrames;
2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    double                            mFirstInputCts;
2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    double                            mLastInputCts;
2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint32_t                          mNbOutputFrames;
2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int64_t                           mFirstOutputCts;
2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int64_t                           mLastOutputCts;
2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29572425b1109ddd092048b5280889f972626a61b7eHong Teng    MediaProfiles *mVideoEditorProfile;
29672425b1109ddd092048b5280889f972626a61b7eHong Teng    int32_t mMaxPrefetchFrames;
2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} VideoEditorVideoEncoder_Context;
2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/********************
3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *      TOOLS       *
3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************/
3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_getDSI(M4ENCODER_Context pContext,
3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sp<MetaData> metaData) {
3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorVideoEncoder_Context*  pEncoderContext = M4OSA_NULL;
3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t result = OK;
3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t nbBuffer = 0;
3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t stride = 0;
3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t height = 0;
3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t framerate = 0;
3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t isCodecConfig = 0;
3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    size_t size = 0;
3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint32_t codecFlags = 0;
3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBuffer* inputBuffer = NULL;
3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBuffer* outputBuffer = NULL;
3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<VideoEditorVideoEncoderSource> encoderSource = NULL;
3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<MediaSource> encoder = NULL;;
3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    OMXClient client;
3203b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng
3212703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_getDSI begin");
3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext,       M4ERR_PARAMETER);
3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != metaData.get(), M4ERR_PARAMETER);
3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext = (VideoEditorVideoEncoder_Context*)pContext;
3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(CREATED == pEncoderContext->mState, M4ERR_STATE);
3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Create the encoder source
3309540d81f926a92b2c44618c212b9efff359dc090Rajneesh Chowdury    encoderSource = VideoEditorVideoEncoderSource::Create(metaData);
3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(NULL != encoderSource.get(), M4ERR_STATE);
3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Connect to the OMX client
3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    result = client.connect();
3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Create the OMX codec
3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // VIDEOEDITOR_FORCECODEC MUST be defined here
3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    codecFlags |= OMXCodec::VIDEOEDITOR_FORCECODEC;
3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    encoder = OMXCodec::Create(client.interface(), metaData, true,
3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        encoderSource, NULL, codecFlags);
3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(NULL != encoder.get(), M4ERR_STATE);
3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * Send fake frames and retrieve the DSI
3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     */
3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Send a fake frame to the source
3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    metaData->findInt32(kKeyStride,     &stride);
3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    metaData->findInt32(kKeyHeight,     &height);
3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    metaData->findInt32(kKeySampleRate, &framerate);
3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    size = (size_t)(stride*height*3)/2;
3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    inputBuffer = new MediaBuffer(size);
3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    inputBuffer->meta_data()->setInt64(kKeyTime, 0);
3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    nbBuffer = encoderSource->storeBuffer(inputBuffer);
3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    encoderSource->storeBuffer(NULL); // Signal EOS
3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Call read once to get the DSI
3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    result = encoder->start();;
3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    result = encoder->read(&outputBuffer, NULL);
3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(outputBuffer->meta_data()->findInt32(
3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        kKeyIsCodecConfig, &isCodecConfig) && isCodecConfig, M4ERR_STATE);
3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL == pEncoderContext->mHeader.pBuf, M4ERR_STATE);
3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( M4ENCODER_kH264 == pEncoderContext->mFormat ) {
3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // For H264, format the DSI
3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        result = buildAVCCodecSpecificData(
3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (uint8_t**)(&(pEncoderContext->mHeader.pBuf)),
3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (size_t*)(&(pEncoderContext->mHeader.Size)),
3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (const uint8_t*)outputBuffer->data() + outputBuffer->range_offset(),
3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            outputBuffer->range_length(), encoder->getFormat().get());
3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outputBuffer->release();
3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // For MPEG4, just copy the DSI
3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mHeader.Size =
3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt32)outputBuffer->range_length();
3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        SAFE_MALLOC(pEncoderContext->mHeader.pBuf, M4OSA_Int8,
3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mHeader.Size, "Encoder header");
38132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)pEncoderContext->mHeader.pBuf,
38232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (void *)((M4OSA_MemAddr8)(outputBuffer->data())+outputBuffer->range_offset()),
3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mHeader.Size);
3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outputBuffer->release();
3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    result = encoder->stop();
3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Destroy the graph
3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( encoder != NULL ) { encoder.clear(); }
3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    client.disconnect();
3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( encoderSource != NULL ) { encoderSource.clear(); }
3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( M4NO_ERROR == err ) {
3962703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_getDSI no error");
3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
3982703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_getDSI ERROR 0x%X", err);
3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4002703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_getDSI end");
4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/********************
4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * ENGINE INTERFACE *
4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************/
4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_cleanup(M4ENCODER_Context pContext) {
4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
4103b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng
4112703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_cleanup begin");
4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext = (VideoEditorVideoEncoder_Context*)pContext;
4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(CREATED == pEncoderContext->mState, M4ERR_STATE);
4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Release memory
4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_FREE(pEncoderContext->mHeader.pBuf);
4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_FREE(pEncoderContext);
4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pContext = M4OSA_NULL;
4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( M4NO_ERROR == err ) {
4252703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_cleanup no error");
4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
4272703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_cleanup ERROR 0x%X", err);
4283b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng    }
4292703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_cleanup end");
4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_init(M4ENCODER_Format format,
4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ENCODER_Context* pContext,
4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4WRITER_DataInterface* pWriterDataInterface,
4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VPP_apply_fct* pVPPfct, M4VPP_Context pVPPctxt,
4373b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng        M4OSA_Void* pExternalAPI, M4OSA_Void* pUserData) {
4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
4417efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang    int encoderInput = OMX_COLOR_FormatYUV420Planar;
4423b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng
4432703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_init begin: format  %d", format);
4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pWriterDataInterface, M4ERR_PARAMETER);
4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pVPPfct, M4ERR_PARAMETER);
4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pVPPctxt, M4ERR_PARAMETER);
4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Context allocation & initialization
4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_MALLOC(pEncoderContext, VideoEditorVideoEncoder_Context, 1,
4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditorVideoEncoder");
4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mState = CREATED;
4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mFormat = format;
4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mWriterDataInterface = pWriterDataInterface;
4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mPreProcFunction = pVPPfct;
4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mPreProcContext = pVPPctxt;
4581b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    pEncoderContext->mPuller = NULL;
4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4607efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang    // Get color converter and determine encoder input format
4612aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang    pEncoderContext->mI420ColorConverter = new I420ColorConverter;
4622aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang    if (pEncoderContext->mI420ColorConverter->isLoaded()) {
4632aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang        encoderInput = pEncoderContext->mI420ColorConverter->getEncoderInputFormat();
4647efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang    }
4657efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang    if (encoderInput == OMX_COLOR_FormatYUV420Planar) {
4662aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang        delete pEncoderContext->mI420ColorConverter;
4672aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang        pEncoderContext->mI420ColorConverter = NULL;
4687efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang    }
4697efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang    pEncoderContext->mEncoderColorFormat = (OMX_COLOR_FORMATTYPE)encoderInput;
470ec9e663f697df4254dacc79f52cdb633179c92abSteve Block    ALOGI("encoder input format = 0x%X\n", encoderInput);
4717efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang
4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pContext = pEncoderContext;
4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( M4NO_ERROR == err ) {
4762703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_init no error");
4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorVideoEncoder_cleanup(pEncoderContext);
4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pContext = M4OSA_NULL;
4802703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_init ERROR 0x%X", err);
4813b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng    }
4822703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_init end");
4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_init_H263(M4ENCODER_Context* pContext,
4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4WRITER_DataInterface* pWriterDataInterface, M4VPP_apply_fct* pVPPfct,
4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VPP_Context pVPPctxt, M4OSA_Void* pExternalAPI, M4OSA_Void* pUserData)
4893b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng        {
4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorVideoEncoder_init(M4ENCODER_kH263, pContext,
4927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pWriterDataInterface, pVPPfct, pVPPctxt, pExternalAPI, pUserData);
4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_init_MPEG4(M4ENCODER_Context* pContext,
4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4WRITER_DataInterface* pWriterDataInterface, M4VPP_apply_fct* pVPPfct,
4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VPP_Context pVPPctxt, M4OSA_Void* pExternalAPI, M4OSA_Void* pUserData)
4993b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng        {
5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorVideoEncoder_init(M4ENCODER_kMPEG4, pContext,
5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pWriterDataInterface, pVPPfct, pVPPctxt, pExternalAPI, pUserData);
5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_init_H264(M4ENCODER_Context* pContext,
5077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4WRITER_DataInterface* pWriterDataInterface, M4VPP_apply_fct* pVPPfct,
5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VPP_Context pVPPctxt, M4OSA_Void* pExternalAPI, M4OSA_Void* pUserData)
5093b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng        {
5107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorVideoEncoder_init(M4ENCODER_kH264, pContext,
5127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pWriterDataInterface, pVPPfct, pVPPctxt, pExternalAPI, pUserData);
5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_close(M4ENCODER_Context pContext) {
5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
5183b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng
5192703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_close begin");
5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
5227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext = (VideoEditorVideoEncoder_Context*)pContext;
5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(OPENED == pEncoderContext->mState, M4ERR_STATE);
5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Release memory
5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_FREE(pEncoderContext->mCodecParams);
5287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Destroy the graph
5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mEncoder.clear();
5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mClient.disconnect();
5327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mEncoderSource.clear();
5337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5341b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    delete pEncoderContext->mPuller;
5351b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    pEncoderContext->mPuller = NULL;
5361b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang
5372aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang    delete pEncoderContext->mI420ColorConverter;
5382aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang    pEncoderContext->mI420ColorConverter = NULL;
5397efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang
5407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Set the new state
5417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mState = CREATED;
5427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
5452703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_close no error");
5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
5472703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_close ERROR 0x%X", err);
5483b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng    }
5492703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_close end");
5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_open(M4ENCODER_Context pContext,
5557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4SYS_AccessUnit* pAU, M4OSA_Void* pParams) {
5567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
5577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
5587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_Params* pCodecParams = M4OSA_NULL;
5597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t result = OK;
5607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<MetaData> encoderMetadata = NULL;
5617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    const char* mime = NULL;
5627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t iProfile = 0;
5630a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    int32_t iLevel = 0;
5640a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury
5657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t iFrameRate = 0;
5667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint32_t codecFlags = 0;
5673b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng
5682703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV(">>> VideoEditorVideoEncoder_open begin");
5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
5717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pAU,      M4ERR_PARAMETER);
5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pParams,  M4ERR_PARAMETER);
5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext = (VideoEditorVideoEncoder_Context*)pContext;
5757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pCodecParams = (M4ENCODER_Params*)pParams;
5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(CREATED == pEncoderContext->mState, M4ERR_STATE);
5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Context initialization
5797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mAccessUnit = pAU;
58072425b1109ddd092048b5280889f972626a61b7eHong Teng    pEncoderContext->mVideoEditorProfile = MediaProfiles::getInstance();
58172425b1109ddd092048b5280889f972626a61b7eHong Teng    pEncoderContext->mMaxPrefetchFrames =
58272425b1109ddd092048b5280889f972626a61b7eHong Teng        pEncoderContext->mVideoEditorProfile->getVideoEditorCapParamByName(
58372425b1109ddd092048b5280889f972626a61b7eHong Teng        "maxPrefetchYUVFrames");
5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Allocate & initialize the encoding parameters
5867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_MALLOC(pEncoderContext->mCodecParams, M4ENCODER_Params, 1,
5877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditorVideoEncoder");
5887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mCodecParams->InputFormat = pCodecParams->InputFormat;
5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mCodecParams->InputFrameWidth =
5927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pCodecParams->InputFrameWidth;
5937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mCodecParams->InputFrameHeight =
5947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pCodecParams->InputFrameHeight;
5957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mCodecParams->FrameWidth = pCodecParams->FrameWidth;
5967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mCodecParams->FrameHeight = pCodecParams->FrameHeight;
5977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mCodecParams->Bitrate = pCodecParams->Bitrate;
5987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mCodecParams->FrameRate = pCodecParams->FrameRate;
5997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mCodecParams->Format = pCodecParams->Format;
6000a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    pEncoderContext->mCodecParams->videoProfile = pCodecParams->videoProfile;
6010a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    pEncoderContext->mCodecParams->videoLevel= pCodecParams->videoLevel;
6027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Check output format consistency and resolution
6047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(
6057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mCodecParams->Format == pEncoderContext->mFormat,
6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ERR_PARAMETER);
6077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(0 == pEncoderContext->mCodecParams->FrameWidth  % 16,
6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ERR_PARAMETER);
6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(0 == pEncoderContext->mCodecParams->FrameHeight % 16,
6107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ERR_PARAMETER);
6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
6137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * StageFright graph building
6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     */
6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Create the meta data for the encoder
6177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    encoderMetadata = new MetaData;
6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( pEncoderContext->mCodecParams->Format ) {
6197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_kH263:
6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mime     = MEDIA_MIMETYPE_VIDEO_H263;
6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_kMPEG4:
6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mime     = MEDIA_MIMETYPE_VIDEO_MPEG4;
6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
6257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_kH264:
6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mime     = MEDIA_MIMETYPE_VIDEO_AVC;
6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(!"VideoEncoder_open : incorrect input format",
6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4ERR_PARAMETER);
6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6330a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    iProfile = pEncoderContext->mCodecParams->videoProfile;
6340a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    iLevel = pEncoderContext->mCodecParams->videoLevel;
6352703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("Encoder mime %s profile %d, level %d",
6360a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        mime,iProfile, iLevel);
6372703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("Encoder w %d, h %d, bitrate %d, fps %d",
6380a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        pEncoderContext->mCodecParams->FrameWidth,
6390a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        pEncoderContext->mCodecParams->FrameHeight,
6400a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        pEncoderContext->mCodecParams->Bitrate,
6410a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        pEncoderContext->mCodecParams->FrameRate);
6420a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    CHECK(iProfile != 0x7fffffff);
6430a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    CHECK(iLevel != 0x7fffffff);
6440a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury
6457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    encoderMetadata->setCString(kKeyMIMEType, mime);
6467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    encoderMetadata->setInt32(kKeyVideoProfile, iProfile);
6470a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    //FIXME:
6480a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    // Temp: Do not set the level for Mpeg4 / H.263 Enc
6490a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    // as OMX.Nvidia.mp4.encoder and OMX.Nvidia.h263.encoder
6500a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    // return 0x80001019
6510a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    if (pEncoderContext->mCodecParams->Format == M4ENCODER_kH264) {
6520a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        encoderMetadata->setInt32(kKeyVideoLevel, iLevel);
6530a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    }
6547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    encoderMetadata->setInt32(kKeyWidth,
6557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (int32_t)pEncoderContext->mCodecParams->FrameWidth);
6567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    encoderMetadata->setInt32(kKeyStride,
6577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (int32_t)pEncoderContext->mCodecParams->FrameWidth);
6587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    encoderMetadata->setInt32(kKeyHeight,
6597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (int32_t)pEncoderContext->mCodecParams->FrameHeight);
6607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    encoderMetadata->setInt32(kKeySliceHeight,
6617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (int32_t)pEncoderContext->mCodecParams->FrameHeight);
6627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( pEncoderContext->mCodecParams->FrameRate ) {
6647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_k5_FPS:    iFrameRate = 5;  break;
6657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_k7_5_FPS:  iFrameRate = 8;  break;
6667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_k10_FPS:   iFrameRate = 10; break;
6677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_k12_5_FPS: iFrameRate = 13; break;
6687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_k15_FPS:   iFrameRate = 15; break;
6697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_k20_FPS:   iFrameRate = 20; break;
6707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_k25_FPS:   iFrameRate = 25; break;
6717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_k30_FPS:   iFrameRate = 30; break;
6727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_kVARIABLE_FPS:
6737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            iFrameRate = 30;
674ec9e663f697df4254dacc79f52cdb633179c92abSteve Block            ALOGI("Frame rate set to M4ENCODER_kVARIABLE_FPS: set to 30");
6757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi          break;
6767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_kUSE_TIMESCALE:
6777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            iFrameRate = 30;
678ec9e663f697df4254dacc79f52cdb633179c92abSteve Block            ALOGI("Frame rate set to M4ENCODER_kUSE_TIMESCALE:  set to 30");
6797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
6807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
6827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(!"VideoEncoder_open:incorrect framerate",
6837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4ERR_STATE);
6847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
6857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    encoderMetadata->setInt32(kKeyFrameRate, iFrameRate);
6877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    encoderMetadata->setInt32(kKeyBitRate,
6887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (int32_t)pEncoderContext->mCodecParams->Bitrate);
6897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    encoderMetadata->setInt32(kKeyIFramesInterval, 1);
6907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    encoderMetadata->setInt32(kKeyColorFormat,
6927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mEncoderColorFormat);
6937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6940a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    if (pEncoderContext->mCodecParams->Format != M4ENCODER_kH263) {
6950a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        // Get the encoder DSI
6960a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        err = VideoEditorVideoEncoder_getDSI(pEncoderContext, encoderMetadata);
6970a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
6980a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    }
6997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Create the encoder source
7019540d81f926a92b2c44618c212b9efff359dc090Rajneesh Chowdury    pEncoderContext->mEncoderSource = VideoEditorVideoEncoderSource::Create(
7029540d81f926a92b2c44618c212b9efff359dc090Rajneesh Chowdury        encoderMetadata);
7037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(
7047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        NULL != pEncoderContext->mEncoderSource.get(), M4ERR_STATE);
7057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Connect to the OMX client
7077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    result = pEncoderContext->mClient.connect();
7087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
7097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Create the OMX codec
7117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef VIDEOEDITOR_FORCECODEC
7127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    codecFlags |= OMXCodec::VIDEOEDITOR_FORCECODEC;
7137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* VIDEOEDITOR_FORCECODEC */
7147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mEncoder = OMXCodec::Create(
7157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mClient.interface(), encoderMetadata, true,
7167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mEncoderSource, NULL, codecFlags);
7177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(NULL != pEncoderContext->mEncoder.get(), M4ERR_STATE);
7182703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_open : DONE");
719427e38084a16ec063983346347decf3ec461eed1James Dong    pEncoderContext->mPuller = new MediaBufferPuller(
7201b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang        pEncoderContext->mEncoder);
7217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Set the new state
7237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mState = OPENED;
7247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
7267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
7272703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_open no error");
7287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
7297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorVideoEncoder_close(pEncoderContext);
7302703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_open ERROR 0x%X", err);
7313b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng    }
7322703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_open end");
7337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
7347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
7357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_processInputBuffer(
7377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ENCODER_Context pContext, M4OSA_Double Cts,
7387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Bool bReachedEOS) {
7397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
7407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
7417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_ImagePlane pOutPlane[3];
7427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBuffer* buffer = NULL;
7437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t nbBuffer = 0;
7443b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng
7452703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_processInputBuffer begin: cts  %f", Cts);
7467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
7477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
7487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext = (VideoEditorVideoEncoder_Context*)pContext;
7507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pOutPlane[0].pac_data = M4OSA_NULL;
7517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pOutPlane[1].pac_data = M4OSA_NULL;
7527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pOutPlane[2].pac_data = M4OSA_NULL;
7537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( M4OSA_FALSE == bReachedEOS ) {
7557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 sizeY = pEncoderContext->mCodecParams->FrameWidth *
7567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mCodecParams->FrameHeight;
7577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 sizeU = sizeY >> 2;
7587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 size  = sizeY + 2*sizeU;
7597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt8* pData = M4OSA_NULL;
7607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        buffer = new MediaBuffer((size_t)size);
7617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pData = (M4OSA_UInt8*)buffer->data() + buffer->range_offset();
7627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Prepare the output image for pre-processing
7647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOutPlane[0].u_width   = pEncoderContext->mCodecParams->FrameWidth;
7657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOutPlane[0].u_height  = pEncoderContext->mCodecParams->FrameHeight;
7667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOutPlane[0].u_topleft = 0;
7677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOutPlane[0].u_stride  = pOutPlane[0].u_width;
7687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOutPlane[1].u_width   = pOutPlane[0].u_width/2;
7697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOutPlane[1].u_height  = pOutPlane[0].u_height/2;
7707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOutPlane[1].u_topleft = 0;
7717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOutPlane[1].u_stride  = pOutPlane[0].u_stride/2;
7727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOutPlane[2].u_width   = pOutPlane[1].u_width;
7737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOutPlane[2].u_height  = pOutPlane[1].u_height;
7747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOutPlane[2].u_topleft = 0;
7757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pOutPlane[2].u_stride  = pOutPlane[1].u_stride;
7767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77776cdb30c5bf3110354051aca2a16b5c8fbad3398Chih-Chung Chang        pOutPlane[0].pac_data = pData;
77876cdb30c5bf3110354051aca2a16b5c8fbad3398Chih-Chung Chang        pOutPlane[1].pac_data = pData + sizeY;
77976cdb30c5bf3110354051aca2a16b5c8fbad3398Chih-Chung Chang        pOutPlane[2].pac_data = pData + sizeY + sizeU;
7807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Apply pre-processing
7827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pEncoderContext->mPreProcFunction(
7837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mPreProcContext, M4OSA_NULL, pOutPlane);
7847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
7857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7867efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang        // Convert MediaBuffer to the encoder input format if necessary
7872aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang        if (pEncoderContext->mI420ColorConverter) {
7882aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang            I420ColorConverter* converter = pEncoderContext->mI420ColorConverter;
7897efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang            int actualWidth = pEncoderContext->mCodecParams->FrameWidth;
7907efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang            int actualHeight = pEncoderContext->mCodecParams->FrameHeight;
7917efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang
7927efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang            int encoderWidth, encoderHeight;
7937efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang            ARect encoderRect;
7947efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang            int encoderBufferSize;
7957efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang
7967efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang            if (converter->getEncoderInputBufferInfo(
7977efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang                actualWidth, actualHeight,
7987efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang                &encoderWidth, &encoderHeight,
7997efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang                &encoderRect, &encoderBufferSize) == 0) {
8007efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang
8017efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang                MediaBuffer* newBuffer = new MediaBuffer(encoderBufferSize);
8027efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang
8032aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang                if (converter->convertI420ToEncoderInput(
8047efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang                    pData,  // srcBits
8057efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang                    actualWidth, actualHeight,
8067efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang                    encoderWidth, encoderHeight,
8077efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang                    encoderRect,
8087efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang                    (uint8_t*)newBuffer->data() + newBuffer->range_offset()) < 0) {
809f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block                    ALOGE("convertI420ToEncoderInput failed");
8107efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang                }
8117efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang
8127efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang                // switch to new buffer
8137efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang                buffer->release();
8147efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang                buffer = newBuffer;
8157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
8167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
8177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Set the metadata
8197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        buffer->meta_data()->setInt64(kKeyTime, (int64_t)(Cts*1000));
8207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
8217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Push the buffer to the source, a NULL buffer, notifies the source of EOS
8237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    nbBuffer = pEncoderContext->mEncoderSource->storeBuffer(buffer);
8247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
8261b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    if ( M4NO_ERROR == err ) {
8272703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_processInputBuffer error 0x%X", err);
8287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
8297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( NULL != buffer ) {
8307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            buffer->release();
8317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
8322703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_processInputBuffer ERROR 0x%X", err);
8333b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng    }
8342703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_processInputBuffer end");
8357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
8367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
8377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_processOutputBuffer(
8397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ENCODER_Context pContext, MediaBuffer* buffer) {
8407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
8417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
8427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 Cts = 0;
8437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t i32Tmp = 0;
8447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int64_t i64Tmp = 0;
8457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t result = OK;
8463b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng
8472703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_processOutputBuffer begin");
8487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
8497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
8507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != buffer,   M4ERR_PARAMETER);
8517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext = (VideoEditorVideoEncoder_Context*)pContext;
8537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Process the returned AU
8557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( 0 == buffer->range_length() ) {
8567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Encoder has no data yet, nothing unusual
8572703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_processOutputBuffer : buffer is empty");
8587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        goto cleanUp;
8597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
8607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(0 == ((M4OSA_UInt32)buffer->data())%4, M4ERR_PARAMETER);
8617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(buffer->meta_data().get(), M4ERR_PARAMETER);
8627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( buffer->meta_data()->findInt32(kKeyIsCodecConfig, &i32Tmp) && i32Tmp ){
8637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {   // Display the DSI
8642703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditorVideoEncoder_processOutputBuffer DSI %d",
8657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                buffer->range_length());
8667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            uint8_t* tmp = (uint8_t*)(buffer->data());
8677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            for( uint32_t i=0; i<buffer->range_length(); i++ ) {
8682703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("DSI [%d] %.2X", i, tmp[i]);
8697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
8707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
8717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
8727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Check the CTS
8737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VIDEOEDITOR_CHECK(buffer->meta_data()->findInt64(kKeyTime, &i64Tmp),
8747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4ERR_STATE);
8757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mNbOutputFrames++;
8773b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng        if ( 0 > pEncoderContext->mFirstOutputCts ) {
8783b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng            pEncoderContext->mFirstOutputCts = i64Tmp;
8797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
8807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mLastOutputCts = i64Tmp;
8817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        Cts = (M4OSA_Int32)(i64Tmp/1000);
8832703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("[TS_CHECK] VI/ENC WRITE frame %d @ %lld -> %d (last %d)",
8847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mNbOutputFrames, i64Tmp, Cts,
8857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mLastCTS);
8867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if ( Cts < pEncoderContext->mLastCTS ) {
8872703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEncoder_processOutputBuffer WARNING : Cts is going "
8887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "backwards %d < %d", Cts, pEncoderContext->mLastCTS);
8897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            goto cleanUp;
8907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
8912703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_processOutputBuffer : %d %d",
8927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            Cts, pEncoderContext->mLastCTS);
8937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Retrieve the AU container
8957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pEncoderContext->mWriterDataInterface->pStartAU(
8967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mWriterDataInterface->pWriterContext,
8977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mAccessUnit->stream->streamID,
8987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mAccessUnit);
8997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
9007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Format the AU
9027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VIDEOEDITOR_CHECK(
9037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            buffer->range_length() <= pEncoderContext->mAccessUnit->size,
9047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4ERR_PARAMETER);
9057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Remove H264 AU start code
9067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if ( M4ENCODER_kH264 == pEncoderContext->mFormat ) {
9077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (!memcmp((const uint8_t *)buffer->data() + \
9087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    buffer->range_offset(), "\x00\x00\x00\x01", 4) ) {
9097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                buffer->set_range(buffer->range_offset() + 4,
9107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    buffer->range_length() - 4);
9117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
9127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
9137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if ( (M4ENCODER_kH264 == pEncoderContext->mFormat) &&
9157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_NULL != pEncoderContext->mH264NALUPostProcessFct) ) {
9167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // H264 trimming case, NALU post processing is needed
9177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int32 outputSize = pEncoderContext->mAccessUnit->size;
9187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pEncoderContext->mH264NALUPostProcessFct(
9197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mH264NALUPostProcessCtx,
9207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt8*)buffer->data()+buffer->range_offset(),
9217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            buffer->range_length(),
9227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt8*)pEncoderContext->mAccessUnit->dataAddress,
9237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &outputSize);
9247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
9257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mAccessUnit->size = (M4OSA_UInt32)outputSize;
9267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
9277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // The AU can just be copied
92832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            memcpy((void *)pEncoderContext->mAccessUnit->\
92932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                dataAddress, (void *)((M4OSA_MemAddr8)(buffer->data())+buffer->\
93032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                range_offset()), buffer->range_length());
9317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mAccessUnit->size =
9327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt32)buffer->range_length();
9337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
9347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if ( buffer->meta_data()->findInt32(kKeyIsSyncFrame,&i32Tmp) && i32Tmp){
9367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mAccessUnit->attribute = AU_RAP;
9377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
9385e61cfe5bb05d061ee4ef951b43156e68ff710afDheeraj Sharma            pEncoderContext->mAccessUnit->attribute = AU_P_Frame;
9397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
9407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mLastCTS = Cts;
9417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mAccessUnit->CTS = Cts;
9427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mAccessUnit->DTS = Cts;
9437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9442703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_processOutputBuffer: AU @ 0x%X 0x%X %d %d",
9457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mAccessUnit->dataAddress,
9463b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng            *pEncoderContext->mAccessUnit->dataAddress,
9477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mAccessUnit->size,
9487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mAccessUnit->CTS);
9497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Write the AU
9517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pEncoderContext->mWriterDataInterface->pProcessAU(
9527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mWriterDataInterface->pWriterContext,
9537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mAccessUnit->stream->streamID,
9547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mAccessUnit);
9557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
9567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
9577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
9597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
9602703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_processOutputBuffer no error");
9617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
9627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        SAFE_FREE(pEncoderContext->mHeader.pBuf);
9637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mHeader.Size = 0;
9642703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_processOutputBuffer ERROR 0x%X", err);
9653b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng    }
9662703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_processOutputBuffer end");
9677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
9687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
9697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_encode(M4ENCODER_Context pContext,
9717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VIFI_ImagePlane* pInPlane, M4OSA_Double Cts,
9727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ENCODER_FrameMode FrameMode) {
9737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
9747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
9757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t result = OK;
9767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBuffer* outputBuffer = NULL;
9773b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng
9782703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_encode 0x%X %f %d", pInPlane, Cts, FrameMode);
9797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
9807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext = (VideoEditorVideoEncoder_Context*)pContext;
9823b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng    if ( STARTED == pEncoderContext->mState ) {
9833b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng        pEncoderContext->mState = BUFFERING;
9847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
9857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(
9867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (BUFFERING | READING) & pEncoderContext->mState, M4ERR_STATE);
9877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mNbInputFrames++;
9893b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng    if ( 0 > pEncoderContext->mFirstInputCts ) {
9903b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng        pEncoderContext->mFirstInputCts = Cts;
9917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
9927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mLastInputCts = Cts;
9937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9942703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_encode 0x%X %d %f (%d)", pInPlane, FrameMode,
9957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        Cts, pEncoderContext->mLastCTS);
9967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Push the input buffer to the encoder source
9987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = VideoEditorVideoEncoder_processInputBuffer(pEncoderContext, Cts,
9997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_FALSE);
10001b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
10017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Notify the source in case of EOS
10037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( M4ENCODER_kLastFrame == FrameMode ) {
10047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = VideoEditorVideoEncoder_processInputBuffer(
10057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext, 0, M4OSA_TRUE);
10061b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang        VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
10077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
10087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( BUFFERING == pEncoderContext->mState ) {
10101b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang        // Prefetch is complete, start reading
10111b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang        pEncoderContext->mState = READING;
10127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
10137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Read
10141b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    while (1)  {
10151b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang        MediaBuffer *outputBuffer =
10161b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang                pEncoderContext->mPuller->getBufferNonBlocking();
10177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
101872425b1109ddd092048b5280889f972626a61b7eHong Teng        if (outputBuffer == NULL) {
101972425b1109ddd092048b5280889f972626a61b7eHong Teng            int32_t YUVBufferNumber =
102072425b1109ddd092048b5280889f972626a61b7eHong Teng                    pEncoderContext->mEncoderSource->getNumberOfBuffersInQueue();
102172425b1109ddd092048b5280889f972626a61b7eHong Teng            /* Make sure that the configured maximum number of prefetch YUV frames is
102272425b1109ddd092048b5280889f972626a61b7eHong Teng             * not exceeded. This is to limit the amount of memory usage of video editor engine.
102372425b1109ddd092048b5280889f972626a61b7eHong Teng             * The value of maximum prefetch Yuv frames is defined in media_profiles.xml */
102472425b1109ddd092048b5280889f972626a61b7eHong Teng            if ((YUVBufferNumber < pEncoderContext->mMaxPrefetchFrames) ||
102572425b1109ddd092048b5280889f972626a61b7eHong Teng                (pEncoderContext->mPuller->hasMediaSourceReturnedError()
102672425b1109ddd092048b5280889f972626a61b7eHong Teng                    == true)) {
102772425b1109ddd092048b5280889f972626a61b7eHong Teng                break;
102872425b1109ddd092048b5280889f972626a61b7eHong Teng            }
102972425b1109ddd092048b5280889f972626a61b7eHong Teng        } else {
103072425b1109ddd092048b5280889f972626a61b7eHong Teng            // Provide the encoded AU to the writer
103172425b1109ddd092048b5280889f972626a61b7eHong Teng            err = VideoEditorVideoEncoder_processOutputBuffer(pEncoderContext,
103272425b1109ddd092048b5280889f972626a61b7eHong Teng                outputBuffer);
103372425b1109ddd092048b5280889f972626a61b7eHong Teng            VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
10341b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang
103572425b1109ddd092048b5280889f972626a61b7eHong Teng            pEncoderContext->mPuller->putBuffer(outputBuffer);
103672425b1109ddd092048b5280889f972626a61b7eHong Teng        }
10371b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    }
10387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
10407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
10412703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_encode no error");
10427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
10432703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_encode ERROR 0x%X", err);
10443b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng    }
10452703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_encode end");
10467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
10477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
10487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_start(M4ENCODER_Context pContext) {
10507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR                  err             = M4NO_ERROR;
10517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
10527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t                   result          = OK;
10533b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng
10542703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_start begin");
10557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
10567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
10577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext = (VideoEditorVideoEncoder_Context*)pContext;
10597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(OPENED == pEncoderContext->mState, M4ERR_STATE);
10607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mNbInputFrames  = 0;
10627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mFirstInputCts  = -1.0;
10637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mLastInputCts   = -1.0;
10647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mNbOutputFrames = 0;
10657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mFirstOutputCts = -1;
10667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mLastOutputCts  = -1;
10677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    result = pEncoderContext->mEncoder->start();
10697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(OK == result, M4ERR_STATE);
10707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10711b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    pEncoderContext->mPuller->start();
10721b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang
10737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Set the new state
10747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext->mState = STARTED;
10757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
10777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( M4NO_ERROR == err ) {
10782703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_start no error");
10797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
10802703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_start ERROR 0x%X", err);
10813b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng    }
10822703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_start end");
10837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
10847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
10857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_stop(M4ENCODER_Context pContext) {
10877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
10887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
10897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBuffer* outputBuffer = NULL;
10907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t result = OK;
10913b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng
10922703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_stop begin");
10937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
10947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
10957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext = (VideoEditorVideoEncoder_Context*)pContext;
10967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10971b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    // Send EOS again to make sure the source doesn't block.
10981b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    err = VideoEditorVideoEncoder_processInputBuffer(pEncoderContext, 0,
10991b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang        M4OSA_TRUE);
11001b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang    VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
11011b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang
11027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Process the remaining buffers if necessary
11037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( (BUFFERING | READING) & pEncoderContext->mState ) {
11041b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang        while (1)  {
11051b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang            MediaBuffer *outputBuffer =
11061b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang                pEncoderContext->mPuller->getBufferBlocking();
11071b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang
11081b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang            if (outputBuffer == NULL) break;
11091b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang
11101b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang            err = VideoEditorVideoEncoder_processOutputBuffer(
11111b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang                pEncoderContext, outputBuffer);
11121b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang            VIDEOEDITOR_CHECK(M4NO_ERROR == err, err);
11131b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang
11141b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang            pEncoderContext->mPuller->putBuffer(outputBuffer);
11157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
11161b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang
11177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mState = STARTED;
11187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
11197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Stop the graph module if necessary
11217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( STARTED == pEncoderContext->mState ) {
11221b37de259e00e22f261f2711e0a318aa386581c7Chih-Chung Chang        pEncoderContext->mPuller->stop();
11237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mEncoder->stop();
11247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderContext->mState = OPENED;
11257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
11267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11279dd21dd09e821d24eda6af225fa173f4aa2d366cJames Dong    if (pEncoderContext->mNbInputFrames != pEncoderContext->mNbOutputFrames) {
1128e70ff37034fdb93f65d34704aec400ec9123e55cSteve Block        ALOGW("Some frames were not encoded: input(%d) != output(%d)",
11299dd21dd09e821d24eda6af225fa173f4aa2d366cJames Dong            pEncoderContext->mNbInputFrames, pEncoderContext->mNbOutputFrames);
11307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
11317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
11337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( M4NO_ERROR == err ) {
11342703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_stop no error");
11357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
11362703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_stop ERROR 0x%X", err);
11373b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng    }
11382703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_stop end");
11397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
11407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
11417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_regulBitRate(M4ENCODER_Context pContext) {
1143e70ff37034fdb93f65d34704aec400ec9123e55cSteve Block    ALOGW("regulBitRate is not implemented");
11449dd21dd09e821d24eda6af225fa173f4aa2d366cJames Dong    return M4NO_ERROR;
11457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
11467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_setOption(M4ENCODER_Context pContext,
11487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 optionID, M4OSA_DataOption optionValue) {
11497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
11507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
11513b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng
11522703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_setOption start optionID 0x%X", optionID);
11537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
11547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
11557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext = (VideoEditorVideoEncoder_Context*)pContext;
11577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( optionID ) {
11597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_kOptionID_SetH264ProcessNALUfctsPtr:
11607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mH264NALUPostProcessFct =
11617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (H264MCS_ProcessEncodedNALU_fct*)optionValue;
11627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
11637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_kOptionID_H264ProcessNALUContext:
11647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderContext->mH264NALUPostProcessCtx =
11657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_Context)optionValue;
11667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
11677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
11682703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditorVideoEncoder_setOption: unsupported optionId 0x%X",
11697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                optionID);
11707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
11717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
11727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
11737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
11757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( M4NO_ERROR == err ) {
11762703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_setOption no error");
11777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
11782703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_setOption ERROR 0x%X", err);
11793b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng    }
11802703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_setOption end");
11817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
11827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
11837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_getOption(M4ENCODER_Context pContext,
11857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 optionID, M4OSA_DataOption optionValue) {
11867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
11877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditorVideoEncoder_Context* pEncoderContext = M4OSA_NULL;
11883b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng
11892703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_getOption begin optinId 0x%X", optionID);
11907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
11917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
11927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderContext = (VideoEditorVideoEncoder_Context*)pContext;
11937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( optionID ) {
11957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_kOptionID_EncoderHeader:
11967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(
11977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_NULL != pEncoderContext->mHeader.pBuf, M4ERR_STATE);
11987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *(M4ENCODER_Header**)optionValue = &(pEncoderContext->mHeader);
11997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
12007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
12012703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditorVideoEncoder_getOption: unsupported optionId 0x%X",
12027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                optionID);
12037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_BAD_OPTION_ID);
12047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
12057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
12067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
12087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( M4NO_ERROR == err ) {
12092703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_getOption no error");
12107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
12112703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_getOption ERROR 0x%X", err);
12127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
12137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
12143b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng}
12157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_getInterface(M4ENCODER_Format format,
12177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ENCODER_Format* pFormat,
12187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ENCODER_GlobalInterface** pEncoderInterface, M4ENCODER_OpenMode mode){
12197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
12207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Input parameters check
12227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pFormat,           M4ERR_PARAMETER);
12237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pEncoderInterface, M4ERR_PARAMETER);
12247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12252703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorVideoEncoder_getInterface begin 0x%x 0x%x %d", pFormat,
12267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderInterface, mode);
12277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_MALLOC(*pEncoderInterface, M4ENCODER_GlobalInterface, 1,
12297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditorVideoEncoder");
12307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pFormat = format;
12327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( format ) {
12343b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng        case M4ENCODER_kH263:
12353b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng            {
12367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pEncoderInterface)->pFctInit =
12373b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng                    VideoEditorVideoEncoder_init_H263;
12383b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng                break;
12397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
12403b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng        case M4ENCODER_kMPEG4:
12413b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng            {
12427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pEncoderInterface)->pFctInit =
12433b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng                    VideoEditorVideoEncoder_init_MPEG4;
12443b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng                break;
12457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
12463b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng        case M4ENCODER_kH264:
12473b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng            {
12487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pEncoderInterface)->pFctInit =
12493b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng                    VideoEditorVideoEncoder_init_H264;
12503b25fdc4a33b53cfcf67315c2d42ad699b8cefe2hongteng                break;
12517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
12527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
12532703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditorVideoEncoder_getInterface : unsupported format %d",
12547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                format);
12557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VIDEOEDITOR_CHECK(M4OSA_FALSE, M4ERR_PARAMETER);
12567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
12577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
12587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pEncoderInterface)->pFctOpen         = VideoEditorVideoEncoder_open;
12597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pEncoderInterface)->pFctStart        = VideoEditorVideoEncoder_start;
12607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pEncoderInterface)->pFctStop         = VideoEditorVideoEncoder_stop;
12617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pEncoderInterface)->pFctPause        = M4OSA_NULL;
12627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pEncoderInterface)->pFctResume       = M4OSA_NULL;
12637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pEncoderInterface)->pFctClose        = VideoEditorVideoEncoder_close;
12647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pEncoderInterface)->pFctCleanup      = VideoEditorVideoEncoder_cleanup;
12657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pEncoderInterface)->pFctRegulBitRate =
12667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditorVideoEncoder_regulBitRate;
12677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pEncoderInterface)->pFctEncode       = VideoEditorVideoEncoder_encode;
12687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pEncoderInterface)->pFctSetOption    = VideoEditorVideoEncoder_setOption;
12697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pEncoderInterface)->pFctGetOption    = VideoEditorVideoEncoder_getOption;
12707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
12727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
12732703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_getInterface no error");
12747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
12757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pEncoderInterface = M4OSA_NULL;
12762703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorVideoEncoder_getInterface ERROR 0x%X", err);
12777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
12787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
12797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
12807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiextern "C" {
12827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_getInterface_H263(M4ENCODER_Format* pFormat,
12847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ENCODER_GlobalInterface** pEncoderInterface, M4ENCODER_OpenMode mode){
12857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorVideoEncoder_getInterface(M4ENCODER_kH263, pFormat,
12867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderInterface, mode);
12877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
12887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_getInterface_MPEG4(M4ENCODER_Format* pFormat,
12907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ENCODER_GlobalInterface** pEncoderInterface, M4ENCODER_OpenMode mode){
12917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorVideoEncoder_getInterface(M4ENCODER_kMPEG4, pFormat,
12927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi           pEncoderInterface, mode);
12937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
12947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoEncoder_getInterface_H264(M4ENCODER_Format* pFormat,
12967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ENCODER_GlobalInterface** pEncoderInterface, M4ENCODER_OpenMode mode){
12977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return VideoEditorVideoEncoder_getInterface(M4ENCODER_kH264, pFormat,
12987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi           pEncoderInterface, mode);
12997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
13017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}  // extern "C"
13037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}  // namespace android
1305