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  Pathname: ./audio/gsm-amr/c/src/amrdecode.c
     34 
     35      Date: 05/23/2001
     36 ------------------------------------------------------------------------------
     37  REVISION HISTORY
     38 
     39  Description:       AMRDecode now doesn't call getbits() or put_header_in().
     40                     It also now obtains a new bit_offset value from a constant
     41                     rather than from the returned value of getbits().
     42 
     43  Description:       AMRDecode now returns byte_offset rather than bit_offset,
     44                     so the program can access the next frame that is byte
     45                     aligned rather than packed without padding.
     46 
     47  Description:       The structure types Speech_Decode_FrameState are now
     48                     passed into amrdecode( ) using void pointers, so that
     49                     higher level functions don't need to know anything about
     50                     this structure type.
     51 
     52  Description: Changed input argument list. Added code to handle incoming DTX
     53               frames, and added call to wmf_to_ets function prior to calling
     54               GSMFrameDecode.
     55 
     56  Description: Made the following changes per comments from Phase 2/3 review:
     57               1. Changed all references to bit_offset to byte_offset.
     58 
     59  Description: Added input_type to the function interface and modified code
     60               to check type of conversion that needs to be made.
     61 
     62  Description: Modified pseudo-code to include IF2 and ETS input formats.
     63               Removed byte_offset from input list. Renamed speech_bits
     64               to speech_bits_ptr.
     65 
     66  Description: Added dec_input_format_tab.h in Include section. Modified
     67               pseudo-code to use correct table names. Renamed input_type to
     68               input_format and speech_bits to speech_bits_ptr.
     69 
     70  Description: Removed *prev_mode_ptr in the input argument list.
     71 
     72  Description: Made the following changes per comments from Phase 2/3 review:
     73               1. Removed dec_input_format_tab.h from Include section.
     74               2. Changed type definition of raw_pcm_buffer in the I/O
     75                  definition section.
     76 
     77  Description: Renamed WmfBytesPerFrame to WmfDecBytesPerFrame, and
     78               If2BytesPerFrame to If2DecBytesPerFrame.
     79 
     80  Description: Modified code so that the ETS testvectors could be fed directly
     81               to this function.
     82 
     83  Description: Changed '&' to '&&' in the setting of rx_type and mode for
     84               AMR_SID < frame_type < NO_DATA case.
     85 
     86  Description: Added code comments and made some code optimizations per Phase
     87               2/3 review comments.
     88 
     89  Description: Added conditional compile around the call to GSMFrameDecode to
     90               allow amrdecode.c to be used in the ETS reference console.
     91 
     92  Description:
     93 
     94 ------------------------------------------------------------------------------
     95 */
     96 
     97 /*----------------------------------------------------------------------------
     98 ; INCLUDES
     99 ----------------------------------------------------------------------------*/
    100 #include "amrdecode.h"
    101 #include "cnst.h"
    102 #include "typedef.h"
    103 #include "frame.h"
    104 #include "sp_dec.h"
    105 #include "wmf_to_ets.h"
    106 #include "if2_to_ets.h"
    107 #include "frame_type_3gpp.h"
    108 
    109 /*----------------------------------------------------------------------------
    110 ; MACROS
    111 ; Define module specific macros here
    112 ----------------------------------------------------------------------------*/
    113 
    114 
    115 /*----------------------------------------------------------------------------
    116 ; DEFINES
    117 ; Include all pre-processor statements here. Include conditional
    118 ; compile variables also.
    119 ----------------------------------------------------------------------------*/
    120 
    121 
    122 /*----------------------------------------------------------------------------
    123 ; LOCAL FUNCTION DEFINITIONS
    124 ; Function Prototype declaration
    125 ----------------------------------------------------------------------------*/
    126 
    127 /*----------------------------------------------------------------------------
    128 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    129 ; Variable declaration - defined here and used outside this module
    130 ----------------------------------------------------------------------------*/
    131 
    132 /*
    133 ------------------------------------------------------------------------------
    134  FUNCTION NAME: AMRDecode
    135 ------------------------------------------------------------------------------
    136  INPUT AND OUTPUT DEFINITIONS
    137 
    138  Inputs:
    139     state_data      = pointer to a structure (type void)
    140 
    141     frame_type      = 3GPP frame type (enum Frame_Type_3GPP)
    142 
    143     speech_bits_ptr = pointer to the beginning of the raw encoded speech bits
    144                       for the current frame to be decoded (unsigned char)
    145 
    146     raw_pcm_buffer  = pointer to the output pcm outputs array (Word16)
    147 
    148     input_format    = input format used; valid values are AMR_WMF, AMR_IF2,
    149                       and AMR_ETS (Word16)
    150 
    151  Outputs:
    152     raw_pcm_buffer contains the newly decoded linear PCM speech samples
    153     state_data->prev_mode contains the new mode
    154 
    155  Returns:
    156     byte_offset     = address offset of the next frame to be processed or
    157                       error condition flag (-1) (int)
    158 
    159  Global Variables Used:
    160     WmfDecBytesPerFrame = table containing the number of core AMR data bytes
    161                           used by each codec mode for WMF input format (const
    162                           int)
    163 
    164     If2DecBytesPerFrame = table containing the number of core AMR data bytes
    165                           used by each codec mode for IF2 input format (const
    166                           int)
    167 
    168  Local Variables Needed:
    169     None
    170 
    171 ------------------------------------------------------------------------------
    172  FUNCTION DESCRIPTION
    173 
    174  This function is the top level entry function to the GSM AMR Decoder library.
    175 
    176  First, it checks the input format type (input_format) to determine the type
    177  of de-formattting that needs to be done. If input_format is AMR_WMF, the input
    178  data is in WMF (aka, non-IF2) format and the function wmf_to_ets will be
    179  called to convert to the ETS format (1 bit/word, where 1 word = 16 bits),
    180  and byte_offset will be updated according to the contents of WmfDecBytesPerFrame
    181  table.
    182 
    183  If input_format is AMR_IF2, the input data is in IF2 format [1] and the
    184  function if2_to_ets will be called to convert to the ETS format, and
    185  byte_offset will be updated according to the contents of If2DecBytesPerFrame
    186  table.
    187 
    188  The codec mode and receive frame type is initialized based on the incoming
    189  frame_type.
    190 
    191  If input_format is AMR_ETS, the input data is in the ETS format. The receive
    192  frame type is set to the value in the first location of the buffer pointed to
    193  by speech_bits_ptr. Then, the encoded speech parameters in the buffer pointed
    194  to by speech_bits is copied to dec_ets_input_bfr and the type will be changed
    195  from unsigned char to Word16. Lastly, if the receive frame type is not
    196  RX_NO_DATA, the mode is obtained from the buffer pointed to by
    197  speech_bits_ptr, offset by MAX_SERIAL_SIZE+1, otherwise, the mode is set to
    198  the previous mode (found the in state_data->prev_mode).
    199 
    200  If input_format is an unsupported format, byte_offset will be set to -1, to
    201  indicate an error condition has occurred, and the function will exit.
    202 
    203  If there are no errors, GSMFrameDecode is called to decode a 20 ms frame. It
    204  puts the decoded linear PCM samples in the buffer pointed to by
    205  raw_pcm_buffer. Then, the prev_mode field of the structure pointed to by
    206  state_data is updated to the current mode.
    207 
    208  This function returns the new byte_offset value to indicate the address
    209  offset of the next speech frame to be decoded.
    210 
    211 ------------------------------------------------------------------------------
    212  REQUIREMENTS
    213 
    214  None
    215 
    216 ------------------------------------------------------------------------------
    217  REFERENCES
    218 
    219  [1] "AMR Speech Codec Frame Structure", 3GPP TS 26.101 version 4.1.0
    220      Release 4, June 2001
    221 
    222 ------------------------------------------------------------------------------
    223  PSEUDO-CODE
    224 
    225  Note: AMRSID_RXTYPE_BIT_OFFSET = 35
    226        AMRSID_RXMODE_BIT_OFFSET = 36
    227        NUM_AMRSID_RXMODE_BITS = 3
    228 
    229 
    230  // Set up Decoder state structure pointer
    231  Speech_Decode_FrameState *decoder_state
    232             = (Speech_Decode_FrameState *) state_data
    233 
    234  // Determine type of de-formatting
    235 
    236  // Decode WMF or IF2 frames
    237  IF ((input_format == AMR_RX_WMF) | (input_format == AMR_RX_IF2))
    238  THEN
    239      IF (input_format == AMR_RX_WMF)
    240      THEN
    241          // Convert incoming packetized raw WMF data to ETS format
    242          CALL wmf_to_ets(frame_type = frame_type
    243                          input_ptr = speech_bits_ptr
    244                          output_ptr = &dec_ets_input_bfr)
    245            MODIFYING(nothing)
    246            RETURNING(nothing)
    247 
    248          // Address offset of the start of next frame
    249          byte_offset = WmfDecBytesPerFrame[frame_type]
    250 
    251      ELSEIF (input_format == AMR_RX_IF2)
    252      THEN
    253          // Convert incoming packetized raw IF2 data to ETS format
    254          CALL if2_to_ets(frame_type = frame_type
    255                          input_ptr = speech_bits_ptr
    256                          output_ptr = &dec_ets_input_bfr)
    257            MODIFYING(nothing)
    258            RETURNING(nothing)
    259 
    260          // Address offset of the start of next frame
    261          byte_offset = If2DecBytesPerFrame[frame_type]
    262 
    263      ENDIF
    264 
    265        // Determine AMR codec mode and AMR RX frame type
    266      IF (frame_type <= AMR_122)
    267      THEN
    268          mode = (enum Mode) frame_type;
    269          rx_type = RX_SPEECH_GOOD;
    270 
    271      ELSEIF (frame_type == AMR_SID)
    272      THEN
    273          // Clear mode store prior to reading mode info from input buffer
    274          mode = 0
    275 
    276          FOR i = 0 TO NUM_AMRSID_RXMODE_BITS-1
    277 
    278              mode |= (dec_ets_input_bfr[AMRSID_RXMODE_BIT_OFFSET+i] << i)
    279 
    280          ENDFOR
    281 
    282          IF (dec_ets_input_bfr[AMRSID_RXTYPE_BIT_OFFSET] == 0)
    283          THEN
    284              rx_type = RX_SID_FIRST
    285 
    286          ELSE
    287              rx_type = RX_SID_UPDATE
    288 
    289          ENDIF
    290 
    291      ELSEIF ((frame_type > AMR_SID) && (frame_type < NO_DATA))
    292      THEN
    293          // Use previous mode
    294          mode = decoder_state->prev_mode
    295 
    296          // Unsupported SID frames
    297          rx_type = RX_SPEECH_BAD;
    298 
    299      ELSE
    300          // Use previous mode
    301          mode = decoder_state->prev_mode
    302 
    303          // No data received
    304          rx_type = RX_NO_DATA;
    305 
    306      ENDIF
    307 
    308  // Decode ETS frames
    309  ELSEIF (input_format == AMR_RX_ETS)
    310  THEN
    311      // Change type of pointer to incoming raw ETS data
    312      ets_word_ptr = (Word16 *) speech_bits_ptr
    313 
    314      // Get RX frame type
    315      rx_type = (enum RXFrameType) *ets_word_ptr
    316      ets_word_ptr = ets_word_ptr + 1
    317 
    318      // Copy incoming raw ETS data to dec_ets_input_bfr
    319      FOR i = 0 TO MAX_SERIAL_SIZE-1
    320 
    321          dec_ets_input_bfr[i] = *ets_word_ptr
    322          ets_word_ptr = ets_word_ptr + 1
    323 
    324      ENDFOR
    325 
    326      // Get codec mode
    327      IF (rx_type != RX_NO_DATA)
    328      THEN
    329          mode = (enum Mode) *ets_word_ptr
    330 
    331      ELSE
    332          //Use previous mode if no received data
    333          mode = decoder_state->prev_mode
    334 
    335      ENDIF
    336 
    337      // Set up byte_offset
    338      byte_offset = 2*(MAX_SERIAL_SIZE+2)
    339 
    340  ELSE
    341      // Invalid format, return error code
    342      byte_offset = -1
    343 
    344  ENDIF
    345 
    346  // Proceed with decoding frame, if there are no errors
    347  IF (byte_offset != -1)
    348  THEN
    349      // Decode a 20 ms frame
    350      CALL GSMFrameDecode( st = decoder_state
    351                           mode = mode
    352                           serial = dec_ets_input_bfr,
    353                           frame_type = rx_type,
    354                           synth = (Word16 *)raw_pcm_buffer);
    355        MODIFYING (nothing)
    356        RETURNING (Nothing)
    357 
    358      // Save mode for next frame
    359      decoder_state->prev_mode = mode
    360 
    361  ENDIF
    362 
    363  RETURN (byte_offset)
    364 
    365 ------------------------------------------------------------------------------
    366  RESOURCES USED [optional]
    367 
    368  When the code is written for a specific target processor the
    369  the resources used should be documented below.
    370 
    371  HEAP MEMORY USED: x bytes
    372 
    373  STACK MEMORY USED: x bytes
    374 
    375  CLOCK CYCLES: (cycle count equation for this function) + (variable
    376                 used to represent cycle count for each subroutine
    377                 called)
    378      where: (cycle count variable) = cycle count for [subroutine
    379                                      name]
    380 
    381 ------------------------------------------------------------------------------
    382  CAUTION [optional]
    383  [State any special notes, constraints or cautions for users of this function]
    384 
    385 ------------------------------------------------------------------------------
    386 */
    387 
    388 Word16 AMRDecode(
    389     void                      *state_data,
    390     enum Frame_Type_3GPP      frame_type,
    391     UWord8                    *speech_bits_ptr,
    392     Word16                    *raw_pcm_buffer,
    393     bitstream_format          input_format
    394 )
    395 {
    396     Word16 *ets_word_ptr;
    397     enum Mode mode = (enum Mode)MR475;
    398     int modeStore;
    399     int tempInt;
    400     enum RXFrameType rx_type = RX_NO_DATA;
    401     Word16 dec_ets_input_bfr[MAX_SERIAL_SIZE];
    402     Word16 i;
    403     Word16 byte_offset = -1;
    404 
    405     /* Type cast state_data to Speech_Decode_FrameState rather than passing
    406      * that structure type to this function so the structure make up can't
    407      * be viewed from higher level functions than this.
    408      */
    409     Speech_Decode_FrameState *decoder_state
    410     = (Speech_Decode_FrameState *) state_data;
    411 
    412     /* Determine type of de-formatting */
    413     /* WMF or IF2 frames */
    414     if ((input_format == MIME_IETF) | (input_format == IF2))
    415     {
    416         if (input_format == MIME_IETF)
    417         {
    418             /* Convert incoming packetized raw WMF data to ETS format */
    419             wmf_to_ets(frame_type, speech_bits_ptr, dec_ets_input_bfr);
    420 
    421             /* Address offset of the start of next frame */
    422             byte_offset = WmfDecBytesPerFrame[frame_type];
    423         }
    424         else   /* else has to be input_format  IF2 */
    425         {
    426             /* Convert incoming packetized raw IF2 data to ETS format */
    427             if2_to_ets(frame_type, speech_bits_ptr, dec_ets_input_bfr);
    428 
    429             /* Address offset of the start of next frame */
    430             byte_offset = If2DecBytesPerFrame[frame_type];
    431         }
    432 
    433         /* At this point, input data is in ETS format     */
    434         /* Determine AMR codec mode and AMR RX frame type */
    435         if (frame_type <= AMR_122)
    436         {
    437             mode = (enum Mode) frame_type;
    438             rx_type = RX_SPEECH_GOOD;
    439         }
    440         else if (frame_type == AMR_SID)
    441         {
    442             /* Clear mode store prior to reading mode info from input buffer */
    443             modeStore = 0;
    444 
    445             for (i = 0; i < NUM_AMRSID_RXMODE_BITS; i++)
    446             {
    447                 tempInt = dec_ets_input_bfr[AMRSID_RXMODE_BIT_OFFSET+i] << i;
    448                 modeStore |= tempInt;
    449             }
    450             mode = (enum Mode) modeStore;
    451 
    452             /* Get RX frame type */
    453             if (dec_ets_input_bfr[AMRSID_RXTYPE_BIT_OFFSET] == 0)
    454             {
    455                 rx_type = RX_SID_FIRST;
    456             }
    457             else
    458             {
    459                 rx_type = RX_SID_UPDATE;
    460             }
    461         }
    462         else if (frame_type < AMR_NO_DATA)
    463         {
    464             /* Invalid frame_type, return error code */
    465             byte_offset = -1;   /*  !!! */
    466         }
    467         else
    468         {
    469             mode = decoder_state->prev_mode;
    470 
    471             /*
    472              * RX_NO_DATA, generate exponential decay from latest valid frame for the first 6 frames
    473              * after that, create silent frames
    474              */
    475             rx_type = RX_NO_DATA;
    476 
    477         }
    478 
    479     }
    480 
    481     /* ETS frames */
    482     else if (input_format == ETS)
    483     {
    484         /* Change type of pointer to incoming raw ETS data */
    485         ets_word_ptr = (Word16 *) speech_bits_ptr;
    486 
    487         /* Get RX frame type */
    488         rx_type = (enum RXFrameType) * ets_word_ptr;
    489         ets_word_ptr++;
    490 
    491         /* Copy incoming raw ETS data to dec_ets_input_bfr */
    492         for (i = 0; i < MAX_SERIAL_SIZE; i++)
    493         {
    494             dec_ets_input_bfr[i] = *ets_word_ptr;
    495             ets_word_ptr++;
    496         }
    497 
    498         /* Get codec mode */
    499         if (rx_type != RX_NO_DATA)
    500         {
    501             /* Get mode from input bitstream */
    502             mode = (enum Mode) * ets_word_ptr;
    503         }
    504         else
    505         {
    506             /* Use previous mode if no received data */
    507             mode = decoder_state->prev_mode;
    508         }
    509 
    510         /* Set up byte_offset */
    511         byte_offset = 2 * (MAX_SERIAL_SIZE + 2);
    512     }
    513     else
    514     {
    515         /* Invalid input format, return error code */
    516         byte_offset = -1;
    517     }
    518 
    519     /* Proceed with decoding frame, if there are no errors */
    520     if (byte_offset != -1)
    521     {
    522         /* Decode a 20 ms frame */
    523 
    524 #ifndef CONSOLE_DECODER_REF
    525         /* Use PV version of sp_dec.c */
    526         GSMFrameDecode(decoder_state, mode, dec_ets_input_bfr, rx_type,
    527                        raw_pcm_buffer);
    528 
    529 #else
    530         /* Use ETS version of sp_dec.c */
    531         Speech_Decode_Frame(decoder_state, mode, dec_ets_input_bfr, rx_type,
    532                             raw_pcm_buffer);
    533 
    534 #endif
    535 
    536         /* Save mode for next frame */
    537         decoder_state->prev_mode = mode;
    538     }
    539 
    540     return (byte_offset);
    541 }
    542 
    543 
    544 
    545