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