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