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         free(s);
    272         return (-1);
    273     }
    274 
    275 
    276     Speech_Decode_Frame_reset(s);
    277     *state_data = (void *)s;
    278 
    279     return (0);
    280 }
    281 
    282 
    283 /****************************************************************************/
    284 
    285 
    286 /*
    287 ------------------------------------------------------------------------------
    288  FUNCTION NAME: Speech_Decode_Frame_reset
    289 ------------------------------------------------------------------------------
    290  INPUT AND OUTPUT DEFINITIONS
    291 
    292  Inputs:
    293     state = pointer to structures of type Speech_Decode_FrameState
    294 
    295  Outputs:
    296     None
    297 
    298  Returns:
    299     return_value = set to zero if reset was successful; -1, otherwise (int)
    300 
    301  Global Variables Used:
    302     None
    303 
    304  Local Variables Needed:
    305     None
    306 
    307 ------------------------------------------------------------------------------
    308  FUNCTION DESCRIPTION
    309 
    310  This function resets the state memory used by the GSM AMR decoder.
    311 
    312 ------------------------------------------------------------------------------
    313  REQUIREMENTS
    314 
    315  None
    316 
    317 ------------------------------------------------------------------------------
    318  REFERENCES
    319 
    320  sp_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
    321 
    322 ------------------------------------------------------------------------------
    323  PSEUDO-CODE
    324 
    325 int Speech_Decode_Frame_reset (Speech_Decode_FrameState *state)
    326 {
    327   if (state == (Speech_Decode_FrameState *) NULL){
    328       fprintf(stderr, "Speech_Decode_Frame_reset: invalid parameter\n");
    329       return -1;
    330   }
    331 
    332   Decoder_amr_reset(state->decoder_amrState, (enum Mode)0);
    333   Post_Filter_reset(state->post_state);
    334   Post_Process_reset(state->postHP_state);
    335 
    336   state->prev_mode = (enum Mode)0;
    337 
    338   setCounter(state->complexityCounter);
    339   Init_WMOPS_counter();
    340   setCounter(0); // set counter to global counter
    341 
    342   return 0;
    343 }
    344 
    345 ------------------------------------------------------------------------------
    346  RESOURCES USED [optional]
    347 
    348  When the code is written for a specific target processor the
    349  the resources used should be documented below.
    350 
    351  HEAP MEMORY USED: x bytes
    352 
    353  STACK MEMORY USED: x bytes
    354 
    355  CLOCK CYCLES: (cycle count equation for this function) + (variable
    356                 used to represent cycle count for each subroutine
    357                 called)
    358      where: (cycle count variable) = cycle count for [subroutine
    359                                      name]
    360 
    361 ------------------------------------------------------------------------------
    362  CAUTION [optional]
    363  [State any special notes, constraints or cautions for users of this function]
    364 
    365 ------------------------------------------------------------------------------
    366 */
    367 Word16 Speech_Decode_Frame_reset(void *state_data)
    368 {
    369 
    370     Speech_Decode_FrameState *state =
    371         (Speech_Decode_FrameState *) state_data;
    372 
    373     if (state_data ==  NULL)
    374     {
    375         /*  fprintf(stderr, "Speech_Decode_Frame_reset:
    376                              invalid parameter\n");  */
    377         return (-1);
    378     }
    379 
    380     Decoder_amr_reset(&(state->decoder_amrState), MR475);
    381     Post_Filter_reset(&(state->post_state));
    382     Post_Process_reset(&(state->postHP_state));
    383 
    384     state->prev_mode = MR475;
    385 
    386     return (0);
    387 }
    388 
    389 /****************************************************************************/
    390 
    391 /*
    392 ------------------------------------------------------------------------------
    393  FUNCTION NAME: GSMDecodeFrameExit
    394 ------------------------------------------------------------------------------
    395  INPUT AND OUTPUT DEFINITIONS
    396 
    397  Inputs:
    398     state = pointer to an array of pointers to structures of type
    399             Speech_Decode_FrameState
    400 
    401  Outputs:
    402     state contents is set to NULL
    403 
    404  Returns:
    405     None
    406 
    407  Global Variables Used:
    408     None
    409 
    410  Local Variables Needed:
    411     None
    412 
    413 ------------------------------------------------------------------------------
    414  FUNCTION DESCRIPTION
    415 
    416  This function frees up the memory used for the state memory of the GSM AMR
    417  decoder.
    418 
    419 ------------------------------------------------------------------------------
    420  REQUIREMENTS
    421 
    422  None
    423 
    424 ------------------------------------------------------------------------------
    425  REFERENCES
    426 
    427  sp_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
    428 
    429 ------------------------------------------------------------------------------
    430  PSEUDO-CODE
    431 
    432  Note: The original function name of Speech_Decode_Frame_exit was changed to
    433        GSMDecodeFrameExit in the Code section.
    434 
    435 void Speech_Decode_Frame_exit (Speech_Decode_FrameState **state)
    436 {
    437   if (state == NULL || *state == NULL)
    438       return;
    439 
    440   Decoder_amr_exit(&(*state)->decoder_amrState);
    441   Post_Filter_exit(&(*state)->post_state);
    442   Post_Process_exit(&(*state)->postHP_state);
    443 
    444   setCounter((*state)->complexityCounter);
    445   WMOPS_output(0);
    446   setCounter(0); // set counter to global counter
    447 
    448   // deallocate memory
    449   free(*state);
    450   *state = NULL;
    451 
    452   return;
    453 }
    454 
    455 ------------------------------------------------------------------------------
    456  RESOURCES USED [optional]
    457 
    458  When the code is written for a specific target processor the
    459  the resources used should be documented below.
    460 
    461  HEAP MEMORY USED: x bytes
    462 
    463  STACK MEMORY USED: x bytes
    464 
    465  CLOCK CYCLES: (cycle count equation for this function) + (variable
    466                 used to represent cycle count for each subroutine
    467                 called)
    468      where: (cycle count variable) = cycle count for [subroutine
    469                                      name]
    470 
    471 ------------------------------------------------------------------------------
    472  CAUTION [optional]
    473  [State any special notes, constraints or cautions for users of this function]
    474 
    475 ------------------------------------------------------------------------------
    476 */
    477 
    478 void GSMDecodeFrameExit(void **state_data)
    479 {
    480 
    481     Speech_Decode_FrameState **state =
    482         (Speech_Decode_FrameState **) state_data;
    483 
    484     if (state == NULL || *state == NULL)
    485     {
    486         return;
    487     }
    488 
    489     /* deallocate memory */
    490     free(*state);
    491     *state = NULL;
    492 
    493     return;
    494 }
    495 
    496 /****************************************************************************/
    497 
    498 /*
    499 ------------------------------------------------------------------------------
    500  FUNCTION NAME: GSMFrameDecode
    501 ------------------------------------------------------------------------------
    502  INPUT AND OUTPUT DEFINITIONS
    503 
    504  Inputs:
    505     st = pointer to structures of type Speech_Decode_FrameState
    506     mode = GSM AMR codec mode (enum Mode)
    507     serial = pointer to the serial bit stream buffer (unsigned char)
    508     frame_type = GSM AMR receive frame type (enum RXFrameType)
    509     synth = pointer to the output synthesis speech buffer (Word16)
    510 
    511  Outputs:
    512     synth contents are truncated to 13 bits if NO13BIT is not defined,
    513       otherwise, its contents are left at 16 bits
    514 
    515  Returns:
    516     return_value = set to zero (int)
    517 
    518  Global Variables Used:
    519     None
    520 
    521  Local Variables Needed:
    522     None
    523 
    524 ------------------------------------------------------------------------------
    525  FUNCTION DESCRIPTION
    526 
    527  This function is the entry point to the GSM AMR decoder. The following
    528  operations are performed on one received frame: First, the codec
    529  parameters are parsed from the buffer pointed to by serial according to
    530  frame_type. Then the AMR decoder is invoked via a call to Decoder_amr. Post
    531  filtering of the decoded data is done via a call to Post_Filter function.
    532  Lastly, the decoded data is post-processed via a call to Post_Process
    533  function. If NO13BIT is not defined, the contents of the buffer pointed to
    534  by synth is truncated to 13 bits. It remains unchanged otherwise.
    535 
    536 ------------------------------------------------------------------------------
    537  REQUIREMENTS
    538 
    539  None
    540 
    541 ------------------------------------------------------------------------------
    542  REFERENCES
    543 
    544  sp_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
    545 
    546 ------------------------------------------------------------------------------
    547  PSEUDO-CODE
    548 
    549  Note: The original function name of Speech_Decode_Frame_exit was changed to
    550        GSMFrameDecode in the Code section.
    551 
    552 int Speech_Decode_Frame (
    553     Speech_Decode_FrameState *st, // io: post filter states
    554     enum Mode mode,               // i : AMR mode
    555     Word16 *serial,               // i : serial bit stream
    556     enum RXFrameType frame_type,  // i : Frame type
    557     Word16 *synth                 // o : synthesis speech (postfiltered
    558                                   //     output)
    559 )
    560 {
    561   Word16 parm[MAX_PRM_SIZE + 1];  // Synthesis parameters
    562   Word16 Az_dec[AZ_SIZE];         // Decoded Az for post-filter
    563                                   // in 4 subframes
    564 
    565 #if !defined(NO13BIT)
    566   Word16 i;
    567 #endif
    568 
    569   setCounter(st->complexityCounter);
    570   Reset_WMOPS_counter ();          // reset WMOPS counter for the new frame
    571 
    572   // Serial to parameters
    573   if ((frame_type == RX_SID_BAD) ||
    574       (frame_type == RX_SID_UPDATE)) {
    575     // Override mode to MRDTX
    576     Bits2prm (MRDTX, serial, parm);
    577   } else {
    578     Bits2prm (mode, serial, parm);
    579   }
    580 
    581   // Synthesis
    582   Decoder_amr(st->decoder_amrState, mode, parm, frame_type,
    583               synth, Az_dec);
    584 
    585   Post_Filter(st->post_state, mode, synth, Az_dec);   // Post-filter
    586 
    587   // post HP filter, and 15->16 bits
    588   Post_Process(st->postHP_state, synth, L_FRAME);
    589 
    590 #if !defined(NO13BIT)
    591   // Truncate to 13 bits
    592   for (i = 0; i < L_FRAME; i++)
    593   {
    594      synth[i] = synth[i] & 0xfff8;
    595   }
    596 #endif
    597 
    598   setCounter(0); // set counter to global counter
    599 
    600   return 0;
    601 }
    602 
    603 
    604 ------------------------------------------------------------------------------
    605  RESOURCES USED [optional]
    606 
    607  When the code is written for a specific target processor the
    608  the resources used should be documented below.
    609 
    610  HEAP MEMORY USED: x bytes
    611 
    612  STACK MEMORY USED: x bytes
    613 
    614  CLOCK CYCLES: (cycle count equation for this function) + (variable
    615                 used to represent cycle count for each subroutine
    616                 called)
    617      where: (cycle count variable) = cycle count for [subroutine
    618                                      name]
    619 
    620 ------------------------------------------------------------------------------
    621  CAUTION [optional]
    622  [State any special notes, constraints or cautions for users of this function]
    623 
    624 ------------------------------------------------------------------------------
    625 */
    626 
    627 void GSMFrameDecode(
    628     Speech_Decode_FrameState *st, /* io: post filter states                */
    629     enum Mode mode,               /* i : AMR mode                          */
    630     Word16 *serial,               /* i : serial bit stream                 */
    631     enum RXFrameType frame_type,  /* i : Frame type                        */
    632     Word16 *synth)                /* o : synthesis speech (postfiltered    */
    633 /*     output)                           */
    634 
    635 {
    636     Word16 parm[MAX_PRM_SIZE + 1];  /* Synthesis parameters                */
    637     Word16 Az_dec[AZ_SIZE];         /* Decoded Az for post-filter          */
    638     /* in 4 subframes                      */
    639     Flag *pOverflow = &(st->decoder_amrState.overflow);  /* Overflow flag  */
    640 
    641 #if !defined(NO13BIT)
    642     Word16 i;
    643 #endif
    644 
    645     /* Serial to parameters   */
    646     if ((frame_type == RX_SID_BAD) ||
    647             (frame_type == RX_SID_UPDATE))
    648     {
    649         /* Override mode to MRDTX */
    650         Bits2prm(MRDTX, serial, parm);
    651     }
    652     else
    653     {
    654         Bits2prm(mode, serial, parm);
    655     }
    656 
    657     /* Synthesis */
    658     Decoder_amr(
    659         &(st->decoder_amrState),
    660         mode,
    661         parm,
    662         frame_type,
    663         synth,
    664         Az_dec);
    665 
    666     /* Post-filter */
    667     Post_Filter(
    668         &(st->post_state),
    669         mode,
    670         synth,
    671         Az_dec,
    672         pOverflow);
    673 
    674     /* post HP filter, and 15->16 bits */
    675     Post_Process(
    676         &(st->postHP_state),
    677         synth,
    678         L_FRAME,
    679         pOverflow);
    680 
    681 #if !defined(NO13BIT)
    682     /* Truncate to 13 bits */
    683     for (i = 0; i < L_FRAME; i++)
    684     {
    685         synth[i] = synth[i] & 0xfff8;
    686     }
    687 #endif
    688 
    689     return;
    690 }
    691 
    692 
    693 
    694