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