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