1/* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18/****************************************************************************************
19Portions of this file are derived from the following 3GPP standard:
20
21    3GPP TS 26.073
22    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23    Available from http://www.3gpp.org
24
25(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26Permission to distribute, modify and use this file under the standard license
27terms listed above has been obtained from the copyright holder.
28****************************************************************************************/
29/*
30------------------------------------------------------------------------------
31
32
33
34 Filename: /audio/gsm-amr/c/src/sid_sync.c
35 Functions: sid_sync_init
36            sid_sync_reset
37            sid_sync_exit
38            sid_sync_set_handover_debt
39            sid_sync
40
41     Date: 03/13/2002
42
43------------------------------------------------------------------------------
44 REVISION HISTORY
45
46 Description: Changed type definition of state pointer to 'void' for
47              sid_sync_init, sid_sync_reset, sid_sync_exit, and sid_sync.
48              Updated to PV coding template.
49
50 Description:  Replaced OSCL mem type functions and eliminated include
51               files that now are chosen by OSCL definitions
52
53 Description:  Replaced "int" and/or "char" with OSCL defined types.
54
55 Description:
56
57------------------------------------------------------------------------------
58 MODULE DESCRIPTION
59
60 This file contains the functions that initialize, reset, exit, and perform
61 SID synchronization.
62
63------------------------------------------------------------------------------
64*/
65
66
67/*----------------------------------------------------------------------------
68; INCLUDES
69----------------------------------------------------------------------------*/
70#include <stdlib.h>
71
72#include "typedef.h"
73#include "basic_op.h"
74#include "mode.h"
75#include "sid_sync.h"
76
77/*----------------------------------------------------------------------------
78; MACROS
79; [Define module specific macros here]
80----------------------------------------------------------------------------*/
81
82
83/*----------------------------------------------------------------------------
84; DEFINES
85; [Include all pre-processor statements here. Include conditional
86; compile variables also.]
87----------------------------------------------------------------------------*/
88
89/*----------------------------------------------------------------------------
90; LOCAL FUNCTION DEFINITIONS
91; [List function prototypes here]
92----------------------------------------------------------------------------*/
93
94/*----------------------------------------------------------------------------
95; LOCAL VARIABLE DEFINITIONS
96; [Variable declaration - defined here and used outside this module]
97----------------------------------------------------------------------------*/
98
99
100/*
101------------------------------------------------------------------------------
102 FUNCTION NAME: sid_sync_init
103------------------------------------------------------------------------------
104 INPUT AND OUTPUT DEFINITIONS
105
106 Inputs:
107    state = pointer containing a pointer to the state structure used for
108            SID synchronization (void)
109
110 Outputs:
111    None
112
113 Returns:
114    return_value = status of sid_sync_reset function; -1, if state is pointing
115                   to a NULL address (int)
116
117 Global Variables Used:
118    None
119
120 Local Variables Needed:
121    None
122
123------------------------------------------------------------------------------
124 FUNCTION DESCRIPTION
125
126 This function initialize one instance of the sid_sync module. It stores
127 the pointer to state struct in *st. This pointer has to be passed to sid_sync
128 in each call. This function returns 0 on success, otherwise, -1.
129
130------------------------------------------------------------------------------
131 REQUIREMENTS
132
133 None
134
135------------------------------------------------------------------------------
136 REFERENCES
137
138 sid_sync.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
139
140------------------------------------------------------------------------------
141 PSEUDO-CODE
142
143------------------------------------------------------------------------------
144 RESOURCES USED [optional]
145
146 When the code is written for a specific target processor the
147 the resources used should be documented below.
148
149 HEAP MEMORY USED: x bytes
150
151 STACK MEMORY USED: x bytes
152
153 CLOCK CYCLES: (cycle count equation for this function) + (variable
154                used to represent cycle count for each subroutine
155                called)
156     where: (cycle count variable) = cycle count for [subroutine
157                                     name]
158
159------------------------------------------------------------------------------
160 CAUTION [optional]
161 [State any special notes, constraints or cautions for users of this function]
162
163------------------------------------------------------------------------------
164*/
165
166Word16 sid_sync_init(void **state)
167{
168    sid_syncState* s;
169
170    if (state == NULL)
171    {
172        /* fprintf(stderr, "sid_sync_init:invalid state parameter\n"); */
173        return -1;
174    }
175
176    *state = NULL;
177
178    /* allocate memory */
179    if ((s = (sid_syncState *)
180             malloc(sizeof(sid_syncState))) == NULL)
181    {
182        /* fprintf(stderr,
183                "sid_sync_init: "
184                "can not malloc state structure\n"); */
185        return -1;
186    }
187    s->sid_update_rate = 8;
188
189    *state = (void *)s;
190
191    return(sid_sync_reset(s));
192}
193
194/****************************************************************************/
195
196/*
197------------------------------------------------------------------------------
198 FUNCTION NAME: sid_sync_reset
199------------------------------------------------------------------------------
200 INPUT AND OUTPUT DEFINITIONS
201
202 Inputs:
203    state = pointer to the state structure used for SID synchronization (void)
204
205 Outputs:
206    None
207
208 Returns:
209    return_value = 0 (int)
210
211 Global Variables Used:
212    None
213
214 Local Variables Needed:
215    None
216
217------------------------------------------------------------------------------
218 FUNCTION DESCRIPTION
219
220 This function performs a reset of the sid_sync module by setting the state
221 memory to zero.
222
223------------------------------------------------------------------------------
224 REQUIREMENTS
225
226 None
227
228------------------------------------------------------------------------------
229 REFERENCES
230
231 sid_sync.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
232
233------------------------------------------------------------------------------
234 PSEUDO-CODE
235
236------------------------------------------------------------------------------
237 RESOURCES USED [optional]
238
239 When the code is written for a specific target processor the
240 the resources used should be documented below.
241
242 HEAP MEMORY USED: x bytes
243
244 STACK MEMORY USED: x bytes
245
246 CLOCK CYCLES: (cycle count equation for this function) + (variable
247                used to represent cycle count for each subroutine
248                called)
249     where: (cycle count variable) = cycle count for [subroutine
250                                     name]
251
252------------------------------------------------------------------------------
253 CAUTION [optional]
254 [State any special notes, constraints or cautions for users of this function]
255
256------------------------------------------------------------------------------
257*/
258Word16 sid_sync_reset(void *st)
259{
260    sid_syncState *state = (sid_syncState *) st;
261
262    state->sid_update_counter = 3;
263    state->sid_handover_debt = 0;
264    state->prev_ft = TX_SPEECH_GOOD;
265
266    return 0;
267}
268
269
270/****************************************************************************/
271
272/*
273------------------------------------------------------------------------------
274 FUNCTION NAME: sid_sync_exit
275------------------------------------------------------------------------------
276 INPUT AND OUTPUT DEFINITIONS
277
278 Inputs:
279    state = pointer containing a pointer to the state structure used for
280            SID synchronization (void)
281
282 Outputs:
283    None
284
285 Returns:
286    None
287
288 Global Variables Used:
289    None
290
291 Local Variables Needed:
292    None
293
294------------------------------------------------------------------------------
295 FUNCTION DESCRIPTION
296
297 This function frees up the state structure used by sid_sync function. It
298 stores NULL in *state.
299
300------------------------------------------------------------------------------
301 REQUIREMENTS
302
303 None
304
305------------------------------------------------------------------------------
306 REFERENCES
307
308 sid_sync.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
309
310------------------------------------------------------------------------------
311 PSEUDO-CODE
312
313------------------------------------------------------------------------------
314 RESOURCES USED [optional]
315
316 When the code is written for a specific target processor the
317 the resources used should be documented below.
318
319 HEAP MEMORY USED: x bytes
320
321 STACK MEMORY USED: x bytes
322
323 CLOCK CYCLES: (cycle count equation for this function) + (variable
324                used to represent cycle count for each subroutine
325                called)
326     where: (cycle count variable) = cycle count for [subroutine
327                                     name]
328
329------------------------------------------------------------------------------
330 CAUTION [optional]
331 [State any special notes, constraints or cautions for users of this function]
332
333------------------------------------------------------------------------------
334*/
335void sid_sync_exit(void **state)
336{
337    sid_syncState **st = (sid_syncState **) state;
338
339    if (st == NULL || *st == NULL)
340    {
341        return;
342    }
343
344    /* deallocate memory */
345    free(*st);
346    *st = NULL;
347
348    return;
349
350}
351
352/****************************************************************************/
353
354/*
355------------------------------------------------------------------------------
356 FUNCTION NAME: sid_sync_set_handover_debt
357------------------------------------------------------------------------------
358 INPUT AND OUTPUT DEFINITIONS
359
360 Inputs:
361    st = pointer to the state structure used for SID synchronization
362         (sid_syncState)
363    debtFrames = number of handover debt frames (Word16)
364
365 Outputs:
366    st->sid_handover_debt is set to debtFrames
367
368 Returns:
369    return_value = 0
370
371 Global Variables Used:
372    None
373
374 Local Variables Needed:
375    None
376
377------------------------------------------------------------------------------
378 FUNCTION DESCRIPTION
379
380 This function updates the handover debt to debtFrames. Extra SID_UPD are
381 scheduled to update remote decoder CNI states, right after an handover.
382 This is primarily for use on MS UL side.
383
384------------------------------------------------------------------------------
385 REQUIREMENTS
386
387 None
388
389------------------------------------------------------------------------------
390 REFERENCES
391
392 sid_sync.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
393
394------------------------------------------------------------------------------
395 PSEUDO-CODE
396
397------------------------------------------------------------------------------
398 RESOURCES USED [optional]
399
400 When the code is written for a specific target processor the
401 the resources used should be documented below.
402
403 HEAP MEMORY USED: x bytes
404
405 STACK MEMORY USED: x bytes
406
407 CLOCK CYCLES: (cycle count equation for this function) + (variable
408                used to represent cycle count for each subroutine
409                called)
410     where: (cycle count variable) = cycle count for [subroutine
411                                     name]
412
413------------------------------------------------------------------------------
414 CAUTION [optional]
415 [State any special notes, constraints or cautions for users of this function]
416
417------------------------------------------------------------------------------
418*/
419void sid_sync_set_handover_debt(sid_syncState *st,
420                                Word16 debtFrames)
421{
422    /* debtFrames >= 0 */
423    st->sid_handover_debt = debtFrames;
424    return;
425}
426
427
428/****************************************************************************/
429
430/*
431------------------------------------------------------------------------------
432 FUNCTION NAME: sid_sync
433------------------------------------------------------------------------------
434 INPUT AND OUTPUT DEFINITIONS
435
436 Inputs:
437    state = pointer to the state structure used for SID synchronization
438            (sid_syncState)
439    mode = codec mode (enum Mode)
440    tx_frame_type = pointer to TX frame type store (enum TXFrameType)
441
442 Outputs:
443    tx_frame_type contains the new TX frame type
444
445 Returns:
446    None
447
448 Global Variables Used:
449    None
450
451 Local Variables Needed:
452    None
453
454------------------------------------------------------------------------------
455 FUNCTION DESCRIPTION
456
457 This function performs SID frame synchronization to ensure that the mode
458 only switches to a neighbouring mode.
459
460------------------------------------------------------------------------------
461 REQUIREMENTS
462
463 None
464
465------------------------------------------------------------------------------
466 REFERENCES
467
468 sid_sync.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
469
470------------------------------------------------------------------------------
471 PSEUDO-CODE
472
473------------------------------------------------------------------------------
474 RESOURCES USED [optional]
475
476 When the code is written for a specific target processor the
477 the resources used should be documented below.
478
479 HEAP MEMORY USED: x bytes
480
481 STACK MEMORY USED: x bytes
482
483 CLOCK CYCLES: (cycle count equation for this function) + (variable
484                used to represent cycle count for each subroutine
485                called)
486     where: (cycle count variable) = cycle count for [subroutine
487                                     name]
488
489------------------------------------------------------------------------------
490 CAUTION [optional]
491 [State any special notes, constraints or cautions for users of this function]
492
493------------------------------------------------------------------------------
494*/
495void sid_sync(void *state,
496              enum Mode mode,
497              enum TXFrameType *tx_frame_type)
498{
499
500    sid_syncState *st = (sid_syncState *) state;
501
502    if (mode == MRDTX)
503    {
504
505        st->sid_update_counter--;
506
507        if (st->prev_ft == TX_SPEECH_GOOD)
508        {
509            *tx_frame_type = TX_SID_FIRST;
510            st->sid_update_counter = 3;
511        }
512        else
513        {
514            /* TX_SID_UPDATE or TX_NO_DATA */
515            if ((st->sid_handover_debt > 0) &&
516                    (st->sid_update_counter > 2))
517            {
518                /* ensure extra updates are  properly delayed after
519                   a possible SID_FIRST */
520                *tx_frame_type = TX_SID_UPDATE;
521                st->sid_handover_debt--;
522            }
523            else
524            {
525                if (st->sid_update_counter == 0)
526                {
527                    *tx_frame_type = TX_SID_UPDATE;
528                    st->sid_update_counter = st->sid_update_rate;
529                }
530                else
531                {
532                    *tx_frame_type = TX_NO_DATA;
533                }
534            }
535        }
536    }
537    else
538    {
539        st->sid_update_counter = st->sid_update_rate ;
540        *tx_frame_type = TX_SPEECH_GOOD;
541    }
542    st->prev_ft = *tx_frame_type;
543}
544
545