1b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* ------------------------------------------------------------------
2b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
4b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * you may not use this file except in compliance with the License.
6b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * You may obtain a copy of the License at
7b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
8b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
10b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Unless required by applicable law or agreed to in writing, software
11b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * express or implied.
14b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * See the License for the specific language governing permissions
15b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * and limitations under the License.
16b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * -------------------------------------------------------------------
17b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber */
18b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************************
19b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberPortions of this file are derived from the following 3GPP standard:
20b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
21b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    3GPP TS 26.073
22b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Available from http://www.3gpp.org
24b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
25b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberPermission to distribute, modify and use this file under the standard license
27b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberterms listed above has been obtained from the copyright holder.
28b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber****************************************************************************************/
29b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
30b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
31b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
32b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
33b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
34b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Filename:  /audio/gsm-amr/c/src/amrencode.c
35b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Functions: AMREncode
36b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            AMREncodeInit
37b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            AMREncodeReset
38b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            AMREncodeExit
39b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
40b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Date: 01/26/2002
41b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
42b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
43b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REVISION HISTORY
44b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
45b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Added input_type in the parameter list and updated code to
46b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              check the type of output formatting to use.
47b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
48b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Corrected typo in Include section.
49b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
50b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Added code to support ETS format.
51b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
52b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Modified file by adding the return of the number of encoder
53b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              frame bytes.
54b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
55b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Added call to sid_sync function to support TX_NO_DATA case.
56b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              Added SID type and mode info to ets_output_bfr for ETS SID
57b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              frames. Created AMREncodeInit, AMREncodeReset, and AMREncodeExit
58b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              functions.
59b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
60b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Modified design of handling of ETS outputs such that the ETS
61b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              testvectors could be compared directly to the output of this
62b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              function.
63b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
64b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Added conditional compile around calls to AMR Encoder interface
65b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              functions to allow amrencode.c to be used in the ETS reference
66b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              console.
67b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
68b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
69b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
70b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:
71b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
72b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
73b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODULE DESCRIPTION
74b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
75b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This file contains the functions required to initialize, reset, exit, and
76b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber invoke the ETS 3GPP GSM AMR encoder.
77b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
78b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
79b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
80b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
81b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
82b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
83b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; INCLUDES
84b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
85b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cnst.h"
86b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "mode.h"
87b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "frame_type_3gpp.h"
88b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "typedef.h"
89b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
90b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "amrencode.h"
91b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "ets_to_if2.h"
92b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "ets_to_wmf.h"
93b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "sid_sync.h"
94b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "sp_enc.h"
95b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
96b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
97b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; MACROS [optional]
98b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; [Define module specific macros here]
99b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; DEFINES [optional]
103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; [Include all pre-processor statements here. Include conditional
104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; compile variables also.]
105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; LOCAL FUNCTION DEFINITIONS
109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; [List function prototypes here]
110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; LOCAL VARIABLE DEFINITIONS
114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; [Variable declaration - defined here and used outside this module]
115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: AMREncodeInit
121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pEncStructure = pointer containing the pointer to a structure used by
126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    the encoder (void)
127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pSidSyncStructure = pointer containing the pointer to a structure used for
128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        SID synchronization (void)
129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    dtx_enable = flag to turn off or turn on DTX (Flag)
130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    init_status = 0, if initialization was successful; -1, otherwise (int)
136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    speech_encoder_state = pointer to encoder frame structure
142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                           (Speech_Encode_FrameState)
143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sid_state = pointer to SID sync structure (sid_syncState)
144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
147b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
148b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function initializes the GSM AMR Encoder library by calling
149b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber GSMInitEncode and sid_sync_init. If initialization was successful,
150b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber init_status is set to zero, otherwise, it is set to -1.
151b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
152b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
153b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
154b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
155b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
156b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
157b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
158b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
159b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
160b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
161b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
162b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
163b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
164b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
165b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Initialize GSM AMR Encoder
166b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CALL GSMInitEncode(state_data = &pEncStructure,
167b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    dtx = dtx_enable,
168b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    id = char_id            )
169b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   MODIFYING(nothing)
170b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   RETURNING(return_value = enc_init_status)
171b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
172b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Initialize SID synchronization
173b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CALL sid_sync_init(state = &pSidSyncStructure)
174b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   MODIFYING(nothing)
175b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   RETURNING(return_value = sid_sync_init_status)
176b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
177b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber IF ((enc_init_status != 0) || (sid_sync_init != 0))
178b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber THEN
179b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     init_status = -1
180b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
181b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ENDIF
182b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
183b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODIFY(nothing)
184b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RETURN(init_status)
185b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
186b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
187b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
188b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
189b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
190b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
191b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
192b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
193b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
194b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
195b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
196b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
197b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
198b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
199b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
200b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
201b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
202b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
203b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
204b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
205b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
206b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
207b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
208b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 AMREncodeInit(
209b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    void **pEncStructure,
210b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    void **pSidSyncStructure,
211b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Flag dtx_enable)
212b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
213b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 enc_init_status = 0;
214b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 sid_sync_init_status = 0;
215b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 init_status = 0;
216b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
217b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Initialize GSM AMR Encoder */
218b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef CONSOLE_ENCODER_REF
219b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Change to original ETS input types */
220b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Speech_Encode_FrameState **speech_encode_frame =
221b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        (Speech_Encode_FrameState **)(pEncStructure);
222b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
223b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sid_syncState **sid_sync_state = (sid_syncState **)(pSidSyncStructure);
224b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
225b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Use ETS version of sp_enc.c */
226b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    enc_init_status = Speech_Encode_Frame_init(speech_encode_frame,
227b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                      dtx_enable,
228b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                      (Word8*)"encoder");
229b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
230b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Initialize SID synchronization */
231b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sid_sync_init_status = sid_sync_init(sid_sync_state);
232b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
233b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else
234b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Use PV version of sp_enc.c */
235b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    enc_init_status = GSMInitEncode(pEncStructure,
236b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                    dtx_enable,
237b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                    (Word8*)"encoder");
238b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
239b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Initialize SID synchronization */
240b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sid_sync_init_status = sid_sync_init(pSidSyncStructure);
241b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
242b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
243b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
244b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
245b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if ((enc_init_status != 0) || (sid_sync_init_status != 0))
246b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
247b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        init_status = -1;
248b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
249b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
250b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return(init_status);
251b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
252b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
253b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
254b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/
255b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
256b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
257b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
258b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: AMREncodeReset
259b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
260b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
261b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
262b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
263b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pEncStructure = pointer to a structure used by the encoder (void)
264b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pSidSyncStructure = pointer to a structure used for SID synchronization
265b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        (void)
266b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
267b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
268b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
269b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
270b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
271b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    reset_status = 0, if reset was successful; -1, otherwise (int)
272b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
273b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
274b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
275b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
276b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
277b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    speech_encoder_state = pointer to encoder frame structure
278b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                           (Speech_Encode_FrameState)
279b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sid_state = pointer to SID sync structure (sid_syncState)
280b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
281b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
282b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
283b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
284b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function resets the state memory used by the Encoder and SID sync
285b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber function. If reset was successful, reset_status is set to zero, otherwise,
286b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber it is set to -1.
287b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
288b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
289b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
290b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
291b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
292b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
293b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
294b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
295b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
296b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
297b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
298b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
299b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
300b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
301b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Reset GSM AMR Encoder
302b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CALL Speech_Encode_Frame_reset(state_data = pEncStructure)
303b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   MODIFYING(nothing)
304b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   RETURNING(return_value = enc_reset_status)
305b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
306b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Reset SID synchronization
307b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CALL sid_sync_reset(state = pSidSyncStructure)
308b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   MODIFYING(nothing)
309b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   RETURNING(return_value = sid_sync_reset_status)
310b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
311b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber IF ((enc_reset_status != 0) || (sid_sync_reset_status != 0))
312b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber THEN
313b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     reset_status = -1
314b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
315b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ENDIF
316b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
317b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODIFY(nothing)
318b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RETURN(reset_status)
319b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
320b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
321b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
322b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
323b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
324b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
325b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
326b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
327b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
328b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
329b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
330b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
331b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
332b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
333b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
334b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
335b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
336b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
337b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
338b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
339b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
340b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
341b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
342b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 AMREncodeReset(
343b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    void *pEncStructure,
344b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    void *pSidSyncStructure)
345b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
346b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 enc_reset_status = 0;
347b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 sid_sync_reset_status = 0;
348b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 reset_status = 0;
349b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
350b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Reset GSM AMR Encoder */
351b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    enc_reset_status = Speech_Encode_Frame_reset(pEncStructure);
352b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
353b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
354b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Reset SID synchronization */
355b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sid_sync_reset_status = sid_sync_reset(pSidSyncStructure);
356b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
357b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if ((enc_reset_status != 0) || (sid_sync_reset_status != 0))
358b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
359b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        reset_status = -1;
360b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
361b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
362b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return(reset_status);
363b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
364b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
365b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
366b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/
367b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
368b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
369b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
370b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: AMREncodeExit
371b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
372b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
373b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
374b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
375b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pEncStructure = pointer containing the pointer to a structure used by
376b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    the encoder (void)
377b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pSidSyncStructure = pointer containing the pointer to a structure used for
378b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        SID synchronization (void)
379b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
380b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
381b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
382b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
383b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
384b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
385b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
386b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
387b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
388b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
389b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
390b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    speech_encoder_state = pointer to encoder frame structure
391b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                           (Speech_Encode_FrameState)
392b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sid_state = pointer to SID sync structure (sid_syncState)
393b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
394b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
395b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
396b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
397b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function frees up the state memory used by the Encoder and SID
398b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber synchronization function.
399b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
400b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
401b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
402b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
403b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
404b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
405b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
406b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
407b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
408b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
409b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
410b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
411b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
412b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
413b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Exit GSM AMR Encoder
414b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CALL GSMEncodeFrameExit(state_data = &pEncStructure)
415b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   MODIFYING(nothing)
416b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   RETURNING(nothing)
417b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
418b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Exit SID synchronization
419b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CALL sid_sync_exit(state = &pSidSyncStructure)
420b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   MODIFYING(nothing)
421b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   RETURNING(nothing)
422b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
423b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODIFY(nothing)
424b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RETURN(nothing)
425b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
426b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
427b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
428b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
429b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
430b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
431b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
432b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
433b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
434b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
435b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
436b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
437b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
438b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
439b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
440b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
441b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
442b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
443b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
444b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
445b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
446b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
447b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
448b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid AMREncodeExit(
449b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    void **pEncStructure,
450b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    void **pSidSyncStructure)
451b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
452b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Exit GSM AMR Encoder */
453b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
454b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef CONSOLE_ENCODER_REF
455b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Change to original ETS input types */
456b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Speech_Encode_FrameState ** speech_encode_frame =
457b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        (Speech_Encode_FrameState **)(pEncStructure);
458b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
459b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sid_syncState ** sid_sync_state = (sid_syncState **)(pSidSyncStructure);
460b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
461b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Use ETS version of sp_enc.c */
462b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Speech_Encode_Frame_exit(speech_encode_frame);
463b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
464b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
465b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Exit SID synchronization */
466b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sid_sync_exit(sid_sync_state);
467b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
468b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else
469b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
470b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Use PV version of sp_enc.c */
471b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    GSMEncodeFrameExit(pEncStructure);
472b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
473b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Exit SID synchronization */
474b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sid_sync_exit(pSidSyncStructure);
475b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
476b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
477b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
478b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return;
479b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
480b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
481b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
482b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/
483b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
484b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
485b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
486b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: AMREncode
487b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
488b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
489b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
490b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
491b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pEncState = pointer to encoder state structure (void)
492b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pSidSyncState = pointer to SID sync state structure (void)
493b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    mode = codec mode (enum Mode)
494b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pEncInput = pointer to the input speech samples (Word16)
495b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pEncOutput = pointer to the encoded bit stream (unsigned char)
496b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    p3gpp_frame_type = pointer to the 3GPP frame type (enum Frame_Type_3GPP)
497b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    output_format = output format type (Word16); valid values are AMR_WMF,
498b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    AMR_IF2, and AMR_ETS
499b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
500b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
501b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pEncOutput buffer contains to the newly encoded bit stream
502b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    p3gpp_frame_type store contains the new 3GPP frame type
503b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
504b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
505b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    num_enc_bytes = number of encoded bytes for a particular
506b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    mode or -1, if an error occurred (int)
507b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
508b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
509b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    WmfEncBytesPerFrame = table containing the number of encoder frame
510b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          data bytes per codec mode for WMF output
511b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          format (const int)
512b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    If2EncBytesPerFrame = table containing the number of encoder frame
513b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          data bytes per codec mode for IF2 output
514b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          format (const int)
515b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
516b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
517b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
518b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
519b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
520b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
521b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
522b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function is the top-level entry point to the GSM AMR Encoder library.
523b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
524b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber The following describes the encoding process for WMF or IF2 formatted output
525b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber data. This functions calls GSMEncodeFrame to encode one frame's worth of
526b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber input speech samples, and returns the newly encoded bit stream in the buffer
527b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pointed to by pEncOutput.Then the function sid_sync is called to determine
528b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the transmit frame type. If the transmit frame type is TX_SPEECH_GOOD or
529b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber TX_SID_FIRST or TX_SID_UPDATE, p3gpp_frame_type will be set to the encoder
530b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber used mode. For SID frames, the SID type information and mode information are
531b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber added to the encoded parameter bitstream according to the SID frame format
532b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber described in [1]. If the transmit frame type is TX_NO_DATA, the store
533b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pointed to by p3gpp_frame_type will be set to NO_DATA. Then the output
534b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber format type (output_format) will be checked to determine the format of the
535b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber encoded data.
536b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
537b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber If output_format is AMR_TX_WMF, the function ets_to_wmf will be called to
538b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber convert from ETS format (1 bit/word, where 1 word = 16 bits, information in
539b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber least significant bit) to WMF (aka, non-IF2). The WMF format stores the data
540b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber in octets. The least significant 4 bits of the first octet contains the 3GPP
541b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber frame type information and the most significant 4 bits are zeroed out. The
542b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber succeeding octets contain the packed encoded speech bits. The total number of
543b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber WMF bytes encoded is obtained from WmfEncBytesPerFrame table and returned via
544b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber num_enc_bytes.
545b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
546b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber If output_format is AMR_TX_IF2, the function if2_to_ets will be called to
547b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber convert from ETS format to IF2 [1]. The IF2 format stores the data in octets.
548b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber The least significant nibble of the first octet contains the 3GPP frame type
549b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber and the most significant nibble contains the first 4 encoded speech bits. The
550b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber suceeding octets contain the packed encoded speech bits. The total number of
551b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber IF2 bytes encoded is obtained from If2EncBytesPerFrame table and returned via
552b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber num_enc_bytes.
553b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
554b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber If output_format is AMR_TX_ETS, GSMFrameEncode is called to generate the
555b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber encoded speech parameters, then, sid_sync is called to determine the transmit
556b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber frame type. If the transmit frame type is not TX_NO_DATA, then the transmit
557b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber frame type information is saved in the first location of the ets_output_bfr,
558b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber followed by the encoded speech parameters. The codec mode information is
559b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber stored immediately after the MAX_SERIAL_SIZE encoded speech parameters. If
560b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the transmit frame type is TX_NO_DATA, the transmit frame type, encoded
561b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber speech parameters, and codec mode are stored in the same order as before
562b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber in ets_output_bfr. However, for the no data case, the codec mode is set to
563b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber -1.
564b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
565b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber After all the required information is generated, the 16-bit data generated
566b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber by the Encoder (in ets_output_bfr) is copied to the buffer pointed to by
567b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pEncOutput in the little endian configuration, i.e., least significant byte,
568b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber followed by most significant byte. The num_enc_bytes is set to
569b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 2*(MAX_SERIAL_SIZE+2).
570b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
571b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber If output_format is invalid, this function flags the error and sets
572b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber num_enc_bytes to -1.
573b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
574b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
575b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
576b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
577b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
578b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
579b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
580b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
581b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
582b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [1] "AMR Speech Codec Frame Structure", 3GPP TS 26.101 version 4.1.0
583b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Release 4, June 2001
584b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
585b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
586b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
587b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
588b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber IF ((output_format == AMR_TX_WMF) | (output_format == AMR_TX_IF2))
589b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber THEN
590b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     // Encode one speech frame (20 ms)
591b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CALL GSMEncodeFrame( state_data = pEncState,
592b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          mode = mode,
593b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          new_speech = pEncInput,
594b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          serial = &ets_output_bfr[0],
595b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          usedMode = &usedMode )
596b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       MODIFYING(nothing)
597b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       RETURNING(return_value = 0)
598b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
599b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     // Determine transmit frame type
600b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CALL sid_sync(st = pSidSyncState,
601b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   mode = usedMode
602b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   tx_frame_type = &tx_frame_type)
603b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       MODIFYING(nothing)
604b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       RETURNING(nothing)
605b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
606b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     IF (tx_frame_type != TX_NO_DATA)
607b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     THEN
608b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         // There is data to transmit
609b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *p3gpp_frame_type = (enum Frame_Type_3GPP) usedMode
610b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
611b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         // Add SID type and mode info for SID frames
612b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         IF (*p3gpp_frame_type == AMR_SID)
613b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         THEN
614b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             // Add SID type to encoder output buffer
615b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             IF (tx_frame_type == TX_SID_FIRST)
616b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             THEN
617b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 ets_output_bfr[AMRSID_TXTYPE_BIT_OFFSET] &= 0x7f
618b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
619b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             ELSEIF (tx_frame_type == TX_SID_UPDATE )
620b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             THEN
621b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 ets_output_bfr[AMRSID_TXTYPE_BIT_OFFSET] |= 0x80
622b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
623b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             ENDIF
624b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
625b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             // Add mode information bits
626b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             FOR i = 0 TO NUM_AMRSID_TXMODE_BITS-1
627b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
628b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 ets_output_bfr[AMRSID_TXMODE_BIT_OFFSET+i] = (mode>>i)&&0x0001
629b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
630b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             ENDFOR
631b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
632b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         ENDIF
633b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
634b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     ELSE
635b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         // There is no data to transmit
636b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *p3gpp_frame_type = NO_DATA
637b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
638b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     ENDIF
639b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
640b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     // Determine the output format to use
641b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     IF (output_format == AMR_TX_WMF)
642b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     THEN
643b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         // Change output data format to WMF
644b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         CALL ets_to_wmf( frame_type_3gpp = *p3gpp_frame_type,
645b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          ets_input_ptr = &ets_output_bfr[0],
646b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          wmf_output_ptr = pEncOutput         )
647b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           MODIFYING(nothing)
648b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           RETURNING(nothing)
649b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
650b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         // Set up the number of encoded WMF bytes
651b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         num_enc_bytes = WmfEncBytesPerFrame[(int) *p3gpp_frame_type]
652b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
653b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     ELSEIF (output_format == AMR_TX_IF2)
654b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     THEN
655b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         // Change output data format to IF2
656b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         CALL ets_to_if2( frame_type_3gpp = *p3gpp_frame_type,
657b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          ets_input_ptr = &ets_output_bfr[0],
658b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          if2_output_ptr = pEncOutput         )
659b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           MODIFYING(nothing)
660b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           RETURNING(nothing)
661b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
662b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         // Set up the number of encoded IF2 bytes
663b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         num_enc_bytes = If2EncBytesPerFrame[(int) *p3gpp_frame_type]
664b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
665b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     ENDIF
666b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
667b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ELSEIF (output_format = AMR_TX_ETS)
668b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber THEN
669b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     // Encode one speech frame (20 ms)
670b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CALL GSMEncodeFrame( state_data = pEncState,
671b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          mode = mode,
672b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          new_speech = pEncInput,
673b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          serial = &ets_output_bfr[1],
674b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          usedMode = &usedMode )
675b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       MODIFYING(nothing)
676b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       RETURNING(return_value = 0)
677b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
678b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     // Save used mode
679b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     *p3gpp_frame_type = (enum Frame_Type_3GPP) usedMode
680b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
681b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     // Determine transmit frame type
682b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CALL sid_sync(st = pSidSyncState,
683b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   mode = usedMode
684b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   tx_frame_type = &tx_frame_type)
685b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       MODIFYING(nothing)
686b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       RETURNING(nothing)
687b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
688b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     // Put TX frame type in output buffer
689b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     ets_output_bfr[0] = tx_frame_type
690b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
691b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     // Put mode information after the encoded speech parameters
692b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     IF (tx_frame_type != TX_NO_DATA)
693b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     THEN
694b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         ets_output_bfr[MAX_SERIAL_SIZE+1] = mode
695b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
696b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     ELSE
697b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         ets_output_bfr[MAX_SERIAL_SIZE+1] = -1
698b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
699b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     ENDIF
700b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
701b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     // Copy output of encoder to pEncOutput buffer
702b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     ets_output_ptr = (unsigned char *) &ets_output_bfr[0]
703b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
704b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     // Copy 16-bit data in 8-bit chunks using Little Endian configuration
705b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FOR i = 0 TO (2*(MAX_SERIAL_SIZE+6))-1
706b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
707b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *(pEncOutput+i) = *ets_output_ptr
708b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         ets_output_ptr = ets_output_ptr + 1
709b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
710b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     ENDFOR
711b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
712b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     // Set up number of encoded bytes
713b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     num_enc_bytes = 2*(MAX_SERIAL_SIZE+6)
714b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
715b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ELSE
716b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     // Invalid output_format, set up error code
717b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     num_enc_bytes = -1
718b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
719b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ENDIF
720b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
721b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODIFY (nothing)
722b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RETURN (num_enc_bytes)
723b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
724b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
725b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
726b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
727b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
728b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
729b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
730b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
731b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
732b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
733b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
734b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
735b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
736b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
737b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
738b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
739b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
740b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
741b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
742b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
743b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
744b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
745b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
746b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 AMREncode(
747b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    void *pEncState,
748b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    void *pSidSyncState,
749b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    enum Mode mode,
750b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 *pEncInput,
751b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    UWord8 *pEncOutput,
752b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    enum Frame_Type_3GPP *p3gpp_frame_type,
753b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 output_format
754b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber)
755b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
756b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 ets_output_bfr[MAX_SERIAL_SIZE+2];
757b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    UWord8 *ets_output_ptr;
758b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 num_enc_bytes = -1;
759b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 i;
760b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    enum TXFrameType tx_frame_type;
761b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    enum Mode usedMode = MR475;
762b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
763b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Encode WMF or IF2 frames */
764b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if ((output_format == AMR_TX_WMF) | (output_format == AMR_TX_IF2))
765b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
766b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Encode one speech frame (20 ms) */
767b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
768b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef CONSOLE_ENCODER_REF
769b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
770b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Use PV version of sp_enc.c */
771b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        GSMEncodeFrame(pEncState, mode, pEncInput, ets_output_bfr, &usedMode);
772b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
773b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else
774b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Use ETS version of sp_enc.c */
775b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Speech_Encode_Frame(pEncState, mode, pEncInput, ets_output_bfr, &usedMode);
776b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
777b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
778b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
779b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Determine transmit frame type */
780b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sid_sync(pSidSyncState, usedMode, &tx_frame_type);
781b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
782b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (tx_frame_type != TX_NO_DATA)
783b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
784b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* There is data to transmit */
785b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *p3gpp_frame_type = (enum Frame_Type_3GPP) usedMode;
786b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
787b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* Add SID type and mode info for SID frames */
788b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            if (*p3gpp_frame_type == AMR_SID)
789b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
790b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* Add SID type to encoder output buffer */
791b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                if (tx_frame_type == TX_SID_FIRST)
792b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                {
793b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    ets_output_bfr[AMRSID_TXTYPE_BIT_OFFSET] &= 0x0000;
794b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                }
795b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                else if (tx_frame_type == TX_SID_UPDATE)
796b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                {
797b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    ets_output_bfr[AMRSID_TXTYPE_BIT_OFFSET] |= 0x0001;
798b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                }
799b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
800b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* Add mode information bits */
801b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                for (i = 0; i < NUM_AMRSID_TXMODE_BITS; i++)
802b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                {
803b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    ets_output_bfr[AMRSID_TXMODE_BIT_OFFSET+i] =
804b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        (mode >> i) & 0x0001;
805b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                }
806b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
807b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
808b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        else
809b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
810b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* This is no data to transmit */
811b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *p3gpp_frame_type = (enum Frame_Type_3GPP)AMR_NO_DATA;
812b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
813b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
814b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* At this point, output format is ETS */
815b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Determine the output format to use */
816b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (output_format == AMR_TX_WMF)
817b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
818b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* Change output data format to WMF */
819b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            ets_to_wmf(*p3gpp_frame_type, ets_output_bfr, pEncOutput);
820b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
821b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* Set up the number of encoded WMF bytes */
822b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            num_enc_bytes = WmfEncBytesPerFrame[(Word16) *p3gpp_frame_type];
823b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
824b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
825b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        else if (output_format == AMR_TX_IF2)
826b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
827b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* Change output data format to IF2 */
828b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            ets_to_if2(*p3gpp_frame_type, ets_output_bfr, pEncOutput);
829b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
830b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* Set up the number of encoded IF2 bytes */
831b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            num_enc_bytes = If2EncBytesPerFrame[(Word16) *p3gpp_frame_type];
832b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
833b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
834b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
835b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
836b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Encode ETS frames */
837b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    else if (output_format == AMR_TX_ETS)
838b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
839b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Encode one speech frame (20 ms) */
840b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
841b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef CONSOLE_ENCODER_REF
842b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
843b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Use PV version of sp_enc.c */
844b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        GSMEncodeFrame(pEncState, mode, pEncInput, &ets_output_bfr[1], &usedMode);
845b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
846b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else
847b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Use ETS version of sp_enc.c */
848b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Speech_Encode_Frame(pEncState, mode, pEncInput, &ets_output_bfr[1], &usedMode);
849b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
850b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
851b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
852b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Save used mode */
853b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *p3gpp_frame_type = (enum Frame_Type_3GPP) usedMode;
854b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
855b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Determine transmit frame type */
856b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sid_sync(pSidSyncState, usedMode, &tx_frame_type);
857b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
858b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Put TX frame type in output buffer */
859b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        ets_output_bfr[0] = tx_frame_type;
860b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
861b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Put mode information after the encoded speech parameters */
862b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (tx_frame_type != TX_NO_DATA)
863b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
864b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            ets_output_bfr[1+MAX_SERIAL_SIZE] = (Word16) mode;
865b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
866b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        else
867b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
868b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            ets_output_bfr[1+MAX_SERIAL_SIZE] = -1;
869b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
870b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
871b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Copy output of encoder to pEncOutput buffer */
872b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        ets_output_ptr = (UWord8 *) & ets_output_bfr[0];
873b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
874b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Copy 16-bit data in 8-bit chunks  */
875b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* using Little Endian configuration */
876b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (i = 0; i < 2*(MAX_SERIAL_SIZE + 2); i++)
877b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
878b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *(pEncOutput + i) = *ets_output_ptr;
879b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            ets_output_ptr += 1;
880b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
881b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
882b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Set up the number of encoded bytes */
883b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        num_enc_bytes = 2 * (MAX_SERIAL_SIZE + 2);
884b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
885b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
886b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
887b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Invalid frame format */
888b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    else
889b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
890b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Invalid output format, set up error code */
891b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        num_enc_bytes = -1;
892b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
893b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
894b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return(num_enc_bytes);
895b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
896b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
897b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
898