17c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* 27c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project 37c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 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 ****************************************************************************** 197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @file M4AMRR_CoreReader.c 207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Implementation of AMR parser 217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note This file contains the API Implementation for 227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * AMR Parser. 237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/ 257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4AMRR_CoreReader.h" 267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h" 277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_CoreID.h" 287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Maximum bitrate per amr type 327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/ 347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4AMRR_NB_MAX_BIT_RATE 12200 357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4AMRR_WB_MAX_BIT_RATE 23850 367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * AMR reader context ID 407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/ 427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4AMRR_CONTEXTID 0x414d5252 437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * An AMR frame is 20ms 477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/ 497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4AMRR_FRAME_LENGTH 20 507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * For the seek, the file is splitted in 40 segments for faster search 547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/ 567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4AMRR_NUM_SEEK_ENTRIES 40 577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4AMRR_NB_SAMPLE_FREQUENCY 8000 /**< Narrow band sampling rate */ 597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4AMRR_WB_SAMPLE_FREQUENCY 16000 /**< Wide band sampling rate */ 607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * AMR reader version numbers 647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/ 667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* CHANGE_VERSION_HERE */ 677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4AMRR_VERSION_MAJOR 1 687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4AMRR_VERSION_MINOR 11 697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4AMRR_VERSION_REVISION 3 707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * structure M4_AMRR_Context 747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Internal AMR reader context structure 757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/ 777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargitypedef struct 787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 m_contextId ; /* Fixed Id. to check for valid Context*/ 807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FileReadPointer* m_pOsaFilePtrFct; /* File function pointer */ 817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_StreamDescription* m_pStreamHandler; /* Stream Description */ 827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32* m_pSeekIndex; /* Seek Index Table */ 837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 m_seekInterval; /* Stores the seek Interval stored in the Index */ 847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 m_maxAuSize; /* Stores the max Au Size */ 857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_MemAddr32 m_pdataAddress; /* Pointer to store AU data */ 867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_StreamType m_streamType; /* Stores the stream type AMR NB or WB */ 877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Context m_pAMRFile; /* Data storage */ 887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AMRR_State m_status; /* AMR Reader Status */ 897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 m_structSize; /* size of structure*/ 907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} M4_AMRR_Context; 917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Parser internal functions, not usable from outside the reader context 957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/ 977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_UInt32 M4AMRR_getAuSize(M4OSA_UInt32 frameType, M4SYS_StreamType streamType); 987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_UInt32 M4AMRR_getBitrate(M4OSA_UInt32 frameType, M4SYS_StreamType streamType); 997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_UInt32 M4AMRR_getAuSize(M4OSA_UInt32 frameType, M4SYS_StreamType streamType) 1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Internal function to the AMR Parser, returns the AU size of the Frame 1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note This function takes the stream type and the frametype and returns the 1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * frame lenght 1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param frameType(IN) : AMR frame type 1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param streamType(IN) : AMR stream type NB or WB 1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @returns The frame size based on the frame type. 1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_UInt32 M4AMRR_getAuSize(M4OSA_UInt32 frameType, M4SYS_StreamType streamType) 1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi const M4OSA_UInt32 M4AMRR_NB_AUSIZE[]={13,14,16,18,20,21,27,32,6,6,6}; 1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi const M4OSA_UInt32 M4AMRR_WB_AUSIZE[]={18,24,33,37,41,47,51,59,61,6}; 1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( streamType == M4SYS_kAMR ) 1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4AMRR_NB_AUSIZE[frameType]; 1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /* M4SYS_kAMR_WB */ 1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4AMRR_WB_AUSIZE[frameType]; 1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_UInt32 M4AMRR_getBitrate(M4OSA_UInt32 frameType, M4SYS_StreamType streamType) 1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Internal function to the AMR Parser, returns the Bit rate of the Frame 1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note This function takes the stream type and the frametype and returns the 1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * bit rate for the given frame. 1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param frameType(IN) : AMR frame type 1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param streamType(IN) : AMR stream type NB or WB 1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @returns The frame's bit rate based on the frame type. 1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_UInt32 M4AMRR_getBitrate(M4OSA_UInt32 frameType, M4SYS_StreamType streamType) 1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi const M4OSA_UInt32 M4AMRR_NB_BITRATE[]= 1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi {4750,5150,5900,6700,7400,7950,10200,12200,12200,12200,12200}; 1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi const M4OSA_UInt32 M4AMRR_WB_BITRATE[]= 1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi {6600,8850,12650,14250,15850,18250,19850,23050,23850,12200}; 1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( streamType == M4SYS_kAMR ) 1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4AMRR_NB_BITRATE[frameType]; 1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /* M4SYS_kAMR_WB */ 1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4AMRR_WB_BITRATE[frameType]; 1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4AMRR_openRead(M4OSA_Context* pContext, M4OSA_Void* pFileDescriptor, 1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FileReadPointer* pFileFunction) 1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_AMRR_Context* pStreamContext; 1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FilePosition filePos; 1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4ERR_FILE_NOT_FOUND ; 1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 size ; 1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 data ; 1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Char *M4_Token; 1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 *tokenPtr; 1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Header for AMR NB */ 1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 M4_AMR_1 = 0x4d412123; 1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 M4_AMR_NB_2 = 0x00000a52; 1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Header for AMR WB */ 1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 M4_AMR_WB_2 = 0x42572d52; 1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 M4_AMR_WB_3 = 0x0000000a; 1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pContext = M4OSA_NULL ; 1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == pContext),M4ERR_PARAMETER,"Context M4OSA_NULL"); 1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == pFileDescriptor),M4ERR_PARAMETER,"File Desc. M4OSA_NULL"); 1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 180694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu M4_Token = (M4OSA_Char*)M4OSA_32bitAlignedMalloc(sizeof(M4OSA_MemAddr32)*3, M4AMR_READER, 1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Char *)("M4_Token")); 1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_NULL == M4_Token) 1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF3((M4OSA_NULL == M4_Token),M4ERR_ALLOC,"Mem Alloc failed - M4_Token"); 1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC ; 1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 188694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu pStreamContext= (M4_AMRR_Context*)M4OSA_32bitAlignedMalloc(sizeof(M4_AMRR_Context), M4AMR_READER, 1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Char *)("pStreamContext")); 1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_NULL == pStreamContext) 1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 192694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(M4_Token); 1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pContext = M4OSA_NULL ; 1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC ; 1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Initialize the context */ 1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_contextId = M4AMRR_CONTEXTID; 1997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_structSize=sizeof(M4_AMRR_Context); 2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct=pFileFunction ; 2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pStreamHandler = M4OSA_NULL ; 2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pAMRFile = M4OSA_NULL ; 2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_status = M4AMRR_kOpening ; 2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pSeekIndex = M4OSA_NULL ; 2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_seekInterval = 0; 2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_maxAuSize = 0 ; 2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pdataAddress = M4OSA_NULL; 2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err=pStreamContext->m_pOsaFilePtrFct->openRead(&pStreamContext->m_pAMRFile, 2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Char*)pFileDescriptor,M4OSA_kFileRead ); 2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( err != M4NO_ERROR ) 2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* M4OSA_DEBUG_IF3((err != M4NO_ERROR),err,"File open failed"); */ 213694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(pStreamContext); 214694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(M4_Token); 2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pContext = M4OSA_NULL ; 2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err ; 2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_status = M4AMRR_kOpening ; 2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi size = 6; 2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->readData(pStreamContext->m_pAMRFile, 2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr8)M4_Token, &size); 2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(size != 6) 2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanup; 2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tokenPtr = (M4OSA_UInt32*)M4_Token ; 2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check for the first 4 bytes of the header common to WB and NB*/ 2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (*tokenPtr != M4_AMR_1) 2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanup; 2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tokenPtr++; 2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi data = *tokenPtr & 0x0000FFFF ; 2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check if the next part is Narrow band header */ 2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (data!= M4_AMR_NB_2) 2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Stream is AMR Wide Band */ 2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filePos = 4; 2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, 2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileSeekBeginning, &filePos); 2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi size = 5; 2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->readData(pStreamContext->m_pAMRFile, 2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr8)M4_Token, &size); 2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(size != 5) 2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanup; 2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tokenPtr=(M4OSA_UInt32*)M4_Token; 2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check for the Wide band hader */ 2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(*tokenPtr!= M4_AMR_WB_2) 2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanup; 2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi tokenPtr++; 2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi data = *tokenPtr & 0x000000FF ; 2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(data!= M4_AMR_WB_3) 2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanup; 2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_streamType = M4SYS_kAMR_WB ; 2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Stream is a Narrow band stream */ 2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_streamType = M4SYS_kAMR ; 2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* No Profile level defined */ 2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_status = M4AMRR_kOpened; 2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 268694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(M4_Token); 2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pContext = pStreamContext ; 2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargicleanup: 2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_NULL != pStreamContext->m_pAMRFile) 2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->closeRead(pStreamContext->m_pAMRFile); 2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 279694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(M4_Token); 280694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(pStreamContext); 2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pContext = M4OSA_NULL ; 2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return (M4OSA_ERR)M4ERR_AMR_NOT_COMPLIANT; 2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4AMRR_getNextStream(M4OSA_Context Context, M4SYS_StreamDescription* pStreamDesc ) 2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; 2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Char frameHeader, frameType ; 2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 size, auCount=0; 2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FilePosition filePos; 2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == Context),M4ERR_PARAMETER,"Context M4OSA_NULL"); 2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == pStreamDesc),M4ERR_PARAMETER,"Stream Desc. M4OSA_NULL"); 2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((pStreamContext->m_contextId != M4AMRR_CONTEXTID),M4ERR_BAD_CONTEXT, 3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Bad Context"); 3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF1(( pStreamContext->m_status != M4AMRR_kOpened), M4ERR_STATE, "Invalid State"); 3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_NULL != pStreamContext->m_pStreamHandler) 3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_NO_MORE_STREAM ; 3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi size = 1; 3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->readData(pStreamContext->m_pAMRFile, 3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr8)&frameHeader, &size); 3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* XFFF FXXX -> F is the Frame type */ 3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameType = ( frameHeader & 0x78 ) >> 3 ; 3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( frameType == 15 ) 3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_NO_DATA_YET ; 3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( pStreamContext->m_streamType == M4SYS_kAMR ) && ( frameType > 11 )) 3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return (M4OSA_ERR)M4ERR_AMR_INVALID_FRAME_TYPE; 3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( pStreamContext->m_streamType == M4SYS_kAMR_WB ) && ( frameType > 9 )) 3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return (M4OSA_ERR)M4ERR_AMR_INVALID_FRAME_TYPE; 3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Average bit rate is assigned the bitrate of the first frame */ 3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->averageBitrate = M4AMRR_getBitrate(frameType,pStreamContext->m_streamType); 3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filePos = -1; 3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, M4OSA_kFileSeekCurrent, 3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &filePos); 3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Initialize pStreamDesc */ 3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->profileLevel = 0xFF ; 3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->decoderSpecificInfoSize = 0 ; 3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->decoderSpecificInfo = M4OSA_NULL ; 3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->maxBitrate = (pStreamContext->m_streamType == 3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_kAMR )?M4AMRR_NB_MAX_BIT_RATE:M4AMRR_WB_MAX_BIT_RATE; 3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->profileLevel = 0xFF ; 3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->streamID = 1; 3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->streamType = pStreamContext->m_streamType; 3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Timescale equals Sampling Frequency: NB-8000 Hz, WB-16000 Hz */ 3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->timeScale = (pStreamContext->m_streamType == M4SYS_kAMR )?8000:16000; 349aa382f3637a68361989d5b70e3184bddcc472d3dhongteng pStreamDesc->duration = M4OSA_TIME_UNKNOWN; 3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pStreamHandler = 352694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4SYS_StreamDescription*)M4OSA_32bitAlignedMalloc(sizeof(M4SYS_StreamDescription), 3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AMR_READER, (M4OSA_Char *)("pStreamContext->m_pStreamHandler")); 3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_NULL == pStreamContext->m_pStreamHandler) 3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Copy the Stream Desc. into the Context */ 3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pStreamHandler->averageBitrate = pStreamDesc->averageBitrate; 3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pStreamHandler->decoderSpecificInfo = M4OSA_NULL ; 3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pStreamHandler->decoderSpecificInfoSize = 0 ; 363aa382f3637a68361989d5b70e3184bddcc472d3dhongteng pStreamContext->m_pStreamHandler->duration = M4OSA_TIME_UNKNOWN; 3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pStreamHandler->profileLevel = 0xFF ; 3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pStreamHandler->streamID = 1; 3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pStreamHandler->streamType = pStreamDesc->streamType ; 3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pStreamHandler->timeScale = pStreamDesc->timeScale ; 3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Count the number of Access Unit in the File to get the */ 3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* duration of the stream = 20 ms * number of access unit */ 3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi while(1) 3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi size = 1; 3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->readData(pStreamContext->m_pAMRFile, 3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr8)&frameHeader, &size); 3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( size == 0) 3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break ; 3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameType = (frameHeader & 0x78) >> 3 ; 3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get the frame size and skip so many bytes */ 3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(frameType != 15){ 3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* GLA 20050628 when frametype is >10 we read over a table */ 3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(frameType > 10) 3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi continue ; 3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi size = M4AMRR_getAuSize(frameType, pStreamContext->m_streamType); 3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(size > pStreamContext->m_maxAuSize ) 3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_maxAuSize = size ; 3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filePos = size-1; 3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, 3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileSeekCurrent, &filePos); 3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auCount++; 3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Each Frame is 20 m Sec. */ 3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pStreamHandler->duration = auCount * M4AMRR_FRAME_LENGTH ; 3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamDesc->duration = pStreamContext->m_pStreamHandler->duration ; 4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Put the file pointer back at the first Access unit */ 4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pStreamContext->m_streamType == M4SYS_kAMR ) 4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filePos = 6; 4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, 4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileSeekBeginning, &filePos); 4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( pStreamContext->m_streamType == M4SYS_kAMR_WB ) 4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filePos = 9; 4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, 4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileSeekBeginning, &filePos); 4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR ; 4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4AMRR_startReading(M4OSA_Context Context, M4SYS_StreamID* pStreamIDs ) 4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; 4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 size = 0 ; 4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == Context),M4ERR_PARAMETER,"Context M4OSA_NULL"); 4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == pStreamIDs),M4ERR_PARAMETER,"Stream Ids. M4OSA_NULL"); 4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((pStreamContext->m_contextId != M4AMRR_CONTEXTID),M4ERR_BAD_CONTEXT, 4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Bad Context"); 4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF1(( pStreamContext->m_status != M4AMRR_kOpened), M4ERR_STATE, "Invalid State"); 4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi while( pStreamIDs[size] != 0 ) 4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pStreamIDs[size++] != 1 ) 4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID ; 4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Allocate memory for data Address for use in NextAU() */ 4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_NULL == pStreamContext->m_pdataAddress) 4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi size = pStreamContext->m_maxAuSize ; 4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* dataAddress is owned by Parser, application should not delete or free it */ 443694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu pStreamContext->m_pdataAddress =(M4OSA_MemAddr32)M4OSA_32bitAlignedMalloc(size + (4 - size % 4), 4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AMR_READER, (M4OSA_Char *)("pStreamContext->m_pdataAddress")); 4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_NULL == pStreamContext->m_pdataAddress) 4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF3((M4OSA_NULL == pStreamContext->m_pdataAddress),M4ERR_ALLOC, 4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Mem Alloc failed - dataAddress"); 4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set the state of context to Reading */ 4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_status = M4AMRR_kReading ; 4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR ; 4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 4587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4AMRR_nextAU(M4OSA_Context Context, M4SYS_StreamID StreamID, M4SYS_AccessUnit* pAu) 4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; 4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Char frameHeader ; 4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Char frameType ; 4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 auSize; 4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 size ; 4697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FilePosition filePos; 4707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == Context),M4ERR_PARAMETER,"Context M4OSA_NULL"); 4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == pAu),M4ERR_PARAMETER,"Access Unit . M4OSA_NULL"); 4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((pStreamContext->m_contextId != M4AMRR_CONTEXTID),M4ERR_BAD_CONTEXT, 4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Bad Context"); 4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF1(( pStreamContext->m_status != M4AMRR_kReading), M4ERR_STATE, "Invalid State"); 4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( StreamID != 1 ) 4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 4807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Read the frame header byte */ 4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi size = pStreamContext->m_maxAuSize; 4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->readData(pStreamContext->m_pAMRFile, 4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr8)pStreamContext->m_pdataAddress, &size); 4867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(size != pStreamContext->m_maxAuSize) 4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_NO_MORE_AU; 4897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameHeader = ((M4OSA_MemAddr8)pStreamContext->m_pdataAddress)[0]; 4927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameType = ( frameHeader & 0x78 ) >> 3 ; 4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( pStreamContext->m_streamType == M4SYS_kAMR ) && 4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( frameType > 11 ) && ( frameType != 15 )) 4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return (M4OSA_ERR)M4ERR_AMR_INVALID_FRAME_TYPE; 4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( pStreamContext->m_streamType == M4SYS_kAMR_WB ) && 5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( frameType > 9 ) && ( frameType != 15 )) 5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return (M4OSA_ERR)M4ERR_AMR_INVALID_FRAME_TYPE; 5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get the frame size */ 5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(frameType == 15) 5097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auSize = 1; 5117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auSize = M4AMRR_getAuSize(frameType, pStreamContext->m_streamType); 5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi size -= auSize ; 5187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(size != 0) 5197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filePos = -((M4OSA_FilePosition)size); 5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, 5227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileSeekCurrent, &filePos); 5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAu->size = auSize ; 5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* even when frameType == 15 (no data frame), ARM core decoder outputs full PCM buffer */ 5287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*if(frameType == 15 ) 5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAu->CTS += 0; 5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi }*/ 5327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*else*/ 5337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAu->CTS += M4AMRR_FRAME_LENGTH ; 5357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAu->DTS = pAu->CTS ; 5397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAu->attribute = M4SYS_kFragAttrOk; 5407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAu->stream = pStreamContext->m_pStreamHandler; 5427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pAu->dataAddress = pStreamContext->m_pdataAddress ; 5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(frameHeader & 0x80) 5457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_NO_MORE_AU; 5477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Change the state to implement NextAu->freeAu->NextAu FSM */ 5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_status = M4AMRR_kReading_nextAU ; 5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR ; 5537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 5547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 5567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4AMRR_freeAU(M4OSA_Context Context, M4SYS_StreamID StreamID, M4SYS_AccessUnit* pAu) 5577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 5587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 5597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; 5607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == Context),M4ERR_PARAMETER,"Context M4OSA_NULL"); 5617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == pAu),M4ERR_PARAMETER,"Access Unit . M4OSA_NULL"); 5627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((pStreamContext->m_contextId != M4AMRR_CONTEXTID),M4ERR_BAD_CONTEXT, 5637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Bad Context"); 5647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF1(( pStreamContext->m_status != M4AMRR_kReading_nextAU), M4ERR_STATE, 5657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Invalid State"); 5667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( StreamID != 1 ) && ( StreamID != 0)) 5687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Change the state to Reading so as to allow access to next AU */ 5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_status = M4AMRR_kReading ; 5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR ; 5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 5797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4AMRR_seek(M4OSA_Context Context, M4SYS_StreamID* pStreamID, M4OSA_Time time, 5807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_SeekAccessMode seekMode, M4OSA_Time* pObtainCTS) 5817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 5827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 5837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; 5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 count, prevAU, nextAU ; 5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 size ; 5867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 auSize ; 5877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 position, partSeekTime; 5887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 auCount = 0, skipAuCount = 0 ; 5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Char frameHeader ; 5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Char frameType ; 5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FilePosition filePos; 5927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Double time_double; 5937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*Make explicit time cast, but take care that timescale is not used !!!*/ 5957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TIME_TO_MS(time_double, time, 1000); 5967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 597aa382f3637a68361989d5b70e3184bddcc472d3dhongteng *pObtainCTS = 0; 5987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == Context),M4ERR_PARAMETER,"Context M4OSA_NULL"); 6007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((pStreamContext->m_contextId != M4AMRR_CONTEXTID),M4ERR_BAD_CONTEXT, 6017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Bad Context"); 6027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF1(( pStreamContext->m_status != M4AMRR_kReading) && \ 6037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( pStreamContext->m_status != M4AMRR_kOpened), M4ERR_STATE, "Invalid State"); 6047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF1((time_double < 0),M4ERR_PARAMETER,"negative time"); 6057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Coming to seek for the first time, need to build the seekIndex Table */ 6077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_NULL == pStreamContext->m_pSeekIndex) 6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Double duration_double; 6107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi count = 0 ; 6127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pSeekIndex = 613694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UInt32*)M4OSA_32bitAlignedMalloc(M4AMRR_NUM_SEEK_ENTRIES * sizeof(M4OSA_UInt32), 6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AMR_READER, (M4OSA_Char *)("pStreamContext->m_pSeekIndex")); 6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_NULL == pStreamContext->m_pSeekIndex) 6177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF3((M4OSA_NULL == pStreamContext->m_pSeekIndex),M4ERR_ALLOC, 6197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Mem Alloc Failed - SeekIndex"); 6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC ; 6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* point to the first AU */ 6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pStreamContext->m_streamType == M4SYS_kAMR ) 6257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filePos = 6; 6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /*if ( pStreamContext->m_streamType == M4SYS_kAMR_WB )*/ 6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filePos = 9; 6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, 6347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileSeekBeginning, &filePos); 6357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set the postion to begining of first AU */ 6377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi position = (pStreamContext->m_streamType != M4SYS_kAMR)?9:6; 6387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*Make explicit time cast, but take care that timescale is not used !!!*/ 6407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TIME_TO_MS(duration_double, pStreamContext->m_pStreamHandler->duration, 1000); 6417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Calculate the seek Interval duration based on total dutation */ 6437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Interval = (duration / ENTRIES) in multiples of AU frame length */ 6447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_seekInterval = 6457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32)(duration_double / M4AMRR_NUM_SEEK_ENTRIES) ; 6467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_seekInterval /= M4AMRR_FRAME_LENGTH ; 6477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_seekInterval *= M4AMRR_FRAME_LENGTH ; 6487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi skipAuCount = pStreamContext->m_seekInterval / M4AMRR_FRAME_LENGTH ; 6497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pSeekIndex[count++]=position; 6517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi while(count < M4AMRR_NUM_SEEK_ENTRIES ) 6527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi size = 1; 6547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->readData(pStreamContext->m_pAMRFile, 6557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr8)&frameHeader, &size); 6567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( size == 0) 6577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break ; 6597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameType = (frameHeader & 0x78) >> 3 ; 6617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(frameType != 15) 6627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< bugfix Ronan Cousyn 05/04/2006: In the core reader AMR, the 6647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * function M4AMRR_seek doesn't check the frameType */ 6657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( pStreamContext->m_streamType == M4SYS_kAMR ) && ( frameType > 10 )) 6667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_AMR_INVALID_FRAME_TYPE; 6687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( pStreamContext->m_streamType == M4SYS_kAMR_WB ) && ( frameType > 9 )) 6707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_AMR_INVALID_FRAME_TYPE; 6727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auSize = M4AMRR_getAuSize(frameType, pStreamContext->m_streamType); 6747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi position += auSize ; 6757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filePos = auSize-1; 6767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, 6777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileSeekCurrent, &filePos); 6787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auCount++; 6797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 6817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi position ++; 6837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Skip the number of AU's as per interval and store in the Index table */ 6857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( (skipAuCount != 0) && !(auCount % skipAuCount)) 6867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pSeekIndex[count++] = position; 6887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi }/* End of Building the seek table */ 6917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Use the seek table to seek the required time in the stream */ 6937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* If we are seeking the begining of the file point to first AU */ 6957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( seekMode == M4SYS_kBeginning ) 6967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pStreamContext->m_streamType == M4SYS_kAMR ) 6987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filePos = 6; 7007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /*if ( pStreamContext->m_streamType == M4SYS_kAMR_WB )*/ 7027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filePos = 9; 7047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, 7067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileSeekBeginning, &filePos ); 7077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR ; 7087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get the Nearest Second */ 7117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (0 != pStreamContext->m_seekInterval) 7127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi position = (M4OSA_UInt32)(time_double / pStreamContext->m_seekInterval); 7147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 7167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*avoid division by 0*/ 7187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi position = 0; 7197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* We have only 40 seek Index. */ 7227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi position=(position >= M4AMRR_NUM_SEEK_ENTRIES)?M4AMRR_NUM_SEEK_ENTRIES-1:position; 7237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* SeekIndex will point to nearest Au, we need to search for the 7257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi required time form that position */ 7267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi partSeekTime = (M4OSA_UInt32)time_double - position * pStreamContext->m_seekInterval; 7277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi position = pStreamContext->m_pSeekIndex[position]; 7297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(!position) 7317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_INVALID_TIME ; 7337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* point the file pointer to nearest AU */ 7367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filePos = position; 7377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, M4OSA_kFileSeekBeginning, 7387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &filePos ); 7397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( partSeekTime == 0) 7417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 742aa382f3637a68361989d5b70e3184bddcc472d3dhongteng *pObtainCTS = time; 7437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 7447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 746aa382f3637a68361989d5b70e3184bddcc472d3dhongteng *pObtainCTS = (M4OSA_Time)(time_double - (M4OSA_Double)partSeekTime); 7477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch(seekMode) 7497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get the AU before the target time */ 7517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kPreviousRAP: 7527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kNoRAPprevious: 7537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi position = partSeekTime / M4AMRR_FRAME_LENGTH ; 7547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( !(partSeekTime % M4AMRR_FRAME_LENGTH) ) 7557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi position -- ; 7577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 7597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get the Closest AU following the target time */ 7607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kNextRAP: 7617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kNoRAPnext: 7627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi position = (partSeekTime + M4AMRR_FRAME_LENGTH )/ M4AMRR_FRAME_LENGTH ; 7637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 7647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Get the closest AU to target time */ 7657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kClosestRAP: 7667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kNoRAPclosest: 7677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi prevAU = partSeekTime-(partSeekTime/M4AMRR_FRAME_LENGTH)*M4AMRR_FRAME_LENGTH; 7687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nextAU = 7697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ((partSeekTime+M4AMRR_FRAME_LENGTH)/M4AMRR_FRAME_LENGTH)*M4AMRR_FRAME_LENGTH -\ 7707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi partSeekTime ; 7717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(prevAU < nextAU) 7727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi position = partSeekTime / M4AMRR_FRAME_LENGTH ; 7747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 7767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi position = (partSeekTime + M4AMRR_FRAME_LENGTH )/ M4AMRR_FRAME_LENGTH ; 7787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 7807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kBeginning: 7817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 7827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi count = 0 ; 7857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Skip the Access unit in the stream to skip the part seek time, 7867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi to reach the required target time */ 7877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi while(count < position ) 7887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi size = 1; 7907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->readData(pStreamContext->m_pAMRFile, 7917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr8)&frameHeader, &size); 7927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( size == 0) 7937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* If the target time is invalid, point to begining and return */ 795aa382f3637a68361989d5b70e3184bddcc472d3dhongteng *pObtainCTS = 0; 7967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filePos = pStreamContext->m_pSeekIndex[0]; 7977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, 7987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileSeekBeginning, &filePos); 7997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_INVALID_TIME ; 8007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pObtainCTS += M4AMRR_FRAME_LENGTH; /*Should use M4OSA_INT64_ADD !!*/ 8027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi count++; 8037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameType = (frameHeader & 0x78) >> 3 ; 8047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(frameType == 15) 8057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auSize = 1 ; 8077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 8097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auSize = M4AMRR_getAuSize(frameType, pStreamContext->m_streamType); 8117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filePos = auSize-1; 8147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, 8157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileSeekCurrent, &filePos); 8167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 8197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 8207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 8227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4AMRR_closeRead(M4OSA_Context Context) 8237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 8247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 8257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; 8267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == Context),M4ERR_PARAMETER,"Context M4OSA_NULL"); 8277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Close the AMR stream */ 8297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_pOsaFilePtrFct->closeRead(pStreamContext->m_pAMRFile); 8307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamContext->m_status=M4AMRR_kClosed ; 8327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check if AU data Address is allocated memory and free it */ 8347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_NULL != pStreamContext->m_pdataAddress) 8357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 836694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(pStreamContext->m_pdataAddress); 8377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check if the stream handler is allocated memory */ 8407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_NULL != pStreamContext->m_pStreamHandler) 8417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 842694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(pStreamContext->m_pStreamHandler); 8437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Seek table is created only when seek is used, so check if memory is allocated */ 8467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_NULL != pStreamContext->m_pSeekIndex) 8477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 848694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(pStreamContext->m_pSeekIndex); 8497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Free the context */ 852694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(pStreamContext); 8537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR ; 8557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 8567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 8587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4AMRR_getState(M4OSA_Context Context, M4AMRR_State* pState, M4SYS_StreamID streamId) 8597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 8607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 8617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; 8627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == Context),M4ERR_PARAMETER,"Context M4OSA_NULL"); 8637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((pStreamContext->m_contextId != M4AMRR_CONTEXTID),M4ERR_BAD_CONTEXT, 8647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Bad Context"); 8657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( streamId != 1 ) && ( streamId != 0)) 8677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 8697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pState = pStreamContext->m_status ; 8727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR ; 8747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 8757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 8787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4AMRR_getVersion (M4_VersionInfo *pVersion) 8797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 8807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 8817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1("M4AMRR_getVersion called with pVersion: 0x%x\n", pVersion); 8827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF1(((M4OSA_UInt32) pVersion == 0),M4ERR_PARAMETER, 8837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "pVersion is NULL in M4AMRR_getVersion"); 8847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVersion->m_major = M4AMRR_VERSION_MAJOR; 8867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVersion->m_minor = M4AMRR_VERSION_MINOR; 8877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pVersion->m_revision = M4AMRR_VERSION_REVISION; 8887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 8907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 8917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 8937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4AMRR_getmaxAUsize(M4OSA_Context Context, M4OSA_UInt32 *pMaxAuSize) 8947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********************************************************/ 8957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 8967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; 8977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 8997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check input parameters */ 9007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF1((M4OSA_NULL == Context), M4ERR_PARAMETER, 9017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4AMRR_getmaxAUsize: Context is M4OSA_NULL"); 9027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF1((M4OSA_NULL == pMaxAuSize),M4ERR_PARAMETER, 9037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4AMRR_getmaxAUsize: pMaxAuSize is M4OSA_NULL"); 9047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pMaxAuSize = pStreamContext->m_maxAuSize; 9067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 9087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 9097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 910