17c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*
27c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
33ad01762633531957174c5b27e71ca4aac45e554Santosh Madhava *
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   VideoEditor3gpReader.cpp
197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief  StageFright shell 3GP Reader
207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*************************************************************************
217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_NDEBUG 1
247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_TAG "VIDEOEDITOR_3GPREADER"
257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * HEADERS
287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define VIDEOEDITOR_BITSTREAM_PARSER
317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h"
337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditor3gpReader.h"
347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4SYS_AccessUnit.h"
357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditorUtils.h"
367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4READER_3gpCom.h"
377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4_Common.h"
387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_FileWriter.h"
397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef VIDEOEDITOR_BITSTREAM_PARSER
417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_CoreID.h"
427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Error.h"
437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Memory.h"
447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4_Utils.h"
457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "ESDS.h"
487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "utils/Log.h"
49c4689fae1bdb8d1c94eb28af1b2a1f30d2b1a3daJames Dong#include <media/stagefright/foundation/ADebug.h>
507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaBufferGroup.h>
517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/DataSource.h>
527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/FileSource.h>
537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaBuffer.h>
547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaDefs.h>
557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaExtractor.h>
567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaSource.h>
577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MetaData.h>
587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * SOURCE CLASS
617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundarginamespace android {
637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * ENGINE INTERFACE
657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Array of AMR NB/WB bitrates
707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    Array to match the mode and the bit rate
717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UInt32 VideoEditor3gpReader_AmrBitRate [2 /* 8kHz / 16kHz     */]
747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                   [9 /* the bitrate mode */] =
757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {4750, 5150, 5900,  6700,  7400,  7950,  10200, 12200, 0},
777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {6600, 8850, 12650, 14250, 15850, 18250, 19850, 23050, 23850}
787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi};
797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * structure VideoEditor3gpReader_Context
837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief:This structure defines the context of the StageFright 3GP shell Reader
847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargitypedef struct {
877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<DataSource>              mDataSource;
887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<MediaExtractor>          mExtractor;
897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<MediaSource>             mAudioSource;
907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<MediaSource>             mVideoSource;
917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_StreamHandler*           mAudioStreamHandler;
927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_StreamHandler*           mVideoStreamHandler;
937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_AccessUnit            mAudioAu;
947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_AccessUnit            mVideoAu;
957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Time                  mMaxDuration;
9695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    int64_t                     mFileSize;
977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_StreamType               mStreamType;
987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32                mStreamId;
997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t                     mTracks;
1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t                     mCurrTrack;
1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Bool                  mAudioSeeking;
1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Time                  mAudioSeekTime;
1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Bool                  mVideoSeeking;
1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Time                  mVideoSeekTime;
1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} VideoEditor3gpReader_Context;
1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef VIDEOEDITOR_BITSTREAM_PARSER
1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * structure    VideoEditor3gpReader_BitStreamParserContext
1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief       Internal BitStreamParser context
1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargitypedef struct {
1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32*   mPbitStream;   /**< bitstream pointer (32bits aligned) */
1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32     mSize;         /**< bitstream size in bytes */
1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32     mIndex;        /**< byte index */
1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32     mBitIndex;     /**< bit index */
1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32     mStructSize;   /**< size of structure */
1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} VideoEditor3gpReader_BitStreamParserContext;
1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Allocates the context and initializes internal data.
1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext    (OUT)  Pointer to the BitStreamParser context to create.
1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   bitStream   A pointer to the bitstream
1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   size        The size of the bitstream in bytes
1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic void VideoEditor3gpReader_BitStreamParserInit(void** pContext,
1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        void* pBitStream, M4OSA_Int32 size) {
1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext;
1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pContext=M4OSA_NULL;
136694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu    pStreamContext = (VideoEditor3gpReader_BitStreamParserContext*)M4OSA_32bitAlignedMalloc(
1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sizeof(VideoEditor3gpReader_BitStreamParserContext), M4READER_3GP,
1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Char*)"3GP BitStreamParser Context");
1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4OSA_NULL == pStreamContext) {
1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return;
1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mPbitStream=(M4OSA_UInt32*)pBitStream;
1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mSize=size;
1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mIndex=0;
1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mBitIndex=0;
1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mStructSize =
1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sizeof(VideoEditor3gpReader_BitStreamParserContext);
1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pContext=pStreamContext;
1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi **********************************************************************
1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Clean up context
1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext    (IN/OUT)  BitStreamParser context.
1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi **********************************************************************
1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic void VideoEditor3gpReader_BitStreamParserCleanUp(void* pContext) {
158694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu    free((M4OSA_Int32*)pContext);
1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *****************************************************************************
1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Read the next <length> bits in the bitstream.
1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    The function does not update the bitstream pointer.
1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext    (IN/OUT) BitStreamParser context.
1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   length      (IN) The number of bits to extract from the bitstream
1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  the read bits
1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *****************************************************************************
1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 VideoEditor3gpReader_BitStreamParserShowBits(void* pContext,
1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int32 length) {
1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 u_mask;
1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 retval;
1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 i_ovf;
1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pStreamContext), 0,
1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_BitStreamParserShowBits:invalid context pointer");
1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    retval=(M4OSA_UInt32)GET_MEMORY32(pStreamContext->\
1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mPbitStream[ pStreamContext->mIndex ]);
1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    i_ovf = pStreamContext->mBitIndex + length - 32;
1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    u_mask = (length >= 32) ? 0xffffffff: (1 << length) - 1;
1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* do we have enough bits availble in the current word(32bits)*/
1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (i_ovf <= 0) {
1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        retval=(retval >> (- i_ovf)) & u_mask;
1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 u_nextword = (M4OSA_UInt32)GET_MEMORY32(
1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pStreamContext->mPbitStream[ pStreamContext->mIndex + 1 ]);
1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 u_msb_mask, u_msb_value, u_lsb_mask, u_lsb_value;
1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u_msb_mask = ((1 << (32 - pStreamContext->mBitIndex)) - 1) << i_ovf;
1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u_msb_value = retval << i_ovf;
1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u_lsb_mask = (1 << i_ovf) - 1;
1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u_lsb_value = u_nextword >> (32 - i_ovf);
1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        retval= (u_msb_value & u_msb_mask ) | (u_lsb_value & u_lsb_mask);
1997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* return the bits...*/
2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return retval;
2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Increment the bitstream pointer of <length> bits.
2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext    (IN/OUT) BitStreamParser context.
2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   length      (IN) The number of bit to shift the bitstream
2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic void VideoEditor3gpReader_BitStreamParserFlushBits(void* pContext,
2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int32 length) {
2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext=(
2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserContext*)pContext;
2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 val;
2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4OSA_NULL == pStreamContext) {
2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return;
2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    val=pStreamContext->mBitIndex + length;
2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* update the bits...*/
2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mBitIndex += length;
2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (val - 32 >= 0) {
2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* update the bits...*/
2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pStreamContext->mBitIndex -= 32;
2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* update the words*/
2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pStreamContext->mIndex++;
2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 VideoEditor3gpReader_BitStreamParserGetBits(
2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        void* pContext,M4OSA_Int32 bitPos, M4OSA_Int32 bitLength) {
2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 bitLocation, bitIndex;
2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 retval=0;
2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pStreamContext), 0,
2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_BitStreamParserGetBits: invalid context pointer");
2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* computes the word location*/
2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    bitLocation=bitPos/32;
2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    bitIndex=(bitPos) % 32;
2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (bitLocation < pStreamContext->mSize) {
2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 u_mask;
2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int32 i_ovf = bitIndex + bitLength - 32;
2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        retval=(M4OSA_UInt32)GET_MEMORY32(
2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pStreamContext->mPbitStream[ bitLocation ]);
2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u_mask = (bitLength >= 32) ? 0xffffffff: (1 << bitLength) - 1;
2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (i_ovf <= 0) {
2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            retval=(retval >> (- i_ovf)) & u_mask;
2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_UInt32 u_nextword = (M4OSA_UInt32)GET_MEMORY32(
2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pStreamContext->mPbitStream[ bitLocation + 1 ]);
2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_UInt32 u_msb_mask, u_msb_value, u_lsb_mask, u_lsb_value;
2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u_msb_mask = ((1 << (32 - bitIndex)) - 1) << i_ovf;
2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u_msb_value = retval << i_ovf;
2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u_lsb_mask = (1 << i_ovf) - 1;
2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u_lsb_value = u_nextword >> (32 - i_ovf);
2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            retval= (u_msb_value & u_msb_mask ) | (u_lsb_value & u_lsb_mask);
2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return retval;
2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic void VideoEditor3gpReader_BitStreamParserRestart(void* pContext) {
2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4OSA_NULL == pStreamContext) {
2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return;
2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* resets the bitstream pointers*/
2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mIndex=0;
2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mBitIndex=0;
2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief  Get a pointer to the current byte pointed by the bitstream pointer.
2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note   It should be used carefully as the pointer is in the bitstream itself
2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *         and no copy is made.
2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param  pContext    (IN/OUT)  BitStreamParser context.
2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return Pointer to the current location in the bitstream
2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt8*  VideoEditor3gpReader_GetCurrentbitStreamPointer(
2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        void* pContext) {
2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pStreamContext), 0, "invalid context pointer");
2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return (M4OSA_UInt8*)((M4OSA_UInt8*)pStreamContext->mPbitStream + \
2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pStreamContext->mIndex * sizeof(M4OSA_UInt32) + \
2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pStreamContext->mBitIndex/8) ;
3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Int32 VideoEditor3gpReader_BitStreamParserGetSize(void* pContext) {
3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pStreamContext), 0, "invalid context pointer");
3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return pStreamContext->mSize;
3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic void VideoEditor3gpReader_MPEG4BitStreamParserInit(void** pContext,
3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        void* pBitStream, M4OSA_Int32 size) {
3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserInit(pContext, pBitStream, size);
3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Int32 VideoEditor3gpReader_GetMpegLengthFromInteger(void* pContext,
3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 val) {
3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 length=0;
3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 numBytes=0;
3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 b=0;
3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pContext), 0, "invalid context pointer");
3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* the length is encoded as a sequence of bytes. The highest bit is used
3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    to indicate that the length continues on the next byte.
3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    The length can be: 0x80 0x80 0x80 0x22
3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    of just            0x22 (highest bit not set)
3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    */
3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    do {
3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        b=(val & ((0xff)<< (8 * numBytes)))>> (8 * numBytes);
3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        length=(length << 7) | (b & 0x7f);
3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        numBytes++;
3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } while ((b & 0x80) && numBytes < 4);
3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return length;
3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief  Decode an MPEG4 Systems descriptor size from an encoded SDL size data
3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note   The value is read from the current bitstream location.
3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param  pContext    (IN/OUT)  BitStreamParser context.
3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return Size in a human readable form
3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Int32 VideoEditor3gpReader_GetMpegLengthFromStream(void* pContext){
3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 length=0;
3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 numBytes=0;
3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 b=0;
3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pContext), 0, "invalid context pointer");
3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* the length is encoded as a sequence of bytes. The highest bit is used
3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    to indicate that the length continues on the next byte.
3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    The length can be: 0x80 0x80 0x80 0x22
3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    of just            0x22 (highest bit not set)
3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    */
3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    do {
3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        b=VideoEditor3gpReader_BitStreamParserShowBits(pContext, 8);
3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pContext, 8);
3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        length=(length << 7) | (b & 0x7f);
3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        numBytes++;
3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } while ((b & 0x80) && numBytes < 4);
3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return length;
3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* VIDEOEDITOR_BITSTREAM_PARSER */
3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    create an instance of the 3gp reader
3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    allocates the context
3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext:       (OUT)   pointer on a reader context
3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR              there is no error
3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_ALLOC             a memory allocation has failed
3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_PARAMETER         at least one parameter is not valid
3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_create(M4OSA_Context *pContext) {
3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = NULL;
3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext , M4ERR_PARAMETER);
3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3902703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_create begin");
3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Context allocation & initialization */
3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_MALLOC(pC, VideoEditor3gpReader_Context, 1, "VideoEditor3gpReader");
3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    memset(pC, sizeof(VideoEditor3gpReader_Context), 0);
3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mAudioStreamHandler  = M4OSA_NULL;
3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mAudioAu.dataAddress = M4OSA_NULL;
3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mVideoStreamHandler  = M4OSA_NULL;
4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mVideoAu.dataAddress = M4OSA_NULL;
4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mAudioSeeking = M4OSA_FALSE;
4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mAudioSeekTime = 0;
4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mVideoSeeking = M4OSA_FALSE;
4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mVideoSeekTime = 0;
4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
408aa382f3637a68361989d5b70e3184bddcc472d3dhongteng    pC->mMaxDuration = 0;
409aa382f3637a68361989d5b70e3184bddcc472d3dhongteng
4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pContext=pC;
4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( M4NO_ERROR == err ) {
4142703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_create no error");
4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
4162703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_create ERROR 0x%X", err);
4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4182703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_create end ");
4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi**************************************************************************
4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    destroy the instance of the 3gp reader
4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note after this call the context is invalid
4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER         pContext parameter is not properly set
4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi**************************************************************************
4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_destroy(M4OSA_Context pContext) {
4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = M4OSA_NULL;
4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4362703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_destroy begin");
4377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC = (VideoEditor3gpReader_Context*)pContext;
4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_FREE(pC->mAudioAu.dataAddress);
4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mAudioAu.dataAddress = M4OSA_NULL;
4437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_FREE(pC->mVideoAu.dataAddress);
4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mVideoAu.dataAddress = M4OSA_NULL;
4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_FREE(pC);
4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pContext = M4OSA_NULL;
4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
4502703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_destroy no error");
4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
4542703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_destroy ERROR 0x%X", err);
4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4572703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_destroy end ");
4587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    open the reader and initializes its created instance
4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note     this function open the media file
4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:            (IN)    Context of the reader
4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pFileDescriptor:    (IN)    Pointer to proprietary data identifying
4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*                                       the media to open
4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR                  there is no error
4697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER             the context is NULL
4701dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava* @return   M4ERR_UNSUPPORTED_MEDIA_TYPE
4711dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava*                                       the media is DRM protected
4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_open(M4OSA_Context pContext,
4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Void* pFileDescriptor) {
4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)pContext;
4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4802703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_open start ");
4817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pC),  M4ERR_PARAMETER,
4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_open: invalid context pointer");
4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pFileDescriptor), M4ERR_PARAMETER,
4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_open: invalid pointer pFileDescriptor");
4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4862703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_open Datasource start %s",
4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (char*)pFileDescriptor);
4883ad01762633531957174c5b27e71ca4aac45e554Santosh Madhava    //pC->mDataSource = DataSource::CreateFromURI((char*)pFileDescriptor);
4893ad01762633531957174c5b27e71ca4aac45e554Santosh Madhava    pC->mDataSource = new FileSource ((char*)pFileDescriptor);
4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (pC->mDataSource == NULL) {
4922703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_open Datasource error");
4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_PARAMETER;
4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mExtractor = MediaExtractor::Create(pC->mDataSource,
4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        MEDIA_MIMETYPE_CONTAINER_MPEG4);
4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (pC->mExtractor == NULL) {
5002703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_open extractor error");
5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_PARAMETER;
5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5041dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava    int32_t isDRMProtected = 0;
5051dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava    sp<MetaData> meta = pC->mExtractor->getMetaData();
5061dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava    meta->findInt32(kKeyIsDRM, &isDRMProtected);
5071dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava    if (isDRMProtected) {
5082703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditorMp3Reader_open error - DRM Protected");
5091dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava        return M4ERR_UNSUPPORTED_MEDIA_TYPE;
5101dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava    }
5111dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava
5122703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_open end ");
5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
5187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    close the reader
5197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note     close the 3GP file
5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
5227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER         the context is NULL
5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_BAD_CONTEXT       provided context is not a valid one
5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_close(M4OSA_Context context) {
5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context *pC = (VideoEditor3gpReader_Context*)context;
5287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4READER_AudioSbrUserdata *pAudioSbrUserData;
5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_AccessUnit *pAU;
5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5322703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_close begin");
5337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
5357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_close: invalid context pointer");
5367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (pC->mAudioStreamHandler) {
5382703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_close Audio");
5397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (M4OSA_NULL != pC->mAudioStreamHandler->m_pDecoderSpecificInfo) {
541694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            free(pC->mAudioStreamHandler->\
5427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_pDecoderSpecificInfo);
5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioStreamHandler->m_decoderSpecificInfoSize = 0;
5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioStreamHandler->m_pDecoderSpecificInfo = M4OSA_NULL;
5457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if ((M4DA_StreamTypeAudioAac == pC->mAudioStreamHandler->m_streamType)
5487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            && (M4OSA_NULL != pC->mAudioStreamHandler->m_pUserData)) {
5497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAudioSbrUserData = (M4READER_AudioSbrUserdata*)(\
5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mAudioStreamHandler->m_pUserData);
5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAU = (M4_AccessUnit*)pAudioSbrUserData->m_pFirstAU;
5537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4OSA_NULL != pAU) {
554694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                free(pAU);
5557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
5567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4OSA_NULL != pAudioSbrUserData->m_pAacDecoderUserConfig) {
558694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                free(pAudioSbrUserData->\
5597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    m_pAacDecoderUserConfig);
5607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
561694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            free(pAudioSbrUserData);
5627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioStreamHandler->m_pUserData = M4OSA_NULL;
5637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (pC->mAudioStreamHandler->m_pESDSInfo != M4OSA_NULL) {
566694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            free(pC->mAudioStreamHandler->m_pESDSInfo);
5677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioStreamHandler->m_pESDSInfo = M4OSA_NULL;
5687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioStreamHandler->m_ESDSInfoSize = 0;
5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Finally destroy the stream handler */
571694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->mAudioStreamHandler);
5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mAudioStreamHandler = M4OSA_NULL;
5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mAudioSource->stop();
5757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mAudioSource.clear();
5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (pC->mVideoStreamHandler) {
5782703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_close Video ");
5797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(M4OSA_NULL != pC->mVideoStreamHandler->m_pDecoderSpecificInfo) {
581694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            free(pC->mVideoStreamHandler->\
5827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_pDecoderSpecificInfo);
5837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoStreamHandler->m_decoderSpecificInfoSize = 0;
5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoStreamHandler->m_pDecoderSpecificInfo = M4OSA_NULL;
5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(M4OSA_NULL != pC->mVideoStreamHandler->m_pH264DecoderSpecificInfo) {
588694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            free(pC->mVideoStreamHandler->\
5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_pH264DecoderSpecificInfo);
5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoStreamHandler->m_H264decoderSpecificInfoSize = 0;
5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoStreamHandler->m_pH264DecoderSpecificInfo = M4OSA_NULL;
5927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(pC->mVideoStreamHandler->m_pESDSInfo != M4OSA_NULL) {
595694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            free(pC->mVideoStreamHandler->m_pESDSInfo);
5967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoStreamHandler->m_pESDSInfo = M4OSA_NULL;
5977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoStreamHandler->m_ESDSInfoSize = 0;
5987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Finally destroy the stream handler */
601694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->mVideoStreamHandler);
6027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mVideoStreamHandler = M4OSA_NULL;
6037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mVideoSource->stop();
6057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mVideoSource.clear();
6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6073ad01762633531957174c5b27e71ca4aac45e554Santosh Madhava    pC->mExtractor.clear();
6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mDataSource.clear();
6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6102703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_close end");
6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
6127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
6137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
6167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    get an option from the 3gp reader
6177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note     it allows the caller to retrieve a property value:
6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*
6197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    optionId:       (IN)    indicates the option to get
6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pValue:         (OUT)   pointer to structure or value (allocated
6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*                                   by user) where option is stored
6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*
6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
6257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_BAD_CONTEXT       provided context is not a valid one
6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER         at least one parameter is not properly set
6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_BAD_OPTION_ID     when the option ID is not a valid one
6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_VIDEO_NOT_H263    No video stream H263 in file.
6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_NO_VIDEO_STREAM_RETRIEVED_YET
6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*           Function 3gpReader_getNextStreamHandler must be called before
6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
6337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getOption(M4OSA_Context context,
6347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_OptionID optionId, M4OSA_DataOption pValue) {
6357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
6367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
6377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6382703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_getOption begin %d", optionId);
6397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
6417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "invalid context pointer");
6427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pValue), M4ERR_PARAMETER,
6437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getOption: invalid pointer on value");
6447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch (optionId) {
6467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_Duration:
6477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
6482703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditor3gpReader_getOption duration %d",pC->mMaxDuration);
649aa382f3637a68361989d5b70e3184bddcc472d3dhongteng            *(M4OSA_Time*)pValue = pC->mMaxDuration;
6507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
6517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
6527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_Version:
6537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
6542703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getOption: M4READER_kOptionID_Version");
6557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
6567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_Copyright:
6587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
6592703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV(">>>>>>>   M4READER_kOptionID_Copyright");
6607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
6617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_CreationTime:
6637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
6642703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_CreationTime");
6657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    break;
6667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_Bitrate:
6687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
6697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_UInt32* pBitrate = (M4OSA_UInt32*)pValue;
6707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (pC->mMaxDuration != 0) {
6727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt32 ui32Tmp = (M4OSA_UInt32)pC->mMaxDuration;
67395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                *pBitrate = (M4OSA_UInt32)(pC->mFileSize * 8000.0 / pC->mMaxDuration);
6747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
6752703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditor3gpReader_getOption bitrate %ld", *pBitrate);
6767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
6777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    break;
6787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_3GP_kOptionID_H263Properties:
6797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
6807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(M4OSA_NULL == pC->mVideoStreamHandler) {
6812703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VideoEditor3gpReader_getOption no videoStream retrieved");
6827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4ERR_NO_VIDEO_STREAM_RETRIEVED_YET;
6847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
6857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
6867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if((M4DA_StreamTypeVideoH263 != pC->mVideoStreamHandler->\
687b864ee128119ad995862355776599e553691e722Danny Fernandes                m_streamType) || (pC->mVideoStreamHandler->\
6887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_decoderSpecificInfoSize < 7)) {
6892703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VideoEditor3gpReader_getOption DSI Size %d",
6907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->mVideoStreamHandler->m_decoderSpecificInfoSize);
6917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4ERR_VIDEO_NOT_H263;
6937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
6947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
6957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* MAGICAL in the decoder confi H263: the 7th byte is the profile
6977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * number, 6th byte is the level number */
6987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ((M4READER_3GP_H263Properties *)pValue)->uiProfile =
6997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mVideoStreamHandler->m_pDecoderSpecificInfo[6];
7007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ((M4READER_3GP_H263Properties *)pValue)->uiLevel =
7017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mVideoStreamHandler->m_pDecoderSpecificInfo[5];
7022703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditor3gpReader_getOption M4READER_3GP_kOptionID_\
7037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            H263Properties end");
7047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
7057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_3GP_kOptionID_PurpleLabsDrm:
7072703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReaderOption M4READER_3GP_kOptionID_PurpleLabsDrm");
7087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
7097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_GetNumberOfAudioAu:
7127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
7132703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReadeOption M4READER_kOptionID_GetNumberOfAudioAu");
7147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    break;
7157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_GetNumberOfVideoAu:
7177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
7182703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getOption :GetNumberOfVideoAu");
7197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    break;
7207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_GetMetadata:
7227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
7232703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_GetMetadata");
7247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    break;
7257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_3gpFtypBox:
7277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* used only for SEMC */
7282703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_3gpFtypBox");
7297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4ERR_BAD_OPTION_ID; //check this
7307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef OPTIONID_GET_NEXT_VIDEO_CTS
7337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_3GP_kOptionID_getNextVideoCTS:
7347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
7352703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getOption: getNextVideoCTS");
7367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
7387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    default:
7397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
7407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4ERR_BAD_OPTION_ID;
7412703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditor3gpReader_getOption M4ERR_BAD_OPTION_ID");
7427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
7437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7452703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_getOption end: optionID: x%x", optionId);
7467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
7477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
7487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
7497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
7507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    set an option on the 3gp reader
7517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note No option can be set yet.
7527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
7537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    optionId:       (IN)    indicates the option to set
7547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pValue:         (IN)    pointer to structure or value (allocated
7557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*                                   by user) where option is stored
7567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
7577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_BAD_CONTEXT       provided context is not a valid one
7587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER         at least one parameter is not properly set
7597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_BAD_OPTION_ID     when the option ID is not a valid one
7607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
7617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
7627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_setOption(M4OSA_Context context,
7637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_OptionID optionId, M4OSA_DataOption pValue) {
7647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
7657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
7667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check function parameters */
7687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
7697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "invalid context pointer");
7707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pValue), M4ERR_PARAMETER,
7717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "invalid value pointer");
7727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7732703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_setOption begin %d",optionId);
7747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch(optionId) {
7767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4READER_kOptionID_SetOsaFileReaderFctsPtr:
7777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4READER_3GP_kOptionID_AudioOnly:
7807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4READER_3GP_kOptionID_VideoOnly:
7837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4READER_3GP_kOptionID_FastOpenMode:
7867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4READER_kOptionID_MaxMetadataSize:
7897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
7927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
7932703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditor3gpReader_setOption: returns M4ERR_BAD_OPTION_ID");
7947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4ERR_BAD_OPTION_ID;
7957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
7967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7982703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_setOption end ");
7997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
8007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
8017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
8027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
8037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   fill the access unit structure with initialization values
8047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   context:        (IN)     Context of the reader
8057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pStreamHandler: (IN)     pointer to the stream handler to which
8067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                   the access unit will be associated
8077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pAccessUnit:    (IN/OUT) pointer to the access unit (allocated
8087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                   by the caller) to initialize
8097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR               there is no error
8107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_PARAMETER          at least one parameter is not properly set
8117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
8127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
8137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_fillAuStruct(M4OSA_Context context,
8147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_StreamHandler *pStreamHandler, M4_AccessUnit *pAccessUnit) {
8157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
8167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err= M4NO_ERROR;
8177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0),             M4ERR_PARAMETER,
8197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_fillAuStruct: invalid context");
8207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
8217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_fillAuStruc invalid pointer to M4_StreamHandler");
8227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pAccessUnit == 0),    M4ERR_PARAMETER,
8237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_fillAuStruct: invalid pointer to M4_AccessUnit");
8247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8252703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_fillAuStruct begin");
8267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Initialize pAccessUnit structure */
8287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_size         = 0;
8297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_CTS          = 0;
8307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_DTS          = 0;
8317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_attribute    = 0;
8327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_dataAddress  = M4OSA_NULL;
8337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_maxsize      = pStreamHandler->m_maxAUSize;
8347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_streamID     = pStreamHandler->m_streamId;
8357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_structSize   = sizeof(M4_AccessUnit);
8367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8372703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_fillAuStruct end");
8387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
8397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
8407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
8427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
8437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    jump into the stream at the specified time
8447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note
8457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:        (IN)   Context of the reader
8467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pStreamHandler  (IN)   the stream handler of the stream to make jump
8477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pTime           (I/O)IN  the time to jump to (in ms)
8487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*                                OUT the time to which the stream really jumped
8497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR             there is no error
8507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER        at least one parameter is not properly set
8517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
8527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
8537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_jump(M4OSA_Context context,
8547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_StreamHandler *pStreamHandler, M4OSA_Int32* pTime) {
8557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
8567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
8577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_AccessUnit* pAu;
8587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Time time64;
8597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER,
8617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_jump: invalid context");
8627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
8637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_jump: invalid pointer to M4_StreamHandler");
8647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pTime == 0), M4ERR_PARAMETER,
8657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_jump: invalid time pointer");
8667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8672703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_jump begin");
8687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (*pTime == (pStreamHandler->m_duration)) {
87013ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru        *pTime -= 1;
87113ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru    }
872aa382f3637a68361989d5b70e3184bddcc472d3dhongteng    time64 = (M4OSA_Time)*pTime;
8737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8742703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_jump time us %ld ", time64);
8757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ((pC->mAudioStreamHandler != M4OSA_NULL) &&
8777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (pStreamHandler->m_streamId == pC->mAudioStreamHandler->m_streamId))
8787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
8797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu = &pC->mAudioAu;
8807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->CTS = time64;
8817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->DTS = time64;
8827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        time64 = time64 * 1000; /* Convert the time into micro sec */
8847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mAudioSeeking = M4OSA_TRUE;
8857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mAudioSeekTime = time64;
8862703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_jump AUDIO time us %ld ", time64);
8877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else if ((pC->mVideoStreamHandler != M4OSA_NULL) &&
8887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (pStreamHandler->m_streamId == pC->mVideoStreamHandler->m_streamId))
8897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
8907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu = &pC->mVideoAu;
8917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->CTS = time64;
8927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->DTS = time64;
8937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        time64 = time64 * 1000; /* Convert the time into micro sec */
8957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mVideoSeeking = M4OSA_TRUE;
8967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mVideoSeekTime = time64;
8972703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_jump VIDEO time us %ld ", time64);
8987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
8992703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_jump passed StreamHandler is not known\n");
9007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_PARAMETER;
9017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
9027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    time64 = time64 / 1000; /* Convert the time into milli sec */
9032703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_jump time ms before seekset %ld ", time64);
9047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
905aa382f3637a68361989d5b70e3184bddcc472d3dhongteng    *pTime = (M4OSA_Int32)time64;
9067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9072703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_jump end");
9087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4NO_ERROR;
9097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
9107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
9117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
9127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
9137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    reset the stream, that is seek it to beginning and make it ready
9147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note
9157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
9167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pStreamHandler  (IN)    The stream handler of the stream to reset
9177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
9187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER         at least one parameter is not properly set
9197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
9207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
9217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_reset(M4OSA_Context context,
9227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_StreamHandler *pStreamHandler) {
9237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
9247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
9257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_StreamID streamIdArray[2];
9267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_AccessUnit* pAu;
927aa382f3637a68361989d5b70e3184bddcc472d3dhongteng    M4OSA_Time time64 = 0;
9287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER,
9307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_reset: invalid context");
9317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
9327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_reset: invalid pointer to M4_StreamHandler");
9337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9342703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_reset begin");
9357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (pStreamHandler == (M4_StreamHandler*)pC->mAudioStreamHandler) {
9377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu = &pC->mAudioAu;
9387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else if (pStreamHandler == (M4_StreamHandler*)pC->mVideoStreamHandler) {
9397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu = &pC->mVideoAu;
9407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
9412703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_reset passed StreamHandler is not known\n");
9427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_PARAMETER;
9437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
9447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAu->CTS = time64;
9467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAu->DTS = time64;
9477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9482703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_reset end");
9497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
9507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
9517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
9537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
9547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief  Gets an access unit (AU) from the stream handler source.
9557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note   An AU is the smallest possible amount of data to be decoded by decoder
9567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*
9577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:        (IN) Context of the reader
9587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pStreamHandler  (IN) The stream handler of the stream to make jump
9597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pAccessUnit     (IO) Pointer to access unit to fill with read data
9607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR           there is no error
9617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER      at least one parameter is not properly set
9627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @returns  M4ERR_ALLOC          memory allocation failed
9637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @returns  M4WAR_NO_MORE_AU     there are no more access unit in the stream
9647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
9657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
9667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getNextAu(M4OSA_Context context,
9677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_StreamHandler *pStreamHandler, M4_AccessUnit *pAccessUnit) {
9687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC=(VideoEditor3gpReader_Context*)context;
9697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
9707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_AccessUnit* pAu;
9717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int64_t tempTime64 = 0;
9727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBuffer *mMediaBuffer = NULL;
9737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaSource::ReadOptions options;
9747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Bool flag = M4OSA_FALSE;
9757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t error;
97613ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru    int32_t i32Tmp = 0;
9777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pReaderContext == 0), M4ERR_PARAMETER,
9797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getNextAu: invalid context");
9807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
9817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getNextAu: invalid pointer to M4_StreamHandler");
9827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pAccessUnit == 0),    M4ERR_PARAMETER,
9837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getNextAu: invalid pointer to M4_AccessUnit");
9847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9852703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_getNextAu begin");
9867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (pStreamHandler == (M4_StreamHandler*)pC->mAudioStreamHandler) {
9882703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getNextAu audio stream");
9897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu = &pC->mAudioAu;
9907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (pC->mAudioSeeking == M4OSA_TRUE) {
9912703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditor3gpReader_getNextAu audio seek time: %ld",
9927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mAudioSeekTime);
9937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            options.setSeekTo(pC->mAudioSeekTime);
9947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioSource->read(&mMediaBuffer, &options);
9957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mMediaBuffer->meta_data()->findInt64(kKeyTime,
9977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (int64_t*)&tempTime64);
9987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            options.clearSeekTo();
9997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioSeeking = M4OSA_FALSE;
10007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            flag = M4OSA_TRUE;
10017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
10022703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditor3gpReader_getNextAu audio no seek:");
10037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioSource->read(&mMediaBuffer, &options);
10047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (mMediaBuffer != NULL) {
10057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                mMediaBuffer->meta_data()->findInt64(kKeyTime,
10067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (int64_t*)&tempTime64);
10077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
10087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
10097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else if (pStreamHandler == (M4_StreamHandler*)pC->mVideoStreamHandler) {
10102703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getNextAu video steram ");
10117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu = &pC->mVideoAu;
10127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(pC->mVideoSeeking == M4OSA_TRUE) {
10137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            flag = M4OSA_TRUE;
10142703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditor3gpReader_getNextAu seek: %ld",pC->mVideoSeekTime);
10157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            options.setSeekTo(pC->mVideoSeekTime,
10167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC);
10177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            do
10187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
10197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if (mMediaBuffer != NULL) {
10202703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                    ALOGV("VideoEditor3gpReader_getNextAu free the MediaBuffer");
10217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    mMediaBuffer->release();
10227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
10237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                error = pC->mVideoSource->read(&mMediaBuffer, &options);
10242703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VE3gpReader_getNextAu MediaBuffer %x , error %d",
10257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    mMediaBuffer, error);
10267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if (mMediaBuffer != NULL)
10277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
102813ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                    if (mMediaBuffer->meta_data()->findInt32(kKeyIsSyncFrame,
102913ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                        &i32Tmp) && i32Tmp) {
10302703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                            ALOGV("SYNC FRAME FOUND--%d", i32Tmp);
103113ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                        pAu->attribute = AU_RAP;
103213ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                    }
1033733100524deb5d2da77ac52a2ff89b2cde242934Dheeraj Sharma                    else {
1034733100524deb5d2da77ac52a2ff89b2cde242934Dheeraj Sharma                        pAu->attribute = AU_P_Frame;
1035733100524deb5d2da77ac52a2ff89b2cde242934Dheeraj Sharma                    }
10367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    mMediaBuffer->meta_data()->findInt64(kKeyTime,
10377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (int64_t*)&tempTime64);
10387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                } else {
10397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
10407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
10417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                options.clearSeekTo();
10427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } while(tempTime64 < pC->mVideoSeekTime);
10437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10442703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VE3gpReader_getNextAu: video  time with seek  = %lld:",
10457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                tempTime64);
10467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoSeeking = M4OSA_FALSE;
10477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
10482703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditor3gpReader_getNextAu video no seek:");
10497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoSource->read(&mMediaBuffer, &options);
10507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(mMediaBuffer != NULL) {
105213ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                if (mMediaBuffer->meta_data()->findInt32(kKeyIsSyncFrame,
105313ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                    &i32Tmp) && i32Tmp) {
10542703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                    ALOGV("SYNC FRAME FOUND--%d", i32Tmp);
105513ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                    pAu->attribute = AU_RAP;
105613ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                }
1057733100524deb5d2da77ac52a2ff89b2cde242934Dheeraj Sharma                else {
1058733100524deb5d2da77ac52a2ff89b2cde242934Dheeraj Sharma                    pAu->attribute = AU_P_Frame;
1059733100524deb5d2da77ac52a2ff89b2cde242934Dheeraj Sharma                }
10607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                mMediaBuffer->meta_data()->findInt64(kKeyTime,
10617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (int64_t*)&tempTime64);
10622703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VE3gpReader_getNextAu: video no seek time = %lld:",
10637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    tempTime64);
10647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }else {
10652703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VE3gpReader_getNextAu:video no seek time buffer is NULL");
10667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
10677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
10687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
10692703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getNextAu M4ERR_PARAMETER");
10707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_PARAMETER;
10717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
10727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (mMediaBuffer != NULL) {
10747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (pAu->dataAddress == NULL) ||  (pAu->size < \
10757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mMediaBuffer->range_length())) {
10767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(pAu->dataAddress != NULL) {
1077694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                free((M4OSA_Int32*)pAu->dataAddress);
10787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAu->dataAddress = NULL;
10797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
10802703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("Buffer lenght = %d ,%d",(mMediaBuffer->range_length() +\
10817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                3) & ~0x3,(mMediaBuffer->range_length()));
10827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1083694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            pAu->dataAddress = (M4OSA_Int32*)M4OSA_32bitAlignedMalloc(
10847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (mMediaBuffer->range_length() + 3) & ~0x3,M4READER_3GP,
10857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Char*)"pAccessUnit->m_dataAddress" );
10867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(pAu->dataAddress == NULL) {
10872703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VideoEditor3gpReader_getNextAu malloc failed");
10887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4ERR_ALLOC;
10897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
10907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
10917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->size = mMediaBuffer->range_length();
10927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
109332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)pAu->dataAddress,
109432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (void *)((const char *)mMediaBuffer->data() + mMediaBuffer->range_offset()),
10957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mMediaBuffer->range_length());
10967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (pStreamHandler == (M4_StreamHandler*)pC->mVideoStreamHandler)  &&
10987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (pStreamHandler->m_streamType == M4DA_StreamTypeVideoMpeg4Avc) ) {
10997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_UInt32 size = mMediaBuffer->range_length();
11007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_UInt8 *lbuffer;
11017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lbuffer = (M4OSA_UInt8 *) pAu->dataAddress;
11032703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("pAccessUnit->m_dataAddress size = %x",size);
11047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lbuffer[0] = (size >> 24) & 0xFF;
11067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lbuffer[1] = (size >> 16) & 0xFF;
11077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lbuffer[2] = (size >> 8) & 0xFF;
11087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lbuffer[3] = (size) & 0xFF;
11097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
11107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->CTS = tempTime64;
11127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->CTS = pAu->CTS / 1000; //converting the microsec to millisec
11142703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getNextAu CTS = %ld",pAu->CTS);
11157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->DTS  = pAu->CTS;
111713ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru        if (pStreamHandler == (M4_StreamHandler*)pC->mAudioStreamHandler) {
111813ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru            pAu->attribute = M4SYS_kFragAttrOk;
111913ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru        }
11207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mMediaBuffer->release();
11217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAccessUnit->m_dataAddress = (M4OSA_Int8*) pAu->dataAddress;
11237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAccessUnit->m_size = pAu->size;
11247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAccessUnit->m_maxsize = pAu->size;
11257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAccessUnit->m_CTS = pAu->CTS;
11267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAccessUnit->m_DTS = pAu->DTS;
11277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAccessUnit->m_attribute = pAu->attribute;
11287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
11302703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getNextAu: M4WAR_NO_MORE_AU (EOS) reached");
11317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAccessUnit->m_size = 0;
11327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4WAR_NO_MORE_AU;
11337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
11347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    options.clearSeekTo();
11357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAu->nbFrag = 0;
11377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mMediaBuffer = NULL;
11382703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_getNextAu end ");
11397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
11417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
11427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
11437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
11447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Split the AVC DSI in its different components and write it in
11457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          ONE memory buffer
11467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
11477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pStreamHandler:         (IN/OUT) The MPEG4-AVC stream
11487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pDecoderConfigLocal:    (IN) The DSI buffer
11497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   decoderConfigSizeLocal: (IN) The DSI buffer size
11507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR              there is no error
11517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  ERR_FILE_SYNTAX_ERROR   pDecoderConfigLocal is NULL
11527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
11537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
11547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR VideoEditor3gpReader_AnalyseAvcDsi(
11557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_StreamHandler *pStreamHandler, M4OSA_Int32* pDecoderConfigLocal,
11567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int32 decoderConfigSizeLocal) {
11577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    struct _avcSpecificInfo *pAvcSpecInfo = M4OSA_NULL;
11587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 uiSpecInfoSize;
11597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Context pBitParserContext = M4OSA_NULL;
11607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_MemAddr8 pPos;
11617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
11637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * First parsing to get the total allocation size (we must not do
11647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * multiple malloc, but only one instead) */
11657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
11667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int32 val;
11677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 i,j;
11687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt8 nalUnitLength;
11697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt8  numOfSequenceParameterSets;
11707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 uiTotalSizeOfSPS = 0;
11717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt8  numOfPictureParameterSets;
11727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 uiTotalSizeOfPPS = 0;
11737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 uiSize;
11747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        struct _avcSpecificInfo avcSpIf;
11757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        avcSpIf.m_nalUnitLength = 0;
11777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (M4OSA_NULL == pDecoderConfigLocal) {
11797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_READER3GP_DECODER_CONFIG_ERROR;
11807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
11817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_MPEG4BitStreamParserInit(&pBitParserContext,
11837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderConfigLocal, decoderConfigSizeLocal);
11847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (M4OSA_NULL == pBitParserContext) {
11867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
11877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
11887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
11907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                       /* 8 bits -- configuration version */
11917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
11927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                       /* 8 bits -- avc profile indication*/
11937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
11947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                       /* 8 bits -- profile compatibility */
11957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
11967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                       /* 8 bits -- avc level indication*/
11977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        val=VideoEditor3gpReader_BitStreamParserShowBits(pBitParserContext, 8);
11987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                       /* 6 bits reserved 111111b 2 bits length Size minus one*/
11997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
12007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                       /* m_nalUnitLength */
12017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nalUnitLength = (M4OSA_UInt8)((val & 0x03) + 1);/*0b11111100*/
12037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (nalUnitLength > 4) {
12047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pStreamHandler->m_decoderSpecificInfoSize = 0;
12057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pStreamHandler->m_pDecoderSpecificInfo = M4OSA_NULL;
12067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
12077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
12087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
12097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * SPS table */
12107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            val=VideoEditor3gpReader_BitStreamParserShowBits(pBitParserContext,
12117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            8);/* 3 bits-reserved 111b-5 bits number of sequence parameter set*/
12127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            numOfSequenceParameterSets = val & 0x1F;
12137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*1F instead of E0*/ /*0b11100000*/ /*Number of seq parameter sets*/
12147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
12157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            for (i=0; i < numOfSequenceParameterSets; i++) {
12167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
12177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * Get the size of this element */
12187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                uiSize =
12197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_UInt32)VideoEditor3gpReader_BitStreamParserShowBits(
12207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 16);
12217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                uiTotalSizeOfSPS += uiSize;
12227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserFlushBits(
12237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 16);
12247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
12257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 *Read the element(dont keep it, we only want size right now) */
12267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                for (j=0; j<uiSize; j++) {
12277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    VideoEditor3gpReader_BitStreamParserFlushBits(
12287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pBitParserContext, 8);
12297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
12307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
12317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
12337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * SPS table */
12347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            numOfPictureParameterSets=(M4OSA_UInt8)\
12357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserShowBits(pBitParserContext,
12367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    8);
12377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
12387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            for (i=0; i < numOfPictureParameterSets; i++) {
12397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
12407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * Get the size of this element */
12417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                uiSize = (M4OSA_UInt32)
12427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    VideoEditor3gpReader_BitStreamParserShowBits(
12437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 16);
12447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                uiTotalSizeOfPPS += uiSize;
12457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserFlushBits(
12467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 16);
12477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
12487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 *Read the element(dont keep it,we only want size right now)*/
12497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                for (j=0; j<uiSize; j++) {
12507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    VideoEditor3gpReader_BitStreamParserFlushBits(
12517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pBitParserContext, 8);
12527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
12537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
12547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
12567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * Compute the size of the full buffer */
12577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            uiSpecInfoSize = sizeof(struct _avcSpecificInfo) +
12587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     numOfSequenceParameterSets * sizeof(struct _parameterSet)
12597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     + /**< size of the table of SPS elements */
12607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     numOfPictureParameterSets  * sizeof(struct _parameterSet)
12617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     + /**< size of the table of PPS elements */
12627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     uiTotalSizeOfSPS +
12637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     uiTotalSizeOfPPS;
12647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
12657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * Allocate the buffer */
1266694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            pAvcSpecInfo =(struct _avcSpecificInfo*)M4OSA_32bitAlignedMalloc(uiSpecInfoSize,
12677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4READER_3GP, (M4OSA_Char*)"MPEG-4 AVC DecoderSpecific");
12687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4OSA_NULL == pAvcSpecInfo) {
12697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
12707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4ERR_ALLOC;
12717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
12727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
12747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * Set the pointers to the correct part of the buffer */
12757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_nalUnitLength = nalUnitLength;
12767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_numOfSequenceParameterSets =
12777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                numOfSequenceParameterSets;
12787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_numOfPictureParameterSets  =
12797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                numOfPictureParameterSets;
12807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* We place the SPS param sets table after m_pPictureParameterSet */
12827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_pSequenceParameterSet= (struct _parameterSet*)(
12837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_MemAddr8)(&pAvcSpecInfo->m_pPictureParameterSet) +
12847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                sizeof(pAvcSpecInfo->m_pPictureParameterSet));
12857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*We place the PPS param sets table after the SPS param sets table*/
12867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_pPictureParameterSet = (struct _parameterSet*)(
12877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_MemAddr8)(pAvcSpecInfo->m_pSequenceParameterSet) +
12887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (numOfSequenceParameterSets * sizeof(struct _parameterSet)));
12897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< The data will be placed after the PPS param sets table */
12907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPos = (M4OSA_MemAddr8)pAvcSpecInfo->m_pPictureParameterSet +
12917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (numOfPictureParameterSets * sizeof(struct _parameterSet));
12927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
12947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * reset the bit parser */
12957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
12967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
12977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
12987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
13007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * Second parsing to copy the data */
13017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4OSA_NULL != pAvcSpecInfo) {
13027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int32 i,j;
13037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_MPEG4BitStreamParserInit(&pBitParserContext,
13057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderConfigLocal, decoderConfigSizeLocal);
13067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (M4OSA_NULL == pBitParserContext) {
1308694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            free(pAvcSpecInfo);
13097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
13107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
13117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* 8 bits -- configuration version */
13147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* 8 bits -- avc profile indication*/
13167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* 8 bits -- profile compatibility */
13187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* 8 bits -- avc level indication*/
13207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* m_nalUnitLength */
13227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* 3 bits -- reserved 111b -- 5 bits number of sequence parameter set*/
13247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        for (i=0; i < pAvcSpecInfo->m_numOfSequenceParameterSets; i++) {
13267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_pSequenceParameterSet[i].m_length =
13277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt16)VideoEditor3gpReader_BitStreamParserShowBits(
13287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pBitParserContext, 16);
13297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext,16);
13307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_pSequenceParameterSet[i].m_pParameterSetUnit =
13327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt8*)pPos;  /**< current position in the buffer */
13337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPos += pAvcSpecInfo->m_pSequenceParameterSet[i].m_length;
13347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**< increment the position in the buffer */
13357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            for (j=0; j<pAvcSpecInfo->m_pSequenceParameterSet[i].m_length;j++){
13367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAvcSpecInfo->m_pSequenceParameterSet[i].m_pParameterSetUnit[j]=
13377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_UInt8)VideoEditor3gpReader_BitStreamParserShowBits(
13387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 8);
13397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserFlushBits(
13407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 8);
13417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
13427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
13437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* number of pîcture parameter set*/
13467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        for (i=0; i < pAvcSpecInfo->m_numOfPictureParameterSets; i++) {
13487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_pPictureParameterSet[i].m_length =
13497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt16)VideoEditor3gpReader_BitStreamParserShowBits(
13507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pBitParserContext, 16);
13517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext,16);
13527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_pPictureParameterSet[i].m_pParameterSetUnit =
13547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt8*)pPos;   /**< current position in the buffer */
13557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPos += pAvcSpecInfo->m_pPictureParameterSet[i].m_length;
13567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**< increment the position in the buffer */
13577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            for (j=0; j<pAvcSpecInfo->m_pPictureParameterSet[i].m_length; j++) {
13587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAvcSpecInfo->m_pPictureParameterSet[i].m_pParameterSetUnit[j] =
13597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_UInt8)VideoEditor3gpReader_BitStreamParserShowBits(
13607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 8);
13617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserFlushBits(
13627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 8);
13637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
13647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
13657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
13667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pStreamHandler->m_decoderSpecificInfoSize = uiSpecInfoSize;
13677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pStreamHandler->m_pDecoderSpecificInfo = (M4OSA_UInt8*)pAvcSpecInfo;
13687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
13697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamHandler->m_H264decoderSpecificInfoSize  =  decoderConfigSizeLocal;
1370694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu    pStreamHandler->m_pH264DecoderSpecificInfo  = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(
13717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        decoderConfigSizeLocal, M4READER_3GP,
13727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Char*)"MPEG-4 AVC DecoderSpecific");
13737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4OSA_NULL == pStreamHandler->m_pH264DecoderSpecificInfo) {
13747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        goto cleanup;
13757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
13767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
137732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu    memcpy((void * ) pStreamHandler->m_pH264DecoderSpecificInfo,
137832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        (void * )pDecoderConfigLocal,
13797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pStreamHandler->m_H264decoderSpecificInfoSize);
13807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
13817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargicleanup:
13827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
13837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4ERR_READER3GP_DECODER_CONFIG_ERROR;
13847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
13857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
13867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
13877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    Get the next stream found in the 3gp file
13887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note
13897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:     (IN)    Context of the reader
13907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pMediaFamily: OUT)   pointer to a user allocated
13917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*                                M4READER_MediaFamily that will be filled
13927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*                                with the media family of the found stream
13937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pStreamHandler:(OUT) pointer to StreamHandler that will be allocated
13947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*                                and filled with the found stream description
13957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
13967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_BAD_CONTEXT       provided context is not a valid one
13977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER         at least one parameter is not properly set
13987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4WAR_NO_MORE_STREAM    no more available stream in the media
13997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
14007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
14017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getNextStreamHandler(M4OSA_Context context,
14027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4READER_MediaFamily *pMediaFamily,
14037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_StreamHandler **pStreamHandler) {
14047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC=(VideoEditor3gpReader_Context*)context;
14057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
14067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_StreamID streamIdArray[2];
14077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_StreamDescription streamDesc;
14087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_AudioStreamHandler* pAudioStreamHandler;
14097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_VideoStreamHandler* pVideoStreamHandler;
14107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int8 *DecoderSpecificInfo = M4OSA_NULL;
14117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 decoderSpecificInfoSize =0, maxAUSize = 0;
14127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_StreamType streamType = M4DA_StreamTypeUnknown;
14147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 temp, i, trackCount;
14157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Bool haveAudio = M4OSA_FALSE;
14167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Bool haveVideo = M4OSA_FALSE;
14177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<MetaData> meta  = NULL;
14187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int64_t Duration = 0;
14197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8* DecoderSpecific = M4OSA_NULL ;
14207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint32_t type;
14217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    const void *data;
14227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    size_t size;
14237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    const void *codec_specific_data;
14247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    size_t codec_specific_data_size;
14257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32  ptempTime;
1426d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru    M4OSA_Int32  avgFPS=0;
14277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14282703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_getNextStreamHandler begin");
14297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER,
14317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getNextStreamHandler: invalid context");
14327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pMediaFamily   == 0), M4ERR_PARAMETER,
14337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "getNextStreamHandler: invalid pointer to MediaFamily");
14347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
14357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "getNextStreamHandler: invalid pointer to StreamHandler");
14367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    trackCount = pC->mExtractor->countTracks();
14387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    temp = pC->mCurrTrack;
14397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(temp >= trackCount) {
14412703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getNextStreamHandler error = %d",
14427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4WAR_NO_MORE_STREAM);
14437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return (M4WAR_NO_MORE_STREAM);
14447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
14457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        const char *mime;
14467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        meta = pC->mExtractor->getTrackMetaData(temp);
14477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        CHECK(meta->findCString(kKeyMIMEType, &mime));
14487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (!haveVideo && !strncasecmp(mime, "video/", 6)) {
14507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoSource = pC->mExtractor->getTrack(temp);
14517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoSource->start();
14527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pMediaFamily = M4READER_kMediaFamilyVideo;
14547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            haveVideo = true;
14552703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditor3gpReader_getNextStreamHandler getTrack called");
14567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) {
14577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamType = M4DA_StreamTypeVideoMpeg4Avc;
14587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_H263)) {
14597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamType = M4DA_StreamTypeVideoH263;
14607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG4)) {
14617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamType = M4DA_StreamTypeVideoMpeg4;
14627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } else {
14632703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VideoEditor3gpReaderGetNextStreamHandler streamTypeNONE");
14647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
14652703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditor3gpReader_getNextStreamHandler: stream type: %d ",
14667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamType);
14677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(streamType != M4DA_StreamTypeUnknown) {
14697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mStreamType = streamType;
14707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mStreamId = pC->mCurrTrack;
14717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1472694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                pVideoStreamHandler = (M4_VideoStreamHandler*)M4OSA_32bitAlignedMalloc
14737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (sizeof(M4_VideoStreamHandler), M4READER_3GP,
14747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Char*)"M4_VideoStreamHandler");
14757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if (M4OSA_NULL == pVideoStreamHandler) {
14767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4ERR_ALLOC;
14777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
14787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pVideoStreamHandler->m_structSize=sizeof(M4_VideoStreamHandler);
14797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                meta->findInt32(kKeyWidth,
14817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (int32_t*)&(pVideoStreamHandler->m_videoWidth));
14827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                meta->findInt32(kKeyHeight,
14837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (int32_t*)&(pVideoStreamHandler->m_videoHeight));
14847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pStreamHandler)  = (M4_StreamHandler*)(pVideoStreamHandler);
148653f69c194d7ae8105b4c6d0c9901eb96281c7bf9James Dong                meta->findInt64(kKeyDuration, (int64_t*)&(Duration));
148753f69c194d7ae8105b4c6d0c9901eb96281c7bf9James Dong                ((*pStreamHandler)->m_duration) = (int32_t)((Duration)/1000); // conversion to mS
14887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mMaxDuration = ((*pStreamHandler)->m_duration);
148953f69c194d7ae8105b4c6d0c9901eb96281c7bf9James Dong                if (pC->mMaxDuration == 0) {
149053f69c194d7ae8105b4c6d0c9901eb96281c7bf9James Dong                    ALOGE("Video is too short: %lld Us", Duration);
149153f69c194d7ae8105b4c6d0c9901eb96281c7bf9James Dong                    delete pVideoStreamHandler;
149253f69c194d7ae8105b4c6d0c9901eb96281c7bf9James Dong                    pVideoStreamHandler = NULL;
149353f69c194d7ae8105b4c6d0c9901eb96281c7bf9James Dong                    return M4ERR_PARAMETER;
149453f69c194d7ae8105b4c6d0c9901eb96281c7bf9James Dong                }
14952703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VideoEditor3gpReader_getNextStreamHandler m_duration %d",
14967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_duration);
14977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
149895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                off64_t fileSize = 0;
149995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                pC->mDataSource->getSize(&fileSize);
150095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                pC->mFileSize  = fileSize;
150195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
15022703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VideoEditor3gpReader_getNextStreamHandler m_fileSize %d",
150395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    pC->mFileSize);
15047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                meta->findInt32(kKeyMaxInputSize, (int32_t*)&(maxAUSize));
15067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(maxAUSize == 0) {
15077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    maxAUSize = 70000;
15087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
15097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pStreamHandler)->m_maxAUSize = maxAUSize;
15102703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("<<<<<<<<<<   video: mMaxAUSize from MP4 extractor: %d",
15117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_maxAUSize);
15127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
151395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                ((M4_StreamHandler*)pVideoStreamHandler)->m_averageBitRate =
151495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                        (pC->mFileSize * 8000)/pC->mMaxDuration;
15152703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VideoEditor3gpReader_getNextStreamHandler m_averageBitrate %d",
151695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    ((M4_StreamHandler*)pVideoStreamHandler)->m_averageBitRate);
151795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1518d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru
1519d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru                meta->findInt32(kKeyFrameRate,
1520d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru                    (int32_t*)&(avgFPS));
15212703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("<<<<<<<<<<   video: Average FPS from MP4 extractor: %d",
1522d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru                    avgFPS);
1523d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru
1524d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru                pVideoStreamHandler->m_averageFrameRate =(M4OSA_Float) avgFPS;
15252703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("<<<<<<<<<<   video: Average FPS from MP4 extractor in FLOAT: %f",
1526d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru                    pVideoStreamHandler->m_averageFrameRate);
1527d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru
1528e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury                // Get the video rotation degree
1529e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury                int32_t rotationDegree;
1530e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury                if(!meta->findInt32(kKeyRotation, &rotationDegree)) {
1531e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury                    rotationDegree = 0;
1532e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury                }
1533e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury                pVideoStreamHandler->videoRotationDegrees = rotationDegree;
1534e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury
15357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mVideoStreamHandler =
15367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4_StreamHandler*)(pVideoStreamHandler);
15377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Get the DSI info */
15397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(M4DA_StreamTypeVideoH263 == streamType) {
1540b864ee128119ad995862355776599e553691e722Danny Fernandes                    if (meta->findData(kKeyD263, &type, &data, &size)) {
1541b864ee128119ad995862355776599e553691e722Danny Fernandes                        (*pStreamHandler)->m_decoderSpecificInfoSize = size;
15427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if ((*pStreamHandler)->m_decoderSpecificInfoSize != 0) {
1543694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                            DecoderSpecific = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(
15447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (*pStreamHandler)->m_decoderSpecificInfoSize,
15457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4READER_3GP,(M4OSA_Char*)"H263 DSI");
15467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            if (M4OSA_NULL == DecoderSpecific) {
15477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                return M4ERR_ALLOC;
15487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
154932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                            memcpy((void *)DecoderSpecific,
155032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                                (void *)data, size);
15517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (*pStreamHandler)->m_pDecoderSpecificInfo =
15527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                DecoderSpecific;
15537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
15547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        else {
15557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (*pStreamHandler)->m_pDecoderSpecificInfo =
15567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_NULL;
1557b864ee128119ad995862355776599e553691e722Danny Fernandes                            (*pStreamHandler)->m_decoderSpecificInfoSize = 0;
15587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
1559b864ee128119ad995862355776599e553691e722Danny Fernandes                        (*pStreamHandler)->m_pESDSInfo = M4OSA_NULL;
1560b864ee128119ad995862355776599e553691e722Danny Fernandes                        (*pStreamHandler)->m_ESDSInfoSize = 0;
1561b864ee128119ad995862355776599e553691e722Danny Fernandes                        (*pStreamHandler)->m_pH264DecoderSpecificInfo = M4OSA_NULL;
1562b864ee128119ad995862355776599e553691e722Danny Fernandes                        (*pStreamHandler)->m_H264decoderSpecificInfoSize = 0;
15637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    } else {
15642703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                        ALOGV("VE_getNextStreamHandler: H263 dsi not found");
15657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo = M4OSA_NULL;
15667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_decoderSpecificInfoSize = 0;
15677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_H264decoderSpecificInfoSize = 0;
15687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pH264DecoderSpecificInfo =
15697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_NULL;
15707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pESDSInfo = M4OSA_NULL;
15717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_ESDSInfoSize = 0;
15727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
15737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
15747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else if(M4DA_StreamTypeVideoMpeg4Avc == streamType) {
15757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if(meta->findData(kKeyAVCC, &type, &data, &size)) {
15767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        decoderSpecificInfoSize = size;
15777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if (decoderSpecificInfoSize != 0) {
1578694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                            DecoderSpecificInfo = (M4OSA_Int8*)M4OSA_32bitAlignedMalloc(
15797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                decoderSpecificInfoSize, M4READER_3GP,
15807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (M4OSA_Char*)"H264 DecoderSpecific" );
15817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            if (M4OSA_NULL == DecoderSpecificInfo) {
15822703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                                ALOGV("VideoEditor3gp_getNextStream is NULL ");
15837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                return M4ERR_ALLOC;
15847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
158532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                            memcpy((void *)DecoderSpecificInfo,
158632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                                (void *)data, decoderSpecificInfoSize);
15877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        } else {
15882703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                            ALOGV("DSI Size %d", decoderSpecificInfoSize);
15897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            DecoderSpecificInfo = M4OSA_NULL;
15907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
15917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
15927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_pESDSInfo = M4OSA_NULL;
15937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_ESDSInfoSize = 0;
15947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = VideoEditor3gpReader_AnalyseAvcDsi(*pStreamHandler,
15967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Int32*)DecoderSpecificInfo, decoderSpecificInfoSize);
15977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if (M4NO_ERROR != err) {
15997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
16007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
16012703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                    ALOGV("decsize %d, h264decsize %d: %d", (*pStreamHandler)->\
16027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        m_decoderSpecificInfoSize, (*pStreamHandler)->\
16037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        m_H264decoderSpecificInfoSize);
16047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if(M4OSA_NULL != DecoderSpecificInfo) {
1606694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                        free(DecoderSpecificInfo);
16077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        DecoderSpecificInfo = M4OSA_NULL;
16087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
16097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                } else if( (M4DA_StreamTypeVideoMpeg4 == streamType) ) {
16107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if (meta->findData(kKeyESDS, &type, &data, &size)) {
16117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ESDS esds((const char *)data, size);
1612c4689fae1bdb8d1c94eb28af1b2a1f30d2b1a3daJames Dong                        CHECK_EQ(esds.InitCheck(), (status_t)OK);
16137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_ESDSInfoSize = size;
16157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pESDSInfo = (M4OSA_UInt8*)\
1616694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                        M4OSA_32bitAlignedMalloc((*pStreamHandler)->m_ESDSInfoSize,
1617efc2e4255b8565f5ad6ef8d1cf0e2695e74190d4James Dong                        M4READER_3GP, (M4OSA_Char*)"M4V DecoderSpecific" );
16187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if (M4OSA_NULL == (*pStreamHandler)->m_pESDSInfo) {
16197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return M4ERR_ALLOC;
16207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
162132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        memcpy((void *)(*pStreamHandler)->\
162232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                            m_pESDSInfo, (void *)data, size);
16237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        esds.getCodecSpecificInfo(&codec_specific_data,
16257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            &codec_specific_data_size);
16262703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                        ALOGV("VE MP4 dsisize: %d, %x", codec_specific_data_size,
16277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            codec_specific_data);
16287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_decoderSpecificInfoSize =
16307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            codec_specific_data_size;
16317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if ((*pStreamHandler)->m_decoderSpecificInfoSize != 0) {
1632694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                            DecoderSpecific = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(
16337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (*pStreamHandler)->m_decoderSpecificInfoSize,
16347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4READER_3GP, (M4OSA_Char*)" DecoderSpecific" );
16357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            if (M4OSA_NULL == DecoderSpecific) {
16367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                return M4ERR_ALLOC;
16377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
163832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                            memcpy((void *)DecoderSpecific,
163932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                                (void *)codec_specific_data,
16407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                codec_specific_data_size);
16417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (*pStreamHandler)->m_pDecoderSpecificInfo =
16427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                DecoderSpecific;
16437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
16447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        else {
16457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (*pStreamHandler)->m_pDecoderSpecificInfo =
16467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_NULL;
16477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
16487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pH264DecoderSpecificInfo =
16497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_NULL;
16507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_H264decoderSpecificInfoSize = 0;
16517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
16527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                } else {
16532703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                    ALOGV("VideoEditor3gpReader_getNextStream NO video stream");
16547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4ERR_READER_UNKNOWN_STREAM_TYPE;
16557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
16567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
16577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else {
16582703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VideoEditor3gpReader_getNextStream NO video stream");
16597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4ERR_READER_UNKNOWN_STREAM_TYPE;
16607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
16617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) {
16632703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VideoEditor3gpReader_getNextStream audio getTrack called");
16647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioSource = pC->mExtractor->getTrack(pC->mCurrTrack);
16657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioSource->start();
16667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pMediaFamily = M4READER_kMediaFamilyAudio;
16677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) {
16697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamType = M4DA_StreamTypeAudioAmrNarrowBand;
16707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } else if(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) {
16717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamType = M4DA_StreamTypeAudioAmrWideBand;
16727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
16737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) {
16747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamType = M4DA_StreamTypeAudioAac;
16757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } else {
16762703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VideoEditor3gpReader_getNextStrea streamtype Unknown ");
16777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
16787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(streamType != M4DA_StreamTypeUnknown) {
16797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mStreamType = streamType;
16807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mStreamId = pC->mCurrTrack;
16817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16822703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VE streamtype %d ,id %d",  streamType, pC->mCurrTrack);
16837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1684694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                pAudioStreamHandler = (M4_AudioStreamHandler*)M4OSA_32bitAlignedMalloc
16857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (sizeof(M4_AudioStreamHandler), M4READER_3GP,
16867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Char*)"M4_AudioStreamHandler");
16877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if (M4OSA_NULL == pAudioStreamHandler) {
16887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4ERR_ALLOC;
16897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
16907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAudioStreamHandler->m_structSize=sizeof(M4_AudioStreamHandler);
16917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAudioStreamHandler->m_byteSampleSize   = 0;
16927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAudioStreamHandler->m_nbChannels       = 0;
16937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAudioStreamHandler->m_samplingFrequency= 0;
16947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAudioStreamHandler->m_byteFrameLength  = 0;
16957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pStreamHandler) = (M4_StreamHandler*)(pAudioStreamHandler);
16977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mAudioStreamHandler =
16987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4_StreamHandler*)(pAudioStreamHandler);
16997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pStreamHandler)->m_averageBitRate = 0;
17007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                haveAudio = true;
17017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mAudioStreamHandler=(M4_StreamHandler*)pAudioStreamHandler;
17027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mAudioStreamHandler->m_pESDSInfo = M4OSA_NULL;
17037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mAudioStreamHandler->m_ESDSInfoSize = 0;
17047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                meta->findInt32(kKeyMaxInputSize, (int32_t*)&(maxAUSize));
17067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(maxAUSize == 0) {
17077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    maxAUSize = 70000;
17087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
17097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pStreamHandler)->m_maxAUSize = maxAUSize;
17102703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VE Audio mMaxAUSize from MP4 extractor: %d", maxAUSize);
17117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
17127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if((M4DA_StreamTypeAudioAmrNarrowBand == streamType) ||
17137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4DA_StreamTypeAudioAmrWideBand == streamType)) {
17147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt32 freqIndex = 0; /**< AMR NB */
17157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt32 modeSet;
17167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt32 i;
17177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_Context pBitParserContext = M4OSA_NULL;
17187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(M4DA_StreamTypeAudioAmrWideBand == streamType) {
17207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    freqIndex = 1; /**< AMR WB */
17217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
17227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if (meta->findData(kKeyESDS, &type, &data, &size)) {
17247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ESDS esds((const char *)data, size);
1725c4689fae1bdb8d1c94eb28af1b2a1f30d2b1a3daJames Dong                    CHECK_EQ(esds.InitCheck(), (status_t)OK);
17267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    esds.getCodecSpecificInfo(&codec_specific_data,
17287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        &codec_specific_data_size);
17297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_decoderSpecificInfoSize =
17307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        codec_specific_data_size;
17317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if ((*pStreamHandler)->m_decoderSpecificInfoSize != 0) {
1733694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                        DecoderSpecific = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(
17347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (*pStreamHandler)->m_decoderSpecificInfoSize,
1735efc2e4255b8565f5ad6ef8d1cf0e2695e74190d4James Dong                            M4READER_3GP, (M4OSA_Char*)"AMR DecoderSpecific" );
17367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if (M4OSA_NULL == DecoderSpecific) {
17377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return M4ERR_ALLOC;
17387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
173932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        memcpy((void *)DecoderSpecific,
174032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                            (void *)codec_specific_data,
17417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            codec_specific_data_size);
17427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo =
17437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            DecoderSpecific;
17447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    } else {
17457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo = M4OSA_NULL;
17467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
17477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                } else {
17487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_UChar AmrDsi[] =
17497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {'P','H','L','P',0x00, 0x00, 0x80, 0x00, 0x01,};
17507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_decoderSpecificInfoSize = 9;
1751694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                    DecoderSpecific = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(
17527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_decoderSpecificInfoSize,
1753efc2e4255b8565f5ad6ef8d1cf0e2695e74190d4James Dong                        M4READER_3GP, (M4OSA_Char*)"PHLP DecoderSpecific" );
17547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if (M4OSA_NULL == DecoderSpecific) {
17557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4ERR_ALLOC;
17567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
17577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if(freqIndex ==0) {
17587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        AmrDsi[8] = 0x01;
17597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    } else {
17607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        AmrDsi[8] = 0x02;
17617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
17627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    for(i = 0; i< 9; i++) {
17637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        DecoderSpecific[i] = AmrDsi[i];
17647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
17657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_pDecoderSpecificInfo = DecoderSpecific;
17667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
17677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pStreamHandler)->m_averageBitRate =
17687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    VideoEditor3gpReader_AmrBitRate[freqIndex][7];
17697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } else if((M4DA_StreamTypeAudioAac == streamType)) {
17707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if (meta->findData(kKeyESDS, &type, &data, &size)) {
17717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ESDS esds((const char *)data, size);
1772c4689fae1bdb8d1c94eb28af1b2a1f30d2b1a3daJames Dong                    CHECK_EQ(esds.InitCheck(), (status_t)OK);
17737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_ESDSInfoSize = size;
1775694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                    (*pStreamHandler)->m_pESDSInfo = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(
17767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_ESDSInfoSize, M4READER_3GP,
1777efc2e4255b8565f5ad6ef8d1cf0e2695e74190d4James Dong                        (M4OSA_Char*)"AAC DecoderSpecific" );
17787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if (M4OSA_NULL == (*pStreamHandler)->m_pESDSInfo) {
17797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4ERR_ALLOC;
17807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
178132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    memcpy((void *)(*pStreamHandler)->m_pESDSInfo,
178232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    (void *)data, size);
17837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    esds.getCodecSpecificInfo(&codec_specific_data,
17847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        &codec_specific_data_size);
17857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17862703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                    ALOGV("VEdsi %d,%x",codec_specific_data_size,
17877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        codec_specific_data);
17887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_decoderSpecificInfoSize =
17907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        codec_specific_data_size;
17917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if ((*pStreamHandler)->m_decoderSpecificInfoSize != 0) {
1792694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                        DecoderSpecific = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(
17937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (*pStreamHandler)->m_decoderSpecificInfoSize,
1794efc2e4255b8565f5ad6ef8d1cf0e2695e74190d4James Dong                            M4READER_3GP, (M4OSA_Char*)"AAC DecoderSpecific" );
17957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if (M4OSA_NULL == DecoderSpecific) {
17967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return M4ERR_ALLOC;
17977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
179832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        memcpy((void *)DecoderSpecific,
179932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                            (void *)codec_specific_data,
18007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            codec_specific_data_size);
18017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo =
18027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            DecoderSpecific;
18037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    } else {
18047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo = M4OSA_NULL;
18057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
18067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
18077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } else {
18082703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("VideoEditor3gpReader_getNextStream mStreamType: none ");
18097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4ERR_READER_UNKNOWN_STREAM_TYPE;
18107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
18122703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VE noaudio-video stream:pC->mCurrTrack = %d ",pC->mCurrTrack);
18137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mCurrTrack++; //Increment current track to get the next track
18147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_READER_UNKNOWN_STREAM_TYPE;
18157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18162703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VE StreamType: %d, stremhandler %x",streamType, *pStreamHandler );
18177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (*pStreamHandler)->m_streamType = streamType;
18187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (*pStreamHandler)->m_streamId   = pC->mStreamId;
18197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (*pStreamHandler)->m_pUserData  = M4OSA_NULL;
18207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (*pStreamHandler)->m_structSize = sizeof(M4_StreamHandler);
18217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (*pStreamHandler)->m_bStreamIsOK = M4OSA_TRUE;
18227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        meta->findInt64(kKeyDuration,
18247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (int64_t*)&(Duration));
18257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (*pStreamHandler)->m_duration = (int32_t)(Duration / 1000);
18277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mMaxDuration = ((*pStreamHandler)->m_duration);
18292703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VE str duration duration: %d ", (*pStreamHandler)->m_duration);
18307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* In AAC case: Put the first AU in pAudioStreamHandler->m_pUserData
18327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         *since decoder has to know if stream contains SBR data(Implicit sig) */
18337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(M4DA_StreamTypeAudioAac == (*pStreamHandler)->m_streamType) {
18347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4READER_AudioSbrUserdata*  pAudioSbrUserdata;
18357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1836694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            pAudioSbrUserdata = (M4READER_AudioSbrUserdata*)M4OSA_32bitAlignedMalloc(
18377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                sizeof(M4READER_AudioSbrUserdata),M4READER_3GP,
18387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_Char*)"M4READER_AudioSbrUserdata");
18397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4OSA_NULL == pAudioSbrUserdata) {
18407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4ERR_ALLOC;
18417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                goto Error;
18427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (*pStreamHandler)->m_pUserData = pAudioSbrUserdata;
18447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAudioSbrUserdata->m_bIsSbrEnabled = M4OSA_FALSE;
18457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1846694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            pAudioSbrUserdata->m_pFirstAU = (M4_AccessUnit*)M4OSA_32bitAlignedMalloc(
18477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                sizeof(M4_AccessUnit),M4READER_3GP, (M4OSA_Char*)"1st AAC AU");
18487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4OSA_NULL == pAudioSbrUserdata->m_pFirstAU) {
18497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAudioSbrUserdata->m_pAacDecoderUserConfig = M4OSA_NULL;
18507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4ERR_ALLOC;
18517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                goto Error;
18527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAudioSbrUserdata->m_pAacDecoderUserConfig = (M4_AacDecoderConfig*)\
1854694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                M4OSA_32bitAlignedMalloc(sizeof(M4_AacDecoderConfig),M4READER_3GP,
18557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_Char*)"m_pAacDecoderUserConfig");
18567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4OSA_NULL == pAudioSbrUserdata->m_pAacDecoderUserConfig) {
18577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4ERR_ALLOC;
18587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                goto Error;
18597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(M4DA_StreamTypeAudioAac == (*pStreamHandler)->m_streamType) {
18627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4_AudioStreamHandler* pAudioStreamHandler =
18637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4_AudioStreamHandler*)(*pStreamHandler);
18647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4READER_AudioSbrUserdata* pUserData = (M4READER_AudioSbrUserdata*)\
18657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (pAudioStreamHandler->m_basicProperties.m_pUserData);
18667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = VideoEditor3gpReader_fillAuStruct(pC, (*pStreamHandler),
18687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4_AccessUnit*)pUserData->m_pFirstAU);
18697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4NO_ERROR != err) {
18707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                goto Error;
18717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = VideoEditor3gpReader_getNextAu(pC, (*pStreamHandler),
18737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4_AccessUnit*)pUserData->m_pFirstAU);
187483410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong
187583410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong            /*
187683410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             * 1. "M4WAR_NO_MORE_AU == err" indicates that there is no more
187783410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             * access unit from the current track. In other words, there
187883410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             * is only a single access unit from the current track, and
187983410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             * the parsing of this track has reached EOS. The reason why
188083410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             * the first access unit needs to be parsed here is because for
188183410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             * some audio codec (like AAC), the very first access unit
188283410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             * must be decoded before its configuration/encoding parameters
188383410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             * (such as # of channels and sample rate) can be correctly
188483410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             * determined.
188583410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             *
188683410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             * 2. "trackCount > pC->mCurrTrack" indicates that there are other
188783410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             * tracks to be parsed, in addition to the current track.
188883410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             *
188983410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             * When both conditions 1 & 2 hold, other tracks should be
189083410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             * parsed. Thus, we should not bail out.
189183410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong             */
189283410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong            if (M4WAR_NO_MORE_AU == err && trackCount > pC->mCurrTrack) {
189383410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong                err = M4NO_ERROR;
189483410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong            }
189583410a85993ad6f5f0c122036ff0bda42bf1d4f7James Dong
18967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4NO_ERROR != err) {
18977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                goto Error;
18987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = VideoEditor3gpReader_reset(pC, (*pStreamHandler));
19007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4NO_ERROR != err) {
19017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                goto Error;
19027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
19037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
19047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mCurrTrack++; //Increment the current track to get next track
19062703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("pC->mCurrTrack = %d",pC->mCurrTrack);
19077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (!haveAudio && !haveVideo) {
19097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pMediaFamily=M4READER_kMediaFamilyUnknown;
19107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_READER_UNKNOWN_STREAM_TYPE;
19117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiError:
19132703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_getNextStreamHandler end error = %d",err);
19147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
19157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
19167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getPrevRapTime(M4OSA_Context context,
19187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_StreamHandler *pStreamHandler, M4OSA_Int32* pTime)
19197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
19207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context *pC = (VideoEditor3gpReader_Context*)context;
19217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
19227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBuffer *mMediaBuffer = M4OSA_NULL;
19237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaSource::ReadOptions options;
19247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Time time64;
19257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int64_t tempTime64 = 0;
19267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t error;
19277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19282703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_getPrevRapTime begin");
19297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER,
19317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getPrevRapTime: invalid context");
19327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
19337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getPrevRapTime invalid pointer to StreamHandler");
19347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pTime == 0), M4ERR_PARAMETER,
19357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getPrevRapTime: invalid time pointer");
19367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (*pTime == (pStreamHandler->m_duration)) {
19373ad01762633531957174c5b27e71ca4aac45e554Santosh Madhava        *pTime -= 1;
19383ad01762633531957174c5b27e71ca4aac45e554Santosh Madhava    }
1939aa382f3637a68361989d5b70e3184bddcc472d3dhongteng
1940aa382f3637a68361989d5b70e3184bddcc472d3dhongteng    time64 = (M4OSA_Time)*pTime * 1000;
19417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19422703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_getPrevRapTime seek time: %ld",time64);
19437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    options.setSeekTo(time64, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC);
19447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    error = pC->mVideoSource->read(&mMediaBuffer, &options);
19457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (error != OK) {
19467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //Can not get the previous Sync.
19477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //Must be end of stream.
19483ad01762633531957174c5b27e71ca4aac45e554Santosh Madhava        return M4WAR_NO_MORE_AU;
19497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mMediaBuffer->meta_data()->findInt64(kKeyTime, (int64_t*)&tempTime64);
19522703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_getPrevRapTime read time %ld, %x", tempTime64,
19537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mMediaBuffer);
19547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1955aa382f3637a68361989d5b70e3184bddcc472d3dhongteng    *pTime = (M4OSA_Int32)(tempTime64 / 1000);
19567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(mMediaBuffer != M4OSA_NULL) {
19582703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV(" mMediaBuffer size = %d length %d", mMediaBuffer->size(),
19597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mMediaBuffer->range_length());
19607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mMediaBuffer->release();
19617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mMediaBuffer = M4OSA_NULL;
19627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    options.clearSeekTo();
19647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(error != OK) {
19662703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getPrevRapTime end \
19677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4WAR_READER_INFORMATION_NOT_PRESENT");
19687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4WAR_READER_INFORMATION_NOT_PRESENT;
19697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
19702703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getPrevRapTime end: err %x", err);
19717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4NO_ERROR;
19727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
19737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
19757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiextern "C" {
19777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getInterface(M4READER_MediaType *pMediaType,
19787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4READER_GlobalInterface **pRdrGlobalInterface,
19797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4READER_DataInterface **pRdrDataInterface) {
19807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
19827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pMediaType,      M4ERR_PARAMETER);
19847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pRdrGlobalInterface, M4ERR_PARAMETER);
19857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pRdrDataInterface, M4ERR_PARAMETER);
19867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19872703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_getInterface begin");
19882703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_getInterface %d 0x%x 0x%x", *pMediaType,
19897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pRdrGlobalInterface,*pRdrDataInterface);
19907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_MALLOC(*pRdrGlobalInterface, M4READER_GlobalInterface, 1,
19927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getInterface");
19937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_MALLOC(*pRdrDataInterface, M4READER_DataInterface, 1,
19947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getInterface");
19957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pMediaType = M4READER_kMediaType3GPP;
19977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctCreate       = VideoEditor3gpReader_create;
19997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctDestroy      = VideoEditor3gpReader_destroy;
20007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctOpen         = VideoEditor3gpReader_open;
20017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctClose        = VideoEditor3gpReader_close;
20027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctGetOption    = VideoEditor3gpReader_getOption;
20037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctSetOption    = VideoEditor3gpReader_setOption;
20047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctGetNextStream =
20057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_getNextStreamHandler;
20067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctFillAuStruct =
20077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_fillAuStruct;
20087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctStart        = M4OSA_NULL;
20097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctStop         = M4OSA_NULL;
20107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctJump         = VideoEditor3gpReader_jump;
20117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctReset        = VideoEditor3gpReader_reset;
20127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctGetPrevRapTime =
20137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_getPrevRapTime;
20147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrDataInterface)->m_pFctGetNextAu      = VideoEditor3gpReader_getNextAu;
20157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrDataInterface)->m_readerContext      = M4OSA_NULL;
20167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
20187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
20192703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getInterface no error");
20207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
20217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        SAFE_FREE(*pRdrGlobalInterface);
20227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        SAFE_FREE(*pRdrDataInterface);
20237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20242703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("VideoEditor3gpReader_getInterface ERROR 0x%X", err);
20257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
20262703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditor3gpReader_getInterface end");
20277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
20287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
20297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}  /* extern "C" */
20317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}  /* namespace android */
20337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2035