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