10c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/*
20c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
325d6699c194a9719997c79dfb95bd66673825b7bSantosh Madhava *
40c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License");
50c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * you may not use this file except in compliance with the License.
60c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * You may obtain a copy of the License at
70c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *
80c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *      http://www.apache.org/licenses/LICENSE-2.0
90c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *
100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software
110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS,
120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * See the License for the specific language governing permissions and
140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * limitations under the License.
150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi */
160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*************************************************************************
180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @file   VideoEditor3gpReader.cpp
190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @brief  StageFright shell 3GP Reader
200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*************************************************************************
210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define LOG_NDEBUG 1
240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define LOG_TAG "VIDEOEDITOR_3GPREADER"
250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * HEADERS
280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *
290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi */
300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#define VIDEOEDITOR_BITSTREAM_PARSER
310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4OSA_Debug.h"
330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "VideoEditor3gpReader.h"
340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4SYS_AccessUnit.h"
350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "VideoEditorUtils.h"
360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4READER_3gpCom.h"
370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4_Common.h"
380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4OSA_FileWriter.h"
390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#ifdef VIDEOEDITOR_BITSTREAM_PARSER
410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4OSA_CoreID.h"
420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4OSA_Error.h"
430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4OSA_Memory.h"
440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4_Utils.h"
450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#endif
460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "ESDS.h"
480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "utils/Log.h"
490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MediaBufferGroup.h>
500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/DataSource.h>
510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/FileSource.h>
520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MediaBuffer.h>
530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MediaDefs.h>
540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MediaExtractor.h>
550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MediaDebug.h>
560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MediaSource.h>
570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include <media/stagefright/MetaData.h>
580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * SOURCE CLASS
610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi */
620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundarginamespace android {
630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * ENGINE INTERFACE
650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi */
660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ************************************************************************
690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief   Array of AMR NB/WB bitrates
700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @note    Array to match the mode and the bit rate
710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ************************************************************************
720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargiconst M4OSA_UInt32 VideoEditor3gpReader_AmrBitRate [2 /* 8kHz / 16kHz     */]
740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                                   [9 /* the bitrate mode */] =
750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi{
760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    {4750, 5150, 5900,  6700,  7400,  7950,  10200, 12200, 0},
770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    {6600, 8850, 12650, 14250, 15850, 18250, 19850, 23050, 23850}
780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi};
790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *******************************************************************************
820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * structure VideoEditor3gpReader_Context
830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief:This structure defines the context of the StageFright 3GP shell Reader
840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *******************************************************************************
850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargitypedef struct {
870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    sp<DataSource>              mDataSource;
880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    sp<MediaExtractor>          mExtractor;
890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    sp<MediaSource>             mAudioSource;
900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    sp<MediaSource>             mVideoSource;
910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4_StreamHandler*           mAudioStreamHandler;
920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4_StreamHandler*           mVideoStreamHandler;
930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4SYS_AccessUnit            mAudioAu;
940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4SYS_AccessUnit            mVideoAu;
950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Time                  mMaxDuration;
96413326960d3b3f6c591685e56a30150087ff08ffRajneesh Chowdury    int64_t                     mFileSize;
970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4_StreamType               mStreamType;
980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32                mStreamId;
990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    int32_t                     mTracks;
1000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    int32_t                     mCurrTrack;
1010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Bool                  mAudioSeeking;
1020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Time                  mAudioSeekTime;
1030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Bool                  mVideoSeeking;
1040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Time                  mVideoSeekTime;
1050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi} VideoEditor3gpReader_Context;
1070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#ifdef VIDEOEDITOR_BITSTREAM_PARSER
1090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
1100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ************************************************************************
1110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * structure    VideoEditor3gpReader_BitStreamParserContext
1120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief       Internal BitStreamParser context
1130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ************************************************************************
1140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
1150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargitypedef struct {
1160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32*   mPbitStream;   /**< bitstream pointer (32bits aligned) */
1170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Int32     mSize;         /**< bitstream size in bytes */
1180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Int32     mIndex;        /**< byte index */
1190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Int32     mBitIndex;     /**< bit index */
1200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Int32     mStructSize;   /**< size of structure */
1210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi} VideoEditor3gpReader_BitStreamParserContext;
1220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
1240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *******************************************************************************
1250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief   Allocates the context and initializes internal data.
1260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   pContext    (OUT)  Pointer to the BitStreamParser context to create.
1270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   bitStream   A pointer to the bitstream
1280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   size        The size of the bitstream in bytes
1290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *******************************************************************************
1300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
1310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatic void VideoEditor3gpReader_BitStreamParserInit(void** pContext,
1320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        void* pBitStream, M4OSA_Int32 size) {
1330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext;
1340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    *pContext=M4OSA_NULL;
1362ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu    pStreamContext = (VideoEditor3gpReader_BitStreamParserContext*)M4OSA_32bitAlignedMalloc(
1370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        sizeof(VideoEditor3gpReader_BitStreamParserContext), M4READER_3GP,
1380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (M4OSA_Char*)"3GP BitStreamParser Context");
1390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (M4OSA_NULL == pStreamContext) {
1400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return;
1410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
1420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pStreamContext->mPbitStream=(M4OSA_UInt32*)pBitStream;
1430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pStreamContext->mSize=size;
1440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pStreamContext->mIndex=0;
1450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pStreamContext->mBitIndex=0;
1460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pStreamContext->mStructSize =
1470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        sizeof(VideoEditor3gpReader_BitStreamParserContext);
1480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    *pContext=pStreamContext;
1500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
1510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
1520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi **********************************************************************
1530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief   Clean up context
1540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   pContext    (IN/OUT)  BitStreamParser context.
1550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi **********************************************************************
1560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
1570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatic void VideoEditor3gpReader_BitStreamParserCleanUp(void* pContext) {
1582ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu    free((M4OSA_Int32*)pContext);
1590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
1600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
1610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *****************************************************************************
1620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief   Read the next <length> bits in the bitstream.
1630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @note    The function does not update the bitstream pointer.
1640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   pContext    (IN/OUT) BitStreamParser context.
1650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   length      (IN) The number of bits to extract from the bitstream
1660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @return  the read bits
1670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *****************************************************************************
1680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
1690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatic M4OSA_UInt32 VideoEditor3gpReader_BitStreamParserShowBits(void* pContext,
1700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Int32 length) {
1710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
1720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
1730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 u_mask;
1750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 retval;
1760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Int32 i_ovf;
1770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pStreamContext), 0,
1790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_BitStreamParserShowBits:invalid context pointer");
1800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    retval=(M4OSA_UInt32)GET_MEMORY32(pStreamContext->\
1820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mPbitStream[ pStreamContext->mIndex ]);
1830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    i_ovf = pStreamContext->mBitIndex + length - 32;
1840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    u_mask = (length >= 32) ? 0xffffffff: (1 << length) - 1;
1850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    /* do we have enough bits availble in the current word(32bits)*/
1870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (i_ovf <= 0) {
1880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        retval=(retval >> (- i_ovf)) & u_mask;
1890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
1900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 u_nextword = (M4OSA_UInt32)GET_MEMORY32(
1910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pStreamContext->mPbitStream[ pStreamContext->mIndex + 1 ]);
1920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 u_msb_mask, u_msb_value, u_lsb_mask, u_lsb_value;
1930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        u_msb_mask = ((1 << (32 - pStreamContext->mBitIndex)) - 1) << i_ovf;
1950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        u_msb_value = retval << i_ovf;
1960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        u_lsb_mask = (1 << i_ovf) - 1;
1970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        u_lsb_value = u_nextword >> (32 - i_ovf);
1980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        retval= (u_msb_value & u_msb_mask ) | (u_lsb_value & u_lsb_mask);
1990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
2000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    /* return the bits...*/
2010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return retval;
2020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
2030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
2040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ************************************************************************
2050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief   Increment the bitstream pointer of <length> bits.
2060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   pContext    (IN/OUT) BitStreamParser context.
2070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   length      (IN) The number of bit to shift the bitstream
2080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ************************************************************************
2090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
2100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatic void VideoEditor3gpReader_BitStreamParserFlushBits(void* pContext,
2110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Int32 length) {
2120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext=(
2130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserContext*)pContext;
2140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Int32 val;
2150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (M4OSA_NULL == pStreamContext) {
2170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return;
2180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
2190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    val=pStreamContext->mBitIndex + length;
2200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    /* update the bits...*/
2210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pStreamContext->mBitIndex += length;
2220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (val - 32 >= 0) {
2240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* update the bits...*/
2250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pStreamContext->mBitIndex -= 32;
2260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* update the words*/
2270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pStreamContext->mIndex++;
2280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
2290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
2300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatic M4OSA_UInt32 VideoEditor3gpReader_BitStreamParserGetBits(
2320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        void* pContext,M4OSA_Int32 bitPos, M4OSA_Int32 bitLength) {
2330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
2340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
2350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Int32 bitLocation, bitIndex;
2370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 retval=0;
2380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pStreamContext), 0,
2400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_BitStreamParserGetBits: invalid context pointer");
2410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    /* computes the word location*/
2430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    bitLocation=bitPos/32;
2440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    bitIndex=(bitPos) % 32;
2450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (bitLocation < pStreamContext->mSize) {
2470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 u_mask;
2480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Int32 i_ovf = bitIndex + bitLength - 32;
2490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        retval=(M4OSA_UInt32)GET_MEMORY32(
2500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pStreamContext->mPbitStream[ bitLocation ]);
2510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        u_mask = (bitLength >= 32) ? 0xffffffff: (1 << bitLength) - 1;
2530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if (i_ovf <= 0) {
2550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            retval=(retval >> (- i_ovf)) & u_mask;
2560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        } else {
2570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            M4OSA_UInt32 u_nextword = (M4OSA_UInt32)GET_MEMORY32(
2580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pStreamContext->mPbitStream[ bitLocation + 1 ]);
2590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            M4OSA_UInt32 u_msb_mask, u_msb_value, u_lsb_mask, u_lsb_value;
2600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            u_msb_mask = ((1 << (32 - bitIndex)) - 1) << i_ovf;
2620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            u_msb_value = retval << i_ovf;
2630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            u_lsb_mask = (1 << i_ovf) - 1;
2640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            u_lsb_value = u_nextword >> (32 - i_ovf);
2650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            retval= (u_msb_value & u_msb_mask ) | (u_lsb_value & u_lsb_mask);
2660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
2670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
2680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return retval;
2690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
2700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatic void VideoEditor3gpReader_BitStreamParserRestart(void* pContext) {
2720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
2730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
2740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (M4OSA_NULL == pStreamContext) {
2760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return;
2770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
2780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    /* resets the bitstream pointers*/
2790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pStreamContext->mIndex=0;
2800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pStreamContext->mBitIndex=0;
2810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
2820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
2830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *******************************************************************************
2840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief  Get a pointer to the current byte pointed by the bitstream pointer.
2850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @note   It should be used carefully as the pointer is in the bitstream itself
2860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *         and no copy is made.
2870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param  pContext    (IN/OUT)  BitStreamParser context.
2880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @return Pointer to the current location in the bitstream
2890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *******************************************************************************
2900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
2910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatic M4OSA_UInt8*  VideoEditor3gpReader_GetCurrentbitStreamPointer(
2920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        void* pContext) {
2930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
2940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
2950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pStreamContext), 0, "invalid context pointer");
2960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return (M4OSA_UInt8*)((M4OSA_UInt8*)pStreamContext->mPbitStream + \
2980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pStreamContext->mIndex * sizeof(M4OSA_UInt32) + \
2990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pStreamContext->mBitIndex/8) ;
3000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
3010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatic M4OSA_Int32 VideoEditor3gpReader_BitStreamParserGetSize(void* pContext) {
3030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
3040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
3050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pStreamContext), 0, "invalid context pointer");
3060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return pStreamContext->mSize;
3080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
3090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatic void VideoEditor3gpReader_MPEG4BitStreamParserInit(void** pContext,
3120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        void* pBitStream, M4OSA_Int32 size) {
3130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserInit(pContext, pBitStream, size);
3140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
3150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatic M4OSA_Int32 VideoEditor3gpReader_GetMpegLengthFromInteger(void* pContext,
3160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 val) {
3170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 length=0;
3180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 numBytes=0;
3190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 b=0;
3200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pContext), 0, "invalid context pointer");
3220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    /* the length is encoded as a sequence of bytes. The highest bit is used
3240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    to indicate that the length continues on the next byte.
3250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    The length can be: 0x80 0x80 0x80 0x22
3270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    of just            0x22 (highest bit not set)
3280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    */
3300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    do {
3320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        b=(val & ((0xff)<< (8 * numBytes)))>> (8 * numBytes);
3330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        length=(length << 7) | (b & 0x7f);
3340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        numBytes++;
3350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } while ((b & 0x80) && numBytes < 4);
3360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return length;
3380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
3390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
3410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *******************************************************************************
3420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief  Decode an MPEG4 Systems descriptor size from an encoded SDL size data
3430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @note   The value is read from the current bitstream location.
3440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param  pContext    (IN/OUT)  BitStreamParser context.
3450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @return Size in a human readable form
3460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *******************************************************************************
3470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
3480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatic M4OSA_Int32 VideoEditor3gpReader_GetMpegLengthFromStream(void* pContext){
3490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 length=0;
3500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 numBytes=0;
3510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 b=0;
3520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pContext), 0, "invalid context pointer");
3540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    /* the length is encoded as a sequence of bytes. The highest bit is used
3560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    to indicate that the length continues on the next byte.
3570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    The length can be: 0x80 0x80 0x80 0x22
3590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    of just            0x22 (highest bit not set)
3600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    */
3610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    do {
3630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        b=VideoEditor3gpReader_BitStreamParserShowBits(pContext, 8);
3640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pContext, 8);
3650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        length=(length << 7) | (b & 0x7f);
3660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        numBytes++;
3670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } while ((b & 0x80) && numBytes < 4);
3680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return length;
3700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
3710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#endif /* VIDEOEDITOR_BITSTREAM_PARSER */
3720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
3730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi************************************************************************
3740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @brief    create an instance of the 3gp reader
3750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @note    allocates the context
3760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *
3770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   pContext:       (OUT)   pointer on a reader context
3780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *
3790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @return  M4NO_ERROR              there is no error
3800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @return  M4ERR_ALLOC             a memory allocation has failed
3810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @return  M4ERR_PARAMETER         at least one parameter is not valid
3820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi************************************************************************
3830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
3840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_create(M4OSA_Context *pContext) {
3860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = NULL;
3870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
3880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext , M4ERR_PARAMETER);
3890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_create begin");
3910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    /* Context allocation & initialization */
3930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    SAFE_MALLOC(pC, VideoEditor3gpReader_Context, 1, "VideoEditor3gpReader");
3940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    memset(pC, sizeof(VideoEditor3gpReader_Context), 0);
3960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
3970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pC->mAudioStreamHandler  = M4OSA_NULL;
3980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pC->mAudioAu.dataAddress = M4OSA_NULL;
3990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pC->mVideoStreamHandler  = M4OSA_NULL;
4000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pC->mVideoAu.dataAddress = M4OSA_NULL;
4010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pC->mAudioSeeking = M4OSA_FALSE;
4030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pC->mAudioSeekTime = 0;
4040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pC->mVideoSeeking = M4OSA_FALSE;
4060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pC->mVideoSeekTime = 0;
4070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
408c5dac4d3fa18a3497242669b823f78a7e48e4e39hongteng    pC->mMaxDuration = 0;
409c5dac4d3fa18a3497242669b823f78a7e48e4e39hongteng
4100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    *pContext=pC;
4110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
4130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if ( M4NO_ERROR == err ) {
4140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_create no error");
4150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
4160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_create ERROR 0x%X", err);
4170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
4180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_create end ");
4190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
4200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
4210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
4230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi**************************************************************************
4240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @brief    destroy the instance of the 3gp reader
4250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @note after this call the context is invalid
4260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
4270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
4280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_PARAMETER         pContext parameter is not properly set
4290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi**************************************************************************
4300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
4310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_destroy(M4OSA_Context pContext) {
4330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
4340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = M4OSA_NULL;
4350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_destroy begin");
4370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
4390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pC = (VideoEditor3gpReader_Context*)pContext;
4400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    SAFE_FREE(pC->mAudioAu.dataAddress);
4420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pC->mAudioAu.dataAddress = M4OSA_NULL;
4430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    SAFE_FREE(pC->mVideoAu.dataAddress);
4440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pC->mVideoAu.dataAddress = M4OSA_NULL;
4450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    SAFE_FREE(pC);
4460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pContext = M4OSA_NULL;
4470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
4490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
4500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_destroy no error");
4510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
4520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    else
4530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    {
4540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_destroy ERROR 0x%X", err);
4550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
4560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_destroy end ");
4580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
4590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
4600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
4620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi************************************************************************
4630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @brief    open the reader and initializes its created instance
4640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @note     this function open the media file
4650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    context:            (IN)    Context of the reader
4660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    pFileDescriptor:    (IN)    Pointer to proprietary data identifying
4670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*                                       the media to open
4680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4NO_ERROR                  there is no error
4690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_PARAMETER             the context is NULL
47056650d036303b87a203bf3e931f2eb16161697b6Santosh Madhava* @return   M4ERR_UNSUPPORTED_MEDIA_TYPE
47156650d036303b87a203bf3e931f2eb16161697b6Santosh Madhava*                                       the media is DRM protected
4720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi************************************************************************
4730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
4740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_open(M4OSA_Context pContext,
4760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Void* pFileDescriptor) {
4770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)pContext;
4780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
4790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_open start ");
4810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pC),  M4ERR_PARAMETER,
4820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_open: invalid context pointer");
4830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pFileDescriptor), M4ERR_PARAMETER,
4840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_open: invalid pointer pFileDescriptor");
4850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_open Datasource start %s",
4870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (char*)pFileDescriptor);
48825d6699c194a9719997c79dfb95bd66673825b7bSantosh Madhava    //pC->mDataSource = DataSource::CreateFromURI((char*)pFileDescriptor);
48925d6699c194a9719997c79dfb95bd66673825b7bSantosh Madhava    pC->mDataSource = new FileSource ((char*)pFileDescriptor);
4900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (pC->mDataSource == NULL) {
4920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_open Datasource error");
4930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return M4ERR_PARAMETER;
4940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
4950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pC->mExtractor = MediaExtractor::Create(pC->mDataSource,
4970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        MEDIA_MIMETYPE_CONTAINER_MPEG4);
4980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
4990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (pC->mExtractor == NULL) {
5000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_open extractor error");
5010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return M4ERR_PARAMETER;
5020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
5030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
50456650d036303b87a203bf3e931f2eb16161697b6Santosh Madhava    int32_t isDRMProtected = 0;
50556650d036303b87a203bf3e931f2eb16161697b6Santosh Madhava    sp<MetaData> meta = pC->mExtractor->getMetaData();
50656650d036303b87a203bf3e931f2eb16161697b6Santosh Madhava    meta->findInt32(kKeyIsDRM, &isDRMProtected);
50756650d036303b87a203bf3e931f2eb16161697b6Santosh Madhava    if (isDRMProtected) {
50856650d036303b87a203bf3e931f2eb16161697b6Santosh Madhava        LOGV("VideoEditorMp3Reader_open error - DRM Protected");
50956650d036303b87a203bf3e931f2eb16161697b6Santosh Madhava        return M4ERR_UNSUPPORTED_MEDIA_TYPE;
51056650d036303b87a203bf3e931f2eb16161697b6Santosh Madhava    }
51156650d036303b87a203bf3e931f2eb16161697b6Santosh Madhava
5120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_open end ");
5130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
5140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
5150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
5170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi************************************************************************
5180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @brief    close the reader
5190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @note     close the 3GP file
5200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
5210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
5220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_PARAMETER         the context is NULL
5230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_BAD_CONTEXT       provided context is not a valid one
5240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi************************************************************************
5250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
5260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_close(M4OSA_Context context) {
5270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_Context *pC = (VideoEditor3gpReader_Context*)context;
5280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4READER_AudioSbrUserdata *pAudioSbrUserData;
5290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4_AccessUnit *pAU;
5300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
5310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_close begin");
5330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
5350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_close: invalid context pointer");
5360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (pC->mAudioStreamHandler) {
5380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_close Audio");
5390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if (M4OSA_NULL != pC->mAudioStreamHandler->m_pDecoderSpecificInfo) {
5412ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu            free(pC->mAudioStreamHandler->\
5420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                m_pDecoderSpecificInfo);
5430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mAudioStreamHandler->m_decoderSpecificInfoSize = 0;
5440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mAudioStreamHandler->m_pDecoderSpecificInfo = M4OSA_NULL;
5450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
5460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if ((M4DA_StreamTypeAudioAac == pC->mAudioStreamHandler->m_streamType)
5480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            && (M4OSA_NULL != pC->mAudioStreamHandler->m_pUserData)) {
5490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pAudioSbrUserData = (M4READER_AudioSbrUserdata*)(\
5500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pC->mAudioStreamHandler->m_pUserData);
5510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pAU = (M4_AccessUnit*)pAudioSbrUserData->m_pFirstAU;
5530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if (M4OSA_NULL != pAU) {
5542ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                free(pAU);
5550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
5560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if (M4OSA_NULL != pAudioSbrUserData->m_pAacDecoderUserConfig) {
5582ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                free(pAudioSbrUserData->\
5590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    m_pAacDecoderUserConfig);
5600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
5612ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu            free(pAudioSbrUserData);
5620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mAudioStreamHandler->m_pUserData = M4OSA_NULL;
5630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
5640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if (pC->mAudioStreamHandler->m_pESDSInfo != M4OSA_NULL) {
5662ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu            free(pC->mAudioStreamHandler->m_pESDSInfo);
5670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mAudioStreamHandler->m_pESDSInfo = M4OSA_NULL;
5680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mAudioStreamHandler->m_ESDSInfoSize = 0;
5690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
5700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* Finally destroy the stream handler */
5712ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu        free(pC->mAudioStreamHandler);
5720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pC->mAudioStreamHandler = M4OSA_NULL;
5730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pC->mAudioSource->stop();
5750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pC->mAudioSource.clear();
5760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
5770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (pC->mVideoStreamHandler) {
5780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_close Video ");
5790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if(M4OSA_NULL != pC->mVideoStreamHandler->m_pDecoderSpecificInfo) {
5812ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu            free(pC->mVideoStreamHandler->\
5820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                m_pDecoderSpecificInfo);
5830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mVideoStreamHandler->m_decoderSpecificInfoSize = 0;
5840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mVideoStreamHandler->m_pDecoderSpecificInfo = M4OSA_NULL;
5850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
5860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if(M4OSA_NULL != pC->mVideoStreamHandler->m_pH264DecoderSpecificInfo) {
5882ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu            free(pC->mVideoStreamHandler->\
5890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                m_pH264DecoderSpecificInfo);
5900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mVideoStreamHandler->m_H264decoderSpecificInfoSize = 0;
5910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mVideoStreamHandler->m_pH264DecoderSpecificInfo = M4OSA_NULL;
5920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
5930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
5940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if(pC->mVideoStreamHandler->m_pESDSInfo != M4OSA_NULL) {
5952ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu            free(pC->mVideoStreamHandler->m_pESDSInfo);
5960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mVideoStreamHandler->m_pESDSInfo = M4OSA_NULL;
5970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mVideoStreamHandler->m_ESDSInfoSize = 0;
5980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
5990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* Finally destroy the stream handler */
6012ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu        free(pC->mVideoStreamHandler);
6020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pC->mVideoStreamHandler = M4OSA_NULL;
6030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pC->mVideoSource->stop();
6050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pC->mVideoSource.clear();
6060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
60725d6699c194a9719997c79dfb95bd66673825b7bSantosh Madhava    pC->mExtractor.clear();
6080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pC->mDataSource.clear();
6090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_close end");
6110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
6120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
6130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
6150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi************************************************************************
6160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @brief    get an option from the 3gp reader
6170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @note     it allows the caller to retrieve a property value:
6180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*
6190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
6200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    optionId:       (IN)    indicates the option to get
6210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    pValue:         (OUT)   pointer to structure or value (allocated
6220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*                                   by user) where option is stored
6230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*
6240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
6250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_BAD_CONTEXT       provided context is not a valid one
6260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_PARAMETER         at least one parameter is not properly set
6270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_BAD_OPTION_ID     when the option ID is not a valid one
6280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_VIDEO_NOT_H263    No video stream H263 in file.
6290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_NO_VIDEO_STREAM_RETRIEVED_YET
6300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*           Function 3gpReader_getNextStreamHandler must be called before
6310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi************************************************************************
6320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
6330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getOption(M4OSA_Context context,
6340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_OptionID optionId, M4OSA_DataOption pValue) {
6350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
6360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
6370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getOption begin %d", optionId);
6390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
6410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "invalid context pointer");
6420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pValue), M4ERR_PARAMETER,
6430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_getOption: invalid pointer on value");
6440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    switch (optionId) {
6460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    case M4READER_kOptionID_Duration:
6470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        {
6480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getOption duration %d",pC->mMaxDuration);
649c5dac4d3fa18a3497242669b823f78a7e48e4e39hongteng            *(M4OSA_Time*)pValue = pC->mMaxDuration;
6500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
6510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
6520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    case M4READER_kOptionID_Version:
6530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* not used */
6540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getOption: M4READER_kOptionID_Version");
6550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
6560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    case M4READER_kOptionID_Copyright:
6580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* not used */
6590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV(">>>>>>>   M4READER_kOptionID_Copyright");
6600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
6610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    case M4READER_kOptionID_CreationTime:
6630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* not used */
6640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_CreationTime");
6650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    break;
6660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    case M4READER_kOptionID_Bitrate:
6680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        {
6690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            M4OSA_UInt32* pBitrate = (M4OSA_UInt32*)pValue;
6700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if (pC->mMaxDuration != 0) {
6720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                M4OSA_UInt32 ui32Tmp = (M4OSA_UInt32)pC->mMaxDuration;
673413326960d3b3f6c591685e56a30150087ff08ffRajneesh Chowdury                *pBitrate = (M4OSA_UInt32)(pC->mFileSize * 8000.0 / pC->mMaxDuration);
6740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
6750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getOption bitrate %ld", *pBitrate);
6760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
6770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    break;
6780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    case M4READER_3GP_kOptionID_H263Properties:
6790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        {
6800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if(M4OSA_NULL == pC->mVideoStreamHandler) {
6810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                LOGV("VideoEditor3gpReader_getOption no videoStream retrieved");
6820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                err = M4ERR_NO_VIDEO_STREAM_RETRIEVED_YET;
6840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                break;
6850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
6860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if((M4DA_StreamTypeVideoH263 != pC->mVideoStreamHandler->\
6875fcff590d602457aa16fad5e13344b67e516bef3Danny Fernandes                m_streamType) || (pC->mVideoStreamHandler->\
6880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                m_decoderSpecificInfoSize < 7)) {
6890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                LOGV("VideoEditor3gpReader_getOption DSI Size %d",
6900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    pC->mVideoStreamHandler->m_decoderSpecificInfoSize);
6910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                err = M4ERR_VIDEO_NOT_H263;
6930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                break;
6940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
6950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
6960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /* MAGICAL in the decoder confi H263: the 7th byte is the profile
6970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi             * number, 6th byte is the level number */
6980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            ((M4READER_3GP_H263Properties *)pValue)->uiProfile =
6990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pC->mVideoStreamHandler->m_pDecoderSpecificInfo[6];
7000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            ((M4READER_3GP_H263Properties *)pValue)->uiLevel =
7010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pC->mVideoStreamHandler->m_pDecoderSpecificInfo[5];
7020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getOption M4READER_3GP_kOptionID_\
7030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            H263Properties end");
7040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
7050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
7060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    case M4READER_3GP_kOptionID_PurpleLabsDrm:
7070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReaderOption M4READER_3GP_kOptionID_PurpleLabsDrm");
7080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* not used */
7090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
7100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    case M4READER_kOptionID_GetNumberOfAudioAu:
7120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* not used */
7130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReadeOption M4READER_kOptionID_GetNumberOfAudioAu");
7140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    break;
7150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    case M4READER_kOptionID_GetNumberOfVideoAu:
7170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* not used */
7180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getOption :GetNumberOfVideoAu");
7190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    break;
7200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    case M4READER_kOptionID_GetMetadata:
7220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* not used */
7230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_GetMetadata");
7240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    break;
7250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    case M4READER_kOptionID_3gpFtypBox:
7270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* used only for SEMC */
7280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_3gpFtypBox");
7290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        err = M4ERR_BAD_OPTION_ID; //check this
7300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
7310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#ifdef OPTIONID_GET_NEXT_VIDEO_CTS
7330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    case M4READER_3GP_kOptionID_getNextVideoCTS:
7340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* not used */
7350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getOption: getNextVideoCTS");
7360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
7370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#endif
7380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    default:
7390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        {
7400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            err = M4ERR_BAD_OPTION_ID;
7410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getOption M4ERR_BAD_OPTION_ID");
7420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
7430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
7440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
7450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getOption end: optionID: x%x", optionId);
7460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
7470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
7480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
7490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi************************************************************************
7500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @brief    set an option on the 3gp reader
7510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @note No option can be set yet.
7520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
7530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    optionId:       (IN)    indicates the option to set
7540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    pValue:         (IN)    pointer to structure or value (allocated
7550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*                                   by user) where option is stored
7560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
7570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_BAD_CONTEXT       provided context is not a valid one
7580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_PARAMETER         at least one parameter is not properly set
7590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_BAD_OPTION_ID     when the option ID is not a valid one
7600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi************************************************************************
7610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
7620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_setOption(M4OSA_Context context,
7630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_OptionID optionId, M4OSA_DataOption pValue) {
7640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
7650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
7660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    /* Check function parameters */
7680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
7690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "invalid context pointer");
7700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pValue), M4ERR_PARAMETER,
7710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "invalid value pointer");
7720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_setOption begin %d",optionId);
7740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    switch(optionId) {
7760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4READER_kOptionID_SetOsaFileReaderFctsPtr:
7770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
7780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4READER_3GP_kOptionID_AudioOnly:
7800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
7810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4READER_3GP_kOptionID_VideoOnly:
7830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
7840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4READER_3GP_kOptionID_FastOpenMode:
7860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
7870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        case M4READER_kOptionID_MaxMetadataSize:
7890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
7900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
7910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        default:
7920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        {
7930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditor3gpReader_setOption: returns M4ERR_BAD_OPTION_ID");
7940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            err = M4ERR_BAD_OPTION_ID;
7950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
7960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        break;
7970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
7980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_setOption end ");
7990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
8000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
8010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
8020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ************************************************************************
8030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief   fill the access unit structure with initialization values
8040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   context:        (IN)     Context of the reader
8050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   pStreamHandler: (IN)     pointer to the stream handler to which
8060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *                                   the access unit will be associated
8070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   pAccessUnit:    (IN/OUT) pointer to the access unit (allocated
8080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *                                   by the caller) to initialize
8090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @return  M4NO_ERROR               there is no error
8100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @return  M4ERR_PARAMETER          at least one parameter is not properly set
8110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ************************************************************************
8120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
8130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_fillAuStruct(M4OSA_Context context,
8140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4_StreamHandler *pStreamHandler, M4_AccessUnit *pAccessUnit) {
8150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
8160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err= M4NO_ERROR;
8170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0),             M4ERR_PARAMETER,
8190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_fillAuStruct: invalid context");
8200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
8210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_fillAuStruc invalid pointer to M4_StreamHandler");
8220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pAccessUnit == 0),    M4ERR_PARAMETER,
8230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_fillAuStruct: invalid pointer to M4_AccessUnit");
8240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_fillAuStruct begin");
8260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    /* Initialize pAccessUnit structure */
8280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pAccessUnit->m_size         = 0;
8290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pAccessUnit->m_CTS          = 0;
8300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pAccessUnit->m_DTS          = 0;
8310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pAccessUnit->m_attribute    = 0;
8320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pAccessUnit->m_dataAddress  = M4OSA_NULL;
8330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pAccessUnit->m_maxsize      = pStreamHandler->m_maxAUSize;
8340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pAccessUnit->m_streamID     = pStreamHandler->m_streamId;
8350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pAccessUnit->m_structSize   = sizeof(M4_AccessUnit);
8360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_fillAuStruct end");
8380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return M4NO_ERROR;
8390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
8400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
8420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi********************************************************************************
8430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @brief    jump into the stream at the specified time
8440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @note
8450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    context:        (IN)   Context of the reader
8460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    pStreamHandler  (IN)   the stream handler of the stream to make jump
8470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    pTime           (I/O)IN  the time to jump to (in ms)
8480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*                                OUT the time to which the stream really jumped
8490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4NO_ERROR             there is no error
8500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_PARAMETER        at least one parameter is not properly set
8510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi********************************************************************************
8520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
8530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_jump(M4OSA_Context context,
8540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4_StreamHandler *pStreamHandler, M4OSA_Int32* pTime) {
8550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
8560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
8570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4SYS_AccessUnit* pAu;
8580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Time time64;
8590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER,
8610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_jump: invalid context");
8620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
8630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_jump: invalid pointer to M4_StreamHandler");
8640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pTime == 0), M4ERR_PARAMETER,
8650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_jump: invalid time pointer");
8660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_jump begin");
8680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (*pTime == (pStreamHandler->m_duration)) {
870c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru        *pTime -= 1;
871c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru    }
872c5dac4d3fa18a3497242669b823f78a7e48e4e39hongteng    time64 = (M4OSA_Time)*pTime;
8730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_jump time us %ld ", time64);
8750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if ((pC->mAudioStreamHandler != M4OSA_NULL) &&
8770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (pStreamHandler->m_streamId == pC->mAudioStreamHandler->m_streamId))
8780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            {
8790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAu = &pC->mAudioAu;
8800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAu->CTS = time64;
8810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAu->DTS = time64;
8820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        time64 = time64 * 1000; /* Convert the time into micro sec */
8840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pC->mAudioSeeking = M4OSA_TRUE;
8850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pC->mAudioSeekTime = time64;
8860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_jump AUDIO time us %ld ", time64);
8870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else if ((pC->mVideoStreamHandler != M4OSA_NULL) &&
8880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (pStreamHandler->m_streamId == pC->mVideoStreamHandler->m_streamId))
8890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            {
8900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAu = &pC->mVideoAu;
8910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAu->CTS = time64;
8920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAu->DTS = time64;
8930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
8940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        time64 = time64 * 1000; /* Convert the time into micro sec */
8950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pC->mVideoSeeking = M4OSA_TRUE;
8960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pC->mVideoSeekTime = time64;
8970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_jump VIDEO time us %ld ", time64);
8980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
8990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_jump passed StreamHandler is not known\n");
9000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return M4ERR_PARAMETER;
9010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
9020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    time64 = time64 / 1000; /* Convert the time into milli sec */
9030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_jump time ms before seekset %ld ", time64);
9040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
905c5dac4d3fa18a3497242669b823f78a7e48e4e39hongteng    *pTime = (M4OSA_Int32)time64;
9060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_jump end");
9080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    err = M4NO_ERROR;
9090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
9100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
9110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
9120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi********************************************************************************
9130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @brief    reset the stream, that is seek it to beginning and make it ready
9140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @note
9150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
9160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    pStreamHandler  (IN)    The stream handler of the stream to reset
9170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
9180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_PARAMETER         at least one parameter is not properly set
9190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi********************************************************************************
9200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
9210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_reset(M4OSA_Context context,
9220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4_StreamHandler *pStreamHandler) {
9230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
9240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
9250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4SYS_StreamID streamIdArray[2];
9260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4SYS_AccessUnit* pAu;
927c5dac4d3fa18a3497242669b823f78a7e48e4e39hongteng    M4OSA_Time time64 = 0;
9280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER,
9300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_reset: invalid context");
9310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
9320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_reset: invalid pointer to M4_StreamHandler");
9330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_reset begin");
9350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (pStreamHandler == (M4_StreamHandler*)pC->mAudioStreamHandler) {
9370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAu = &pC->mAudioAu;
9380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else if (pStreamHandler == (M4_StreamHandler*)pC->mVideoStreamHandler) {
9390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAu = &pC->mVideoAu;
9400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
9410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_reset passed StreamHandler is not known\n");
9420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return M4ERR_PARAMETER;
9430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
9440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pAu->CTS = time64;
9460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pAu->DTS = time64;
9470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_reset end");
9490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
9500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
9510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
9530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi********************************************************************************
9540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @brief  Gets an access unit (AU) from the stream handler source.
9550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @note   An AU is the smallest possible amount of data to be decoded by decoder
9560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*
9570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    context:        (IN) Context of the reader
9580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    pStreamHandler  (IN) The stream handler of the stream to make jump
9590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    pAccessUnit     (IO) Pointer to access unit to fill with read data
9600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4NO_ERROR           there is no error
9610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_PARAMETER      at least one parameter is not properly set
9620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @returns  M4ERR_ALLOC          memory allocation failed
9630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @returns  M4WAR_NO_MORE_AU     there are no more access unit in the stream
9640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi********************************************************************************
9650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
9660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getNextAu(M4OSA_Context context,
9670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4_StreamHandler *pStreamHandler, M4_AccessUnit *pAccessUnit) {
9680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_Context* pC=(VideoEditor3gpReader_Context*)context;
9690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
9700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4SYS_AccessUnit* pAu;
9710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    int64_t tempTime64 = 0;
9720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    MediaBuffer *mMediaBuffer = NULL;
9730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    MediaSource::ReadOptions options;
9740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Bool flag = M4OSA_FALSE;
9750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    status_t error;
976c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru    int32_t i32Tmp = 0;
9770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pReaderContext == 0), M4ERR_PARAMETER,
9790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_getNextAu: invalid context");
9800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
9810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_getNextAu: invalid pointer to M4_StreamHandler");
9820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pAccessUnit == 0),    M4ERR_PARAMETER,
9830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_getNextAu: invalid pointer to M4_AccessUnit");
9840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getNextAu begin");
9860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (pStreamHandler == (M4_StreamHandler*)pC->mAudioStreamHandler) {
9880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getNextAu audio stream");
9890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAu = &pC->mAudioAu;
9900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if (pC->mAudioSeeking == M4OSA_TRUE) {
9910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getNextAu audio seek time: %ld",
9920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pC->mAudioSeekTime);
9930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            options.setSeekTo(pC->mAudioSeekTime);
9940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mAudioSource->read(&mMediaBuffer, &options);
9950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
9960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            mMediaBuffer->meta_data()->findInt64(kKeyTime,
9970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (int64_t*)&tempTime64);
9980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            options.clearSeekTo();
9990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mAudioSeeking = M4OSA_FALSE;
10000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            flag = M4OSA_TRUE;
10010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        } else {
10020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getNextAu audio no seek:");
10030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mAudioSource->read(&mMediaBuffer, &options);
10040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if (mMediaBuffer != NULL) {
10050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                mMediaBuffer->meta_data()->findInt64(kKeyTime,
10060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (int64_t*)&tempTime64);
10070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
10080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
10090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else if (pStreamHandler == (M4_StreamHandler*)pC->mVideoStreamHandler) {
10100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getNextAu video steram ");
10110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAu = &pC->mVideoAu;
10120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if(pC->mVideoSeeking == M4OSA_TRUE) {
10130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            flag = M4OSA_TRUE;
10140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getNextAu seek: %ld",pC->mVideoSeekTime);
10150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            options.setSeekTo(pC->mVideoSeekTime,
10160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC);
10170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            do
10180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            {
10190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                if (mMediaBuffer != NULL) {
10200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    LOGV("VideoEditor3gpReader_getNextAu free the MediaBuffer");
10210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    mMediaBuffer->release();
10220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                }
10230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                error = pC->mVideoSource->read(&mMediaBuffer, &options);
10240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                LOGV("VE3gpReader_getNextAu MediaBuffer %x , error %d",
10250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    mMediaBuffer, error);
10260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                if (mMediaBuffer != NULL)
10270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                {
1028c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru                    if (mMediaBuffer->meta_data()->findInt32(kKeyIsSyncFrame,
1029c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru                        &i32Tmp) && i32Tmp) {
1030c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru                            LOGV("SYNC FRAME FOUND--%d", i32Tmp);
1031c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru                        pAu->attribute = AU_RAP;
1032c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru                    }
10337e768504a0222d68ab2f9e80fbd670df033aafdbDheeraj Sharma                    else {
10347e768504a0222d68ab2f9e80fbd670df033aafdbDheeraj Sharma                        pAu->attribute = AU_P_Frame;
10357e768504a0222d68ab2f9e80fbd670df033aafdbDheeraj Sharma                    }
10360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    mMediaBuffer->meta_data()->findInt64(kKeyTime,
10370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (int64_t*)&tempTime64);
10380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                } else {
10390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    break;
10400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                }
10410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                options.clearSeekTo();
10420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            } while(tempTime64 < pC->mVideoSeekTime);
10430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
10440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VE3gpReader_getNextAu: video  time with seek  = %lld:",
10450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                tempTime64);
10460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mVideoSeeking = M4OSA_FALSE;
10470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        } else {
10480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getNextAu video no seek:");
10490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mVideoSource->read(&mMediaBuffer, &options);
10500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
10510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if(mMediaBuffer != NULL) {
1052c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru                if (mMediaBuffer->meta_data()->findInt32(kKeyIsSyncFrame,
1053c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru                    &i32Tmp) && i32Tmp) {
1054c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru                    LOGV("SYNC FRAME FOUND--%d", i32Tmp);
1055c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru                    pAu->attribute = AU_RAP;
1056c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru                }
10577e768504a0222d68ab2f9e80fbd670df033aafdbDheeraj Sharma                else {
10587e768504a0222d68ab2f9e80fbd670df033aafdbDheeraj Sharma                    pAu->attribute = AU_P_Frame;
10597e768504a0222d68ab2f9e80fbd670df033aafdbDheeraj Sharma                }
10600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                mMediaBuffer->meta_data()->findInt64(kKeyTime,
10610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (int64_t*)&tempTime64);
10620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                LOGV("VE3gpReader_getNextAu: video no seek time = %lld:",
10630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    tempTime64);
10640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }else {
10650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                LOGV("VE3gpReader_getNextAu:video no seek time buffer is NULL");
10660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
10670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
10680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
10690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getNextAu M4ERR_PARAMETER");
10700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return M4ERR_PARAMETER;
10710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
10720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
10730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (mMediaBuffer != NULL) {
10740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if( (pAu->dataAddress == NULL) ||  (pAu->size < \
10750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            mMediaBuffer->range_length())) {
10760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if(pAu->dataAddress != NULL) {
10772ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                free((M4OSA_Int32*)pAu->dataAddress);
10780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pAu->dataAddress = NULL;
10790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
10800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("Buffer lenght = %d ,%d",(mMediaBuffer->range_length() +\
10810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                3) & ~0x3,(mMediaBuffer->range_length()));
10820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
10832ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu            pAu->dataAddress = (M4OSA_Int32*)M4OSA_32bitAlignedMalloc(
10840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (mMediaBuffer->range_length() + 3) & ~0x3,M4READER_3GP,
10850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (M4OSA_Char*)"pAccessUnit->m_dataAddress" );
10860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if(pAu->dataAddress == NULL) {
10870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                LOGV("VideoEditor3gpReader_getNextAu malloc failed");
10880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                return M4ERR_ALLOC;
10890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
10900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
10910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAu->size = mMediaBuffer->range_length();
10920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
10939d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu        memcpy((void *)pAu->dataAddress,
10949d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu            (void *)((const char *)mMediaBuffer->data() + mMediaBuffer->range_offset()),
10950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            mMediaBuffer->range_length());
10960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
10970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if( (pStreamHandler == (M4_StreamHandler*)pC->mVideoStreamHandler)  &&
10980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (pStreamHandler->m_streamType == M4DA_StreamTypeVideoMpeg4Avc) ) {
10990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            M4OSA_UInt32 size = mMediaBuffer->range_length();
11000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            M4OSA_UInt8 *lbuffer;
11010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            lbuffer = (M4OSA_UInt8 *) pAu->dataAddress;
11030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("pAccessUnit->m_dataAddress size = %x",size);
11040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            lbuffer[0] = (size >> 24) & 0xFF;
11060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            lbuffer[1] = (size >> 16) & 0xFF;
11070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            lbuffer[2] = (size >> 8) & 0xFF;
11080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            lbuffer[3] = (size) & 0xFF;
11090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
11100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAu->CTS = tempTime64;
11120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAu->CTS = pAu->CTS / 1000; //converting the microsec to millisec
11140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getNextAu CTS = %ld",pAu->CTS);
11150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAu->DTS  = pAu->CTS;
1117c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru        if (pStreamHandler == (M4_StreamHandler*)pC->mAudioStreamHandler) {
1118c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru            pAu->attribute = M4SYS_kFragAttrOk;
1119c3b959af08149605d3b1fdb52b1a21b851399565Basavapatna Dattaguru        }
11200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mMediaBuffer->release();
11210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAccessUnit->m_dataAddress = (M4OSA_Int8*) pAu->dataAddress;
11230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAccessUnit->m_size = pAu->size;
11240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAccessUnit->m_maxsize = pAu->size;
11250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAccessUnit->m_CTS = pAu->CTS;
11260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAccessUnit->m_DTS = pAu->DTS;
11270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAccessUnit->m_attribute = pAu->attribute;
11280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
11300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getNextAu: M4WAR_NO_MORE_AU (EOS) reached");
11310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pAccessUnit->m_size = 0;
11320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        err = M4WAR_NO_MORE_AU;
11330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
11340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    options.clearSeekTo();
11350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pAu->nbFrag = 0;
11370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    mMediaBuffer = NULL;
11380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getNextAu end ");
11390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
11410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
11420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
11430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *******************************************************************************
11440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief   Split the AVC DSI in its different components and write it in
11450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *          ONE memory buffer
11460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @note
11470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   pStreamHandler:         (IN/OUT) The MPEG4-AVC stream
11480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   pDecoderConfigLocal:    (IN) The DSI buffer
11490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @param   decoderConfigSizeLocal: (IN) The DSI buffer size
11500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @return  M4NO_ERROR              there is no error
11510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @return  ERR_FILE_SYNTAX_ERROR   pDecoderConfigLocal is NULL
11520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *******************************************************************************
11530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
11540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargistatic M4OSA_ERR VideoEditor3gpReader_AnalyseAvcDsi(
11550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4_StreamHandler *pStreamHandler, M4OSA_Int32* pDecoderConfigLocal,
11560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Int32 decoderConfigSizeLocal) {
11570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    struct _avcSpecificInfo *pAvcSpecInfo = M4OSA_NULL;
11580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt32 uiSpecInfoSize;
11590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Context pBitParserContext = M4OSA_NULL;
11600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_MemAddr8 pPos;
11610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    /**
11630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi     * First parsing to get the total allocation size (we must not do
11640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi     * multiple malloc, but only one instead) */
11650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    {
11660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Int32 val;
11670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 i,j;
11680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt8 nalUnitLength;
11690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt8  numOfSequenceParameterSets;
11700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 uiTotalSizeOfSPS = 0;
11710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt8  numOfPictureParameterSets;
11720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 uiTotalSizeOfPPS = 0;
11730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_UInt32 uiSize;
11740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        struct _avcSpecificInfo avcSpIf;
11750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        avcSpIf.m_nalUnitLength = 0;
11770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if (M4OSA_NULL == pDecoderConfigLocal) {
11790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            return M4ERR_READER3GP_DECODER_CONFIG_ERROR;
11800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
11810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_MPEG4BitStreamParserInit(&pBitParserContext,
11830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderConfigLocal, decoderConfigSizeLocal);
11840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if (M4OSA_NULL == pBitParserContext) {
11860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            return M4ERR_ALLOC;
11870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
11880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
11890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
11900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                       /* 8 bits -- configuration version */
11910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
11920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                       /* 8 bits -- avc profile indication*/
11930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
11940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                       /* 8 bits -- profile compatibility */
11950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
11960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                       /* 8 bits -- avc level indication*/
11970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        val=VideoEditor3gpReader_BitStreamParserShowBits(pBitParserContext, 8);
11980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                       /* 6 bits reserved 111111b 2 bits length Size minus one*/
11990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
12000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                       /* m_nalUnitLength */
12010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
12020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        nalUnitLength = (M4OSA_UInt8)((val & 0x03) + 1);/*0b11111100*/
12030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if (nalUnitLength > 4) {
12040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pStreamHandler->m_decoderSpecificInfoSize = 0;
12050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pStreamHandler->m_pDecoderSpecificInfo = M4OSA_NULL;
12060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
12070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        } else {
12080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /**
12090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi             * SPS table */
12100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            val=VideoEditor3gpReader_BitStreamParserShowBits(pBitParserContext,
12110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            8);/* 3 bits-reserved 111b-5 bits number of sequence parameter set*/
12120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            numOfSequenceParameterSets = val & 0x1F;
12130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /*1F instead of E0*/ /*0b11100000*/ /*Number of seq parameter sets*/
12140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
12150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            for (i=0; i < numOfSequenceParameterSets; i++) {
12160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                /**
12170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                 * Get the size of this element */
12180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                uiSize =
12190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (M4OSA_UInt32)VideoEditor3gpReader_BitStreamParserShowBits(
12200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    pBitParserContext, 16);
12210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                uiTotalSizeOfSPS += uiSize;
12220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserFlushBits(
12230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    pBitParserContext, 16);
12240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                /**
12250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                 *Read the element(dont keep it, we only want size right now) */
12260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                for (j=0; j<uiSize; j++) {
12270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    VideoEditor3gpReader_BitStreamParserFlushBits(
12280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        pBitParserContext, 8);
12290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                }
12300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
12310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
12320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /**
12330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi             * SPS table */
12340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            numOfPictureParameterSets=(M4OSA_UInt8)\
12350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserShowBits(pBitParserContext,
12360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    8);
12370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
12380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            for (i=0; i < numOfPictureParameterSets; i++) {
12390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                /**
12400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                 * Get the size of this element */
12410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                uiSize = (M4OSA_UInt32)
12420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    VideoEditor3gpReader_BitStreamParserShowBits(
12430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    pBitParserContext, 16);
12440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                uiTotalSizeOfPPS += uiSize;
12450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserFlushBits(
12460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    pBitParserContext, 16);
12470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                /**
12480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                 *Read the element(dont keep it,we only want size right now)*/
12490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                for (j=0; j<uiSize; j++) {
12500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    VideoEditor3gpReader_BitStreamParserFlushBits(
12510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        pBitParserContext, 8);
12520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                }
12530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
12540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
12550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /**
12560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi             * Compute the size of the full buffer */
12570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            uiSpecInfoSize = sizeof(struct _avcSpecificInfo) +
12580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                     numOfSequenceParameterSets * sizeof(struct _parameterSet)
12590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                     + /**< size of the table of SPS elements */
12600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                     numOfPictureParameterSets  * sizeof(struct _parameterSet)
12610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                     + /**< size of the table of PPS elements */
12620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                     uiTotalSizeOfSPS +
12630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                     uiTotalSizeOfPPS;
12640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /**
12650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi             * Allocate the buffer */
12662ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu            pAvcSpecInfo =(struct _avcSpecificInfo*)M4OSA_32bitAlignedMalloc(uiSpecInfoSize,
12670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                M4READER_3GP, (M4OSA_Char*)"MPEG-4 AVC DecoderSpecific");
12680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if (M4OSA_NULL == pAvcSpecInfo) {
12690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
12700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                return M4ERR_ALLOC;
12710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
12720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
12730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /**
12740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi             * Set the pointers to the correct part of the buffer */
12750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pAvcSpecInfo->m_nalUnitLength = nalUnitLength;
12760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pAvcSpecInfo->m_numOfSequenceParameterSets =
12770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                numOfSequenceParameterSets;
12780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pAvcSpecInfo->m_numOfPictureParameterSets  =
12790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                numOfPictureParameterSets;
12800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
12810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /* We place the SPS param sets table after m_pPictureParameterSet */
12820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pAvcSpecInfo->m_pSequenceParameterSet= (struct _parameterSet*)(
12830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (M4OSA_MemAddr8)(&pAvcSpecInfo->m_pPictureParameterSet) +
12840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                sizeof(pAvcSpecInfo->m_pPictureParameterSet));
12850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /*We place the PPS param sets table after the SPS param sets table*/
12860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pAvcSpecInfo->m_pPictureParameterSet = (struct _parameterSet*)(
12870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (M4OSA_MemAddr8)(pAvcSpecInfo->m_pSequenceParameterSet) +
12880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (numOfSequenceParameterSets * sizeof(struct _parameterSet)));
12890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /**< The data will be placed after the PPS param sets table */
12900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pPos = (M4OSA_MemAddr8)pAvcSpecInfo->m_pPictureParameterSet +
12910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (numOfPictureParameterSets * sizeof(struct _parameterSet));
12920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
12930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /**
12940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi             * reset the bit parser */
12950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
12960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
12970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
12980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
12990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    /**
13000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi     * Second parsing to copy the data */
13010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (M4OSA_NULL != pAvcSpecInfo) {
13020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4OSA_Int32 i,j;
13030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
13040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_MPEG4BitStreamParserInit(&pBitParserContext,
13050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pDecoderConfigLocal, decoderConfigSizeLocal);
13060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
13070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if (M4OSA_NULL == pBitParserContext) {
13082ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu            free(pAvcSpecInfo);
13090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            return M4ERR_ALLOC;
13100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
13110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
13120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /* 8 bits -- configuration version */
13140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /* 8 bits -- avc profile indication*/
13160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /* 8 bits -- profile compatibility */
13180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /* 8 bits -- avc level indication*/
13200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /* m_nalUnitLength */
13220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* 3 bits -- reserved 111b -- 5 bits number of sequence parameter set*/
13240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
13250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        for (i=0; i < pAvcSpecInfo->m_numOfSequenceParameterSets; i++) {
13260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pAvcSpecInfo->m_pSequenceParameterSet[i].m_length =
13270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (M4OSA_UInt16)VideoEditor3gpReader_BitStreamParserShowBits(
13280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pBitParserContext, 16);
13290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext,16);
13300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
13310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pAvcSpecInfo->m_pSequenceParameterSet[i].m_pParameterSetUnit =
13320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (M4OSA_UInt8*)pPos;  /**< current position in the buffer */
13330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pPos += pAvcSpecInfo->m_pSequenceParameterSet[i].m_length;
13340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                /**< increment the position in the buffer */
13350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            for (j=0; j<pAvcSpecInfo->m_pSequenceParameterSet[i].m_length;j++){
13360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pAvcSpecInfo->m_pSequenceParameterSet[i].m_pParameterSetUnit[j]=
13370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (M4OSA_UInt8)VideoEditor3gpReader_BitStreamParserShowBits(
13380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    pBitParserContext, 8);
13390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserFlushBits(
13400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    pBitParserContext, 8);
13410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
13420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
13430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
13440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            /* number of pîcture parameter set*/
13460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
13470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        for (i=0; i < pAvcSpecInfo->m_numOfPictureParameterSets; i++) {
13480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pAvcSpecInfo->m_pPictureParameterSet[i].m_length =
13490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (M4OSA_UInt16)VideoEditor3gpReader_BitStreamParserShowBits(
13500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pBitParserContext, 16);
13510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext,16);
13520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
13530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pAvcSpecInfo->m_pPictureParameterSet[i].m_pParameterSetUnit =
13540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (M4OSA_UInt8*)pPos;   /**< current position in the buffer */
13550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pPos += pAvcSpecInfo->m_pPictureParameterSet[i].m_length;
13560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                /**< increment the position in the buffer */
13570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            for (j=0; j<pAvcSpecInfo->m_pPictureParameterSet[i].m_length; j++) {
13580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pAvcSpecInfo->m_pPictureParameterSet[i].m_pParameterSetUnit[j] =
13590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (M4OSA_UInt8)VideoEditor3gpReader_BitStreamParserShowBits(
13600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    pBitParserContext, 8);
13610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserFlushBits(
13620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    pBitParserContext, 8);
13630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
13640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
13650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
13660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pStreamHandler->m_decoderSpecificInfoSize = uiSpecInfoSize;
13670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pStreamHandler->m_pDecoderSpecificInfo = (M4OSA_UInt8*)pAvcSpecInfo;
13680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
13690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pStreamHandler->m_H264decoderSpecificInfoSize  =  decoderConfigSizeLocal;
13702ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu    pStreamHandler->m_pH264DecoderSpecificInfo  = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(
13710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        decoderConfigSizeLocal, M4READER_3GP,
13720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (M4OSA_Char*)"MPEG-4 AVC DecoderSpecific");
13730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (M4OSA_NULL == pStreamHandler->m_pH264DecoderSpecificInfo) {
13740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        goto cleanup;
13750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
13760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
13779d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu    memcpy((void * ) pStreamHandler->m_pH264DecoderSpecificInfo,
13789d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu        (void * )pDecoderConfigLocal,
13790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pStreamHandler->m_H264decoderSpecificInfoSize);
13800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return M4NO_ERROR;
13810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargicleanup:
13820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
13830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return M4ERR_READER3GP_DECODER_CONFIG_ERROR;
13840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
13850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/**
13860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi********************************************************************************
13870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @brief    Get the next stream found in the 3gp file
13880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @note
13890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    context:     (IN)    Context of the reader
13900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    pMediaFamily: OUT)   pointer to a user allocated
13910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*                                M4READER_MediaFamily that will be filled
13920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*                                with the media family of the found stream
13930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @param    pStreamHandler:(OUT) pointer to StreamHandler that will be allocated
13940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*                                and filled with the found stream description
13950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
13960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_BAD_CONTEXT       provided context is not a valid one
13970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4ERR_PARAMETER         at least one parameter is not properly set
13980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi* @return   M4WAR_NO_MORE_STREAM    no more available stream in the media
13990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi********************************************************************************
14000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi*/
14010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getNextStreamHandler(M4OSA_Context context,
14020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4READER_MediaFamily *pMediaFamily,
14030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4_StreamHandler **pStreamHandler) {
14040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_Context* pC=(VideoEditor3gpReader_Context*)context;
14050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
14060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4SYS_StreamID streamIdArray[2];
14070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4SYS_StreamDescription streamDesc;
14080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4_AudioStreamHandler* pAudioStreamHandler;
14090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4_VideoStreamHandler* pVideoStreamHandler;
14100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Int8 *DecoderSpecificInfo = M4OSA_NULL;
14110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Int32 decoderSpecificInfoSize =0, maxAUSize = 0;
14120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
14130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4_StreamType streamType = M4DA_StreamTypeUnknown;
14140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt8 temp, i, trackCount;
14150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Bool haveAudio = M4OSA_FALSE;
14160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Bool haveVideo = M4OSA_FALSE;
14170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    sp<MetaData> meta  = NULL;
14180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    int64_t Duration = 0;
14190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_UInt8* DecoderSpecific = M4OSA_NULL ;
14200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    uint32_t type;
14210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    const void *data;
14220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    size_t size;
14230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    const void *codec_specific_data;
14240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    size_t codec_specific_data_size;
14250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Int32  ptempTime;
1426dab5839386270b4ec08db02ce9f8fa87bc96ca03Basavapatna Dattaguru    M4OSA_Int32  avgFPS=0;
14270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
14280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getNextStreamHandler begin");
14290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
14300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER,
14310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_getNextStreamHandler: invalid context");
14320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pMediaFamily   == 0), M4ERR_PARAMETER,
14330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "getNextStreamHandler: invalid pointer to MediaFamily");
14340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
14350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "getNextStreamHandler: invalid pointer to StreamHandler");
14360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
14370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    trackCount = pC->mExtractor->countTracks();
14380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    temp = pC->mCurrTrack;
14390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
14400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if(temp >= trackCount) {
14410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getNextStreamHandler error = %d",
14420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            M4WAR_NO_MORE_STREAM);
14430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return (M4WAR_NO_MORE_STREAM);
14440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
14450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        const char *mime;
14460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        meta = pC->mExtractor->getTrackMetaData(temp);
14470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        CHECK(meta->findCString(kKeyMIMEType, &mime));
14480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
14490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if (!haveVideo && !strncasecmp(mime, "video/", 6)) {
14500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mVideoSource = pC->mExtractor->getTrack(temp);
14510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mVideoSource->start();
14520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
14530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            *pMediaFamily = M4READER_kMediaFamilyVideo;
14540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            haveVideo = true;
14550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getNextStreamHandler getTrack called");
14560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) {
14570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                streamType = M4DA_StreamTypeVideoMpeg4Avc;
14580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_H263)) {
14590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                streamType = M4DA_StreamTypeVideoH263;
14600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG4)) {
14610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                streamType = M4DA_StreamTypeVideoMpeg4;
14620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            } else {
14630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                LOGV("VideoEditor3gpReaderGetNextStreamHandler streamTypeNONE");
14640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
14650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getNextStreamHandler: stream type: %d ",
14660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                streamType);
14670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
14680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if(streamType != M4DA_StreamTypeUnknown) {
14690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pC->mStreamType = streamType;
14700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pC->mStreamId = pC->mCurrTrack;
14710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
14722ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                pVideoStreamHandler = (M4_VideoStreamHandler*)M4OSA_32bitAlignedMalloc
14730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (sizeof(M4_VideoStreamHandler), M4READER_3GP,
14740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (M4OSA_Char*)"M4_VideoStreamHandler");
14750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                if (M4OSA_NULL == pVideoStreamHandler) {
14760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    return M4ERR_ALLOC;
14770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                }
14780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pVideoStreamHandler->m_structSize=sizeof(M4_VideoStreamHandler);
14790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
14800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                meta->findInt32(kKeyWidth,
14810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (int32_t*)&(pVideoStreamHandler->m_videoWidth));
14820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                meta->findInt32(kKeyHeight,
14830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (int32_t*)&(pVideoStreamHandler->m_videoHeight));
14840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
14850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (*pStreamHandler)  = (M4_StreamHandler*)(pVideoStreamHandler);
14860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                meta->findInt64(kKeyDuration,
14870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (int64_t*)&(Duration));
14880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                ((*pStreamHandler)->m_duration) =
14890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (int32_t)((Duration)/1000); // conversion to mS
14900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pC->mMaxDuration = ((*pStreamHandler)->m_duration);
14910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                LOGV("VideoEditor3gpReader_getNextStreamHandler m_duration %d",
14920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (*pStreamHandler)->m_duration);
14930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1494413326960d3b3f6c591685e56a30150087ff08ffRajneesh Chowdury                off64_t fileSize = 0;
1495413326960d3b3f6c591685e56a30150087ff08ffRajneesh Chowdury                pC->mDataSource->getSize(&fileSize);
1496413326960d3b3f6c591685e56a30150087ff08ffRajneesh Chowdury                pC->mFileSize  = fileSize;
1497413326960d3b3f6c591685e56a30150087ff08ffRajneesh Chowdury
1498413326960d3b3f6c591685e56a30150087ff08ffRajneesh Chowdury                LOGV("VideoEditor3gpReader_getNextStreamHandler m_fileSize %d",
1499413326960d3b3f6c591685e56a30150087ff08ffRajneesh Chowdury                    pC->mFileSize);
15000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
15010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                meta->findInt32(kKeyMaxInputSize, (int32_t*)&(maxAUSize));
15020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                if(maxAUSize == 0) {
15030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    maxAUSize = 70000;
15040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                }
15050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (*pStreamHandler)->m_maxAUSize = maxAUSize;
15060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                LOGV("<<<<<<<<<<   video: mMaxAUSize from MP4 extractor: %d",
15070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (*pStreamHandler)->m_maxAUSize);
15080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1509413326960d3b3f6c591685e56a30150087ff08ffRajneesh Chowdury                ((M4_StreamHandler*)pVideoStreamHandler)->m_averageBitRate =
1510413326960d3b3f6c591685e56a30150087ff08ffRajneesh Chowdury                        (pC->mFileSize * 8000)/pC->mMaxDuration;
1511413326960d3b3f6c591685e56a30150087ff08ffRajneesh Chowdury                LOGV("VideoEditor3gpReader_getNextStreamHandler m_averageBitrate %d",
1512413326960d3b3f6c591685e56a30150087ff08ffRajneesh Chowdury                    ((M4_StreamHandler*)pVideoStreamHandler)->m_averageBitRate);
1513413326960d3b3f6c591685e56a30150087ff08ffRajneesh Chowdury
1514dab5839386270b4ec08db02ce9f8fa87bc96ca03Basavapatna Dattaguru
1515dab5839386270b4ec08db02ce9f8fa87bc96ca03Basavapatna Dattaguru                meta->findInt32(kKeyFrameRate,
1516dab5839386270b4ec08db02ce9f8fa87bc96ca03Basavapatna Dattaguru                    (int32_t*)&(avgFPS));
1517dab5839386270b4ec08db02ce9f8fa87bc96ca03Basavapatna Dattaguru                LOGV("<<<<<<<<<<   video: Average FPS from MP4 extractor: %d",
1518dab5839386270b4ec08db02ce9f8fa87bc96ca03Basavapatna Dattaguru                    avgFPS);
1519dab5839386270b4ec08db02ce9f8fa87bc96ca03Basavapatna Dattaguru
1520dab5839386270b4ec08db02ce9f8fa87bc96ca03Basavapatna Dattaguru                pVideoStreamHandler->m_averageFrameRate =(M4OSA_Float) avgFPS;
1521dab5839386270b4ec08db02ce9f8fa87bc96ca03Basavapatna Dattaguru                LOGV("<<<<<<<<<<   video: Average FPS from MP4 extractor in FLOAT: %f",
1522dab5839386270b4ec08db02ce9f8fa87bc96ca03Basavapatna Dattaguru                    pVideoStreamHandler->m_averageFrameRate);
1523dab5839386270b4ec08db02ce9f8fa87bc96ca03Basavapatna Dattaguru
152416757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury                // Get the video rotation degree
152516757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury                int32_t rotationDegree;
152616757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury                if(!meta->findInt32(kKeyRotation, &rotationDegree)) {
152716757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury                    rotationDegree = 0;
152816757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury                }
152916757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury                pVideoStreamHandler->videoRotationDegrees = rotationDegree;
153016757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury
15310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pC->mVideoStreamHandler =
15320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (M4_StreamHandler*)(pVideoStreamHandler);
15330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
15340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                /* Get the DSI info */
15350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                if(M4DA_StreamTypeVideoH263 == streamType) {
15365fcff590d602457aa16fad5e13344b67e516bef3Danny Fernandes                    if (meta->findData(kKeyD263, &type, &data, &size)) {
15375fcff590d602457aa16fad5e13344b67e516bef3Danny Fernandes                        (*pStreamHandler)->m_decoderSpecificInfoSize = size;
15380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        if ((*pStreamHandler)->m_decoderSpecificInfoSize != 0) {
15392ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                            DecoderSpecific = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(
15400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                (*pStreamHandler)->m_decoderSpecificInfoSize,
15410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                M4READER_3GP,(M4OSA_Char*)"H263 DSI");
15420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            if (M4OSA_NULL == DecoderSpecific) {
15430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                return M4ERR_ALLOC;
15440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            }
15459d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                            memcpy((void *)DecoderSpecific,
15469d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                                (void *)data, size);
15470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            (*pStreamHandler)->m_pDecoderSpecificInfo =
15480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                DecoderSpecific;
15490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        }
15500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        else {
15510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            (*pStreamHandler)->m_pDecoderSpecificInfo =
15520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                M4OSA_NULL;
15535fcff590d602457aa16fad5e13344b67e516bef3Danny Fernandes                            (*pStreamHandler)->m_decoderSpecificInfoSize = 0;
15540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        }
15555fcff590d602457aa16fad5e13344b67e516bef3Danny Fernandes                        (*pStreamHandler)->m_pESDSInfo = M4OSA_NULL;
15565fcff590d602457aa16fad5e13344b67e516bef3Danny Fernandes                        (*pStreamHandler)->m_ESDSInfoSize = 0;
15575fcff590d602457aa16fad5e13344b67e516bef3Danny Fernandes                        (*pStreamHandler)->m_pH264DecoderSpecificInfo = M4OSA_NULL;
15585fcff590d602457aa16fad5e13344b67e516bef3Danny Fernandes                        (*pStreamHandler)->m_H264decoderSpecificInfoSize = 0;
15590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    } else {
15600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        LOGV("VE_getNextStreamHandler: H263 dsi not found");
15610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo = M4OSA_NULL;
15620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_decoderSpecificInfoSize = 0;
15630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_H264decoderSpecificInfoSize = 0;
15640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_pH264DecoderSpecificInfo =
15650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            M4OSA_NULL;
15660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_pESDSInfo = M4OSA_NULL;
15670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_ESDSInfoSize = 0;
15680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    }
15690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                }
15700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                else if(M4DA_StreamTypeVideoMpeg4Avc == streamType) {
15710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    if(meta->findData(kKeyAVCC, &type, &data, &size)) {
15720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        decoderSpecificInfoSize = size;
15730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        if (decoderSpecificInfoSize != 0) {
15742ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                            DecoderSpecificInfo = (M4OSA_Int8*)M4OSA_32bitAlignedMalloc(
15750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                decoderSpecificInfoSize, M4READER_3GP,
15760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                (M4OSA_Char*)"H264 DecoderSpecific" );
15770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            if (M4OSA_NULL == DecoderSpecificInfo) {
15780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                LOGV("VideoEditor3gp_getNextStream is NULL ");
15790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                return M4ERR_ALLOC;
15800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            }
15819d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                            memcpy((void *)DecoderSpecificInfo,
15829d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                                (void *)data, decoderSpecificInfoSize);
15830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        } else {
15840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            LOGV("DSI Size %d", decoderSpecificInfoSize);
15850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            DecoderSpecificInfo = M4OSA_NULL;
15860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        }
15870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    }
15880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (*pStreamHandler)->m_pESDSInfo = M4OSA_NULL;
15890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (*pStreamHandler)->m_ESDSInfoSize = 0;
15900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
15910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    err = VideoEditor3gpReader_AnalyseAvcDsi(*pStreamHandler,
15920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (M4OSA_Int32*)DecoderSpecificInfo, decoderSpecificInfoSize);
15930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
15940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    if (M4NO_ERROR != err) {
15950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        return err;
15960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    }
15970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    LOGV("decsize %d, h264decsize %d: %d", (*pStreamHandler)->\
15980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        m_decoderSpecificInfoSize, (*pStreamHandler)->\
15990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        m_H264decoderSpecificInfoSize);
16000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
16010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    if(M4OSA_NULL != DecoderSpecificInfo) {
16022ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                        free(DecoderSpecificInfo);
16030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        DecoderSpecificInfo = M4OSA_NULL;
16040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    }
16050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                } else if( (M4DA_StreamTypeVideoMpeg4 == streamType) ) {
16060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    if (meta->findData(kKeyESDS, &type, &data, &size)) {
16070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        ESDS esds((const char *)data, size);
16080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        CHECK_EQ(esds.InitCheck(), OK);
16090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
16100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_ESDSInfoSize = size;
16110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_pESDSInfo = (M4OSA_UInt8*)\
16122ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                        M4OSA_32bitAlignedMalloc((*pStreamHandler)->m_ESDSInfoSize,
161303ee95fbc29c9fe39c8eb74ee18daf7060e97bc5James Dong                        M4READER_3GP, (M4OSA_Char*)"M4V DecoderSpecific" );
16140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        if (M4OSA_NULL == (*pStreamHandler)->m_pESDSInfo) {
16150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            return M4ERR_ALLOC;
16160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        }
16179d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                        memcpy((void *)(*pStreamHandler)->\
16189d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                            m_pESDSInfo, (void *)data, size);
16190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
16200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        esds.getCodecSpecificInfo(&codec_specific_data,
16210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            &codec_specific_data_size);
16220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        LOGV("VE MP4 dsisize: %d, %x", codec_specific_data_size,
16230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            codec_specific_data);
16240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
16250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_decoderSpecificInfoSize =
16260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            codec_specific_data_size;
16270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        if ((*pStreamHandler)->m_decoderSpecificInfoSize != 0) {
16282ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                            DecoderSpecific = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(
16290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                (*pStreamHandler)->m_decoderSpecificInfoSize,
16300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                M4READER_3GP, (M4OSA_Char*)" DecoderSpecific" );
16310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            if (M4OSA_NULL == DecoderSpecific) {
16320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                return M4ERR_ALLOC;
16330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            }
16349d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                            memcpy((void *)DecoderSpecific,
16359d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                                (void *)codec_specific_data,
16360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                codec_specific_data_size);
16370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            (*pStreamHandler)->m_pDecoderSpecificInfo =
16380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                DecoderSpecific;
16390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        }
16400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        else {
16410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            (*pStreamHandler)->m_pDecoderSpecificInfo =
16420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                                M4OSA_NULL;
16430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        }
16440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_pH264DecoderSpecificInfo =
16450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            M4OSA_NULL;
16460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_H264decoderSpecificInfoSize = 0;
16470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    }
16480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                } else {
16490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    LOGV("VideoEditor3gpReader_getNextStream NO video stream");
16500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    return M4ERR_READER_UNKNOWN_STREAM_TYPE;
16510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                }
16520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
16530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            else {
16540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                LOGV("VideoEditor3gpReader_getNextStream NO video stream");
16550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                return M4ERR_READER_UNKNOWN_STREAM_TYPE;
16560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
16570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
16580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) {
16590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getNextStream audio getTrack called");
16600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mAudioSource = pC->mExtractor->getTrack(pC->mCurrTrack);
16610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mAudioSource->start();
16620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            *pMediaFamily = M4READER_kMediaFamilyAudio;
16630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
16640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) {
16650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                streamType = M4DA_StreamTypeAudioAmrNarrowBand;
16660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            } else if(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) {
16670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                streamType = M4DA_StreamTypeAudioAmrWideBand;
16680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
16690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            else if(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) {
16700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                streamType = M4DA_StreamTypeAudioAac;
16710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            } else {
16720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                LOGV("VideoEditor3gpReader_getNextStrea streamtype Unknown ");
16730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
16740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if(streamType != M4DA_StreamTypeUnknown) {
16750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pC->mStreamType = streamType;
16760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pC->mStreamId = pC->mCurrTrack;
16770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
16780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                LOGV("VE streamtype %d ,id %d",  streamType, pC->mCurrTrack);
16790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
16802ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                pAudioStreamHandler = (M4_AudioStreamHandler*)M4OSA_32bitAlignedMalloc
16810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (sizeof(M4_AudioStreamHandler), M4READER_3GP,
16820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (M4OSA_Char*)"M4_AudioStreamHandler");
16830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                if (M4OSA_NULL == pAudioStreamHandler) {
16840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    return M4ERR_ALLOC;
16850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                }
16860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pAudioStreamHandler->m_structSize=sizeof(M4_AudioStreamHandler);
16870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pAudioStreamHandler->m_byteSampleSize   = 0;
16880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pAudioStreamHandler->m_nbChannels       = 0;
16890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pAudioStreamHandler->m_samplingFrequency= 0;
16900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pAudioStreamHandler->m_byteFrameLength  = 0;
16910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
16920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (*pStreamHandler) = (M4_StreamHandler*)(pAudioStreamHandler);
16930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pC->mAudioStreamHandler =
16940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (M4_StreamHandler*)(pAudioStreamHandler);
16950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (*pStreamHandler)->m_averageBitRate = 0;
16960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                haveAudio = true;
16970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pC->mAudioStreamHandler=(M4_StreamHandler*)pAudioStreamHandler;
16980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pC->mAudioStreamHandler->m_pESDSInfo = M4OSA_NULL;
16990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pC->mAudioStreamHandler->m_ESDSInfoSize = 0;
17000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
17010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                meta->findInt32(kKeyMaxInputSize, (int32_t*)&(maxAUSize));
17020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                if(maxAUSize == 0) {
17030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    maxAUSize = 70000;
17040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                }
17050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (*pStreamHandler)->m_maxAUSize = maxAUSize;
17060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                LOGV("VE Audio mMaxAUSize from MP4 extractor: %d", maxAUSize);
17070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
17080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if((M4DA_StreamTypeAudioAmrNarrowBand == streamType) ||
17090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (M4DA_StreamTypeAudioAmrWideBand == streamType)) {
17100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                M4OSA_UInt32 freqIndex = 0; /**< AMR NB */
17110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                M4OSA_UInt32 modeSet;
17120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                M4OSA_UInt32 i;
17130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                M4OSA_Context pBitParserContext = M4OSA_NULL;
17140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
17150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                if(M4DA_StreamTypeAudioAmrWideBand == streamType) {
17160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    freqIndex = 1; /**< AMR WB */
17170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                }
17180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
17190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                if (meta->findData(kKeyESDS, &type, &data, &size)) {
17200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    ESDS esds((const char *)data, size);
17210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    CHECK_EQ(esds.InitCheck(), OK);
17220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
17230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    esds.getCodecSpecificInfo(&codec_specific_data,
17240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        &codec_specific_data_size);
17250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (*pStreamHandler)->m_decoderSpecificInfoSize =
17260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        codec_specific_data_size;
17270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
17280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    if ((*pStreamHandler)->m_decoderSpecificInfoSize != 0) {
17292ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                        DecoderSpecific = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(
17300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            (*pStreamHandler)->m_decoderSpecificInfoSize,
173103ee95fbc29c9fe39c8eb74ee18daf7060e97bc5James Dong                            M4READER_3GP, (M4OSA_Char*)"AMR DecoderSpecific" );
17320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        if (M4OSA_NULL == DecoderSpecific) {
17330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            return M4ERR_ALLOC;
17340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        }
17359d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                        memcpy((void *)DecoderSpecific,
17369d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                            (void *)codec_specific_data,
17370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            codec_specific_data_size);
17380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo =
17390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            DecoderSpecific;
17400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    } else {
17410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo = M4OSA_NULL;
17420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    }
17430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                } else {
17440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    M4OSA_UChar AmrDsi[] =
17450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        {'P','H','L','P',0x00, 0x00, 0x80, 0x00, 0x01,};
17460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (*pStreamHandler)->m_decoderSpecificInfoSize = 9;
17472ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                    DecoderSpecific = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(
17480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_decoderSpecificInfoSize,
174903ee95fbc29c9fe39c8eb74ee18daf7060e97bc5James Dong                        M4READER_3GP, (M4OSA_Char*)"PHLP DecoderSpecific" );
17500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    if (M4OSA_NULL == DecoderSpecific) {
17510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        return M4ERR_ALLOC;
17520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    }
17530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    if(freqIndex ==0) {
17540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        AmrDsi[8] = 0x01;
17550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    } else {
17560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        AmrDsi[8] = 0x02;
17570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    }
17580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    for(i = 0; i< 9; i++) {
17590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        DecoderSpecific[i] = AmrDsi[i];
17600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    }
17610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (*pStreamHandler)->m_pDecoderSpecificInfo = DecoderSpecific;
17620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                }
17630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (*pStreamHandler)->m_averageBitRate =
17640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    VideoEditor3gpReader_AmrBitRate[freqIndex][7];
17650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            } else if((M4DA_StreamTypeAudioAac == streamType)) {
17660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                if (meta->findData(kKeyESDS, &type, &data, &size)) {
17670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    ESDS esds((const char *)data, size);
17680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    CHECK_EQ(esds.InitCheck(), OK);
17690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
17700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (*pStreamHandler)->m_ESDSInfoSize = size;
17712ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                    (*pStreamHandler)->m_pESDSInfo = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(
17720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_ESDSInfoSize, M4READER_3GP,
177303ee95fbc29c9fe39c8eb74ee18daf7060e97bc5James Dong                        (M4OSA_Char*)"AAC DecoderSpecific" );
17740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    if (M4OSA_NULL == (*pStreamHandler)->m_pESDSInfo) {
17750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        return M4ERR_ALLOC;
17760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    }
17779d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                    memcpy((void *)(*pStreamHandler)->m_pESDSInfo,
17789d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                    (void *)data, size);
17790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    esds.getCodecSpecificInfo(&codec_specific_data,
17800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        &codec_specific_data_size);
17810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
17820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    LOGV("VEdsi %d,%x",codec_specific_data_size,
17830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        codec_specific_data);
17840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
17850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    (*pStreamHandler)->m_decoderSpecificInfoSize =
17860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        codec_specific_data_size;
17870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    if ((*pStreamHandler)->m_decoderSpecificInfoSize != 0) {
17882ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                        DecoderSpecific = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(
17890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            (*pStreamHandler)->m_decoderSpecificInfoSize,
179003ee95fbc29c9fe39c8eb74ee18daf7060e97bc5James Dong                            M4READER_3GP, (M4OSA_Char*)"AAC DecoderSpecific" );
17910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        if (M4OSA_NULL == DecoderSpecific) {
17920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            return M4ERR_ALLOC;
17930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        }
17949d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                        memcpy((void *)DecoderSpecific,
17959d73576eaba7f8e788f1883ed1d767270ccd0fc2Shyam Pallapothu                            (void *)codec_specific_data,
17960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            codec_specific_data_size);
17970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo =
17980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                            DecoderSpecific;
17990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    } else {
18000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo = M4OSA_NULL;
18010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                    }
18020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                }
18030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            } else {
18040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                LOGV("VideoEditor3gpReader_getNextStream mStreamType: none ");
18050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                return M4ERR_READER_UNKNOWN_STREAM_TYPE;
18060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
18070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        } else {
18080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            LOGV("VE noaudio-video stream:pC->mCurrTrack = %d ",pC->mCurrTrack);
18090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pC->mCurrTrack++; //Increment current track to get the next track
18100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            return M4ERR_READER_UNKNOWN_STREAM_TYPE;
18110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
18120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VE StreamType: %d, stremhandler %x",streamType, *pStreamHandler );
18130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (*pStreamHandler)->m_streamType = streamType;
18140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (*pStreamHandler)->m_streamId   = pC->mStreamId;
18150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (*pStreamHandler)->m_pUserData  = M4OSA_NULL;
18160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (*pStreamHandler)->m_structSize = sizeof(M4_StreamHandler);
18170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (*pStreamHandler)->m_bStreamIsOK = M4OSA_TRUE;
18180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
18190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        meta->findInt64(kKeyDuration,
18200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (int64_t*)&(Duration));
18210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
18220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        (*pStreamHandler)->m_duration = (int32_t)(Duration / 1000);
18230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
18240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        pC->mMaxDuration = ((*pStreamHandler)->m_duration);
18250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VE str duration duration: %d ", (*pStreamHandler)->m_duration);
18260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
18270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        /* In AAC case: Put the first AU in pAudioStreamHandler->m_pUserData
18280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi         *since decoder has to know if stream contains SBR data(Implicit sig) */
18290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if(M4DA_StreamTypeAudioAac == (*pStreamHandler)->m_streamType) {
18300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            M4READER_AudioSbrUserdata*  pAudioSbrUserdata;
18310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
18322ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu            pAudioSbrUserdata = (M4READER_AudioSbrUserdata*)M4OSA_32bitAlignedMalloc(
18330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                sizeof(M4READER_AudioSbrUserdata),M4READER_3GP,
18340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (M4OSA_Char*)"M4READER_AudioSbrUserdata");
18350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if (M4OSA_NULL == pAudioSbrUserdata) {
18360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                err = M4ERR_ALLOC;
18370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                goto Error;
18380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
18390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            (*pStreamHandler)->m_pUserData = pAudioSbrUserdata;
18400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pAudioSbrUserdata->m_bIsSbrEnabled = M4OSA_FALSE;
18410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
18422ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu            pAudioSbrUserdata->m_pFirstAU = (M4_AccessUnit*)M4OSA_32bitAlignedMalloc(
18430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                sizeof(M4_AccessUnit),M4READER_3GP, (M4OSA_Char*)"1st AAC AU");
18440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if (M4OSA_NULL == pAudioSbrUserdata->m_pFirstAU) {
18450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                pAudioSbrUserdata->m_pAacDecoderUserConfig = M4OSA_NULL;
18460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                err = M4ERR_ALLOC;
18470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                goto Error;
18480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
18490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            pAudioSbrUserdata->m_pAacDecoderUserConfig = (M4_AacDecoderConfig*)\
18502ee9722574bb93eaa3f4499faf9c82fcf63f8da3Shyam Pallapothu                M4OSA_32bitAlignedMalloc(sizeof(M4_AacDecoderConfig),M4READER_3GP,
18510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (M4OSA_Char*)"m_pAacDecoderUserConfig");
18520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if (M4OSA_NULL == pAudioSbrUserdata->m_pAacDecoderUserConfig) {
18530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                err = M4ERR_ALLOC;
18540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                goto Error;
18550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
18560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
18570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        if(M4DA_StreamTypeAudioAac == (*pStreamHandler)->m_streamType) {
18580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            M4_AudioStreamHandler* pAudioStreamHandler =
18590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (M4_AudioStreamHandler*)(*pStreamHandler);
18600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            M4READER_AudioSbrUserdata* pUserData = (M4READER_AudioSbrUserdata*)\
18610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (pAudioStreamHandler->m_basicProperties.m_pUserData);
18620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
18630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            err = VideoEditor3gpReader_fillAuStruct(pC, (*pStreamHandler),
18640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (M4_AccessUnit*)pUserData->m_pFirstAU);
18650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if (M4NO_ERROR != err) {
18660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                goto Error;
18670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
18680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            err = VideoEditor3gpReader_getNextAu(pC, (*pStreamHandler),
18690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                (M4_AccessUnit*)pUserData->m_pFirstAU);
18700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if (M4NO_ERROR != err) {
18710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                goto Error;
18720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
18730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            err = VideoEditor3gpReader_reset(pC, (*pStreamHandler));
18740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            if (M4NO_ERROR != err) {
18750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi                goto Error;
18760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            }
18770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        }
18780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
18790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    pC->mCurrTrack++; //Increment the current track to get next track
18800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("pC->mCurrTrack = %d",pC->mCurrTrack);
18810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
18820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (!haveAudio && !haveVideo) {
18830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        *pMediaFamily=M4READER_kMediaFamilyUnknown;
18840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return M4ERR_READER_UNKNOWN_STREAM_TYPE;
18850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
18860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiError:
18870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getNextStreamHandler end error = %d",err);
18880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
18890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
18900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
18910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getPrevRapTime(M4OSA_Context context,
18920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4_StreamHandler *pStreamHandler, M4OSA_Int32* pTime)
18930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi{
18940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VideoEditor3gpReader_Context *pC = (VideoEditor3gpReader_Context*)context;
18950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
18960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    MediaBuffer *mMediaBuffer = M4OSA_NULL;
18970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    MediaSource::ReadOptions options;
18980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_Time time64;
18990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    int64_t tempTime64 = 0;
19000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    status_t error;
19010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getPrevRapTime begin");
19030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER,
19050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_getPrevRapTime: invalid context");
19060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
19070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_getPrevRapTime invalid pointer to StreamHandler");
19080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_DEBUG_IF1((pTime == 0), M4ERR_PARAMETER,
19090c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_getPrevRapTime: invalid time pointer");
19100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (*pTime == (pStreamHandler->m_duration)) {
191125d6699c194a9719997c79dfb95bd66673825b7bSantosh Madhava        *pTime -= 1;
191225d6699c194a9719997c79dfb95bd66673825b7bSantosh Madhava    }
1913c5dac4d3fa18a3497242669b823f78a7e48e4e39hongteng
1914c5dac4d3fa18a3497242669b823f78a7e48e4e39hongteng    time64 = (M4OSA_Time)*pTime * 1000;
19150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getPrevRapTime seek time: %ld",time64);
19170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    options.setSeekTo(time64, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC);
19180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    error = pC->mVideoSource->read(&mMediaBuffer, &options);
19190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if (error != OK) {
19200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        //Can not get the previous Sync.
19210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        //Must be end of stream.
192225d6699c194a9719997c79dfb95bd66673825b7bSantosh Madhava        return M4WAR_NO_MORE_AU;
19230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
19240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    mMediaBuffer->meta_data()->findInt64(kKeyTime, (int64_t*)&tempTime64);
19260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getPrevRapTime read time %ld, %x", tempTime64,
19270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mMediaBuffer);
19280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
1929c5dac4d3fa18a3497242669b823f78a7e48e4e39hongteng    *pTime = (M4OSA_Int32)(tempTime64 / 1000);
19300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if(mMediaBuffer != M4OSA_NULL) {
19320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV(" mMediaBuffer size = %d length %d", mMediaBuffer->size(),
19330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            mMediaBuffer->range_length());
19340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mMediaBuffer->release();
19350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        mMediaBuffer = M4OSA_NULL;
19360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
19370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    options.clearSeekTo();
19380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if(error != OK) {
19400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getPrevRapTime end \
19410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi            M4WAR_READER_INFORMATION_NOT_PRESENT");
19420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return M4WAR_READER_INFORMATION_NOT_PRESENT;
19430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
19440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getPrevRapTime end: err %x", err);
19450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        err = M4NO_ERROR;
19460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        return err;
19470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
19480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
19490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargiextern "C" {
19510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getInterface(M4READER_MediaType *pMediaType,
19520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4READER_GlobalInterface **pRdrGlobalInterface,
19530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        M4READER_DataInterface **pRdrDataInterface) {
19540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
19560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pMediaType,      M4ERR_PARAMETER);
19580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pRdrGlobalInterface, M4ERR_PARAMETER);
19590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pRdrDataInterface, M4ERR_PARAMETER);
19600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getInterface begin");
19620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getInterface %d 0x%x 0x%x", *pMediaType,
19630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        *pRdrGlobalInterface,*pRdrDataInterface);
19640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    SAFE_MALLOC(*pRdrGlobalInterface, M4READER_GlobalInterface, 1,
19660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_getInterface");
19670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    SAFE_MALLOC(*pRdrDataInterface, M4READER_DataInterface, 1,
19680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        "VideoEditor3gpReader_getInterface");
19690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    *pMediaType = M4READER_kMediaType3GPP;
19710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctCreate       = VideoEditor3gpReader_create;
19730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctDestroy      = VideoEditor3gpReader_destroy;
19740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctOpen         = VideoEditor3gpReader_open;
19750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctClose        = VideoEditor3gpReader_close;
19760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctGetOption    = VideoEditor3gpReader_getOption;
19770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctSetOption    = VideoEditor3gpReader_setOption;
19780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctGetNextStream =
19790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_getNextStreamHandler;
19800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctFillAuStruct =
19810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_fillAuStruct;
19820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctStart        = M4OSA_NULL;
19830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctStop         = M4OSA_NULL;
19840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctJump         = VideoEditor3gpReader_jump;
19850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctReset        = VideoEditor3gpReader_reset;
19860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctGetPrevRapTime =
19870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        VideoEditor3gpReader_getPrevRapTime;
19880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrDataInterface)->m_pFctGetNextAu      = VideoEditor3gpReader_getNextAu;
19890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    (*pRdrDataInterface)->m_readerContext      = M4OSA_NULL;
19900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargicleanUp:
19920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    if( M4NO_ERROR == err ) {
19930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getInterface no error");
19940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    } else {
19950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        SAFE_FREE(*pRdrGlobalInterface);
19960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        SAFE_FREE(*pRdrDataInterface);
19970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
19980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getInterface ERROR 0x%X", err);
19990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    }
20000c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getInterface end");
20010c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi    return err;
20020c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}
20030c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
20040c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}  /* extern "C" */
20050c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
20060c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi}  /* namespace android */
20070c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
20080c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi
2009