Home | History | Annotate | Download | only in src
      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 /****************************************************************************************
     19 Portions 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)
     26 Permission to distribute, modify and use this file under the standard license
     27 terms 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 
    166 Word16 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 */
    258 Word16 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 */
    335 void 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 */
    419 void 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 */
    495 void 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