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