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