VideoEditor3gpReader.cpp revision 733100524deb5d2da77ac52a2ff89b2cde242934
17c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*
27c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 NXP Software
37c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
43ad01762633531957174c5b27e71ca4aac45e554Santosh Madhava *
57c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License");
67c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * you may not use this file except in compliance with the License.
77c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * You may obtain a copy of the License at
87c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
97c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *      http://www.apache.org/licenses/LICENSE-2.0
107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software
127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS,
137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * See the License for the specific language governing permissions and
157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * limitations under the License.
167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*************************************************************************
197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @file   VideoEditor3gpReader.cpp
207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief  StageFright shell 3GP Reader
217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*************************************************************************
227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_NDEBUG 1
257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_TAG "VIDEOEDITOR_3GPREADER"
267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * HEADERS
297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define VIDEOEDITOR_BITSTREAM_PARSER
327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h"
347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditor3gpReader.h"
357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4SYS_AccessUnit.h"
367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditorUtils.h"
377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4READER_3gpCom.h"
387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4_Common.h"
397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_FileWriter.h"
407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef VIDEOEDITOR_BITSTREAM_PARSER
427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_CoreID.h"
437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Error.h"
447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Memory.h"
457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4_Utils.h"
467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "ESDS.h"
497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "utils/Log.h"
507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaBufferGroup.h>
517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/DataSource.h>
527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/FileSource.h>
537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaBuffer.h>
547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaDefs.h>
557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaExtractor.h>
567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaDebug.h>
577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaSource.h>
587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MetaData.h>
597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * SOURCE CLASS
627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundarginamespace android {
647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * ENGINE INTERFACE
667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Array of AMR NB/WB bitrates
717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    Array to match the mode and the bit rate
727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UInt32 VideoEditor3gpReader_AmrBitRate [2 /* 8kHz / 16kHz     */]
757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                   [9 /* the bitrate mode */] =
767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {4750, 5150, 5900,  6700,  7400,  7950,  10200, 12200, 0},
787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {6600, 8850, 12650, 14250, 15850, 18250, 19850, 23050, 23850}
797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi};
807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * structure VideoEditor3gpReader_Context
847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief:This structure defines the context of the StageFright 3GP shell Reader
857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargitypedef struct {
887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<DataSource>              mDataSource;
897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<MediaExtractor>          mExtractor;
907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<MediaSource>             mAudioSource;
917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<MediaSource>             mVideoSource;
927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_StreamHandler*           mAudioStreamHandler;
937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_StreamHandler*           mVideoStreamHandler;
947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_AccessUnit            mAudioAu;
957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_AccessUnit            mVideoAu;
967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Time                  mMaxDuration;
977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t                     mFileSize;
987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_StreamType               mStreamType;
997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32                mStreamId;
1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t                     mTracks;
1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t                     mCurrTrack;
1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Bool                  mAudioSeeking;
1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Time                  mAudioSeekTime;
1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Bool                  mVideoSeeking;
1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Time                  mVideoSeekTime;
1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} VideoEditor3gpReader_Context;
1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef VIDEOEDITOR_BITSTREAM_PARSER
1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * structure    VideoEditor3gpReader_BitStreamParserContext
1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief       Internal BitStreamParser context
1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargitypedef struct {
1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32*   mPbitStream;   /**< bitstream pointer (32bits aligned) */
1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32     mSize;         /**< bitstream size in bytes */
1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32     mIndex;        /**< byte index */
1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32     mBitIndex;     /**< bit index */
1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32     mStructSize;   /**< size of structure */
1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} VideoEditor3gpReader_BitStreamParserContext;
1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Allocates the context and initializes internal data.
1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext    (OUT)  Pointer to the BitStreamParser context to create.
1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   bitStream   A pointer to the bitstream
1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   size        The size of the bitstream in bytes
1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic void VideoEditor3gpReader_BitStreamParserInit(void** pContext,
1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        void* pBitStream, M4OSA_Int32 size) {
1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext;
1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pContext=M4OSA_NULL;
1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext = (VideoEditor3gpReader_BitStreamParserContext*)M4OSA_malloc(
1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sizeof(VideoEditor3gpReader_BitStreamParserContext), M4READER_3GP,
1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Char*)"3GP BitStreamParser Context");
1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4OSA_NULL == pStreamContext) {
1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return;
1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mPbitStream=(M4OSA_UInt32*)pBitStream;
1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mSize=size;
1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mIndex=0;
1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mBitIndex=0;
1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mStructSize =
1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sizeof(VideoEditor3gpReader_BitStreamParserContext);
1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pContext=pStreamContext;
1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi **********************************************************************
1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Clean up context
1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext    (IN/OUT)  BitStreamParser context.
1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi **********************************************************************
1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic void VideoEditor3gpReader_BitStreamParserCleanUp(void* pContext) {
1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_free((M4OSA_Int32*)pContext);
1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *****************************************************************************
1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Read the next <length> bits in the bitstream.
1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    The function does not update the bitstream pointer.
1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext    (IN/OUT) BitStreamParser context.
1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   length      (IN) The number of bits to extract from the bitstream
1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  the read bits
1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *****************************************************************************
1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 VideoEditor3gpReader_BitStreamParserShowBits(void* pContext,
1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int32 length) {
1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 u_mask;
1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 retval;
1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 i_ovf;
1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pStreamContext), 0,
1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_BitStreamParserShowBits:invalid context pointer");
1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    retval=(M4OSA_UInt32)GET_MEMORY32(pStreamContext->\
1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mPbitStream[ pStreamContext->mIndex ]);
1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    i_ovf = pStreamContext->mBitIndex + length - 32;
1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    u_mask = (length >= 32) ? 0xffffffff: (1 << length) - 1;
1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* do we have enough bits availble in the current word(32bits)*/
1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (i_ovf <= 0) {
1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        retval=(retval >> (- i_ovf)) & u_mask;
1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 u_nextword = (M4OSA_UInt32)GET_MEMORY32(
1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pStreamContext->mPbitStream[ pStreamContext->mIndex + 1 ]);
1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 u_msb_mask, u_msb_value, u_lsb_mask, u_lsb_value;
1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u_msb_mask = ((1 << (32 - pStreamContext->mBitIndex)) - 1) << i_ovf;
1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u_msb_value = retval << i_ovf;
1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u_lsb_mask = (1 << i_ovf) - 1;
1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u_lsb_value = u_nextword >> (32 - i_ovf);
1997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        retval= (u_msb_value & u_msb_mask ) | (u_lsb_value & u_lsb_mask);
2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* return the bits...*/
2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return retval;
2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Increment the bitstream pointer of <length> bits.
2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext    (IN/OUT) BitStreamParser context.
2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   length      (IN) The number of bit to shift the bitstream
2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic void VideoEditor3gpReader_BitStreamParserFlushBits(void* pContext,
2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int32 length) {
2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext=(
2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserContext*)pContext;
2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 val;
2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4OSA_NULL == pStreamContext) {
2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return;
2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    val=pStreamContext->mBitIndex + length;
2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* update the bits...*/
2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mBitIndex += length;
2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (val - 32 >= 0) {
2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* update the bits...*/
2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pStreamContext->mBitIndex -= 32;
2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* update the words*/
2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pStreamContext->mIndex++;
2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 VideoEditor3gpReader_BitStreamParserGetBits(
2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        void* pContext,M4OSA_Int32 bitPos, M4OSA_Int32 bitLength) {
2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 bitLocation, bitIndex;
2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 retval=0;
2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pStreamContext), 0,
2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_BitStreamParserGetBits: invalid context pointer");
2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* computes the word location*/
2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    bitLocation=bitPos/32;
2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    bitIndex=(bitPos) % 32;
2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (bitLocation < pStreamContext->mSize) {
2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 u_mask;
2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int32 i_ovf = bitIndex + bitLength - 32;
2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        retval=(M4OSA_UInt32)GET_MEMORY32(
2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pStreamContext->mPbitStream[ bitLocation ]);
2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u_mask = (bitLength >= 32) ? 0xffffffff: (1 << bitLength) - 1;
2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (i_ovf <= 0) {
2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            retval=(retval >> (- i_ovf)) & u_mask;
2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_UInt32 u_nextword = (M4OSA_UInt32)GET_MEMORY32(
2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pStreamContext->mPbitStream[ bitLocation + 1 ]);
2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_UInt32 u_msb_mask, u_msb_value, u_lsb_mask, u_lsb_value;
2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u_msb_mask = ((1 << (32 - bitIndex)) - 1) << i_ovf;
2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u_msb_value = retval << i_ovf;
2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u_lsb_mask = (1 << i_ovf) - 1;
2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u_lsb_value = u_nextword >> (32 - i_ovf);
2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            retval= (u_msb_value & u_msb_mask ) | (u_lsb_value & u_lsb_mask);
2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return retval;
2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic void VideoEditor3gpReader_BitStreamParserRestart(void* pContext) {
2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4OSA_NULL == pStreamContext) {
2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return;
2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* resets the bitstream pointers*/
2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mIndex=0;
2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamContext->mBitIndex=0;
2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief  Get a pointer to the current byte pointed by the bitstream pointer.
2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note   It should be used carefully as the pointer is in the bitstream itself
2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *         and no copy is made.
2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param  pContext    (IN/OUT)  BitStreamParser context.
2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return Pointer to the current location in the bitstream
2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt8*  VideoEditor3gpReader_GetCurrentbitStreamPointer(
2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        void* pContext) {
2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pStreamContext), 0, "invalid context pointer");
2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return (M4OSA_UInt8*)((M4OSA_UInt8*)pStreamContext->mPbitStream + \
2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pStreamContext->mIndex * sizeof(M4OSA_UInt32) + \
3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pStreamContext->mBitIndex/8) ;
3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Int32 VideoEditor3gpReader_BitStreamParserGetSize(void* pContext) {
3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserContext* pStreamContext =
3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (VideoEditor3gpReader_BitStreamParserContext*)pContext;
3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pStreamContext), 0, "invalid context pointer");
3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return pStreamContext->mSize;
3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic void VideoEditor3gpReader_MPEG4BitStreamParserInit(void** pContext,
3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        void* pBitStream, M4OSA_Int32 size) {
3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserInit(pContext, pBitStream, size);
3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Int32 VideoEditor3gpReader_GetMpegLengthFromInteger(void* pContext,
3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 val) {
3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 length=0;
3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 numBytes=0;
3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 b=0;
3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pContext), 0, "invalid context pointer");
3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* the length is encoded as a sequence of bytes. The highest bit is used
3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    to indicate that the length continues on the next byte.
3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    The length can be: 0x80 0x80 0x80 0x22
3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    of just            0x22 (highest bit not set)
3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    */
3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    do {
3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        b=(val & ((0xff)<< (8 * numBytes)))>> (8 * numBytes);
3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        length=(length << 7) | (b & 0x7f);
3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        numBytes++;
3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } while ((b & 0x80) && numBytes < 4);
3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return length;
3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief  Decode an MPEG4 Systems descriptor size from an encoded SDL size data
3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note   The value is read from the current bitstream location.
3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param  pContext    (IN/OUT)  BitStreamParser context.
3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return Size in a human readable form
3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Int32 VideoEditor3gpReader_GetMpegLengthFromStream(void* pContext){
3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 length=0;
3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 numBytes=0;
3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 b=0;
3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL==pContext), 0, "invalid context pointer");
3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* the length is encoded as a sequence of bytes. The highest bit is used
3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    to indicate that the length continues on the next byte.
3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    The length can be: 0x80 0x80 0x80 0x22
3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    of just            0x22 (highest bit not set)
3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    */
3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    do {
3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        b=VideoEditor3gpReader_BitStreamParserShowBits(pContext, 8);
3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pContext, 8);
3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        length=(length << 7) | (b & 0x7f);
3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        numBytes++;
3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } while ((b & 0x80) && numBytes < 4);
3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return length;
3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* VIDEOEDITOR_BITSTREAM_PARSER */
3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    create an instance of the 3gp reader
3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    allocates the context
3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext:       (OUT)   pointer on a reader context
3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR              there is no error
3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_ALLOC             a memory allocation has failed
3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_PARAMETER         at least one parameter is not valid
3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_create(M4OSA_Context *pContext) {
3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = NULL;
3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext , M4ERR_PARAMETER);
3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_create begin");
3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Context allocation & initialization */
3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_MALLOC(pC, VideoEditor3gpReader_Context, 1, "VideoEditor3gpReader");
3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    memset(pC, sizeof(VideoEditor3gpReader_Context), 0);
3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mAudioStreamHandler  = M4OSA_NULL;
3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mAudioAu.dataAddress = M4OSA_NULL;
4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mVideoStreamHandler  = M4OSA_NULL;
4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mVideoAu.dataAddress = M4OSA_NULL;
4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mAudioSeeking = M4OSA_FALSE;
4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mAudioSeekTime = 0;
4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mVideoSeeking = M4OSA_FALSE;
4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mVideoSeekTime = 0;
4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_INT64_FROM_INT32(pC->mMaxDuration, 0);
4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pContext=pC;
4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( M4NO_ERROR == err ) {
4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_create no error");
4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_create ERROR 0x%X", err);
4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_create end ");
4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi**************************************************************************
4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    destroy the instance of the 3gp reader
4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note after this call the context is invalid
4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER         pContext parameter is not properly set
4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi**************************************************************************
4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_destroy(M4OSA_Context pContext) {
4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = M4OSA_NULL;
4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_destroy begin");
4377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pContext, M4ERR_PARAMETER);
4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC = (VideoEditor3gpReader_Context*)pContext;
4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_FREE(pC->mAudioAu.dataAddress);
4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mAudioAu.dataAddress = M4OSA_NULL;
4437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_FREE(pC->mVideoAu.dataAddress);
4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mVideoAu.dataAddress = M4OSA_NULL;
4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_FREE(pC);
4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pContext = M4OSA_NULL;
4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_destroy no error");
4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_destroy ERROR 0x%X", err);
4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_destroy end ");
4587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    open the reader and initializes its created instance
4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note     this function open the media file
4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:            (IN)    Context of the reader
4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pFileDescriptor:    (IN)    Pointer to proprietary data identifying
4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*                                       the media to open
4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR                  there is no error
4697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER             the context is NULL
4707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
4717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_open(M4OSA_Context pContext,
4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Void* pFileDescriptor) {
4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)pContext;
4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_open start ");
4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pC),  M4ERR_PARAMETER,
4807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_open: invalid context pointer");
4817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pFileDescriptor), M4ERR_PARAMETER,
4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_open: invalid pointer pFileDescriptor");
4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_open Datasource start %s",
4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (char*)pFileDescriptor);
4863ad01762633531957174c5b27e71ca4aac45e554Santosh Madhava    //pC->mDataSource = DataSource::CreateFromURI((char*)pFileDescriptor);
4873ad01762633531957174c5b27e71ca4aac45e554Santosh Madhava    pC->mDataSource = new FileSource ((char*)pFileDescriptor);
4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (pC->mDataSource == NULL) {
4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_open Datasource error");
4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_PARAMETER;
4927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mExtractor = MediaExtractor::Create(pC->mDataSource,
4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        MEDIA_MIMETYPE_CONTAINER_MPEG4);
4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (pC->mExtractor == NULL) {
4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_open extractor error");
4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_PARAMETER;
5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_open end ");
5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
5077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    close the reader
5097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note     close the 3GP file
5107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
5117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
5127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER         the context is NULL
5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_BAD_CONTEXT       provided context is not a valid one
5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_close(M4OSA_Context context) {
5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context *pC = (VideoEditor3gpReader_Context*)context;
5187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4READER_AudioSbrUserdata *pAudioSbrUserData;
5197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_AccessUnit *pAU;
5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_close begin");
5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_close: invalid context pointer");
5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (pC->mAudioStreamHandler) {
5287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_close Audio");
5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (M4OSA_NULL != pC->mAudioStreamHandler->m_pDecoderSpecificInfo) {
5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_free((M4OSA_MemAddr32)pC->mAudioStreamHandler->\
5327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_pDecoderSpecificInfo);
5337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioStreamHandler->m_decoderSpecificInfoSize = 0;
5347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioStreamHandler->m_pDecoderSpecificInfo = M4OSA_NULL;
5357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if ((M4DA_StreamTypeAudioAac == pC->mAudioStreamHandler->m_streamType)
5387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            && (M4OSA_NULL != pC->mAudioStreamHandler->m_pUserData)) {
5397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAudioSbrUserData = (M4READER_AudioSbrUserdata*)(\
5407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mAudioStreamHandler->m_pUserData);
5417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAU = (M4_AccessUnit*)pAudioSbrUserData->m_pFirstAU;
5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4OSA_NULL != pAU) {
5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_free((M4OSA_MemAddr32)pAU);
5457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4OSA_NULL != pAudioSbrUserData->m_pAacDecoderUserConfig) {
5487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_free((M4OSA_MemAddr32)pAudioSbrUserData->\
5497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    m_pAacDecoderUserConfig);
5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_free((M4OSA_MemAddr32)pAudioSbrUserData);
5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioStreamHandler->m_pUserData = M4OSA_NULL;
5537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (pC->mAudioStreamHandler->m_pESDSInfo != M4OSA_NULL) {
5567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_free((M4OSA_MemAddr32)pC->mAudioStreamHandler->m_pESDSInfo);
5577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioStreamHandler->m_pESDSInfo = M4OSA_NULL;
5587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioStreamHandler->m_ESDSInfoSize = 0;
5597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Finally destroy the stream handler */
5617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_free((M4OSA_MemAddr32)pC->mAudioStreamHandler);
5627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mAudioStreamHandler = M4OSA_NULL;
5637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mAudioSource->stop();
5657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mAudioSource.clear();
5667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (pC->mVideoStreamHandler) {
5687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_close Video ");
5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(M4OSA_NULL != pC->mVideoStreamHandler->m_pDecoderSpecificInfo) {
5717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_free((M4OSA_MemAddr32)pC->mVideoStreamHandler->\
5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_pDecoderSpecificInfo);
5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoStreamHandler->m_decoderSpecificInfoSize = 0;
5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoStreamHandler->m_pDecoderSpecificInfo = M4OSA_NULL;
5757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(M4OSA_NULL != pC->mVideoStreamHandler->m_pH264DecoderSpecificInfo) {
5787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_free((M4OSA_MemAddr32)pC->mVideoStreamHandler->\
5797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_pH264DecoderSpecificInfo);
5807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoStreamHandler->m_H264decoderSpecificInfoSize = 0;
5817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoStreamHandler->m_pH264DecoderSpecificInfo = M4OSA_NULL;
5827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(pC->mVideoStreamHandler->m_pESDSInfo != M4OSA_NULL) {
5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_free((M4OSA_MemAddr32)pC->mVideoStreamHandler->m_pESDSInfo);
5867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoStreamHandler->m_pESDSInfo = M4OSA_NULL;
5877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoStreamHandler->m_ESDSInfoSize = 0;
5887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Finally destroy the stream handler */
5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_free((M4OSA_MemAddr32)pC->mVideoStreamHandler);
5927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mVideoStreamHandler = M4OSA_NULL;
5937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mVideoSource->stop();
5957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mVideoSource.clear();
5967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5973ad01762633531957174c5b27e71ca4aac45e554Santosh Madhava    pC->mExtractor.clear();
5987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mDataSource.clear();
5997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_close end");
6017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
6027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
6037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
6057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    get an option from the 3gp reader
6077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note     it allows the caller to retrieve a property value:
6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*
6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
6107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    optionId:       (IN)    indicates the option to get
6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pValue:         (OUT)   pointer to structure or value (allocated
6127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*                                   by user) where option is stored
6137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*
6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_BAD_CONTEXT       provided context is not a valid one
6167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER         at least one parameter is not properly set
6177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_BAD_OPTION_ID     when the option ID is not a valid one
6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_VIDEO_NOT_H263    No video stream H263 in file.
6197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_NO_VIDEO_STREAM_RETRIEVED_YET
6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*           Function 3gpReader_getNextStreamHandler must be called before
6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getOption(M4OSA_Context context,
6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_OptionID optionId, M4OSA_DataOption pValue) {
6257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getOption begin %d", optionId);
6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "invalid context pointer");
6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pValue), M4ERR_PARAMETER,
6337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getOption: invalid pointer on value");
6347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch (optionId) {
6367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_Duration:
6377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
6387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getOption duration %d",pC->mMaxDuration);
6397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TIME_SET(*(M4OSA_Time*)pValue, pC->mMaxDuration);
6407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
6417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
6427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_Version:
6437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
6447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getOption: M4READER_kOptionID_Version");
6457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
6467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_Copyright:
6487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
6497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV(">>>>>>>   M4READER_kOptionID_Copyright");
6507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
6517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_CreationTime:
6537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
6547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_CreationTime");
6557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    break;
6567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_Bitrate:
6587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
6597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_UInt32* pBitrate = (M4OSA_UInt32*)pValue;
6607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (pC->mMaxDuration != 0) {
6627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt32 ui32Tmp = (M4OSA_UInt32)pC->mMaxDuration;
6637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *pBitrate = (M4OSA_UInt32)((M4OSA_Double)pC->mFileSize * \
6647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    8000.0 / (M4OSA_Double)ui32Tmp);
6657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("3gpReader_getOption bitrate:  %d", *pBitrate);
6667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
6677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pBitrate = 384000; //check
6687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getOption bitrate %ld", *pBitrate);
6697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
6707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    break;
6717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_3GP_kOptionID_H263Properties:
6727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
6737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#if 0
6747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(M4OSA_NULL == pC->mVideoStreamHandler) {
6757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("VideoEditor3gpReader_getOption no videoStream retrieved");
6767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4ERR_NO_VIDEO_STREAM_RETRIEVED_YET;
6787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
6797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
6807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if((M4DA_StreamTypeVideoH263 != pC->mVideoStreamHandler->\
6817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                mStreamType) || (pC->mVideoStreamHandler->\
6827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_decoderSpecificInfoSize < 7)) {
6837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("VideoEditor3gpReader_getOption DSI Size %d",
6847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->mVideoStreamHandler->m_decoderSpecificInfoSize);
6857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4ERR_VIDEO_NOT_H263;
6877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
6887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
6897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* MAGICAL in the decoder confi H263: the 7th byte is the profile
6917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * number, 6th byte is the level number */
6927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ((M4READER_3GP_H263Properties *)pValue)->uiProfile =
6937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mVideoStreamHandler->m_pDecoderSpecificInfo[6];
6947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ((M4READER_3GP_H263Properties *)pValue)->uiLevel =
6957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mVideoStreamHandler->m_pDecoderSpecificInfo[5];
6967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
6977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getOption M4READER_3GP_kOptionID_\
6987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            H263Properties end");
6997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
7007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_3GP_kOptionID_PurpleLabsDrm:
7027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReaderOption M4READER_3GP_kOptionID_PurpleLabsDrm");
7037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
7047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_GetNumberOfAudioAu:
7077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
7087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReadeOption M4READER_kOptionID_GetNumberOfAudioAu");
7097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    break;
7107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_GetNumberOfVideoAu:
7127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
7137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getOption :GetNumberOfVideoAu");
7147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    break;
7157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_GetMetadata:
7177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
7187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_GetMetadata");
7197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    break;
7207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_kOptionID_3gpFtypBox:
7227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* used only for SEMC */
7237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getOption M4READER_kOptionID_3gpFtypBox");
7247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4ERR_BAD_OPTION_ID; //check this
7257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef OPTIONID_GET_NEXT_VIDEO_CTS
7287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    case M4READER_3GP_kOptionID_getNextVideoCTS:
7297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* not used */
7307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getOption: getNextVideoCTS");
7317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
7337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    default:
7347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
7357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4ERR_BAD_OPTION_ID;
7367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getOption M4ERR_BAD_OPTION_ID");
7377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
7387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getOption end: optionID: x%x", optionId);
7417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
7427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
7437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
7447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
7457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    set an option on the 3gp reader
7467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note No option can be set yet.
7477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
7487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    optionId:       (IN)    indicates the option to set
7497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pValue:         (IN)    pointer to structure or value (allocated
7507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*                                   by user) where option is stored
7517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
7527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_BAD_CONTEXT       provided context is not a valid one
7537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER         at least one parameter is not properly set
7547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_BAD_OPTION_ID     when the option ID is not a valid one
7557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi************************************************************************
7567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
7577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_setOption(M4OSA_Context context,
7587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_OptionID optionId, M4OSA_DataOption pValue) {
7597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
7607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
7617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check function parameters */
7637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
7647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "invalid context pointer");
7657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((M4OSA_NULL == pValue), M4ERR_PARAMETER,
7667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "invalid value pointer");
7677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_setOption begin %d",optionId);
7697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch(optionId) {
7717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4READER_kOptionID_SetOsaFileReaderFctsPtr:
7727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4READER_3GP_kOptionID_AudioOnly:
7757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4READER_3GP_kOptionID_VideoOnly:
7787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4READER_3GP_kOptionID_FastOpenMode:
7817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4READER_kOptionID_MaxMetadataSize:
7847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
7877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
7887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditor3gpReader_setOption: returns M4ERR_BAD_OPTION_ID");
7897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4ERR_BAD_OPTION_ID;
7907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
7917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        break;
7927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_setOption end ");
7947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
7957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
7967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
7977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
7987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   fill the access unit structure with initialization values
7997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   context:        (IN)     Context of the reader
8007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pStreamHandler: (IN)     pointer to the stream handler to which
8017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                   the access unit will be associated
8027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pAccessUnit:    (IN/OUT) pointer to the access unit (allocated
8037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                   by the caller) to initialize
8047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR               there is no error
8057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_PARAMETER          at least one parameter is not properly set
8067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
8077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
8087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_fillAuStruct(M4OSA_Context context,
8097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_StreamHandler *pStreamHandler, M4_AccessUnit *pAccessUnit) {
8107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
8117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err= M4NO_ERROR;
8127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0),             M4ERR_PARAMETER,
8147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_fillAuStruct: invalid context");
8157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
8167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_fillAuStruc invalid pointer to M4_StreamHandler");
8177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pAccessUnit == 0),    M4ERR_PARAMETER,
8187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_fillAuStruct: invalid pointer to M4_AccessUnit");
8197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_fillAuStruct begin");
8217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Initialize pAccessUnit structure */
8237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_size         = 0;
8247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_CTS          = 0;
8257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_DTS          = 0;
8267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_attribute    = 0;
8277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_dataAddress  = M4OSA_NULL;
8287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_maxsize      = pStreamHandler->m_maxAUSize;
8297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_streamID     = pStreamHandler->m_streamId;
8307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAccessUnit->m_structSize   = sizeof(M4_AccessUnit);
8317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_fillAuStruct end");
8337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
8347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
8357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
8377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
8387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    jump into the stream at the specified time
8397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note
8407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:        (IN)   Context of the reader
8417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pStreamHandler  (IN)   the stream handler of the stream to make jump
8427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pTime           (I/O)IN  the time to jump to (in ms)
8437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*                                OUT the time to which the stream really jumped
8447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR             there is no error
8457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER        at least one parameter is not properly set
8467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
8477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
8487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_jump(M4OSA_Context context,
8497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_StreamHandler *pStreamHandler, M4OSA_Int32* pTime) {
8507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
8517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
8527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_AccessUnit* pAu;
8537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Time time64;
8547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Double timeDouble;
8557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER,
8577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_jump: invalid context");
8587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
8597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_jump: invalid pointer to M4_StreamHandler");
8607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pTime == 0), M4ERR_PARAMETER,
8617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_jump: invalid time pointer");
8627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_jump begin");
8647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (*pTime == (pStreamHandler->m_duration)) {
86613ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru        *pTime -= 1;
86713ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru    }
8687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_INT64_FROM_INT32(time64, *pTime);
8697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_jump time us %ld ", time64);
8717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ((pC->mAudioStreamHandler != M4OSA_NULL) &&
8737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (pStreamHandler->m_streamId == pC->mAudioStreamHandler->m_streamId))
8747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
8757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu = &pC->mAudioAu;
8767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->CTS = time64;
8777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->DTS = time64;
8787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        time64 = time64 * 1000; /* Convert the time into micro sec */
8807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mAudioSeeking = M4OSA_TRUE;
8817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mAudioSeekTime = time64;
8827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_jump AUDIO time us %ld ", time64);
8837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else if ((pC->mVideoStreamHandler != M4OSA_NULL) &&
8847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (pStreamHandler->m_streamId == pC->mVideoStreamHandler->m_streamId))
8857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
8867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu = &pC->mVideoAu;
8877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->CTS = time64;
8887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->DTS = time64;
8897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        time64 = time64 * 1000; /* Convert the time into micro sec */
8917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mVideoSeeking = M4OSA_TRUE;
8927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mVideoSeekTime = time64;
8937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_jump VIDEO time us %ld ", time64);
8947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
8957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_jump passed StreamHandler is not known\n");
8967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_PARAMETER;
8977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
8987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    time64 = time64 / 1000; /* Convert the time into milli sec */
8997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_jump time ms before seekset %ld ", time64);
9007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_INT64_TO_DOUBLE(timeDouble, time64);
9027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pTime = (M4OSA_Int32)timeDouble;
9037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_jump end");
9057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4NO_ERROR;
9067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
9077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
9087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
9097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
9107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    reset the stream, that is seek it to beginning and make it ready
9117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note
9127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:        (IN)    Context of the reader
9137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pStreamHandler  (IN)    The stream handler of the stream to reset
9147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
9157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER         at least one parameter is not properly set
9167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
9177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
9187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_reset(M4OSA_Context context,
9197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_StreamHandler *pStreamHandler) {
9207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC = (VideoEditor3gpReader_Context*)context;
9217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
9227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_StreamID streamIdArray[2];
9237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_AccessUnit* pAu;
9247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Time time64;
9257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER,
9277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_reset: invalid context");
9287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
9297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_reset: invalid pointer to M4_StreamHandler");
9307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_INT64_FROM_INT32(time64, 0);
9327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_reset begin");
9347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (pStreamHandler == (M4_StreamHandler*)pC->mAudioStreamHandler) {
9367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu = &pC->mAudioAu;
9377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else if (pStreamHandler == (M4_StreamHandler*)pC->mVideoStreamHandler) {
9387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu = &pC->mVideoAu;
9397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
9407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_reset passed StreamHandler is not known\n");
9417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_PARAMETER;
9427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
9437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAu->CTS = time64;
9457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAu->DTS = time64;
9467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_reset end");
9487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
9497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
9507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
9527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
9537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief  Gets an access unit (AU) from the stream handler source.
9547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note   An AU is the smallest possible amount of data to be decoded by decoder
9557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*
9567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:        (IN) Context of the reader
9577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pStreamHandler  (IN) The stream handler of the stream to make jump
9587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pAccessUnit     (IO) Pointer to access unit to fill with read data
9597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR           there is no error
9607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER      at least one parameter is not properly set
9617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @returns  M4ERR_ALLOC          memory allocation failed
9627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @returns  M4WAR_NO_MORE_AU     there are no more access unit in the stream
9637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
9647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
9657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getNextAu(M4OSA_Context context,
9667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_StreamHandler *pStreamHandler, M4_AccessUnit *pAccessUnit) {
9677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC=(VideoEditor3gpReader_Context*)context;
9687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
9697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_AccessUnit* pAu;
9707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int64_t tempTime64 = 0;
9717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBuffer *mMediaBuffer = NULL;
9727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaSource::ReadOptions options;
9737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Bool flag = M4OSA_FALSE;
9747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t error;
97513ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru    int32_t i32Tmp = 0;
9767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pReaderContext == 0), M4ERR_PARAMETER,
9787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getNextAu: invalid context");
9797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
9807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getNextAu: invalid pointer to M4_StreamHandler");
9817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pAccessUnit == 0),    M4ERR_PARAMETER,
9827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getNextAu: invalid pointer to M4_AccessUnit");
9837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getNextAu begin");
9857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (pStreamHandler == (M4_StreamHandler*)pC->mAudioStreamHandler) {
9877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getNextAu audio stream");
9887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu = &pC->mAudioAu;
9897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (pC->mAudioSeeking == M4OSA_TRUE) {
9907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getNextAu audio seek time: %ld",
9917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mAudioSeekTime);
9927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            options.setSeekTo(pC->mAudioSeekTime);
9937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioSource->read(&mMediaBuffer, &options);
9947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mMediaBuffer->meta_data()->findInt64(kKeyTime,
9967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (int64_t*)&tempTime64);
9977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            options.clearSeekTo();
9987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioSeeking = M4OSA_FALSE;
9997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            flag = M4OSA_TRUE;
10007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
10017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getNextAu audio no seek:");
10027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioSource->read(&mMediaBuffer, &options);
10037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (mMediaBuffer != NULL) {
10047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                mMediaBuffer->meta_data()->findInt64(kKeyTime,
10057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (int64_t*)&tempTime64);
10067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
10077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
10087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else if (pStreamHandler == (M4_StreamHandler*)pC->mVideoStreamHandler) {
10097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getNextAu video steram ");
10107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu = &pC->mVideoAu;
10117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(pC->mVideoSeeking == M4OSA_TRUE) {
10127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            flag = M4OSA_TRUE;
10137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getNextAu seek: %ld",pC->mVideoSeekTime);
10147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            options.setSeekTo(pC->mVideoSeekTime,
10157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC);
10167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            do
10177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
10187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if (mMediaBuffer != NULL) {
10197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    LOGV("VideoEditor3gpReader_getNextAu free the MediaBuffer");
10207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    mMediaBuffer->release();
10217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
10227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                error = pC->mVideoSource->read(&mMediaBuffer, &options);
10237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("VE3gpReader_getNextAu MediaBuffer %x , error %d",
10247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    mMediaBuffer, error);
10257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if (mMediaBuffer != NULL)
10267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
102713ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                    if (mMediaBuffer->meta_data()->findInt32(kKeyIsSyncFrame,
102813ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                        &i32Tmp) && i32Tmp) {
102913ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                            LOGV("SYNC FRAME FOUND--%d", i32Tmp);
103013ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                        pAu->attribute = AU_RAP;
103113ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                    }
1032733100524deb5d2da77ac52a2ff89b2cde242934Dheeraj Sharma                    else {
1033733100524deb5d2da77ac52a2ff89b2cde242934Dheeraj Sharma                        pAu->attribute = AU_P_Frame;
1034733100524deb5d2da77ac52a2ff89b2cde242934Dheeraj Sharma                    }
10357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    mMediaBuffer->meta_data()->findInt64(kKeyTime,
10367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (int64_t*)&tempTime64);
10377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                } else {
10387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
10397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
10407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                options.clearSeekTo();
10417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } while(tempTime64 < pC->mVideoSeekTime);
10427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VE3gpReader_getNextAu: video  time with seek  = %lld:",
10447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                tempTime64);
10457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoSeeking = M4OSA_FALSE;
10467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
10477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getNextAu video no seek:");
10487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoSource->read(&mMediaBuffer, &options);
10497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(mMediaBuffer != NULL) {
105113ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                if (mMediaBuffer->meta_data()->findInt32(kKeyIsSyncFrame,
105213ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                    &i32Tmp) && i32Tmp) {
105313ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                    LOGV("SYNC FRAME FOUND--%d", i32Tmp);
105413ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                    pAu->attribute = AU_RAP;
105513ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru                }
1056733100524deb5d2da77ac52a2ff89b2cde242934Dheeraj Sharma                else {
1057733100524deb5d2da77ac52a2ff89b2cde242934Dheeraj Sharma                    pAu->attribute = AU_P_Frame;
1058733100524deb5d2da77ac52a2ff89b2cde242934Dheeraj Sharma                }
10597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                mMediaBuffer->meta_data()->findInt64(kKeyTime,
10607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (int64_t*)&tempTime64);
10617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("VE3gpReader_getNextAu: video no seek time = %lld:",
10627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    tempTime64);
10637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }else {
10647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("VE3gpReader_getNextAu:video no seek time buffer is NULL");
10657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
10667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
10677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
10687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getNextAu M4ERR_PARAMETER");
10697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_PARAMETER;
10707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
10717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (mMediaBuffer != NULL) {
10737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (pAu->dataAddress == NULL) ||  (pAu->size < \
10747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mMediaBuffer->range_length())) {
10757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(pAu->dataAddress != NULL) {
10767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_free((M4OSA_Int32*)pAu->dataAddress);
10777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAu->dataAddress = NULL;
10787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
10797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("Buffer lenght = %d ,%d",(mMediaBuffer->range_length() +\
10807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                3) & ~0x3,(mMediaBuffer->range_length()));
10817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAu->dataAddress = (M4OSA_Int32*)M4OSA_malloc(
10837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (mMediaBuffer->range_length() + 3) & ~0x3,M4READER_3GP,
10847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Char*)"pAccessUnit->m_dataAddress" );
10857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(pAu->dataAddress == NULL) {
10867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("VideoEditor3gpReader_getNextAu malloc failed");
10877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4ERR_ALLOC;
10887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
10897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
10907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->size = mMediaBuffer->range_length();
10917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        memcpy((M4OSA_MemAddr8)pAu->dataAddress,
10937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (const char *)mMediaBuffer->data() + mMediaBuffer->range_offset(),
10947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mMediaBuffer->range_length());
10957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (pStreamHandler == (M4_StreamHandler*)pC->mVideoStreamHandler)  &&
10977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (pStreamHandler->m_streamType == M4DA_StreamTypeVideoMpeg4Avc) ) {
10987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_UInt32 size = mMediaBuffer->range_length();
10997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_UInt8 *lbuffer;
11007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lbuffer = (M4OSA_UInt8 *) pAu->dataAddress;
11027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("pAccessUnit->m_dataAddress size = %x",size);
11037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lbuffer[0] = (size >> 24) & 0xFF;
11057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lbuffer[1] = (size >> 16) & 0xFF;
11067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lbuffer[2] = (size >> 8) & 0xFF;
11077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lbuffer[3] = (size) & 0xFF;
11087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
11097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->CTS = tempTime64;
11117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->CTS = pAu->CTS / 1000; //converting the microsec to millisec
11137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getNextAu CTS = %ld",pAu->CTS);
11147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAu->DTS  = pAu->CTS;
111613ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru        if (pStreamHandler == (M4_StreamHandler*)pC->mAudioStreamHandler) {
111713ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru            pAu->attribute = M4SYS_kFragAttrOk;
111813ecfb62545e521f807239864dc74ca1c295e3faBasavapatna Dattaguru        }
11197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mMediaBuffer->release();
11207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAccessUnit->m_dataAddress = (M4OSA_Int8*) pAu->dataAddress;
11227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAccessUnit->m_size = pAu->size;
11237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAccessUnit->m_maxsize = pAu->size;
11247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAccessUnit->m_CTS = pAu->CTS;
11257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAccessUnit->m_DTS = pAu->DTS;
11267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAccessUnit->m_attribute = pAu->attribute;
11277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
11297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getNextAu: M4WAR_NO_MORE_AU (EOS) reached");
11307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pAccessUnit->m_size = 0;
11317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4WAR_NO_MORE_AU;
11327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
11337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    options.clearSeekTo();
11347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pAu->nbFrag = 0;
11367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mMediaBuffer = NULL;
11377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getNextAu end ");
11387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
11407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
11417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
11427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
11437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Split the AVC DSI in its different components and write it in
11447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          ONE memory buffer
11457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
11467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pStreamHandler:         (IN/OUT) The MPEG4-AVC stream
11477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pDecoderConfigLocal:    (IN) The DSI buffer
11487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   decoderConfigSizeLocal: (IN) The DSI buffer size
11497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR              there is no error
11507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  ERR_FILE_SYNTAX_ERROR   pDecoderConfigLocal is NULL
11517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *******************************************************************************
11527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
11537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR VideoEditor3gpReader_AnalyseAvcDsi(
11547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_StreamHandler *pStreamHandler, M4OSA_Int32* pDecoderConfigLocal,
11557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int32 decoderConfigSizeLocal) {
11567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    struct _avcSpecificInfo *pAvcSpecInfo = M4OSA_NULL;
11577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 uiSpecInfoSize;
11587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Context pBitParserContext = M4OSA_NULL;
11597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_MemAddr8 pPos;
11607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
11627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * First parsing to get the total allocation size (we must not do
11637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * multiple malloc, but only one instead) */
11647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
11657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int32 val;
11667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 i,j;
11677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt8 nalUnitLength;
11687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt8  numOfSequenceParameterSets;
11697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 uiTotalSizeOfSPS = 0;
11707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt8  numOfPictureParameterSets;
11717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 uiTotalSizeOfPPS = 0;
11727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 uiSize;
11737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        struct _avcSpecificInfo avcSpIf;
11747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        avcSpIf.m_nalUnitLength = 0;
11767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (M4OSA_NULL == pDecoderConfigLocal) {
11787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_READER3GP_DECODER_CONFIG_ERROR;
11797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
11807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_MPEG4BitStreamParserInit(&pBitParserContext,
11827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderConfigLocal, decoderConfigSizeLocal);
11837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (M4OSA_NULL == pBitParserContext) {
11857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
11867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
11877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
11897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                       /* 8 bits -- configuration version */
11907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
11917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                       /* 8 bits -- avc profile indication*/
11927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
11937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                       /* 8 bits -- profile compatibility */
11947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
11957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                       /* 8 bits -- avc level indication*/
11967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        val=VideoEditor3gpReader_BitStreamParserShowBits(pBitParserContext, 8);
11977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                       /* 6 bits reserved 111111b 2 bits length Size minus one*/
11987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
11997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                       /* m_nalUnitLength */
12007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nalUnitLength = (M4OSA_UInt8)((val & 0x03) + 1);/*0b11111100*/
12027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (nalUnitLength > 4) {
12037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pStreamHandler->m_decoderSpecificInfoSize = 0;
12047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pStreamHandler->m_pDecoderSpecificInfo = M4OSA_NULL;
12057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
12067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
12077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
12087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * SPS table */
12097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            val=VideoEditor3gpReader_BitStreamParserShowBits(pBitParserContext,
12107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            8);/* 3 bits-reserved 111b-5 bits number of sequence parameter set*/
12117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            numOfSequenceParameterSets = val & 0x1F;
12127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*1F instead of E0*/ /*0b11100000*/ /*Number of seq parameter sets*/
12137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
12147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            for (i=0; i < numOfSequenceParameterSets; i++) {
12157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
12167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * Get the size of this element */
12177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                uiSize =
12187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_UInt32)VideoEditor3gpReader_BitStreamParserShowBits(
12197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 16);
12207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                uiTotalSizeOfSPS += uiSize;
12217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserFlushBits(
12227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 16);
12237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
12247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 *Read the element(dont keep it, we only want size right now) */
12257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                for (j=0; j<uiSize; j++) {
12267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    VideoEditor3gpReader_BitStreamParserFlushBits(
12277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pBitParserContext, 8);
12287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
12297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
12307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
12327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * SPS table */
12337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            numOfPictureParameterSets=(M4OSA_UInt8)\
12347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserShowBits(pBitParserContext,
12357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    8);
12367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
12377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            for (i=0; i < numOfPictureParameterSets; i++) {
12387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
12397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * Get the size of this element */
12407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                uiSize = (M4OSA_UInt32)
12417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    VideoEditor3gpReader_BitStreamParserShowBits(
12427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 16);
12437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                uiTotalSizeOfPPS += uiSize;
12447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserFlushBits(
12457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 16);
12467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
12477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 *Read the element(dont keep it,we only want size right now)*/
12487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                for (j=0; j<uiSize; j++) {
12497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    VideoEditor3gpReader_BitStreamParserFlushBits(
12507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pBitParserContext, 8);
12517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
12527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
12537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
12557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * Compute the size of the full buffer */
12567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            uiSpecInfoSize = sizeof(struct _avcSpecificInfo) +
12577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     numOfSequenceParameterSets * sizeof(struct _parameterSet)
12587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     + /**< size of the table of SPS elements */
12597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     numOfPictureParameterSets  * sizeof(struct _parameterSet)
12607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     + /**< size of the table of PPS elements */
12617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     uiTotalSizeOfSPS +
12627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     uiTotalSizeOfPPS;
12637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
12647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * Allocate the buffer */
12657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo =(struct _avcSpecificInfo*)M4OSA_malloc(uiSpecInfoSize,
12667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4READER_3GP, (M4OSA_Char*)"MPEG-4 AVC DecoderSpecific");
12677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4OSA_NULL == pAvcSpecInfo) {
12687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
12697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4ERR_ALLOC;
12707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
12717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
12737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * Set the pointers to the correct part of the buffer */
12747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_nalUnitLength = nalUnitLength;
12757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_numOfSequenceParameterSets =
12767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                numOfSequenceParameterSets;
12777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_numOfPictureParameterSets  =
12787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                numOfPictureParameterSets;
12797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* We place the SPS param sets table after m_pPictureParameterSet */
12817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_pSequenceParameterSet= (struct _parameterSet*)(
12827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_MemAddr8)(&pAvcSpecInfo->m_pPictureParameterSet) +
12837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                sizeof(pAvcSpecInfo->m_pPictureParameterSet));
12847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*We place the PPS param sets table after the SPS param sets table*/
12857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_pPictureParameterSet = (struct _parameterSet*)(
12867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_MemAddr8)(pAvcSpecInfo->m_pSequenceParameterSet) +
12877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (numOfSequenceParameterSets * sizeof(struct _parameterSet)));
12887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< The data will be placed after the PPS param sets table */
12897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPos = (M4OSA_MemAddr8)pAvcSpecInfo->m_pPictureParameterSet +
12907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (numOfPictureParameterSets * sizeof(struct _parameterSet));
12917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
12937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * reset the bit parser */
12947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
12957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
12967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
12977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
12997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * Second parsing to copy the data */
13007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4OSA_NULL != pAvcSpecInfo) {
13017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int32 i,j;
13027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_MPEG4BitStreamParserInit(&pBitParserContext,
13047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDecoderConfigLocal, decoderConfigSizeLocal);
13057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (M4OSA_NULL == pBitParserContext) {
13077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_free((M4OSA_MemAddr32)pAvcSpecInfo);
13087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
13097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
13107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* 8 bits -- configuration version */
13137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* 8 bits -- avc profile indication*/
13157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* 8 bits -- profile compatibility */
13177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* 8 bits -- avc level indication*/
13197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* m_nalUnitLength */
13217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* 3 bits -- reserved 111b -- 5 bits number of sequence parameter set*/
13237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        for (i=0; i < pAvcSpecInfo->m_numOfSequenceParameterSets; i++) {
13257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_pSequenceParameterSet[i].m_length =
13267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt16)VideoEditor3gpReader_BitStreamParserShowBits(
13277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pBitParserContext, 16);
13287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext,16);
13297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_pSequenceParameterSet[i].m_pParameterSetUnit =
13317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt8*)pPos;  /**< current position in the buffer */
13327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPos += pAvcSpecInfo->m_pSequenceParameterSet[i].m_length;
13337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**< increment the position in the buffer */
13347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            for (j=0; j<pAvcSpecInfo->m_pSequenceParameterSet[i].m_length;j++){
13357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAvcSpecInfo->m_pSequenceParameterSet[i].m_pParameterSetUnit[j]=
13367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_UInt8)VideoEditor3gpReader_BitStreamParserShowBits(
13377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 8);
13387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserFlushBits(
13397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 8);
13407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
13417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
13427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext, 8);
13447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* number of pîcture parameter set*/
13457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        for (i=0; i < pAvcSpecInfo->m_numOfPictureParameterSets; i++) {
13477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_pPictureParameterSet[i].m_length =
13487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt16)VideoEditor3gpReader_BitStreamParserShowBits(
13497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pBitParserContext, 16);
13507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            VideoEditor3gpReader_BitStreamParserFlushBits(pBitParserContext,16);
13517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAvcSpecInfo->m_pPictureParameterSet[i].m_pParameterSetUnit =
13537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt8*)pPos;   /**< current position in the buffer */
13547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPos += pAvcSpecInfo->m_pPictureParameterSet[i].m_length;
13557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**< increment the position in the buffer */
13567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            for (j=0; j<pAvcSpecInfo->m_pPictureParameterSet[i].m_length; j++) {
13577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAvcSpecInfo->m_pPictureParameterSet[i].m_pParameterSetUnit[j] =
13587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_UInt8)VideoEditor3gpReader_BitStreamParserShowBits(
13597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 8);
13607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                VideoEditor3gpReader_BitStreamParserFlushBits(
13617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pBitParserContext, 8);
13627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
13637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
13647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
13657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pStreamHandler->m_decoderSpecificInfoSize = uiSpecInfoSize;
13667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pStreamHandler->m_pDecoderSpecificInfo = (M4OSA_UInt8*)pAvcSpecInfo;
13677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
13687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamHandler->m_H264decoderSpecificInfoSize  =  decoderConfigSizeLocal;
13697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pStreamHandler->m_pH264DecoderSpecificInfo  = (M4OSA_UInt8*)M4OSA_malloc(
13707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        decoderConfigSizeLocal, M4READER_3GP,
13717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Char*)"MPEG-4 AVC DecoderSpecific");
13727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4OSA_NULL == pStreamHandler->m_pH264DecoderSpecificInfo) {
13737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        goto cleanup;
13747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
13757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_memcpy((M4OSA_MemAddr8 ) pStreamHandler->m_pH264DecoderSpecificInfo,
13777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_MemAddr8 )pDecoderConfigLocal,
13787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pStreamHandler->m_H264decoderSpecificInfoSize);
13797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
13807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargicleanup:
13817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_BitStreamParserCleanUp(pBitParserContext);
13827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4ERR_READER3GP_DECODER_CONFIG_ERROR;
13837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
13847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
13857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
13867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief    Get the next stream found in the 3gp file
13877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @note
13887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    context:     (IN)    Context of the reader
13897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pMediaFamily: OUT)   pointer to a user allocated
13907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*                                M4READER_MediaFamily that will be filled
13917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*                                with the media family of the found stream
13927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @param    pStreamHandler:(OUT) pointer to StreamHandler that will be allocated
13937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*                                and filled with the found stream description
13947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4NO_ERROR              there is no error
13957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_BAD_CONTEXT       provided context is not a valid one
13967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4ERR_PARAMETER         at least one parameter is not properly set
13977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @return   M4WAR_NO_MORE_STREAM    no more available stream in the media
13987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi********************************************************************************
13997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
14007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getNextStreamHandler(M4OSA_Context context,
14017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4READER_MediaFamily *pMediaFamily,
14027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_StreamHandler **pStreamHandler) {
14037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context* pC=(VideoEditor3gpReader_Context*)context;
14047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
14057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_StreamID streamIdArray[2];
14067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_StreamDescription streamDesc;
14077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_AudioStreamHandler* pAudioStreamHandler;
14087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_VideoStreamHandler* pVideoStreamHandler;
14097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int8 *DecoderSpecificInfo = M4OSA_NULL;
14107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 decoderSpecificInfoSize =0, maxAUSize = 0;
14117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_StreamType streamType = M4DA_StreamTypeUnknown;
14137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 temp, i, trackCount;
14147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Bool haveAudio = M4OSA_FALSE;
14157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Bool haveVideo = M4OSA_FALSE;
14167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sp<MetaData> meta  = NULL;
14177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int64_t Duration = 0;
14187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8* DecoderSpecific = M4OSA_NULL ;
14197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint32_t type;
14207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    const void *data;
14217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    size_t size;
14227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    const void *codec_specific_data;
14237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    size_t codec_specific_data_size;
14247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32  ptempTime;
1425d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru    M4OSA_Int32  avgFPS=0;
14267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getNextStreamHandler begin");
14287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER,
14307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getNextStreamHandler: invalid context");
14317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pMediaFamily   == 0), M4ERR_PARAMETER,
14327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "getNextStreamHandler: invalid pointer to MediaFamily");
14337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
14347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "getNextStreamHandler: invalid pointer to StreamHandler");
14357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    trackCount = pC->mExtractor->countTracks();
14377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    temp = pC->mCurrTrack;
14387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(temp >= trackCount) {
14407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getNextStreamHandler error = %d",
14417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4WAR_NO_MORE_STREAM);
14427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return (M4WAR_NO_MORE_STREAM);
14437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
14447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        const char *mime;
14457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        meta = pC->mExtractor->getTrackMetaData(temp);
14467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        CHECK(meta->findCString(kKeyMIMEType, &mime));
14477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (!haveVideo && !strncasecmp(mime, "video/", 6)) {
14497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoSource = pC->mExtractor->getTrack(temp);
14507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mVideoSource->start();
14517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pMediaFamily = M4READER_kMediaFamilyVideo;
14537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            haveVideo = true;
14547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getNextStreamHandler getTrack called");
14557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) {
14567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamType = M4DA_StreamTypeVideoMpeg4Avc;
14577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_H263)) {
14587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamType = M4DA_StreamTypeVideoH263;
14597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG4)) {
14607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamType = M4DA_StreamTypeVideoMpeg4;
14617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } else {
14627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("VideoEditor3gpReaderGetNextStreamHandler streamTypeNONE");
14637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
14647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getNextStreamHandler: stream type: %d ",
14657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamType);
14667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(streamType != M4DA_StreamTypeUnknown) {
14687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mStreamType = streamType;
14697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mStreamId = pC->mCurrTrack;
14707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pVideoStreamHandler = (M4_VideoStreamHandler*)M4OSA_malloc
14727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (sizeof(M4_VideoStreamHandler), M4READER_3GP,
14737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Char*)"M4_VideoStreamHandler");
14747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if (M4OSA_NULL == pVideoStreamHandler) {
14757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4ERR_ALLOC;
14767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
14777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pVideoStreamHandler->m_structSize=sizeof(M4_VideoStreamHandler);
14787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                meta->findInt32(kKeyWidth,
14807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (int32_t*)&(pVideoStreamHandler->m_videoWidth));
14817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                meta->findInt32(kKeyHeight,
14827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (int32_t*)&(pVideoStreamHandler->m_videoHeight));
14837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pStreamHandler)  = (M4_StreamHandler*)(pVideoStreamHandler);
14857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                meta->findInt64(kKeyDuration,
14867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (int64_t*)&(Duration));
14877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ((*pStreamHandler)->m_duration) =
14887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (int32_t)((Duration)/1000); // conversion to mS
14897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mMaxDuration = ((*pStreamHandler)->m_duration);
14907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("VideoEditor3gpReader_getNextStreamHandler m_duration %d",
14917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_duration);
14927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mFileSize  = 0;
14947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                meta->findInt32(kKeyMaxInputSize, (int32_t*)&(maxAUSize));
14967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(maxAUSize == 0) {
14977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    maxAUSize = 70000;
14987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
14997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pStreamHandler)->m_maxAUSize = maxAUSize;
15007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("<<<<<<<<<<   video: mMaxAUSize from MP4 extractor: %d",
15017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_maxAUSize);
15027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( (M4DA_StreamTypeVideoH263       == streamType) ||
15047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4DA_StreamTypeVideoMpeg4Avc   == streamType)){
15057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ((M4_StreamHandler*)pVideoStreamHandler)->m_averageBitRate =
15067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        384000;
15077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
1508d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru
1509d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru                meta->findInt32(kKeyFrameRate,
1510d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru                    (int32_t*)&(avgFPS));
1511d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru                LOGV("<<<<<<<<<<   video: Average FPS from MP4 extractor: %d",
1512d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru                    avgFPS);
1513d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru
1514d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru                pVideoStreamHandler->m_averageFrameRate =(M4OSA_Float) avgFPS;
1515d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru                LOGV("<<<<<<<<<<   video: Average FPS from MP4 extractor in FLOAT: %f",
1516d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru                    pVideoStreamHandler->m_averageFrameRate);
1517d6dbc5850ca49d7c8b3bc8a6802fa7c85c5b1613Basavapatna Dattaguru
15187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mVideoStreamHandler =
15197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4_StreamHandler*)(pVideoStreamHandler);
15207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Get the DSI info */
15227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(M4DA_StreamTypeVideoH263 == streamType) {
15237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if (meta->findData(kKeyESDS, &type, &data, &size)) {
15247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ESDS esds((const char *)data, size);
15257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        CHECK_EQ(esds.InitCheck(), OK);
15267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        esds.getCodecSpecificInfo(
15287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            &codec_specific_data, &codec_specific_data_size);
15297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_decoderSpecificInfoSize =
15307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            codec_specific_data_size;
15317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if ((*pStreamHandler)->m_decoderSpecificInfoSize != 0) {
15327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            DecoderSpecific = (M4OSA_UInt8*)M4OSA_malloc(
15337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (*pStreamHandler)->m_decoderSpecificInfoSize,
15347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4READER_3GP,(M4OSA_Char*)"H263 DSI");
15357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            if (M4OSA_NULL == DecoderSpecific) {
15367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                return M4ERR_ALLOC;
15377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
15387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_memcpy((M4OSA_MemAddr8)DecoderSpecific,
15397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (M4OSA_MemAddr8)codec_specific_data,
15407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                codec_specific_data_size);
15417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (*pStreamHandler)->m_pDecoderSpecificInfo =
15427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                DecoderSpecific;
15437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
15447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        else {
15457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (*pStreamHandler)->m_pDecoderSpecificInfo =
15467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_NULL;
15477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
15487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    } else {
15497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        LOGV("VE_getNextStreamHandler: H263 dsi not found");
15507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo = M4OSA_NULL;
15517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_decoderSpecificInfoSize = 0;
15527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_H264decoderSpecificInfoSize = 0;
15537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pH264DecoderSpecificInfo =
15547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_NULL;
15557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pESDSInfo = M4OSA_NULL;
15567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_ESDSInfoSize = 0;
15577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
15587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
15597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else if(M4DA_StreamTypeVideoMpeg4Avc == streamType) {
15607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if(meta->findData(kKeyAVCC, &type, &data, &size)) {
15617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        decoderSpecificInfoSize = size;
15627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if (decoderSpecificInfoSize != 0) {
15637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            DecoderSpecificInfo = (M4OSA_Int8*)M4OSA_malloc(
15647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                decoderSpecificInfoSize, M4READER_3GP,
15657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (M4OSA_Char*)"H264 DecoderSpecific" );
15667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            if (M4OSA_NULL == DecoderSpecificInfo) {
15677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                LOGV("VideoEditor3gp_getNextStream is NULL ");
15687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                return M4ERR_ALLOC;
15697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
15707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_memcpy((M4OSA_MemAddr8)DecoderSpecificInfo,
15717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (M4OSA_MemAddr8)data, decoderSpecificInfoSize);
15727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        } else {
15737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            LOGV("DSI Size %d", decoderSpecificInfoSize);
15747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            DecoderSpecificInfo = M4OSA_NULL;
15757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
15767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
15777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_pESDSInfo = M4OSA_NULL;
15787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_ESDSInfoSize = 0;
15797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = VideoEditor3gpReader_AnalyseAvcDsi(*pStreamHandler,
15817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Int32*)DecoderSpecificInfo, decoderSpecificInfoSize);
15827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if (M4NO_ERROR != err) {
15847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
15857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
15867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    LOGV("decsize %d, h264decsize %d: %d", (*pStreamHandler)->\
15877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        m_decoderSpecificInfoSize, (*pStreamHandler)->\
15887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        m_H264decoderSpecificInfoSize);
15897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if(M4OSA_NULL != DecoderSpecificInfo) {
15917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_free((M4OSA_MemAddr32)DecoderSpecificInfo);
15927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        DecoderSpecificInfo = M4OSA_NULL;
15937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
15947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                } else if( (M4DA_StreamTypeVideoMpeg4 == streamType) ) {
15957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if (meta->findData(kKeyESDS, &type, &data, &size)) {
15967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ESDS esds((const char *)data, size);
15977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        CHECK_EQ(esds.InitCheck(), OK);
15987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_ESDSInfoSize = size;
16007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pESDSInfo = (M4OSA_UInt8*)\
16017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_malloc((*pStreamHandler)->m_ESDSInfoSize,
16027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4READER_3GP, (M4OSA_Char*)"H263 DecoderSpecific" );
16037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if (M4OSA_NULL == (*pStreamHandler)->m_pESDSInfo) {
16047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return M4ERR_ALLOC;
16057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
16067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_memcpy((M4OSA_MemAddr8)(*pStreamHandler)->\
16077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            m_pESDSInfo, (M4OSA_MemAddr8)data, size);
16087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        esds.getCodecSpecificInfo(&codec_specific_data,
16107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            &codec_specific_data_size);
16117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        LOGV("VE MP4 dsisize: %d, %x", codec_specific_data_size,
16127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            codec_specific_data);
16137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_decoderSpecificInfoSize =
16157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            codec_specific_data_size;
16167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if ((*pStreamHandler)->m_decoderSpecificInfoSize != 0) {
16177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            DecoderSpecific = (M4OSA_UInt8*)M4OSA_malloc(
16187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (*pStreamHandler)->m_decoderSpecificInfoSize,
16197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4READER_3GP, (M4OSA_Char*)" DecoderSpecific" );
16207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            if (M4OSA_NULL == DecoderSpecific) {
16217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                return M4ERR_ALLOC;
16227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
16237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_memcpy((M4OSA_MemAddr8)DecoderSpecific,
16247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (M4OSA_MemAddr8)codec_specific_data,
16257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                codec_specific_data_size);
16267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (*pStreamHandler)->m_pDecoderSpecificInfo =
16277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                DecoderSpecific;
16287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
16297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        else {
16307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (*pStreamHandler)->m_pDecoderSpecificInfo =
16317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_NULL;
16327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
16337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pH264DecoderSpecificInfo =
16347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_NULL;
16357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_H264decoderSpecificInfoSize = 0;
16367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
16377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                } else {
16387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    LOGV("VideoEditor3gpReader_getNextStream NO video stream");
16397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4ERR_READER_UNKNOWN_STREAM_TYPE;
16407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
16417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
16427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else {
16437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("VideoEditor3gpReader_getNextStream NO video stream");
16447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4ERR_READER_UNKNOWN_STREAM_TYPE;
16457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
16467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) {
16487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VideoEditor3gpReader_getNextStream audio getTrack called");
16497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioSource = pC->mExtractor->getTrack(pC->mCurrTrack);
16507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mAudioSource->start();
16517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pMediaFamily = M4READER_kMediaFamilyAudio;
16527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) {
16547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamType = M4DA_StreamTypeAudioAmrNarrowBand;
16557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } else if(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) {
16567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamType = M4DA_StreamTypeAudioAmrWideBand;
16577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
16587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) {
16597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamType = M4DA_StreamTypeAudioAac;
16607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } else {
16617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("VideoEditor3gpReader_getNextStrea streamtype Unknown ");
16627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
16637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(streamType != M4DA_StreamTypeUnknown) {
16647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mStreamType = streamType;
16657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mStreamId = pC->mCurrTrack;
16667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("VE streamtype %d ,id %d",  streamType, pC->mCurrTrack);
16687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAudioStreamHandler = (M4_AudioStreamHandler*)M4OSA_malloc
16707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (sizeof(M4_AudioStreamHandler), M4READER_3GP,
16717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Char*)"M4_AudioStreamHandler");
16727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if (M4OSA_NULL == pAudioStreamHandler) {
16737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4ERR_ALLOC;
16747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
16757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAudioStreamHandler->m_structSize=sizeof(M4_AudioStreamHandler);
16767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAudioStreamHandler->m_byteSampleSize   = 0;
16777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAudioStreamHandler->m_nbChannels       = 0;
16787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAudioStreamHandler->m_samplingFrequency= 0;
16797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAudioStreamHandler->m_byteFrameLength  = 0;
16807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pStreamHandler) = (M4_StreamHandler*)(pAudioStreamHandler);
16827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mAudioStreamHandler =
16837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4_StreamHandler*)(pAudioStreamHandler);
16847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pStreamHandler)->m_averageBitRate = 0;
16857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                haveAudio = true;
16867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mAudioStreamHandler=(M4_StreamHandler*)pAudioStreamHandler;
16877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mAudioStreamHandler->m_pESDSInfo = M4OSA_NULL;
16887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mAudioStreamHandler->m_ESDSInfoSize = 0;
16897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                meta->findInt32(kKeyMaxInputSize, (int32_t*)&(maxAUSize));
16917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(maxAUSize == 0) {
16927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    maxAUSize = 70000;
16937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
16947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pStreamHandler)->m_maxAUSize = maxAUSize;
16957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("VE Audio mMaxAUSize from MP4 extractor: %d", maxAUSize);
16967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
16977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if((M4DA_StreamTypeAudioAmrNarrowBand == streamType) ||
16987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4DA_StreamTypeAudioAmrWideBand == streamType)) {
16997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt32 freqIndex = 0; /**< AMR NB */
17007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt32 modeSet;
17017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt32 i;
17027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_Context pBitParserContext = M4OSA_NULL;
17037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(M4DA_StreamTypeAudioAmrWideBand == streamType) {
17057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    freqIndex = 1; /**< AMR WB */
17067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
17077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if (meta->findData(kKeyESDS, &type, &data, &size)) {
17097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ESDS esds((const char *)data, size);
17107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    CHECK_EQ(esds.InitCheck(), OK);
17117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    esds.getCodecSpecificInfo(&codec_specific_data,
17137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        &codec_specific_data_size);
17147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_decoderSpecificInfoSize =
17157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        codec_specific_data_size;
17167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if ((*pStreamHandler)->m_decoderSpecificInfoSize != 0) {
17187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        DecoderSpecific = (M4OSA_UInt8*)M4OSA_malloc(
17197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (*pStreamHandler)->m_decoderSpecificInfoSize,
17207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4READER_3GP, (M4OSA_Char*)"H263 DecoderSpecific" );
17217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if (M4OSA_NULL == DecoderSpecific) {
17227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return M4ERR_ALLOC;
17237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
17247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_memcpy((M4OSA_MemAddr8)DecoderSpecific,
17257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (M4OSA_MemAddr8)codec_specific_data,
17267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            codec_specific_data_size);
17277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo =
17287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            DecoderSpecific;
17297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    } else {
17307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo = M4OSA_NULL;
17317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
17327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                } else {
17337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_UChar AmrDsi[] =
17347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {'P','H','L','P',0x00, 0x00, 0x80, 0x00, 0x01,};
17357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_decoderSpecificInfoSize = 9;
17367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    DecoderSpecific = (M4OSA_UInt8*)M4OSA_malloc(
17377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_decoderSpecificInfoSize,
17387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4READER_3GP, (M4OSA_Char*)"H263 DecoderSpecific" );
17397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if (M4OSA_NULL == DecoderSpecific) {
17407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4ERR_ALLOC;
17417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
17427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if(freqIndex ==0) {
17437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        AmrDsi[8] = 0x01;
17447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    } else {
17457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        AmrDsi[8] = 0x02;
17467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
17477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    for(i = 0; i< 9; i++) {
17487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        DecoderSpecific[i] = AmrDsi[i];
17497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
17507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_pDecoderSpecificInfo = DecoderSpecific;
17517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
17527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (*pStreamHandler)->m_averageBitRate =
17537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    VideoEditor3gpReader_AmrBitRate[freqIndex][7];
17547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } else if((M4DA_StreamTypeAudioAac == streamType)) {
17557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if (meta->findData(kKeyESDS, &type, &data, &size)) {
17567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ESDS esds((const char *)data, size);
17577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    CHECK_EQ(esds.InitCheck(), OK);
17587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_ESDSInfoSize = size;
17607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_pESDSInfo = (M4OSA_UInt8*)M4OSA_malloc(
17617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_ESDSInfoSize, M4READER_3GP,
17627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_Char*)"H263 DecoderSpecific" );
17637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if (M4OSA_NULL == (*pStreamHandler)->m_pESDSInfo) {
17647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4ERR_ALLOC;
17657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
17667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_memcpy((M4OSA_MemAddr8)(*pStreamHandler)->m_pESDSInfo,
17677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_MemAddr8)data, size);
17687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    esds.getCodecSpecificInfo(&codec_specific_data,
17697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        &codec_specific_data_size);
17707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    LOGV("VEdsi %d,%x",codec_specific_data_size,
17727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        codec_specific_data);
17737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (*pStreamHandler)->m_decoderSpecificInfoSize =
17757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        codec_specific_data_size;
17767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if ((*pStreamHandler)->m_decoderSpecificInfoSize != 0) {
17777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        DecoderSpecific = (M4OSA_UInt8*)M4OSA_malloc(
17787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (*pStreamHandler)->m_decoderSpecificInfoSize,
17797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4READER_3GP, (M4OSA_Char*)"H263 DecoderSpecific" );
17807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if (M4OSA_NULL == DecoderSpecific) {
17817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return M4ERR_ALLOC;
17827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
17837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_memcpy((M4OSA_MemAddr8)DecoderSpecific,
17847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (M4OSA_MemAddr8)codec_specific_data,
17857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            codec_specific_data_size);
17867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo =
17877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            DecoderSpecific;
17887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    } else {
17897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (*pStreamHandler)->m_pDecoderSpecificInfo = M4OSA_NULL;
17907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
17917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
17927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } else {
17937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LOGV("VideoEditor3gpReader_getNextStream mStreamType: none ");
17947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4ERR_READER_UNKNOWN_STREAM_TYPE;
17957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
17967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
17977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            LOGV("VE noaudio-video stream:pC->mCurrTrack = %d ",pC->mCurrTrack);
17987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mCurrTrack++; //Increment current track to get the next track
17997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_READER_UNKNOWN_STREAM_TYPE;
18007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VE StreamType: %d, stremhandler %x",streamType, *pStreamHandler );
18027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (*pStreamHandler)->m_streamType = streamType;
18037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (*pStreamHandler)->m_streamId   = pC->mStreamId;
18047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (*pStreamHandler)->m_pUserData  = M4OSA_NULL;
18057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (*pStreamHandler)->m_structSize = sizeof(M4_StreamHandler);
18067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (*pStreamHandler)->m_bStreamIsOK = M4OSA_TRUE;
18077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        meta->findInt64(kKeyDuration,
18097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (int64_t*)&(Duration));
18107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (*pStreamHandler)->m_duration = (int32_t)(Duration / 1000);
18127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mMaxDuration = ((*pStreamHandler)->m_duration);
18147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VE str duration duration: %d ", (*pStreamHandler)->m_duration);
18157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* In AAC case: Put the first AU in pAudioStreamHandler->m_pUserData
18177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         *since decoder has to know if stream contains SBR data(Implicit sig) */
18187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(M4DA_StreamTypeAudioAac == (*pStreamHandler)->m_streamType) {
18197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4READER_AudioSbrUserdata*  pAudioSbrUserdata;
18207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAudioSbrUserdata = (M4READER_AudioSbrUserdata*)M4OSA_malloc(
18227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                sizeof(M4READER_AudioSbrUserdata),M4READER_3GP,
18237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_Char*)"M4READER_AudioSbrUserdata");
18247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4OSA_NULL == pAudioSbrUserdata) {
18257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4ERR_ALLOC;
18267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                goto Error;
18277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (*pStreamHandler)->m_pUserData = pAudioSbrUserdata;
18297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAudioSbrUserdata->m_bIsSbrEnabled = M4OSA_FALSE;
18307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAudioSbrUserdata->m_pFirstAU = (M4_AccessUnit*)M4OSA_malloc(
18327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                sizeof(M4_AccessUnit),M4READER_3GP, (M4OSA_Char*)"1st AAC AU");
18337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4OSA_NULL == pAudioSbrUserdata->m_pFirstAU) {
18347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAudioSbrUserdata->m_pAacDecoderUserConfig = M4OSA_NULL;
18357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4ERR_ALLOC;
18367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                goto Error;
18377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pAudioSbrUserdata->m_pAacDecoderUserConfig = (M4_AacDecoderConfig*)\
18397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_malloc(sizeof(M4_AacDecoderConfig),M4READER_3GP,
18407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_Char*)"m_pAacDecoderUserConfig");
18417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4OSA_NULL == pAudioSbrUserdata->m_pAacDecoderUserConfig) {
18427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4ERR_ALLOC;
18437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                goto Error;
18447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(M4DA_StreamTypeAudioAac == (*pStreamHandler)->m_streamType) {
18477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4_AudioStreamHandler* pAudioStreamHandler =
18487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4_AudioStreamHandler*)(*pStreamHandler);
18497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4READER_AudioSbrUserdata* pUserData = (M4READER_AudioSbrUserdata*)\
18507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (pAudioStreamHandler->m_basicProperties.m_pUserData);
18517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = VideoEditor3gpReader_fillAuStruct(pC, (*pStreamHandler),
18537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4_AccessUnit*)pUserData->m_pFirstAU);
18547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4NO_ERROR != err) {
18557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                goto Error;
18567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = VideoEditor3gpReader_getNextAu(pC, (*pStreamHandler),
18587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4_AccessUnit*)pUserData->m_pFirstAU);
18597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4NO_ERROR != err) {
18607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                goto Error;
18617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = VideoEditor3gpReader_reset(pC, (*pStreamHandler));
18637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4NO_ERROR != err) {
18647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                goto Error;
18657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
18687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->mCurrTrack++; //Increment the current track to get next track
18697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("pC->mCurrTrack = %d",pC->mCurrTrack);
18707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (!haveAudio && !haveVideo) {
18727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pMediaFamily=M4READER_kMediaFamilyUnknown;
18737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_READER_UNKNOWN_STREAM_TYPE;
18747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
18757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiError:
18767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getNextStreamHandler end error = %d",err);
18777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
18787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
18797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getPrevRapTime(M4OSA_Context context,
18817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_StreamHandler *pStreamHandler, M4OSA_Int32* pTime)
18827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
18837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VideoEditor3gpReader_Context *pC = (VideoEditor3gpReader_Context*)context;
18847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
18857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaBuffer *mMediaBuffer = M4OSA_NULL;
18867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    MediaSource::ReadOptions options;
18877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Time time64;
18887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int64_t tempTime64 = 0;
18897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    status_t error;
18907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getPrevRapTime begin");
18927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER,
18947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getPrevRapTime: invalid context");
18957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER,
18967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getPrevRapTime invalid pointer to StreamHandler");
18977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF1((pTime == 0), M4ERR_PARAMETER,
18987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getPrevRapTime: invalid time pointer");
18997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (*pTime == (pStreamHandler->m_duration)) {
19003ad01762633531957174c5b27e71ca4aac45e554Santosh Madhava        *pTime -= 1;
19013ad01762633531957174c5b27e71ca4aac45e554Santosh Madhava    }
19027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_INT64_FROM_INT32(time64, *pTime);
19037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    time64 = time64 * 1000;
19047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getPrevRapTime seek time: %ld",time64);
19067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    options.setSeekTo(time64, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC);
19077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    error = pC->mVideoSource->read(&mMediaBuffer, &options);
19087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (error != OK) {
19097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //Can not get the previous Sync.
19107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //Must be end of stream.
19113ad01762633531957174c5b27e71ca4aac45e554Santosh Madhava        return M4WAR_NO_MORE_AU;
19127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mMediaBuffer->meta_data()->findInt64(kKeyTime, (int64_t*)&tempTime64);
19157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getPrevRapTime read time %ld, %x", tempTime64,
19167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mMediaBuffer);
19177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pTime) =  (tempTime64) / 1000;
19197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(mMediaBuffer != M4OSA_NULL) {
19217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV(" mMediaBuffer size = %d length %d", mMediaBuffer->size(),
19227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            mMediaBuffer->range_length());
19237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mMediaBuffer->release();
19247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mMediaBuffer = M4OSA_NULL;
19257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    options.clearSeekTo();
19277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(error != OK) {
19297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getPrevRapTime end \
19307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4WAR_READER_INFORMATION_NOT_PRESENT");
19317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4WAR_READER_INFORMATION_NOT_PRESENT;
19327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
19337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getPrevRapTime end: err %x", err);
19347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4NO_ERROR;
19357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
19367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
19387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiextern "C" {
19407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR VideoEditor3gpReader_getInterface(M4READER_MediaType *pMediaType,
19417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4READER_GlobalInterface **pRdrGlobalInterface,
19427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4READER_DataInterface **pRdrDataInterface) {
19437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
19457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pMediaType,      M4ERR_PARAMETER);
19477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pRdrGlobalInterface, M4ERR_PARAMETER);
19487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VIDEOEDITOR_CHECK(M4OSA_NULL != pRdrDataInterface, M4ERR_PARAMETER);
19497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getInterface begin");
19517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getInterface %d 0x%x 0x%x", *pMediaType,
19527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pRdrGlobalInterface,*pRdrDataInterface);
19537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_MALLOC(*pRdrGlobalInterface, M4READER_GlobalInterface, 1,
19557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getInterface");
19567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SAFE_MALLOC(*pRdrDataInterface, M4READER_DataInterface, 1,
19577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "VideoEditor3gpReader_getInterface");
19587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pMediaType = M4READER_kMediaType3GPP;
19607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctCreate       = VideoEditor3gpReader_create;
19627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctDestroy      = VideoEditor3gpReader_destroy;
19637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctOpen         = VideoEditor3gpReader_open;
19647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctClose        = VideoEditor3gpReader_close;
19657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctGetOption    = VideoEditor3gpReader_getOption;
19667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctSetOption    = VideoEditor3gpReader_setOption;
19677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctGetNextStream =
19687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_getNextStreamHandler;
19697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctFillAuStruct =
19707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_fillAuStruct;
19717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctStart        = M4OSA_NULL;
19727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctStop         = M4OSA_NULL;
19737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctJump         = VideoEditor3gpReader_jump;
19747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctReset        = VideoEditor3gpReader_reset;
19757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrGlobalInterface)->m_pFctGetPrevRapTime =
19767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VideoEditor3gpReader_getPrevRapTime;
19777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrDataInterface)->m_pFctGetNextAu      = VideoEditor3gpReader_getNextAu;
19787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (*pRdrDataInterface)->m_readerContext      = M4OSA_NULL;
19797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargicleanUp:
19817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR == err ) {
19827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getInterface no error");
19837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
19847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        SAFE_FREE(*pRdrGlobalInterface);
19857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        SAFE_FREE(*pRdrDataInterface);
19867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOGV("VideoEditor3gpReader_getInterface ERROR 0x%X", err);
19887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LOGV("VideoEditor3gpReader_getInterface end");
19907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
19917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
19927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}  /* extern "C" */
19947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}  /* namespace android */
19967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1998