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 VideoEditorVideoDecoder.cpp 197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief StageFright shell video decoder 207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************* 217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/ 227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_NDEBUG 1 237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_TAG "VIDEOEDITOR_VIDEODECODER" 247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/******************* 257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * HEADERS * 267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************/ 277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditorVideoDecoder_internal.h" 297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditorUtils.h" 307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VD_Tools.h" 317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32c4689fae1bdb8d1c94eb28af1b2a1f30d2b1a3daJames Dong#include <media/stagefright/foundation/ADebug.h> 337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MetaData.h> 347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaDefs.h> 357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/******************** 367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * DEFINITIONS * 377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************/ 387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define MAX_DEC_BUFFERS 10 397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/******************** 417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * SOURCE CLASS * 427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************/ 437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiusing namespace android; 44b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Changstatic M4OSA_ERR copyBufferToQueue( 45b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang VideoEditorVideoDecoder_Context* pDecShellContext, 46b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang MediaBuffer* pDecodedBuffer); 477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiclass VideoEditorVideoDecoderSource : public MediaSource { 497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi public: 50e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong 51e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong VideoEditorVideoDecoderSource( 52e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong const sp<MetaData> &format, 53e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong VIDEOEDITOR_CodecType codecType, 54e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong void *decoderShellContext); 55e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong 567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi virtual status_t start(MetaData *params = NULL); 577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi virtual status_t stop(); 587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi virtual sp<MetaData> getFormat(); 597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi virtual status_t read( 607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBuffer **buffer, const ReadOptions *options = NULL); 617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi protected : 637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi virtual ~VideoEditorVideoDecoderSource(); 647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi private: 667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sp<MetaData> mFormat; 677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBuffer* mBuffer; 687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBufferGroup* mGroup; 697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Mutex mLock; 707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorVideoDecoder_Context* mpDecShellContext; 717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int32_t mMaxAUSize; 727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi bool mStarted; 737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CodecType mCodecType; 74e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong 75e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong // Don't call me 76e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong VideoEditorVideoDecoderSource(const VideoEditorVideoDecoderSource &); 77e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong VideoEditorVideoDecoderSource &operator=( 78e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong const VideoEditorVideoDecoderSource &); 797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiVideoEditorVideoDecoderSource::VideoEditorVideoDecoderSource( 827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi const sp<MetaData> &format, VIDEOEDITOR_CodecType codecType, 837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi void *decoderShellContext) : 847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mFormat(format), 857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mBuffer(NULL), 867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mGroup(NULL), 877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mStarted(false), 887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mCodecType(codecType) { 897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mpDecShellContext = (VideoEditorVideoDecoder_Context*) decoderShellContext; 907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiVideoEditorVideoDecoderSource::~VideoEditorVideoDecoderSource() { 937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mStarted == true) { 947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi stop(); 957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorVideoDecoderSource::start( 997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MetaData *params) { 1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (!mStarted) { 102e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong if (mFormat->findInt32(kKeyMaxInputSize, &mMaxAUSize) == false) { 103f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("Could not find kKeyMaxInputSize"); 104e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong return ERROR_MALFORMED; 1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mGroup = new MediaBufferGroup; 108e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong if (mGroup == NULL) { 109f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("FATAL: memory limitation ! "); 1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return NO_MEMORY; 1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 112e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong 1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mGroup->add_buffer(new MediaBuffer(mMaxAUSize)); 1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mStarted = true; 1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return OK; 1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorVideoDecoderSource::stop() { 1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mStarted) { 122e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong if (mBuffer != NULL) { 123e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong 124e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong // FIXME: 125e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong // Why do we need to check on the ref count? 126e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong int ref_count = mBuffer->refcount(); 1272703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("MediaBuffer refcount is %d",ref_count); 128e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong for (int i = 0; i < ref_count; ++i) { 1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mBuffer->release(); 1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mBuffer = NULL; 1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi delete mGroup; 1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mGroup = NULL; 1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mStarted = false; 1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return OK; 1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargisp<MetaData> VideoEditorVideoDecoderSource::getFormat() { 1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Mutex::Autolock autolock(mLock); 1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return mFormat; 1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t VideoEditorVideoDecoderSource::read(MediaBuffer** buffer_out, 1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi const ReadOptions *options) { 1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Mutex::Autolock autolock(mLock); 151e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong if (options != NULL) { 152b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang int64_t time_us; 153b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang MediaSource::ReadOptions::SeekMode mode; 154b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang options->getSeekTo(&time_us, &mode); 155b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang if (mode != MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC) { 156f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("Unexpected read options"); 157b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang return BAD_VALUE; 158b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } 159b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 160b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang M4OSA_ERR err; 161b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang M4OSA_Int32 rapTime = time_us / 1000; 162b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 163b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang /*--- Retrieve the previous RAP time ---*/ 164b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang err = mpDecShellContext->m_pReaderGlobal->m_pFctGetPrevRapTime( 165b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang mpDecShellContext->m_pReader->m_readerContext, 166b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang (M4_StreamHandler*)mpDecShellContext->m_pVideoStreamhandler, 167b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang &rapTime); 168b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 169b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang if (err == M4WAR_READER_INFORMATION_NOT_PRESENT) { 170b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang /* No RAP table, jump backward and predecode */ 171b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang rapTime -= 40000; 172b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang if(rapTime < 0) rapTime = 0; 173b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } else if (err != OK) { 174f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("get rap time error = 0x%x\n", (uint32_t)err); 175b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang return UNKNOWN_ERROR; 176b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } 177b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 178b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang err = mpDecShellContext->m_pReaderGlobal->m_pFctJump( 179b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang mpDecShellContext->m_pReader->m_readerContext, 180b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang (M4_StreamHandler*)mpDecShellContext->m_pVideoStreamhandler, 181b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang &rapTime); 182b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 183b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang if (err != OK) { 184f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("jump err = 0x%x\n", (uint32_t)err); 185b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang return BAD_VALUE; 186b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } 187e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong } 1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *buffer_out = NULL; 1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 191e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong M4OSA_ERR lerr = mGroup->acquire_buffer(&mBuffer); 1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (lerr != OK) { 1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return lerr; 1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 195e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong mBuffer->meta_data()->clear(); // clear all the meta data 1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mStarted) { 1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi //getNext AU from reader. 199e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong M4_AccessUnit* pAccessUnit = mpDecShellContext->m_pNextAccessUnitToDecode; 2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lerr = mpDecShellContext->m_pReader->m_pFctGetNextAu( 2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mpDecShellContext->m_pReader->m_readerContext, 2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_StreamHandler*)mpDecShellContext->m_pVideoStreamhandler, 2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAccessUnit); 204e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong if (lerr == M4WAR_NO_DATA_YET || lerr == M4WAR_NO_MORE_AU) { 2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *buffer_out = NULL; 2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return ERROR_END_OF_STREAM; 2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi //copy the reader AU buffer to mBuffer 210e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong M4OSA_UInt32 lSize = (pAccessUnit->m_size > (M4OSA_UInt32)mMaxAUSize)\ 2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ? (M4OSA_UInt32)mMaxAUSize : pAccessUnit->m_size; 21232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)mBuffer->data(),(void *)pAccessUnit->m_dataAddress, 2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lSize); 2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mBuffer->set_range(0, lSize); 216e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong int64_t frameTimeUs = (int64_t) (pAccessUnit->m_CTS * 1000); 217e946f0bfe7f5c63d4b10497ccc87ddb5b002b51dJames Dong mBuffer->meta_data()->setInt64(kKeyTime, frameTimeUs); 2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Replace the AU start code for H264 2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (VIDEOEDITOR_kH264VideoDec == mCodecType) { 2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uint8_t *data =(uint8_t *)mBuffer->data() + mBuffer->range_offset(); 2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi data[0]=0; 2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi data[1]=0; 2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi data[2]=0; 2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi data[3]=1; 2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mBuffer->meta_data()->setInt32(kKeyIsSyncFrame, 2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pAccessUnit->m_attribute == 0x04)? 1 : 0); 2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *buffer_out = mBuffer; 2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return OK; 2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 VideoEditorVideoDecoder_GetBitsFromMemory( 2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_VIDEO_Bitstream_ctxt* parsingCtxt, M4OSA_UInt32 nb_bits) { 2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return (M4VD_Tools_GetBitsFromMemory((M4VS_Bitstream_ctxt*) parsingCtxt, 2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nb_bits)); 2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoDecoder_internalParseVideoDSI(M4OSA_UInt8* pVol, 2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 aVolSize, M4DECODER_MPEG4_DecoderConfigInfo* pDci, 2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4DECODER_VideoSize* pVideoSize) { 2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_VIDEO_Bitstream_ctxt parsingCtxt; 2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 code, j; 2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_MemAddr8 start; 2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 i; 2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 time_incr_length; 2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 vol_verid=0, b_hierarchy_type; 2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Parsing variables */ 2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 video_object_layer_shape = 0; 2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 sprite_enable = 0; 2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 reduced_resolution_vop_enable = 0; 2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 scalability = 0; 2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 enhancement_type = 0; 2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 complexity_estimation_disable = 0; 2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 interlaced = 0; 2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 sprite_warping_points = 0; 2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 sprite_brightness_change = 0; 2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 quant_precision = 0; 2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Fill the structure with default parameters */ 2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVideoSize->m_uiWidth = 0; 2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVideoSize->m_uiHeight = 0; 2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDci->uiTimeScale = 0; 2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDci->uiProfile = 0; 2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDci->uiUseOfResynchMarker = 0; 2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDci->bDataPartition = M4OSA_FALSE; 2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDci->bUseOfRVLC = M4OSA_FALSE; 2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Reset the bitstream context */ 2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi parsingCtxt.stream_byte = 0; 2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi parsingCtxt.stream_index = 8; 2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi parsingCtxt.in = (M4OSA_MemAddr8) pVol; 2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi start = (M4OSA_MemAddr8) pVol; 2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Start parsing */ 2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi while (parsingCtxt.in - start < aVolSize) { 2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory(&parsingCtxt, 8); 2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code == 0) { 2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory(&parsingCtxt, 8); 2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code == 0) { 2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory(&parsingCtxt,8); 2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code == 1) { 2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* start code found */ 2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 8); 2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ----- 0x20..0x2F : video_object_layer_start_code ----- */ 2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((code > 0x1F) && (code < 0x30)) { 2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1); 2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 8); 2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1); 3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code == 1) { 3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 4); 3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi vol_verid = (M4OSA_UInt8)code; 3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 3); 3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 4); 3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code == 15) { 3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 16); 3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1); 3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code == 1) { 3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 3); 3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1); 3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code == 1) { 3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 32); 3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 31); 3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 16); 3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 2); 3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Need to save it for vop parsing */ 3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi video_object_layer_shape = (M4OSA_UInt8)code; 3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code != 0) { 3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return 0; /* only rectangular case supported */ 3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1); 3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 16); 3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDci->uiTimeScale = code; 3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Computes time increment length */ 3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi j = code - 1; 3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (i = 0; (i < 32) && (j != 0); j >>=1) { 3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i++; 3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi time_incr_length = (i == 0) ? 1 : i; 3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1); 3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1); 3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code == 1) { 3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, time_incr_length); 3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(video_object_layer_shape != 1) { /* 1 = Binary */ 3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(video_object_layer_shape == 0) { 3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* Marker bit */ 3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 13);/* Width */ 3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVideoSize->m_uiWidth = code; 3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* Marker bit */ 3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 13);/* Height */ 3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVideoSize->m_uiHeight = code; 3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* Marker bit */ 3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* interlaced */ 3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi interlaced = (M4OSA_UInt8)code; 3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* OBMC disable */ 3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(vol_verid == 1) { 3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* sprite enable */ 3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sprite_enable = (M4OSA_UInt8)code; 3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 2);/* sprite enable */ 3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sprite_enable = (M4OSA_UInt8)code; 3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((sprite_enable == 1) || (sprite_enable == 2)) { 3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (sprite_enable != 2) { 3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 13);/* sprite width */ 3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* Marker bit */ 4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 13);/* sprite height */ 4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* Marker bit */ 4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 13);/* sprite l coordinate */ 4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* Marker bit */ 4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 13);/* sprite top coordinate */ 4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* Marker bit */ 4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 6);/* sprite warping points */ 4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sprite_warping_points = (M4OSA_UInt8)code; 4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 2);/* sprite warping accuracy */ 4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* sprite brightness change */ 4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sprite_brightness_change = (M4OSA_UInt8)code; 4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (sprite_enable != 2) { 4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1); 4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((vol_verid != 1) && (video_object_layer_shape != 0)){ 4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* sadct disable */ 4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1); /* not 8 bits */ 4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code) { 4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 4);/* quant precision */ 4377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi quant_precision = (M4OSA_UInt8)code; 4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 4);/* bits per pixel */ 4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* greyscale not supported */ 4437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(video_object_layer_shape == 3) { 4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 3); 4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* quant type */ 4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code) { 4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* load intra quant mat */ 4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code) { 4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 8);/* */ 4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i = 1; 4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi while (i < 64) { 4587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = 4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorVideoDecoder_GetBitsFromMemory( 4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 8); 4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code == 0) { 4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i++; 4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* load non intra quant mat */ 4707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code) { 4717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 8);/* */ 4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i = 1; 4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi while (i < 64) { 4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = 4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorVideoDecoder_GetBitsFromMemory( 4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 8); 4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code == 0) { 4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 4807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i++; 4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (vol_verid != 1) { 4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* quarter sample */ 4897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* complexity estimation disable */ 4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi complexity_estimation_disable = (M4OSA_UInt8)code; 4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (!code) { 4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi //return M4ERR_NOT_IMPLEMENTED; 4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* resync marker disable */ 5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDci->uiUseOfResynchMarker = (code) ? 0 : 1; 5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* data partitionned */ 5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDci->bDataPartition = (code) ? M4OSA_TRUE : M4OSA_FALSE; 5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code) { 5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* reversible VLC */ 5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDci->bUseOfRVLC = (code) ? M4OSA_TRUE : M4OSA_FALSE; 5097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (vol_verid != 1) { 5127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* newpred */ 5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code) { 5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi //return M4ERR_PARAMETER; 5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1); 5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi reduced_resolution_vop_enable = (M4OSA_UInt8)code; 5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* scalability */ 5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi scalability = (M4OSA_UInt8)code; 5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code) { 5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* hierarchy type */ 5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi b_hierarchy_type = (M4OSA_UInt8)code; 5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 4);/* ref layer id */ 5327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* ref sampling direct */ 5347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 5);/* hor sampling factor N */ 5367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 5);/* hor sampling factor M */ 5387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 5);/* vert sampling factor N */ 5407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 5);/* vert sampling factor M */ 5427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* enhancement type */ 5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi enhancement_type = (M4OSA_UInt8)code; 5457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((!b_hierarchy_type) && 5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (video_object_layer_shape == 1)) { 5477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* use ref shape */ 5497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* use ref texture */ 5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 5); 5537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 5); 5557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 5); 5577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 5); 5597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 5627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ----- 0xB0 : visual_object_sequence_start_code ----- */ 5657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if(code == 0xB0) { 5677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 8);/* profile_and_level_indication */ 5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDci->uiProfile = (M4OSA_UInt8)code; 5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ----- 0xB5 : visual_object_start_code ----- */ 5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if(code == 0xB5) { 5757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 1);/* is object layer identifier */ 5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (code == 1) { 5787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 4); /* visual object verid */ 5807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi vol_verid = (M4OSA_UInt8)code; 5817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 3); 5837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi code = VideoEditorVideoDecoder_GetBitsFromMemory( 5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &parsingCtxt, 7); /* Realign on byte */ 5867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi vol_verid = 1; 5877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ----- end ----- */ 5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 5927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((code >> 2) == 0x20) { 5937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* H263 ...-> wrong*/ 5947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 5957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 6017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 6027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4VIFI_UInt8 M4VIFI_SemiplanarYVU420toYUV420(void *user_data, 6047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VIFI_UInt8 *inyuv, M4VIFI_ImagePlane *PlaneOut ) { 6057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VIFI_UInt8 return_code = M4VIFI_OK; 6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VIFI_UInt8 *outyuv = 6077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ((M4VIFI_UInt8*)&(PlaneOut[0].pac_data[PlaneOut[0].u_topleft])); 6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int32_t width = PlaneOut[0].u_width; 6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int32_t height = PlaneOut[0].u_height; 6107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int32_t outYsize = width * height; 6127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uint32_t *outy = (uint32_t *) outyuv; 6137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uint16_t *outcb = 6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (uint16_t *) &(PlaneOut[1].pac_data[PlaneOut[1].u_topleft]); 6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uint16_t *outcr = 6167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (uint16_t *) &(PlaneOut[2].pac_data[PlaneOut[2].u_topleft]); 6177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Y copying */ 61932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)outy, (void *)inyuv, outYsize); 6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* U & V copying */ 6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uint32_t *inyuv_4 = (uint32_t *) (inyuv + outYsize); 6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (int32_t i = height >> 1; i > 0; --i) { 6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (int32_t j = width >> 2; j > 0; --j) { 6257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uint32_t temp = *inyuv_4++; 6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uint32_t tempU = temp & 0xFF; 6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tempU = tempU | ((temp >> 8) & 0xFF00); 6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi uint32_t tempV = (temp >> 8) & 0xFF; 6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tempV = tempV | ((temp >> 16) & 0xFF00); 6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Flip U and V 6337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *outcb++ = tempV; 6347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *outcr++ = tempU; 6357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return return_code; 6387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 6390a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowduryvoid logSupportDecodersAndCapabilities(M4DECODER_VideoDecoders* decoders) { 6400a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury VideoDecoder *pDecoder; 6410a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury VideoComponentCapabilities *pOmxComponents = NULL; 6420a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury VideoProfileLevel *pProfileLevel = NULL; 6430a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pDecoder = decoders->decoder; 6440a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury for (size_t i = 0; i< decoders->decoderNumber; i++) { 6452703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("Supported Codec[%d] :%d", i, pDecoder->codec); 6460a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pOmxComponents = pDecoder->component; 6470a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury for(size_t j = 0; j < pDecoder->componentNumber; j++) { 6480a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pProfileLevel = pOmxComponents->profileLevel; 6492703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("-->component %d", j); 6500a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury for(size_t k = 0; k < pOmxComponents->profileNumber; k++) { 6512703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("-->profile:%ld maxLevel:%ld", pProfileLevel->mProfile, 6520a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pProfileLevel->mLevel); 6530a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pProfileLevel++; 6540a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury } 6550a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pOmxComponents++; 6567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6570a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pDecoder++; 6587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6590a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury} 66093d4a21f1c73df290e26a21e7a628f28d50bd035James Dong 6610a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh ChowduryM4OSA_ERR queryVideoDecoderCapabilities 6620a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury (M4DECODER_VideoDecoders** decoders) { 6630a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury M4OSA_ERR err = M4NO_ERROR; 6640a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury const char *kMimeTypes[] = { 6650a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury MEDIA_MIMETYPE_VIDEO_AVC, MEDIA_MIMETYPE_VIDEO_MPEG4, 6660a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury MEDIA_MIMETYPE_VIDEO_H263 6670a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury }; 6680a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury 6690a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury int32_t supportFormats = sizeof(kMimeTypes) / sizeof(kMimeTypes[0]); 6700a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury M4DECODER_VideoDecoders *pDecoders; 6710a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury VideoDecoder *pDecoder; 6720a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury VideoComponentCapabilities *pOmxComponents = NULL; 6730a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury VideoProfileLevel *pProfileLevel = NULL; 6740a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury OMXClient client; 6750a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury status_t status = OK; 6760a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury SAFE_MALLOC(pDecoders, M4DECODER_VideoDecoders, 1, "VideoDecoders"); 6770a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury SAFE_MALLOC(pDecoder, VideoDecoder, supportFormats, 6780a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury "VideoDecoder"); 6790a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pDecoders->decoder = pDecoder; 6800a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury 6810a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pDecoders->decoderNumber= supportFormats; 6820a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury status = client.connect(); 6830a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury CHECK(status == OK); 6840a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury for (size_t k = 0; k < sizeof(kMimeTypes) / sizeof(kMimeTypes[0]); 6850a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury ++k) { 6860a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury Vector<CodecCapabilities> results; 6870a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury CHECK_EQ(QueryCodecs(client.interface(), kMimeTypes[k], 6880a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury true, // queryDecoders 6890a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury &results), (status_t)OK); 6900a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury 6910a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury if (results.size()) { 6920a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury SAFE_MALLOC(pOmxComponents, VideoComponentCapabilities, 6930a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury results.size(), "VideoComponentCapabilities"); 6942703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("K=%d",k); 6950a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pDecoder->component = pOmxComponents; 6960a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pDecoder->componentNumber = results.size(); 6970a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury } 6980a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury 6990a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury for (size_t i = 0; i < results.size(); ++i) { 7002703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV(" decoder '%s' supports ", 7010a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury results[i].mComponentName.string()); 7020a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury 7030a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury if (results[i].mProfileLevels.size() == 0) { 7042703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("NOTHING.\n"); 7050a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury continue; 7067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 70793d4a21f1c73df290e26a21e7a628f28d50bd035James Dong 70893d4a21f1c73df290e26a21e7a628f28d50bd035James Dong#if 0 70993d4a21f1c73df290e26a21e7a628f28d50bd035James Dong // FIXME: 71093d4a21f1c73df290e26a21e7a628f28d50bd035James Dong // We should ignore the software codecs and make IsSoftwareCodec() 71193d4a21f1c73df290e26a21e7a628f28d50bd035James Dong // part of pubic API from OMXCodec.cpp 71293d4a21f1c73df290e26a21e7a628f28d50bd035James Dong if (IsSoftwareCodec(results[i].mComponentName.string())) { 7132703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("Ignore software codec %s", results[i].mComponentName.string()); 71493d4a21f1c73df290e26a21e7a628f28d50bd035James Dong continue; 71593d4a21f1c73df290e26a21e7a628f28d50bd035James Dong } 71693d4a21f1c73df290e26a21e7a628f28d50bd035James Dong#endif 71793d4a21f1c73df290e26a21e7a628f28d50bd035James Dong 7180a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury // Count the supported profiles 7190a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury int32_t profileNumber = 0; 7200a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury int32_t profile = -1; 7210a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury for (size_t j = 0; j < results[i].mProfileLevels.size(); ++j) { 7220a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury const CodecProfileLevel &profileLevel = 7230a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury results[i].mProfileLevels[j]; 72493d4a21f1c73df290e26a21e7a628f28d50bd035James Dong // FIXME: assume that the profiles are ordered 7250a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury if (profileLevel.mProfile != profile) { 7260a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury profile = profileLevel.mProfile; 7270a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury profileNumber++; 7280a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury } 7290a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury } 7300a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury SAFE_MALLOC(pProfileLevel, VideoProfileLevel, 7310a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury profileNumber, "VideoProfileLevel"); 7320a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pOmxComponents->profileLevel = pProfileLevel; 7330a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pOmxComponents->profileNumber = profileNumber; 7340a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury 7350a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury // Get the max Level for each profile. 7360a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury int32_t maxLevel = -1; 7370a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury profile = -1; 7380a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury profileNumber = 0; 7390a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury for (size_t j = 0; j < results[i].mProfileLevels.size(); ++j) { 7400a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury const CodecProfileLevel &profileLevel = 7410a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury results[i].mProfileLevels[j]; 7420a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury if (profile == -1 && maxLevel == -1) { 7430a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury profile = profileLevel.mProfile; 7440a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury maxLevel = profileLevel.mLevel; 7450a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pProfileLevel->mProfile = profile; 7460a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pProfileLevel->mLevel = maxLevel; 7472703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("%d profile: %ld, max level: %ld", 74893d4a21f1c73df290e26a21e7a628f28d50bd035James Dong __LINE__, pProfileLevel->mProfile, pProfileLevel->mLevel); 74993d4a21f1c73df290e26a21e7a628f28d50bd035James Dong } 75093d4a21f1c73df290e26a21e7a628f28d50bd035James Dong if (profileLevel.mProfile != profile) { 75193d4a21f1c73df290e26a21e7a628f28d50bd035James Dong profile = profileLevel.mProfile; 75293d4a21f1c73df290e26a21e7a628f28d50bd035James Dong maxLevel = profileLevel.mLevel; 7530a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury profileNumber++; 7540a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pProfileLevel++; 75593d4a21f1c73df290e26a21e7a628f28d50bd035James Dong pProfileLevel->mProfile = profile; 75693d4a21f1c73df290e26a21e7a628f28d50bd035James Dong pProfileLevel->mLevel = maxLevel; 7572703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("%d profile: %ld, max level: %ld", 75893d4a21f1c73df290e26a21e7a628f28d50bd035James Dong __LINE__, pProfileLevel->mProfile, pProfileLevel->mLevel); 75993d4a21f1c73df290e26a21e7a628f28d50bd035James Dong } else if (profileLevel.mLevel > maxLevel) { 7600a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury maxLevel = profileLevel.mLevel; 76193d4a21f1c73df290e26a21e7a628f28d50bd035James Dong pProfileLevel->mLevel = maxLevel; 7622703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("%d profile: %ld, max level: %ld", 76393d4a21f1c73df290e26a21e7a628f28d50bd035James Dong __LINE__, pProfileLevel->mProfile, pProfileLevel->mLevel); 7640a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury } 7650a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury 7660a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury } 7670a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pOmxComponents++; 7680a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury } 7690a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury if (!strcmp(MEDIA_MIMETYPE_VIDEO_AVC, kMimeTypes[k])) 7700a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pDecoder->codec = M4DA_StreamTypeVideoMpeg4Avc; 7710a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury if (!strcmp(MEDIA_MIMETYPE_VIDEO_MPEG4, kMimeTypes[k])) 7720a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pDecoder->codec = M4DA_StreamTypeVideoMpeg4; 7730a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury if (!strcmp(MEDIA_MIMETYPE_VIDEO_H263, kMimeTypes[k])) 7740a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pDecoder->codec = M4DA_StreamTypeVideoH263; 7750a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury 7760a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury pDecoder++; 7777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7780a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury 7790a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury logSupportDecodersAndCapabilities(pDecoders); 7800a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury *decoders = pDecoders; 7810a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh ChowdurycleanUp: 7827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 7837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 7847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/******************** 7857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * ENGINE INTERFACE * 7867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************/ 7877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoDecoder_configureFromMetadata(M4OSA_Context pContext, 7887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MetaData* meta) { 7897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 7907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorVideoDecoder_Context* pDecShellContext = M4OSA_NULL; 7917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi bool success = OK; 7927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int32_t width = 0; 7937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int32_t height = 0; 7947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int32_t frameSize = 0; 79535cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi int32_t vWidth, vHeight; 79635cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi int32_t cropLeft, cropTop, cropRight, cropBottom; 7977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER); 7997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != meta, M4ERR_PARAMETER); 8007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8012703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_configureFromMetadata begin"); 8027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext = (VideoEditorVideoDecoder_Context*)pContext; 8047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 80535cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi success = meta->findInt32(kKeyWidth, &vWidth); 8067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(TRUE == success, M4ERR_PARAMETER); 80735cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi success = meta->findInt32(kKeyHeight, &vHeight); 80835cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi VIDEOEDITOR_CHECK(TRUE == success, M4ERR_PARAMETER); 80935cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 8102703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("vWidth = %d, vHeight = %d", vWidth, vHeight); 8117efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang 81235cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi pDecShellContext->mGivenWidth = vWidth; 81335cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi pDecShellContext->mGivenHeight = vHeight; 81435cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 81535cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi if (!meta->findRect( 81635cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi kKeyCropRect, &cropLeft, &cropTop, &cropRight, &cropBottom)) { 81735cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 81835cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi cropLeft = cropTop = 0; 81935cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi cropRight = vWidth - 1; 82035cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi cropBottom = vHeight - 1; 82135cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 8222703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("got dimensions only %d x %d", width, height); 82335cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi } else { 8242703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("got crop rect %d, %d, %d, %d", 82535cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi cropLeft, cropTop, cropRight, cropBottom); 82635cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi } 82735cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 8287efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang pDecShellContext->mCropRect.left = cropLeft; 8297efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang pDecShellContext->mCropRect.right = cropRight; 8307efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang pDecShellContext->mCropRect.top = cropTop; 8317efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang pDecShellContext->mCropRect.bottom = cropBottom; 8327efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang 83335cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi width = cropRight - cropLeft + 1; 83435cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi height = cropBottom - cropTop + 1; 8357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8362703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoDecoder_configureFromMetadata : W=%d H=%d", width, height); 8377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK((0 != width) && (0 != height), M4ERR_PARAMETER); 8387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( (M4OSA_NULL != pDecShellContext->m_pDecBufferPool) && 8407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pDecShellContext->m_pVideoStreamhandler->m_videoWidth == \ 8417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (uint32_t)width) && 8427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pDecShellContext->m_pVideoStreamhandler->m_videoHeight == \ 8437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (uint32_t)height) ) { 8447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // No need to reconfigure 8457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanUp; 8467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8472703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoDecoder_configureFromMetadata reset: W=%d H=%d", width, height); 8487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Update the stream handler parameters 8497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pVideoStreamhandler->m_videoWidth = width; 8507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pVideoStreamhandler->m_videoHeight = height; 8517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = (width * height * 3) / 2; 8527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Configure the buffer pool 8547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pDecShellContext->m_pDecBufferPool ) { 8552703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoDecoder_configureFromMetadata : reset the buffer pool"); 8567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_BUFFER_freePool(pDecShellContext->m_pDecBufferPool); 8577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pDecBufferPool = M4OSA_NULL; 8587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = VIDEOEDITOR_BUFFER_allocatePool(&pDecShellContext->m_pDecBufferPool, 8607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MAX_DEC_BUFFERS, (M4OSA_Char*)"VIDEOEDITOR_DecodedBufferPool"); 8617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4NO_ERROR == err, err); 8627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = VIDEOEDITOR_BUFFER_initPoolBuffers(pDecShellContext->m_pDecBufferPool, 86335cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi frameSize + pDecShellContext->mGivenWidth * 2); 86435cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi 8657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4NO_ERROR == err, err); 8667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp: 8687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) { 8692703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_configureFromMetadata no error"); 8707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 8717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pDecShellContext->m_pDecBufferPool ) { 8727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_BUFFER_freePool(pDecShellContext->m_pDecBufferPool); 8737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pDecBufferPool = M4OSA_NULL; 8747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8752703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_configureFromMetadata ERROR 0x%X", err); 8767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8772703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_configureFromMetadata end"); 8787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 8797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 8807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoDecoder_destroy(M4OSA_Context pContext) { 8827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 8837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorVideoDecoder_Context* pDecShellContext = 8847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (VideoEditorVideoDecoder_Context*)pContext; 8857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Input parameters check 8872703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_destroy begin"); 8887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER); 8897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8907efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang // Release the color converter 8912aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang delete pDecShellContext->mI420ColorConverter; 8927efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang 8937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Destroy the graph 8947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pDecShellContext->mVideoDecoder != NULL ) { 8952703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("### VideoEditorVideoDecoder_destroy : releasing decoder"); 8967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mVideoDecoder->stop(); 8977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mVideoDecoder.clear(); 8987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mClient.disconnect(); 9007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mReaderSource.clear(); 9017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Release memory 9037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pDecShellContext->m_pDecBufferPool != M4OSA_NULL ) { 9047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_BUFFER_freePool(pDecShellContext->m_pDecBufferPool); 9057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pDecBufferPool = M4OSA_NULL; 9067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi SAFE_FREE(pDecShellContext); 9087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pContext = NULL; 9097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp: 9117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) { 9122703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_destroy no error"); 9137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 9142703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_destroy ERROR 0x%X", err); 9157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9162703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_destroy end"); 9177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 9187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 9197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoDecoder_create(M4OSA_Context *pContext, 9217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_StreamHandler *pStreamHandler, 922b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang M4READER_GlobalInterface *pReaderGlobalInterface, 9237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4READER_DataInterface *pReaderDataInterface, 9247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_AccessUnit *pAccessUnit, M4OSA_Void *pUserData) { 9257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 9267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorVideoDecoder_Context* pDecShellContext = M4OSA_NULL; 9277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi status_t status = OK; 9287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi bool success = TRUE; 9297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int32_t colorFormat = 0; 9307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 size = 0; 9317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sp<MetaData> decoderMetadata = NULL; 9327efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang int decoderOutput = OMX_COLOR_FormatYUV420Planar; 9337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9342703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_create begin"); 9357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Input parameters check 9367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER); 9377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pStreamHandler, M4ERR_PARAMETER); 9387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pReaderDataInterface, M4ERR_PARAMETER); 9397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Context allocation & initialization 9417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi SAFE_MALLOC(pDecShellContext, VideoEditorVideoDecoder_Context, 1, 9427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "VideoEditorVideoDecoder"); 9437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pVideoStreamhandler = 9447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_VideoStreamHandler*)pStreamHandler; 9457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pNextAccessUnitToDecode = pAccessUnit; 946b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pDecShellContext->m_pReaderGlobal = pReaderGlobalInterface; 9477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pReader = pReaderDataInterface; 9487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_lastDecodedCTS = -1; 9497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_lastRenderCts = -1; 9507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( pStreamHandler->m_streamType ) { 9517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4DA_StreamTypeVideoH263: 9527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mDecoderType = VIDEOEDITOR_kH263VideoDec; 9537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 9547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4DA_StreamTypeVideoMpeg4: 9557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mDecoderType = VIDEOEDITOR_kMpeg4VideoDec; 9567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Parse the VOL header 9577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = VideoEditorVideoDecoder_internalParseVideoDSI( 9587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt8*)pDecShellContext->m_pVideoStreamhandler->\ 9597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_basicProperties.m_pDecoderSpecificInfo, 9607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pVideoStreamhandler->\ 9617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_basicProperties.m_decoderSpecificInfoSize, 9627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pDecShellContext->m_Dci, &pDecShellContext->m_VideoSize); 9637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4NO_ERROR == err, err); 9647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 9657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4DA_StreamTypeVideoMpeg4Avc: 9667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mDecoderType = VIDEOEDITOR_kH264VideoDec; 9677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 9687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 9697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(!"VideoDecoder_create : incorrect stream type", 9707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_PARAMETER); 9717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 9727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mNbInputFrames = 0; 9757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mFirstInputCts = -1.0; 9767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mLastInputCts = -1.0; 9777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mNbRenderedFrames = 0; 9787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mFirstRenderedCts = -1.0; 9797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mLastRenderedCts = -1.0; 9807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mNbOutputFrames = 0; 9817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mFirstOutputCts = -1; 9827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mLastOutputCts = -1; 98335cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi pDecShellContext->m_pDecBufferPool = M4OSA_NULL; 9847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9853e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong // Calculate the interval between two video frames. 9863e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong CHECK(pDecShellContext->m_pVideoStreamhandler->m_averageFrameRate > 0); 9873e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong pDecShellContext->mFrameIntervalMs = 9883e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong 1000.0 / pDecShellContext->m_pVideoStreamhandler->m_averageFrameRate; 9893e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong 9907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * StageFright graph building 9927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 9937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoderMetadata = new MetaData; 9947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( pDecShellContext->mDecoderType ) { 9957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case VIDEOEDITOR_kH263VideoDec: 9967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoderMetadata->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263); 9977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 9987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case VIDEOEDITOR_kMpeg4VideoDec: 9997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoderMetadata->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4); 10007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoderMetadata->setData(kKeyESDS, kTypeESDS, 10017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamHandler->m_pESDSInfo, 10027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamHandler->m_ESDSInfoSize); 10037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 10047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case VIDEOEDITOR_kH264VideoDec: 10057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoderMetadata->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); 10067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoderMetadata->setData(kKeyAVCC, kTypeAVCC, 10077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamHandler->m_pH264DecoderSpecificInfo, 10087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamHandler->m_H264decoderSpecificInfoSize); 10097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 10107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 10117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(!"VideoDecoder_create : incorrect stream type", 10127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_PARAMETER); 10137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 10147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoderMetadata->setInt32(kKeyMaxInputSize, pStreamHandler->m_maxAUSize); 10177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoderMetadata->setInt32(kKeyWidth, 10187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pVideoStreamhandler->m_videoWidth); 10197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoderMetadata->setInt32(kKeyHeight, 10207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pVideoStreamhandler->m_videoHeight); 10217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Create the decoder source 10237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mReaderSource = new VideoEditorVideoDecoderSource( 10247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoderMetadata, pDecShellContext->mDecoderType, 10257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (void *)pDecShellContext); 10267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(NULL != pDecShellContext->mReaderSource.get(), 10277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_SF_DECODER_RSRC_FAIL); 10287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Connect to the OMX client 10307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi status = pDecShellContext->mClient.connect(); 10317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(OK == status, M4ERR_SF_DECODER_RSRC_FAIL); 10327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Create the decoder 10347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mVideoDecoder = OMXCodec::Create( 10357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mClient.interface(), 10367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoderMetadata, false, pDecShellContext->mReaderSource); 10377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(NULL != pDecShellContext->mVideoDecoder.get(), 10387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_SF_DECODER_RSRC_FAIL); 10397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Get the output color format 10427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi success = pDecShellContext->mVideoDecoder->getFormat()->findInt32( 10437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi kKeyColorFormat, &colorFormat); 10447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(TRUE == success, M4ERR_PARAMETER); 10457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->decOuputColorFormat = (OMX_COLOR_FORMATTYPE)colorFormat; 10467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mVideoDecoder->getFormat()->setInt32(kKeyWidth, 10487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pVideoStreamhandler->m_videoWidth); 10497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mVideoDecoder->getFormat()->setInt32(kKeyHeight, 10507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pVideoStreamhandler->m_videoHeight); 10517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10527efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang // Get the color converter 10532aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang pDecShellContext->mI420ColorConverter = new I420ColorConverter; 10542aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang if (pDecShellContext->mI420ColorConverter->isLoaded()) { 10552aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang decoderOutput = pDecShellContext->mI420ColorConverter->getDecoderOutputFormat(); 10567efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang } 10577efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang 10587efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang if (decoderOutput == OMX_COLOR_FormatYUV420Planar) { 10592aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang delete pDecShellContext->mI420ColorConverter; 10602aa01fd002bba1dde45791c1138c1f71a8d0aa53Chih-Chung Chang pDecShellContext->mI420ColorConverter = NULL; 10617efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang } 10627efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang 1063ec9e663f697df4254dacc79f52cdb633179c92abSteve Block ALOGI("decoder output format = 0x%X\n", decoderOutput); 10647efb8efc88ba529c1c57366a305855c2051ebb8bChih-Chung Chang 10657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Configure the buffer pool from the metadata 10667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = VideoEditorVideoDecoder_configureFromMetadata(pDecShellContext, 10677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mVideoDecoder->getFormat().get()); 10687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4NO_ERROR == err, err); 10697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Start the graph 10717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi status = pDecShellContext->mVideoDecoder->start(); 10727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(OK == status, M4ERR_SF_DECODER_RSRC_FAIL); 10737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pContext = (M4OSA_Context)pDecShellContext; 10757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp: 10777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) { 10782703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_create no error"); 10797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 10807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorVideoDecoder_destroy(pDecShellContext); 10817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pContext = M4OSA_NULL; 10822703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_create ERROR 0x%X", err); 10837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10842703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_create : DONE"); 10857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 10867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 10877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1088b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj SharmaM4OSA_ERR VideoEditorVideoSoftwareDecoder_create(M4OSA_Context *pContext, 1089b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma M4_StreamHandler *pStreamHandler, 1090b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang M4READER_GlobalInterface *pReaderGlobalInterface, 1091b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma M4READER_DataInterface *pReaderDataInterface, 1092b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma M4_AccessUnit *pAccessUnit, M4OSA_Void *pUserData) { 1093b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma M4OSA_ERR err = M4NO_ERROR; 1094b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma VideoEditorVideoDecoder_Context* pDecShellContext = M4OSA_NULL; 1095b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma status_t status = OK; 1096b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma bool success = TRUE; 1097b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma int32_t colorFormat = 0; 1098b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma M4OSA_UInt32 size = 0; 1099b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma sp<MetaData> decoderMetadata = NULL; 1100b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 11012703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_create begin"); 1102b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma // Input parameters check 1103b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER); 1104b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma VIDEOEDITOR_CHECK(M4OSA_NULL != pStreamHandler, M4ERR_PARAMETER); 1105b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma VIDEOEDITOR_CHECK(M4OSA_NULL != pReaderDataInterface, M4ERR_PARAMETER); 1106b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1107b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma // Context allocation & initialization 1108b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma SAFE_MALLOC(pDecShellContext, VideoEditorVideoDecoder_Context, 1, 1109b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma "VideoEditorVideoDecoder"); 1110b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->m_pVideoStreamhandler = 1111b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma (M4_VideoStreamHandler*)pStreamHandler; 1112b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->m_pNextAccessUnitToDecode = pAccessUnit; 1113b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pDecShellContext->m_pReaderGlobal = pReaderGlobalInterface; 1114b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->m_pReader = pReaderDataInterface; 1115b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->m_lastDecodedCTS = -1; 1116b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->m_lastRenderCts = -1; 1117b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma switch( pStreamHandler->m_streamType ) { 1118b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma case M4DA_StreamTypeVideoH263: 1119b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mDecoderType = VIDEOEDITOR_kH263VideoDec; 1120b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma break; 1121b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma case M4DA_StreamTypeVideoMpeg4: 1122b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mDecoderType = VIDEOEDITOR_kMpeg4VideoDec; 1123b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma // Parse the VOL header 1124b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma err = VideoEditorVideoDecoder_internalParseVideoDSI( 1125b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma (M4OSA_UInt8*)pDecShellContext->m_pVideoStreamhandler->\ 1126b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma m_basicProperties.m_pDecoderSpecificInfo, 1127b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->m_pVideoStreamhandler->\ 1128b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma m_basicProperties.m_decoderSpecificInfoSize, 1129b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma &pDecShellContext->m_Dci, &pDecShellContext->m_VideoSize); 1130b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma VIDEOEDITOR_CHECK(M4NO_ERROR == err, err); 1131b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma break; 1132b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma case M4DA_StreamTypeVideoMpeg4Avc: 1133b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mDecoderType = VIDEOEDITOR_kH264VideoDec; 1134b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma break; 1135b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma default: 1136b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma VIDEOEDITOR_CHECK(!"VideoDecoder_create : incorrect stream type", 1137b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma M4ERR_PARAMETER); 1138b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma break; 1139b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma } 1140b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1141b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mNbInputFrames = 0; 1142b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mFirstInputCts = -1.0; 1143b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mLastInputCts = -1.0; 1144b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mNbRenderedFrames = 0; 1145b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mFirstRenderedCts = -1.0; 1146b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mLastRenderedCts = -1.0; 1147b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mNbOutputFrames = 0; 1148b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mFirstOutputCts = -1; 1149b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mLastOutputCts = -1; 1150b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->m_pDecBufferPool = M4OSA_NULL; 1151b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1152b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma /** 1153b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma * StageFright graph building 1154b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma */ 1155b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma decoderMetadata = new MetaData; 1156b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma switch( pDecShellContext->mDecoderType ) { 1157b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma case VIDEOEDITOR_kH263VideoDec: 1158b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma decoderMetadata->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263); 1159b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma break; 1160b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma case VIDEOEDITOR_kMpeg4VideoDec: 1161b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma decoderMetadata->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4); 1162b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma decoderMetadata->setData(kKeyESDS, kTypeESDS, 1163b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pStreamHandler->m_pESDSInfo, 1164b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pStreamHandler->m_ESDSInfoSize); 1165b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma break; 1166b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma case VIDEOEDITOR_kH264VideoDec: 1167b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma decoderMetadata->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); 1168b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma decoderMetadata->setData(kKeyAVCC, kTypeAVCC, 1169b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pStreamHandler->m_pH264DecoderSpecificInfo, 1170b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pStreamHandler->m_H264decoderSpecificInfoSize); 1171b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma break; 1172b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma default: 1173b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma VIDEOEDITOR_CHECK(!"VideoDecoder_create : incorrect stream type", 1174b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma M4ERR_PARAMETER); 1175b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma break; 1176b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma } 1177b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1178b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma decoderMetadata->setInt32(kKeyMaxInputSize, pStreamHandler->m_maxAUSize); 1179b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma decoderMetadata->setInt32(kKeyWidth, 1180b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->m_pVideoStreamhandler->m_videoWidth); 1181b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma decoderMetadata->setInt32(kKeyHeight, 1182b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->m_pVideoStreamhandler->m_videoHeight); 1183b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1184b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma // Create the decoder source 1185b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mReaderSource = new VideoEditorVideoDecoderSource( 1186b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma decoderMetadata, pDecShellContext->mDecoderType, 1187b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma (void *)pDecShellContext); 1188b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma VIDEOEDITOR_CHECK(NULL != pDecShellContext->mReaderSource.get(), 1189b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma M4ERR_SF_DECODER_RSRC_FAIL); 1190b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1191b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma // Connect to the OMX client 1192b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma status = pDecShellContext->mClient.connect(); 1193b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma VIDEOEDITOR_CHECK(OK == status, M4ERR_SF_DECODER_RSRC_FAIL); 1194b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1195ec9e663f697df4254dacc79f52cdb633179c92abSteve Block ALOGI("Using software codecs only"); 1196b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma // Create the decoder 1197b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mVideoDecoder = OMXCodec::Create( 1198b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mClient.interface(), 1199b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma decoderMetadata, false, pDecShellContext->mReaderSource,NULL,OMXCodec::kSoftwareCodecsOnly); 1200b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma VIDEOEDITOR_CHECK(NULL != pDecShellContext->mVideoDecoder.get(), 1201b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma M4ERR_SF_DECODER_RSRC_FAIL); 1202b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1203b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma // Get the output color format 1204b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma success = pDecShellContext->mVideoDecoder->getFormat()->findInt32( 1205b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma kKeyColorFormat, &colorFormat); 1206b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma VIDEOEDITOR_CHECK(TRUE == success, M4ERR_PARAMETER); 1207b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->decOuputColorFormat = (OMX_COLOR_FORMATTYPE)colorFormat; 1208b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1209b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mVideoDecoder->getFormat()->setInt32(kKeyWidth, 1210b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->m_pVideoStreamhandler->m_videoWidth); 1211b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mVideoDecoder->getFormat()->setInt32(kKeyHeight, 1212b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->m_pVideoStreamhandler->m_videoHeight); 1213b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1214b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma // Configure the buffer pool from the metadata 1215b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma err = VideoEditorVideoDecoder_configureFromMetadata(pDecShellContext, 1216b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecShellContext->mVideoDecoder->getFormat().get()); 1217b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma VIDEOEDITOR_CHECK(M4NO_ERROR == err, err); 1218b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1219b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma // Start the graph 1220b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma status = pDecShellContext->mVideoDecoder->start(); 1221b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma VIDEOEDITOR_CHECK(OK == status, M4ERR_SF_DECODER_RSRC_FAIL); 1222b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1223b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma *pContext = (M4OSA_Context)pDecShellContext; 1224b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1225b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj SharmacleanUp: 1226b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma if( M4NO_ERROR == err ) { 12272703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_create no error"); 1228b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma } else { 1229b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma VideoEditorVideoDecoder_destroy(pDecShellContext); 1230b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma *pContext = M4OSA_NULL; 12312703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_create ERROR 0x%X", err); 1232b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma } 12332703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_create : DONE"); 1234b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma return err; 1235b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma} 1236b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1237b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 12387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoDecoder_getOption(M4OSA_Context context, 12397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_OptionID optionId, M4OSA_DataOption pValue) { 12407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR lerr = M4NO_ERROR; 12417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorVideoDecoder_Context* pDecShellContext = 12427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (VideoEditorVideoDecoder_Context*) context; 12437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_VersionInfo* pVersionInfo; 12447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4DECODER_VideoSize* pVideoSize; 12457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32* pNextFrameCts; 12467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 *plastDecodedFrameCts; 12477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4DECODER_AVCProfileLevel* profile; 12487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4DECODER_MPEG4_DecoderConfigInfo* pDecConfInfo; 12497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12502703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_getOption begin"); 12517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch (optionId) { 12537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4DECODER_kOptionID_AVCLastDecodedFrameCTS: 12547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi plastDecodedFrameCts = (M4OSA_UInt32 *) pValue; 12557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *plastDecodedFrameCts = pDecShellContext->m_lastDecodedCTS; 12567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 12577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4DECODER_kOptionID_Version: 12597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVersionInfo = (M4_VersionInfo*)pValue; 12607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVersionInfo->m_major = VIDEOEDITOR_VIDEC_SHELL_VER_MAJOR; 12627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVersionInfo->m_minor= VIDEOEDITOR_VIDEC_SHELL_VER_MINOR; 12637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVersionInfo->m_revision = VIDEOEDITOR_VIDEC_SHELL_VER_REVISION; 12647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVersionInfo->m_structSize=sizeof(M4_VersionInfo); 12657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 12667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4DECODER_kOptionID_VideoSize: 12687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** Only VPS uses this Option ID. */ 12697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVideoSize = (M4DECODER_VideoSize*)pValue; 12707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mVideoDecoder->getFormat()->findInt32(kKeyWidth, 12717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (int32_t*)(&pVideoSize->m_uiWidth)); 12727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mVideoDecoder->getFormat()->findInt32(kKeyHeight, 12737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (int32_t*)(&pVideoSize->m_uiHeight)); 12742703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_getOption : W=%d H=%d", 12757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVideoSize->m_uiWidth, pVideoSize->m_uiHeight); 12767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 12777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4DECODER_kOptionID_NextRenderedFrameCTS: 12797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** How to get this information. SF decoder does not provide this. * 12807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ** Let us provide last decoded frame CTS as of now. * 12817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ** Only VPS uses this Option ID. */ 12827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pNextFrameCts = (M4OSA_UInt32 *)pValue; 12837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pNextFrameCts = pDecShellContext->m_lastDecodedCTS; 12847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 12857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4DECODER_MPEG4_kOptionID_DecoderConfigInfo: 12867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(pDecShellContext->mDecoderType == VIDEOEDITOR_kMpeg4VideoDec) { 12877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (*(M4DECODER_MPEG4_DecoderConfigInfo*)pValue) = 12887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_Dci; 12897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 12917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 12927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lerr = M4ERR_BAD_OPTION_ID; 12937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 12947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12972703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_getOption: end with err = 0x%x", lerr); 12987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return lerr; 12997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 13007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoDecoder_setOption(M4OSA_Context context, 13027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_OptionID optionId, M4OSA_DataOption pValue) { 13037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR lerr = M4NO_ERROR; 13047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorVideoDecoder_Context *pDecShellContext = 13057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (VideoEditorVideoDecoder_Context*) context; 13067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13072703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_setOption begin"); 13087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch (optionId) { 13107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4DECODER_kOptionID_OutputFilter: { 13117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4DECODER_OutputFilter* pOutputFilter = 13127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4DECODER_OutputFilter*) pValue; 13137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pFilter = 13147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4VIFI_PlanConverterFunctionType*)pOutputFilter->\ 13157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_pFilterFunction; 13167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pFilterUserData = 13177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pOutputFilter->m_pFilterUserData; 13187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 13207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4DECODER_kOptionID_DeblockingFilter: 13217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 13227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 13237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lerr = M4ERR_BAD_CONTEXT; 13247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 13257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13272703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_setOption: end with err = 0x%x", lerr); 13287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return lerr; 13297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 13307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoDecoder_decode(M4OSA_Context context, 1332b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang M4_MediaTime* pTime, M4OSA_Bool bJump, M4OSA_UInt32 tolerance) { 13337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR lerr = M4NO_ERROR; 13347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorVideoDecoder_Context* pDecShellContext = 13357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (VideoEditorVideoDecoder_Context*) context; 13367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi int64_t lFrameTime; 13377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi MediaBuffer* pDecoderBuffer = NULL; 1338b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang MediaBuffer* pNextBuffer = NULL; 13397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi status_t errStatus; 1340b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang bool needSeek = bJump; 13417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13422703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_decode begin"); 13437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_TRUE == pDecShellContext->mReachedEOS ) { 13457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Do not call read(), it could lead to a freeze 13462703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_decode : EOS already reached"); 13477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lerr = M4WAR_NO_MORE_AU; 13487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto VIDEOEDITOR_VideoDecode_cleanUP; 13497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(pDecShellContext->m_lastDecodedCTS >= *pTime) { 13512703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoDecoder_decode: Already decoded up to this time CTS = %lf.", 13527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_lastDecodedCTS); 13537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto VIDEOEDITOR_VideoDecode_cleanUP; 13547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_TRUE == bJump) { 13562703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_decode: Jump called"); 13577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_lastDecodedCTS = -1; 13587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_lastRenderCts = -1; 13597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mNbInputFrames++; 13627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (0 > pDecShellContext->mFirstInputCts){ 13637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mFirstInputCts = *pTime; 13647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mLastInputCts = *pTime; 13667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1367b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang while (pDecoderBuffer == NULL || pDecShellContext->m_lastDecodedCTS + tolerance < *pTime) { 13682703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_decode, frameCTS = %lf, DecodeUpTo = %lf", 13697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_lastDecodedCTS, *pTime); 13707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1371b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang // Read the buffer from the stagefright decoder 1372b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang if (needSeek) { 1373b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang MediaSource::ReadOptions options; 1374b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang int64_t time_us = *pTime * 1000; 1375b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang options.setSeekTo(time_us, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); 1376b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang errStatus = pDecShellContext->mVideoDecoder->read(&pNextBuffer, &options); 1377b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang needSeek = false; 1378b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } else { 1379b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang errStatus = pDecShellContext->mVideoDecoder->read(&pNextBuffer); 13807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1382b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang // Handle EOS and format change 13837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (errStatus == ERROR_END_OF_STREAM) { 13842703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("End of stream reached, returning M4WAR_NO_MORE_AU "); 13857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mReachedEOS = M4OSA_TRUE; 13867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lerr = M4WAR_NO_MORE_AU; 1387b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang // If we decoded a buffer before EOS, we still need to put it 1388b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang // into the queue. 1389b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang if (pDecoderBuffer && bJump) { 1390b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang copyBufferToQueue(pDecShellContext, pDecoderBuffer); 1391b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } 13927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto VIDEOEDITOR_VideoDecode_cleanUP; 1393b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } else if (INFO_FORMAT_CHANGED == errStatus) { 13942703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoDecoder_decode : source returns INFO_FORMAT_CHANGED"); 13957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lerr = VideoEditorVideoDecoder_configureFromMetadata( 13967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext, 13977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mVideoDecoder->getFormat().get()); 13987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != lerr ) { 13992703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("!!! VideoEditorVideoDecoder_decode ERROR : " 14007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "VideoDecoder_configureFromMetadata returns 0x%X", lerr); 14017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 14027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 14037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi continue; 140400b82d39c6d1b4e0594857ef5113f46775c4a065Hong Teng } else if (errStatus != OK) { 1405f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("VideoEditorVideoDecoder_decode ERROR:0x%x(%d)", 140600b82d39c6d1b4e0594857ef5113f46775c4a065Hong Teng errStatus,errStatus); 140700b82d39c6d1b4e0594857ef5113f46775c4a065Hong Teng lerr = errStatus; 140800b82d39c6d1b4e0594857ef5113f46775c4a065Hong Teng goto VIDEOEDITOR_VideoDecode_cleanUP; 14097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 14107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1411072be1ea494b0f4ca6d184e6c53d9ba01e539de2Chih-Chung Chang // The OMXCodec client should expect to receive 0-length buffers 1412072be1ea494b0f4ca6d184e6c53d9ba01e539de2Chih-Chung Chang // and drop the 0-length buffers. 1413072be1ea494b0f4ca6d184e6c53d9ba01e539de2Chih-Chung Chang if (pNextBuffer->range_length() == 0) { 1414072be1ea494b0f4ca6d184e6c53d9ba01e539de2Chih-Chung Chang pNextBuffer->release(); 1415072be1ea494b0f4ca6d184e6c53d9ba01e539de2Chih-Chung Chang continue; 1416072be1ea494b0f4ca6d184e6c53d9ba01e539de2Chih-Chung Chang } 1417072be1ea494b0f4ca6d184e6c53d9ba01e539de2Chih-Chung Chang 1418b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang // Now we have a good next buffer, release the previous one. 1419b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang if (pDecoderBuffer != NULL) { 1420b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pDecoderBuffer->release(); 1421b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pDecoderBuffer = NULL; 1422b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } 1423b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pDecoderBuffer = pNextBuffer; 14247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1425b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang // Record the timestamp of last decoded buffer 14267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecoderBuffer->meta_data()->findInt64(kKeyTime, &lFrameTime); 14277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_lastDecodedCTS = (M4_MediaTime)(lFrameTime/1000); 14282703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_decode,decoded frametime = %lf,size = %d", 14297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_MediaTime)lFrameTime, pDecoderBuffer->size() ); 14307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14313e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong /* 14323e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong * We need to save a buffer if bJump == false to a queue. These 14333e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong * buffers have a timestamp >= the target time, *pTime (for instance, 14343e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong * the transition between two videos, or a trimming postion inside 14353e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong * one video), since they are part of the transition clip or the 14363e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong * trimmed video. 14373e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong * 14383e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong * If *pTime does not have the same value as any of the existing 14393e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong * video frames, we would like to get the buffer right before *pTime 14403e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong * and in the transcoding phrase, this video frame will be encoded 14413e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong * as a key frame and becomes the first video frame for the transition or the 14423e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong * trimmed video to be generated. This buffer must also be queued. 14433e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong * 14443e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong */ 14453e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong int64_t targetTimeMs = 14463e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong pDecShellContext->m_lastDecodedCTS + 14473e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong pDecShellContext->mFrameIntervalMs + 14483e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong tolerance; 14493e1e78ccd5936111f31a709592f11aa7c677c42dJames Dong if (!bJump || targetTimeMs > *pTime) { 1450b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang lerr = copyBufferToQueue(pDecShellContext, pDecoderBuffer); 1451b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang if (lerr != M4NO_ERROR) { 1452b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang goto VIDEOEDITOR_VideoDecode_cleanUP; 145335cb2de64cb6482a08f446e80733e7d344a0dcacDharmaray Kundargi } 14547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1455b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } 14567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mNbOutputFrames++; 14587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( 0 > pDecShellContext->mFirstOutputCts ) { 14597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mFirstOutputCts = *pTime; 14607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 14617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mLastOutputCts = *pTime; 14627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiVIDEOEDITOR_VideoDecode_cleanUP: 14647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pTime = pDecShellContext->m_lastDecodedCTS; 14657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (pDecoderBuffer != NULL) { 14667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecoderBuffer->release(); 14677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecoderBuffer = NULL; 14687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 14697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14702703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_decode: end with 0x%x", lerr); 14717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return lerr; 14727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 14737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1474b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Changstatic M4OSA_ERR copyBufferToQueue( 1475b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang VideoEditorVideoDecoder_Context* pDecShellContext, 1476b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang MediaBuffer* pDecoderBuffer) { 1477b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 1478b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang M4OSA_ERR lerr = M4NO_ERROR; 1479b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang VIDEOEDITOR_BUFFER_Buffer* tmpDecBuffer; 1480b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 1481b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang // Get a buffer from the queue 1482b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang lerr = VIDEOEDITOR_BUFFER_getBuffer(pDecShellContext->m_pDecBufferPool, 1483b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang VIDEOEDITOR_BUFFER_kEmpty, &tmpDecBuffer); 1484b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang if (lerr == (M4OSA_UInt32)M4ERR_NO_BUFFER_AVAILABLE) { 1485b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang lerr = VIDEOEDITOR_BUFFER_getOldestBuffer( 1486b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pDecShellContext->m_pDecBufferPool, 1487b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang VIDEOEDITOR_BUFFER_kFilled, &tmpDecBuffer); 1488b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang tmpDecBuffer->state = VIDEOEDITOR_BUFFER_kEmpty; 1489b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang lerr = M4NO_ERROR; 1490b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } 1491b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 1492b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang if (lerr != M4NO_ERROR) return lerr; 1493b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 1494b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang // Color convert or copy from the given MediaBuffer to our buffer 1495b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang if (pDecShellContext->mI420ColorConverter) { 1496b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang if (pDecShellContext->mI420ColorConverter->convertDecoderOutputToI420( 1497b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang (uint8_t *)pDecoderBuffer->data(),// ?? + pDecoderBuffer->range_offset(), // decoderBits 1498b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pDecShellContext->mGivenWidth, // decoderWidth 1499b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pDecShellContext->mGivenHeight, // decoderHeight 1500b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pDecShellContext->mCropRect, // decoderRect 1501b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang tmpDecBuffer->pData /* dstBits */) < 0) { 1502f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("convertDecoderOutputToI420 failed"); 1503b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang lerr = M4ERR_NOT_IMPLEMENTED; 1504b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } 1505b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } else if (pDecShellContext->decOuputColorFormat == OMX_COLOR_FormatYUV420Planar) { 1506b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang int32_t width = pDecShellContext->m_pVideoStreamhandler->m_videoWidth; 1507b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang int32_t height = pDecShellContext->m_pVideoStreamhandler->m_videoHeight; 1508b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang int32_t yPlaneSize = width * height; 1509b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang int32_t uvPlaneSize = width * height / 4; 1510b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang int32_t offsetSrc = 0; 1511b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 1512b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang if (( width == pDecShellContext->mGivenWidth ) && 1513b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang ( height == pDecShellContext->mGivenHeight )) 1514b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang { 1515b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang M4OSA_MemAddr8 pTmpBuff = (M4OSA_MemAddr8)pDecoderBuffer->data() + pDecoderBuffer->range_offset(); 1516b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 1517b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang memcpy((void *)tmpDecBuffer->pData, (void *)pTmpBuff, yPlaneSize); 1518b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 1519b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang offsetSrc += pDecShellContext->mGivenWidth * pDecShellContext->mGivenHeight; 1520b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang memcpy((void *)((M4OSA_MemAddr8)tmpDecBuffer->pData + yPlaneSize), 1521b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang (void *)(pTmpBuff + offsetSrc), uvPlaneSize); 1522b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 1523b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang offsetSrc += (pDecShellContext->mGivenWidth >> 1) * (pDecShellContext->mGivenHeight >> 1); 1524b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang memcpy((void *)((M4OSA_MemAddr8)tmpDecBuffer->pData + yPlaneSize + uvPlaneSize), 1525b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang (void *)(pTmpBuff + offsetSrc), uvPlaneSize); 1526b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } 1527b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang else 1528b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang { 1529b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang M4OSA_MemAddr8 pTmpBuff = (M4OSA_MemAddr8)pDecoderBuffer->data() + pDecoderBuffer->range_offset(); 1530b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang M4OSA_MemAddr8 pTmpBuffDst = (M4OSA_MemAddr8)tmpDecBuffer->pData; 1531b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang int32_t index; 1532b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 1533b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang for ( index = 0; index < height; index++) 1534b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang { 1535b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang memcpy((void *)pTmpBuffDst, (void *)pTmpBuff, width); 1536b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pTmpBuffDst += width; 1537b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pTmpBuff += pDecShellContext->mGivenWidth; 1538b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } 1539b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 1540b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pTmpBuff += (pDecShellContext->mGivenWidth * ( pDecShellContext->mGivenHeight - height)); 1541b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang for ( index = 0; index < height >> 1; index++) 1542b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang { 1543b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang memcpy((void *)pTmpBuffDst, (void *)pTmpBuff, width >> 1); 1544b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pTmpBuffDst += width >> 1; 1545b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pTmpBuff += pDecShellContext->mGivenWidth >> 1; 1546b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } 1547b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 1548b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pTmpBuff += ((pDecShellContext->mGivenWidth * (pDecShellContext->mGivenHeight - height)) / 4); 1549b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang for ( index = 0; index < height >> 1; index++) 1550b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang { 1551b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang memcpy((void *)pTmpBuffDst, (void *)pTmpBuff, width >> 1); 1552b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pTmpBuffDst += width >> 1; 1553b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pTmpBuff += pDecShellContext->mGivenWidth >> 1; 1554b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } 1555b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } 1556b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } else { 1557f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("VideoDecoder_decode: unexpected color format 0x%X", 1558b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pDecShellContext->decOuputColorFormat); 1559b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang lerr = M4ERR_PARAMETER; 1560b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang } 1561b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 1562b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang tmpDecBuffer->buffCTS = pDecShellContext->m_lastDecodedCTS; 1563b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang tmpDecBuffer->state = VIDEOEDITOR_BUFFER_kFilled; 1564b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang tmpDecBuffer->size = pDecoderBuffer->size(); 1565b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 1566b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang return lerr; 1567b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang} 1568b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang 15697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoDecoder_render(M4OSA_Context context, 15707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_MediaTime* pTime, M4VIFI_ImagePlane* pOutputPlane, 15717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool bForceRender) { 15727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 15737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VideoEditorVideoDecoder_Context* pDecShellContext = 15747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (VideoEditorVideoDecoder_Context*) context; 15757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 lindex, i; 15767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8* p_buf_src, *p_buf_dest; 15777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VIFI_ImagePlane tmpPlaneIn, tmpPlaneOut; 15787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_BUFFER_Buffer* pTmpVIDEOEDITORBuffer, *pRenderVIDEOEDITORBuffer 15797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi = M4OSA_NULL; 15807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_MediaTime candidateTimeStamp = -1; 15817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool bFound = M4OSA_FALSE; 15827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15832703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_render begin"); 15847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Input parameters check 15857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != context, M4ERR_PARAMETER); 15867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pTime, M4ERR_PARAMETER); 15877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi VIDEOEDITOR_CHECK(M4OSA_NULL != pOutputPlane, M4ERR_PARAMETER); 15887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // The output buffer is already allocated, just copy the data 15907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( (*pTime <= pDecShellContext->m_lastRenderCts) && 15917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_FALSE == bForceRender) ) { 15922703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VIDEOEDITOR_VIDEO_render Frame in the past"); 15937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4WAR_VIDEORENDERER_NO_NEW_FRAME; 15947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanUp; 15957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 15962703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoDecoder_render: lastRendered time = %lf,requested render time = " 15977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "%lf", pDecShellContext->m_lastRenderCts, *pTime); 15987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 16007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Find the buffer appropriate for rendering. */ 16017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (i=0; i < pDecShellContext->m_pDecBufferPool->NB; i++) { 16027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pTmpVIDEOEDITORBuffer = &pDecShellContext->m_pDecBufferPool\ 16037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ->pNXPBuffer[i]; 16047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (pTmpVIDEOEDITORBuffer->state == VIDEOEDITOR_BUFFER_kFilled) { 16057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** Free all those buffers older than last rendered frame. */ 16067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (pTmpVIDEOEDITORBuffer->buffCTS < pDecShellContext->\ 16077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_lastRenderCts) { 16087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pTmpVIDEOEDITORBuffer->state = VIDEOEDITOR_BUFFER_kEmpty; 16097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** Get the buffer with appropriate timestamp */ 16127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( (pTmpVIDEOEDITORBuffer->buffCTS >= pDecShellContext->\ 16137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_lastRenderCts) && 16147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pTmpVIDEOEDITORBuffer->buffCTS <= *pTime) && 16157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pTmpVIDEOEDITORBuffer->buffCTS > candidateTimeStamp)) { 16167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi bFound = M4OSA_TRUE; 16177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pRenderVIDEOEDITORBuffer = pTmpVIDEOEDITORBuffer; 16187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi candidateTimeStamp = pTmpVIDEOEDITORBuffer->buffCTS; 16192703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoDecoder_render: found a buffer with timestamp = %lf", 16207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi candidateTimeStamp); 16217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_FALSE == bFound) { 16257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4WAR_VIDEORENDERER_NO_NEW_FRAME; 16267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanUp; 16277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16292703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_render 3 ouput %d %d %d %d", 16307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pOutputPlane[0].u_width, pOutputPlane[0].u_height, 16317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pOutputPlane[0].u_topleft, pOutputPlane[0].u_stride); 16327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_lastRenderCts = candidateTimeStamp; 16347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pDecShellContext->m_pFilter ) { 16367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Filtering was requested 16377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VIFI_ImagePlane tmpPlane[3]; 16387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Prepare the output image for conversion 16397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[0].u_width = 16407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pVideoStreamhandler->m_videoWidth; 16417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[0].u_height = 16427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pVideoStreamhandler->m_videoHeight; 16437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[0].u_topleft = 0; 16447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[0].u_stride = tmpPlane[0].u_width; 16457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[0].pac_data = (M4VIFI_UInt8*)pRenderVIDEOEDITORBuffer->pData; 16467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[1].u_width = tmpPlane[0].u_width/2; 16477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[1].u_height = tmpPlane[0].u_height/2; 16487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[1].u_topleft = 0; 16497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[1].u_stride = tmpPlane[0].u_stride/2; 16507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[1].pac_data = tmpPlane[0].pac_data + 16517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (tmpPlane[0].u_stride * tmpPlane[0].u_height); 16527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[2].u_width = tmpPlane[1].u_width; 16537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[2].u_height = tmpPlane[1].u_height; 16547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[2].u_topleft = 0; 16557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[2].u_stride = tmpPlane[1].u_stride; 16567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[2].pac_data = tmpPlane[1].pac_data + 16577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (tmpPlane[1].u_stride * tmpPlane[1].u_height); 16587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16592703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_render w = %d H = %d", 16607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tmpPlane[0].u_width,tmpPlane[0].u_height); 16617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pFilter(M4OSA_NULL, &tmpPlane[0], pOutputPlane); 16627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 16637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Just copy the YUV420P buffer 16647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_MemAddr8 tempBuffPtr = 16657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr8)pRenderVIDEOEDITORBuffer->pData; 16667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 tempWidth = 16677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pVideoStreamhandler->m_videoWidth; 16687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 tempHeight = 16697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->m_pVideoStreamhandler->m_videoHeight; 16707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 167132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *) pOutputPlane[0].pac_data, (void *)tempBuffPtr, 16727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tempWidth * tempHeight); 16737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tempBuffPtr += (tempWidth * tempHeight); 167432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *) pOutputPlane[1].pac_data, (void *)tempBuffPtr, 16757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (tempWidth/2) * (tempHeight/2)); 16767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tempBuffPtr += ((tempWidth/2) * (tempHeight/2)); 167732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *) pOutputPlane[2].pac_data, (void *)tempBuffPtr, 16787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (tempWidth/2) * (tempHeight/2)); 16797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mNbRenderedFrames++; 16827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( 0 > pDecShellContext->mFirstRenderedCts ) { 16837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mFirstRenderedCts = *pTime; 16847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecShellContext->mLastRenderedCts = *pTime; 16867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp: 16887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) { 16897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pTime = pDecShellContext->m_lastRenderCts; 16902703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_render no error"); 16917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } else { 16922703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_render ERROR 0x%X", err); 16937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16942703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("VideoEditorVideoDecoder_render end"); 16957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 16967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 16977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoDecoder_getInterface(M4DECODER_VideoType decoderType, 16997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4DECODER_VideoType *pDecoderType, M4OSA_Context *pDecInterface) { 17007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4DECODER_VideoInterface* pDecoderInterface = M4OSA_NULL; 17017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1702694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu pDecoderInterface = (M4DECODER_VideoInterface*)M4OSA_32bitAlignedMalloc( 17037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(M4DECODER_VideoInterface), M4DECODER_EXTERNAL, 17047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Char*)"VideoEditorVideoDecoder_getInterface" ); 17057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_NULL == pDecoderInterface) { 17067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 17077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 17087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pDecoderType = decoderType; 17107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecoderInterface->m_pFctCreate = VideoEditorVideoDecoder_create; 17127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecoderInterface->m_pFctDestroy = VideoEditorVideoDecoder_destroy; 17137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecoderInterface->m_pFctGetOption = VideoEditorVideoDecoder_getOption; 17147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecoderInterface->m_pFctSetOption = VideoEditorVideoDecoder_setOption; 17157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecoderInterface->m_pFctDecode = VideoEditorVideoDecoder_decode; 17167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecoderInterface->m_pFctRender = VideoEditorVideoDecoder_render; 17177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pDecInterface = (M4OSA_Context)pDecoderInterface; 17197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 17207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 17217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1722b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj SharmaM4OSA_ERR VideoEditorVideoDecoder_getSoftwareInterface(M4DECODER_VideoType decoderType, 1723b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma M4DECODER_VideoType *pDecoderType, M4OSA_Context *pDecInterface) { 1724b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma M4DECODER_VideoInterface* pDecoderInterface = M4OSA_NULL; 1725b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1726694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu pDecoderInterface = (M4DECODER_VideoInterface*)M4OSA_32bitAlignedMalloc( 1727b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma sizeof(M4DECODER_VideoInterface), M4DECODER_EXTERNAL, 1728b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma (M4OSA_Char*)"VideoEditorVideoDecoder_getInterface" ); 1729b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma if (M4OSA_NULL == pDecoderInterface) { 1730b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma return M4ERR_ALLOC; 1731b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma } 1732b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1733b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma *pDecoderType = decoderType; 1734b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1735b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecoderInterface->m_pFctCreate = VideoEditorVideoSoftwareDecoder_create; 1736b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecoderInterface->m_pFctDestroy = VideoEditorVideoDecoder_destroy; 1737b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecoderInterface->m_pFctGetOption = VideoEditorVideoDecoder_getOption; 1738b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecoderInterface->m_pFctSetOption = VideoEditorVideoDecoder_setOption; 1739b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecoderInterface->m_pFctDecode = VideoEditorVideoDecoder_decode; 1740b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecoderInterface->m_pFctRender = VideoEditorVideoDecoder_render; 1741b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1742b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma *pDecInterface = (M4OSA_Context)pDecoderInterface; 1743b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma return M4NO_ERROR; 1744b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma} 17457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiextern "C" { 17467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoDecoder_getInterface_MPEG4( 17487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4DECODER_VideoType *pDecoderType, M4OSA_Context *pDecInterface) { 17497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return VideoEditorVideoDecoder_getInterface(M4DECODER_kVideoTypeMPEG4, 17507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecoderType, pDecInterface); 17517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 17527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditorVideoDecoder_getInterface_H264( 17547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4DECODER_VideoType *pDecoderType, M4OSA_Context *pDecInterface) { 17557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return VideoEditorVideoDecoder_getInterface(M4DECODER_kVideoTypeAVC, 17567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pDecoderType, pDecInterface); 17577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 17597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1760b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj SharmaM4OSA_ERR VideoEditorVideoDecoder_getSoftwareInterface_MPEG4( 1761b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma M4DECODER_VideoType *pDecoderType, M4OSA_Context *pDecInterface) { 1762b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma return VideoEditorVideoDecoder_getSoftwareInterface(M4DECODER_kVideoTypeMPEG4, 1763b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecoderType, pDecInterface); 1764b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma} 1765b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1766b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj SharmaM4OSA_ERR VideoEditorVideoDecoder_getSoftwareInterface_H264( 1767b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma M4DECODER_VideoType *pDecoderType, M4OSA_Context *pDecInterface) { 1768b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma return VideoEditorVideoDecoder_getSoftwareInterface(M4DECODER_kVideoTypeAVC, 1769b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma pDecoderType, pDecInterface); 1770b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 1771b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma} 1772b828db5197c34be4ae00a7d37f5c21caa51b8cbeDheeraj Sharma 17730a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh ChowduryM4OSA_ERR VideoEditorVideoDecoder_getVideoDecodersAndCapabilities( 17740a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury M4DECODER_VideoDecoders** decoders) { 17750a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury return queryVideoDecoderCapabilities(decoders); 17760a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury} 17770a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury 17787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} // extern "C" 1779