1a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* ------------------------------------------------------------------ 2a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 4a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * you may not use this file except in compliance with the License. 6a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * You may obtain a copy of the License at 7a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 8a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 10a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Unless required by applicable law or agreed to in writing, software 11a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * express or implied. 14a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * See the License for the specific language governing permissions 15a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * and limitations under the License. 16a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * ------------------------------------------------------------------- 17a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */ 18a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/**************************************************************************************** 19a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPortions of this file are derived from the following 3GPP standard: 20a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 21a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 3GPP TS 26.073 22a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec 23a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Available from http://www.3gpp.org 24a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 25a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 26a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPermission to distribute, modify and use this file under the standard license 27a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberterms listed above has been obtained from the copyright holder. 28a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber****************************************************************************************/ 29a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* 30a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 31a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 32a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 33a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 34a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Pathname: ./audio/gsm-amr/c/src/sp_dec.c 35a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Functions: GSMInitDecode 36a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Speech_Decode_Frame_reset 37a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber GSMDecodeFrameExit 38a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber GSMFrameDecode 39a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 40a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Date: 08/03/2001 41a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 42a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 43a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REVISION HISTORY 44a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 45a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Add PV coding template. Filled out template sections and 46a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber reformatted code to follow C coding standard. Removed code that 47a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber handles SID in GSMFrameDecode. 48a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 49a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Made the following changes per comments from Phase 2/3 review: 50a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1. Updated to more recent PV C coding template. 51a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2. Took out all the tabs in the file and replaced with spaces. 52a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 3. Deleted bit_offset from input list of GSMFrameDecode. 53a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 54a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Changing several variables passed into these functions of type 55a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Speech_Decode_FrameState to type void. 56a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 57a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Cleaning up brackets and line spacing for statements with 58a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber brackets as per a review comments. 59a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 60a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Synchronized file with UMTS version 3.2.0. Removed unnecessary 61a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber include files. 62a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 63a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Removed all references to malloc/free, except for the top-level 64a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber malloc in GSMInitDecode, and corresponding free in GSMDecodeFrameExit. 65a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 66a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Also, modified function calls throughout to reflect the fact that the members 67a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber of the structure Decoder_amrState are no longer pointers to be set via 68a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber malloc, but full-blown structures. (Changes of the type D_plsfState *lsfState 69a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber to D_plsfState lsfState) 70a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 71a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Created overflow and pass the variable into the decoder. 72a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 73a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Changed inititlaization of the pointer to overflow flag. Removed 74a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber code related to MOPS counter. 75a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 76a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Replaced OSCL mem type functions and eliminated include 77a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber files that now are chosen by OSCL definitions 78a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 79a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Replaced "int" and/or "char" with defined types. 80a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Added proper casting (Word32) to some left shifting operations 81a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 82a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: 83a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 84a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 85a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MODULE DESCRIPTION 86a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 87a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This file contains the functions that initialize, invoke, reset, and exit 88a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the GSM AMR decoder. 89a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 90a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 91a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/ 92a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 93a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 94a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; INCLUDES 95a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 96a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include <stdlib.h> 97a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 98a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "sp_dec.h" 99a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "typedef.h" 100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "cnst.h" 101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "dec_amr.h" 102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "pstfilt.h" 103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "bits2prm.h" 104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "mode.h" 105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "post_pro.h" 106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; MACROS 110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Define module specific macros here 111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; DEFINES 115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Include all pre-processor statements here. Include conditional 116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; compile variables also. 117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL FUNCTION DEFINITIONS 121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Function Prototype declaration 122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL VARIABLE DEFINITIONS 126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Variable declaration - defined here and used outside this module 127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* 131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: GSMInitDecode 133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS 135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs: 137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state = pointer to an array of pointers to structures of type 138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Speech_Decode_FrameState 139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber no_hp_post_MR122 = flag to turn off high-pass post filter for 12.2 kbps 140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode (Flag) 141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber id = pointer to an array whose contents are of type char 142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs: 144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber decoder_amrState field of the structure pointed to by the pointer pointed 145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber to by state is set to NULL 146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber post_state field of the structure pointed to by the pointer pointed to 147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber by state is set to NULL 148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber postHP_state field of the structure pointed to by the pointer pointed to 149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber by state is set to NULL 150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber no_hp_post_MR122 field of the structure pointed to by the pointer pointed 151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber to by state is set to the input no_hp_post_MR122 152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns: 154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return_value = set to zero, if initialization was successful; -1, 155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber otherwise (int) 156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used: 158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed: 161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION 165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function allocates memory for filter structure and initializes state 167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber memory used by the GSM AMR decoder. 168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS 171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES 176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sp_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE 181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Note: Original function name of Speech_Decode_Frame_init was changed to 183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber GSMInitDecode in the Code section. 184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint Speech_Decode_Frame_init (Speech_Decode_FrameState **state, 186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber char *id) 187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Speech_Decode_FrameState* s; 189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (state == (Speech_Decode_FrameState **) NULL){ 191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber fprintf(stderr, "Speech_Decode_Frame_init: invalid parameter\n"); 192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return -1; 193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *state = NULL; 195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // allocate memory 197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((s= (Speech_Decode_FrameState *) 198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber malloc(sizeof(Speech_Decode_FrameState))) == NULL) { 199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber fprintf(stderr, "Speech_Decode_Frame_init: can not malloc state " 200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber "structure\n"); 201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return -1; 202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->decoder_amrState = NULL; 204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->post_state = NULL; 205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->postHP_state = NULL; 206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (Decoder_amr_init(&s->decoder_amrState) || 208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Post_Filter_init(&s->post_state) || 209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Post_Process_init(&s->postHP_state) ) { 210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Speech_Decode_Frame_exit(&s); 211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return -1; 212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->complexityCounter = getCounterId(id); 215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Speech_Decode_Frame_reset(s); 217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *state = s; 218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return 0; 220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional] 224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the 226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below. 227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes 229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes 231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber used to represent cycle count for each subroutine 234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber called) 235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber where: (cycle count variable) = cycle count for [subroutine 236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber name] 237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional] 240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function] 241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/ 244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 245a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberWord16 GSMInitDecode(void **state_data, 246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word8 * id) 247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Speech_Decode_FrameState* s; 249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber OSCL_UNUSED_ARG(id); 250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (state_data == NULL) 252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* fprintf(stderr, "Speech_Decode_Frame_init: 254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber invalid parameter\n"); */ 255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return (-1); 256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *state_data = NULL; 258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* allocate memory */ 260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((s = (Speech_Decode_FrameState *) 261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber malloc(sizeof(Speech_Decode_FrameState))) == NULL) 262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* fprintf(stderr, "Speech_Decode_Frame_init: can not malloc state " 264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber "structure\n"); */ 265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return (-1); 266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (Decoder_amr_init(&s->decoder_amrState) 269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber || Post_Process_reset(&s->postHP_state)) 270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Speech_Decode_FrameState *tmp = s; 272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* 273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * dereferencing type-punned pointer avoid 274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * breaking strict-aliasing rules 275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */ 276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber void** tempVoid = (void**) tmp; 277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber GSMDecodeFrameExit(tempVoid); 278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return (-1); 279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Speech_Decode_Frame_reset(s); 283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *state_data = (void *)s; 284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return (0); 286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************/ 290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* 293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Speech_Decode_Frame_reset 295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS 297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs: 299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state = pointer to structures of type Speech_Decode_FrameState 300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs: 302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns: 305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return_value = set to zero if reset was successful; -1, otherwise (int) 306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used: 308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed: 311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION 315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function resets the state memory used by the GSM AMR decoder. 317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS 320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES 325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sp_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE 330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint Speech_Decode_Frame_reset (Speech_Decode_FrameState *state) 332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 333a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (state == (Speech_Decode_FrameState *) NULL){ 334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber fprintf(stderr, "Speech_Decode_Frame_reset: invalid parameter\n"); 335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return -1; 336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amr_reset(state->decoder_amrState, (enum Mode)0); 339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Post_Filter_reset(state->post_state); 340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Post_Process_reset(state->postHP_state); 341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->prev_mode = (enum Mode)0; 343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber setCounter(state->complexityCounter); 345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Init_WMOPS_counter(); 346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber setCounter(0); // set counter to global counter 347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return 0; 349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional] 353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the 355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below. 356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes 358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes 360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber used to represent cycle count for each subroutine 363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber called) 364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber where: (cycle count variable) = cycle count for [subroutine 365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber name] 366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional] 369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function] 370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/ 373a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberWord16 Speech_Decode_Frame_reset(void *state_data) 374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 375a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 376a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Speech_Decode_FrameState *state = 377a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (Speech_Decode_FrameState *) state_data; 378a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 379a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (state_data == NULL) 380a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 381a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* fprintf(stderr, "Speech_Decode_Frame_reset: 382a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber invalid parameter\n"); */ 383a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return (-1); 384a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 385a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 386a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amr_reset(&(state->decoder_amrState), MR475); 387a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Post_Filter_reset(&(state->post_state)); 388a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Post_Process_reset(&(state->postHP_state)); 389a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 390a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->prev_mode = MR475; 391a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 392a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return (0); 393a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 394a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 395a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************/ 396a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 397a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* 398a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 399a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: GSMDecodeFrameExit 400a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 401a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS 402a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 403a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs: 404a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state = pointer to an array of pointers to structures of type 405a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Speech_Decode_FrameState 406a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 407a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs: 408a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state contents is set to NULL 409a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 410a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns: 411a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 412a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 413a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used: 414a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 415a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 416a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed: 417a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 418a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 419a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 420a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION 421a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 422a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function frees up the memory used for the state memory of the GSM AMR 423a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber decoder. 424a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 425a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 426a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS 427a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 428a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 429a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 430a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 431a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES 432a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 433a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sp_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 434a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 435a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 436a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE 437a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 438a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Note: The original function name of Speech_Decode_Frame_exit was changed to 439a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber GSMDecodeFrameExit in the Code section. 440a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 441a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid Speech_Decode_Frame_exit (Speech_Decode_FrameState **state) 442a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 443a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (state == NULL || *state == NULL) 444a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return; 445a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 446a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amr_exit(&(*state)->decoder_amrState); 447a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Post_Filter_exit(&(*state)->post_state); 448a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Post_Process_exit(&(*state)->postHP_state); 449a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 450a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber setCounter((*state)->complexityCounter); 451a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber WMOPS_output(0); 452a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber setCounter(0); // set counter to global counter 453a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 454a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // deallocate memory 455a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber free(*state); 456a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *state = NULL; 457a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 458a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return; 459a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 460a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 461a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 462a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional] 463a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 464a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the 465a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below. 466a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 467a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes 468a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 469a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes 470a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 471a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 472a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber used to represent cycle count for each subroutine 473a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber called) 474a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber where: (cycle count variable) = cycle count for [subroutine 475a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber name] 476a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 477a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 478a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional] 479a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function] 480a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 481a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 482a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/ 483a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 484a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid GSMDecodeFrameExit(void **state_data) 485a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 486a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 487a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Speech_Decode_FrameState **state = 488a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (Speech_Decode_FrameState **) state_data; 489a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 490a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (state == NULL || *state == NULL) 491a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 492a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return; 493a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 494a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 495a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* deallocate memory */ 496a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber free(*state); 497a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *state = NULL; 498a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 499a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return; 500a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 501a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 502a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************/ 503a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 504a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* 505a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 506a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: GSMFrameDecode 507a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 508a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS 509a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 510a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs: 511a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st = pointer to structures of type Speech_Decode_FrameState 512a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode = GSM AMR codec mode (enum Mode) 513a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber serial = pointer to the serial bit stream buffer (unsigned char) 514a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber frame_type = GSM AMR receive frame type (enum RXFrameType) 515a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber synth = pointer to the output synthesis speech buffer (Word16) 516a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 517a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs: 518a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber synth contents are truncated to 13 bits if NO13BIT is not defined, 519a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber otherwise, its contents are left at 16 bits 520a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 521a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns: 522a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return_value = set to zero (int) 523a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 524a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used: 525a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 526a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 527a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed: 528a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 529a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 530a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 531a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION 532a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 533a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function is the entry point to the GSM AMR decoder. The following 534a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber operations are performed on one received frame: First, the codec 535a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parameters are parsed from the buffer pointed to by serial according to 536a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber frame_type. Then the AMR decoder is invoked via a call to Decoder_amr. Post 537a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber filtering of the decoded data is done via a call to Post_Filter function. 538a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Lastly, the decoded data is post-processed via a call to Post_Process 539a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber function. If NO13BIT is not defined, the contents of the buffer pointed to 540a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber by synth is truncated to 13 bits. It remains unchanged otherwise. 541a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 542a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 543a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS 544a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 545a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 546a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 547a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 548a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES 549a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 550a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sp_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 551a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 552a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 553a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE 554a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 555a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Note: The original function name of Speech_Decode_Frame_exit was changed to 556a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber GSMFrameDecode in the Code section. 557a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 558a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint Speech_Decode_Frame ( 559a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Speech_Decode_FrameState *st, // io: post filter states 560a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber enum Mode mode, // i : AMR mode 561a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 *serial, // i : serial bit stream 562a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber enum RXFrameType frame_type, // i : Frame type 563a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 *synth // o : synthesis speech (postfiltered 564a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // output) 565a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber) 566a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 567a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 parm[MAX_PRM_SIZE + 1]; // Synthesis parameters 568a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 Az_dec[AZ_SIZE]; // Decoded Az for post-filter 569a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // in 4 subframes 570a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 571a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#if !defined(NO13BIT) 572a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 i; 573a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#endif 574a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 575a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber setCounter(st->complexityCounter); 576a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Reset_WMOPS_counter (); // reset WMOPS counter for the new frame 577a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 578a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // Serial to parameters 579a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((frame_type == RX_SID_BAD) || 580a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (frame_type == RX_SID_UPDATE)) { 581a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // Override mode to MRDTX 582a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Bits2prm (MRDTX, serial, parm); 583a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } else { 584a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Bits2prm (mode, serial, parm); 585a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 586a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 587a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // Synthesis 588a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amr(st->decoder_amrState, mode, parm, frame_type, 589a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber synth, Az_dec); 590a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 591a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Post_Filter(st->post_state, mode, synth, Az_dec); // Post-filter 592a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 593a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // post HP filter, and 15->16 bits 594a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Post_Process(st->postHP_state, synth, L_FRAME); 595a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 596a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#if !defined(NO13BIT) 597a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // Truncate to 13 bits 598a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < L_FRAME; i++) 599a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 600a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber synth[i] = synth[i] & 0xfff8; 601a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 602a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#endif 603a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 604a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber setCounter(0); // set counter to global counter 605a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 606a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return 0; 607a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 608a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 609a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 610a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 611a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional] 612a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 613a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the 614a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below. 615a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 616a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes 617a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 618a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes 619a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 620a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 621a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber used to represent cycle count for each subroutine 622a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber called) 623a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber where: (cycle count variable) = cycle count for [subroutine 624a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber name] 625a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 626a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 627a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional] 628a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function] 629a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 630a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 631a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/ 632a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 633a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid GSMFrameDecode( 634a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Speech_Decode_FrameState *st, /* io: post filter states */ 635a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber enum Mode mode, /* i : AMR mode */ 636a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 *serial, /* i : serial bit stream */ 637a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber enum RXFrameType frame_type, /* i : Frame type */ 638a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 *synth) /* o : synthesis speech (postfiltered */ 639a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* output) */ 640a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 641a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 642a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 parm[MAX_PRM_SIZE + 1]; /* Synthesis parameters */ 643a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 Az_dec[AZ_SIZE]; /* Decoded Az for post-filter */ 644a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* in 4 subframes */ 645a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Flag *pOverflow = &(st->decoder_amrState.overflow); /* Overflow flag */ 646a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 647a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#if !defined(NO13BIT) 648a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 i; 649a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#endif 650a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 651a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Serial to parameters */ 652a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((frame_type == RX_SID_BAD) || 653a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (frame_type == RX_SID_UPDATE)) 654a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 655a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Override mode to MRDTX */ 656a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Bits2prm(MRDTX, serial, parm); 657a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 658a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 659a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 660a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Bits2prm(mode, serial, parm); 661a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 662a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 663a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Synthesis */ 664a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amr( 665a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->decoder_amrState), 666a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode, 667a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm, 668a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber frame_type, 669a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber synth, 670a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Az_dec); 671a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 672a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Post-filter */ 673a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Post_Filter( 674a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->post_state), 675a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode, 676a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber synth, 677a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Az_dec, 678a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 679a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 680a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* post HP filter, and 15->16 bits */ 681a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Post_Process( 682a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->postHP_state), 683a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber synth, 684a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_FRAME, 685a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 686a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 687a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#if !defined(NO13BIT) 688a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Truncate to 13 bits */ 689a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < L_FRAME; i++) 690a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 691a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber synth[i] = synth[i] & 0xfff8; 692a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 693a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#endif 694a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 695a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return; 696a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 697a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 698a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 699a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 700