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  Pathname: ./audio/gsm-amr/c/src/ets_to_if2.c
     33  Funtions: ets_to_if2
     34 
     35 */
     36 
     37 /*----------------------------------------------------------------------------
     38 ; INCLUDES
     39 ----------------------------------------------------------------------------*/
     40 #include "frame_type_3gpp.h"
     41 #include "ets_to_if2.h"
     42 #include "typedef.h"
     43 #include "bitreorder_tab.h"
     44 
     45 /*----------------------------------------------------------------------------
     46 ; MACROS
     47 ; Define module specific macros here
     48 ----------------------------------------------------------------------------*/
     49 
     50 /*----------------------------------------------------------------------------
     51 ; DEFINES
     52 ; Include all pre-processor statements here. Include conditional
     53 ; compile variables also.
     54 ----------------------------------------------------------------------------*/
     55 
     56 /*----------------------------------------------------------------------------
     57 ; LOCAL FUNCTION DEFINITIONS
     58 ; Function Prototype declaration
     59 ----------------------------------------------------------------------------*/
     60 
     61 /*----------------------------------------------------------------------------
     62 ; LOCAL VARIABLE DEFINITIONS
     63 ; Variable declaration - defined here and used outside this module
     64 ----------------------------------------------------------------------------*/
     65 
     66 
     67 /*
     68 ------------------------------------------------------------------------------
     69  FUNCTION NAME: ets_to_if2
     70 ------------------------------------------------------------------------------
     71  INPUT AND OUTPUT DEFINITIONS
     72 
     73  Inputs:
     74     frame_type_3gpp = decoder speech bit rate (enum Frame_Type_3GPP)
     75     ets_input_ptr   = pointer to input encoded speech bits in ETS format (Word16)
     76     if2_output_ptr  = pointer to output encoded speech bits in IF2 format (UWord8)
     77 
     78  Outputs:
     79     if2_output_ptr  = pointer to encoded speech bits in the IF2 format (UWord8)
     80 
     81  Returns:
     82     None
     83 
     84  Global Variables Used:
     85     None
     86 
     87  Local Variables Needed:
     88     None
     89 
     90 ------------------------------------------------------------------------------
     91  FUNCTION DESCRIPTION
     92 
     93  This function performs a transformation on the data buffers. It converts the
     94  data format from ETS (European Telecommunication Standard) to IF2. ETS format
     95  has the encoded speech bits each separate with only one bit stored in each
     96  word. IF2 is the storage format where the frame type is in the first four bits
     97  of the first byte. The upper four bits of that byte contain the first four
     98  encoded speech bits for the frame. The following bytes contain the rest of
     99  the encoded speech bits. The final byte has padded zeros  to make the frame
    100  byte aligned.
    101 ------------------------------------------------------------------------------
    102  REQUIREMENTS
    103 
    104  None
    105 
    106 ------------------------------------------------------------------------------
    107  REFERENCES
    108 
    109 AMR Speech Codec Frame Structure", 3GPP TS 26.101 version 4.1.0 Release 4, June 2001
    110 
    111 ------------------------------------------------------------------------------
    112  PSEUDO-CODE
    113 
    114 
    115 
    116 ------------------------------------------------------------------------------
    117  RESOURCES USED [optional]
    118 
    119  When the code is written for a specific target processor the
    120  the resources used should be documented below.
    121 
    122  HEAP MEMORY USED: x bytes
    123 
    124  STACK MEMORY USED: x bytes
    125 
    126  CLOCK CYCLES: (cycle count equation for this function) + (variable
    127                 used to represent cycle count for each subroutine
    128                 called)
    129      where: (cycle count variable) = cycle count for [subroutine
    130                                      name]
    131 
    132 ------------------------------------------------------------------------------
    133  CAUTION [optional]
    134  [State any special notes, constraints or cautions for users of this function]
    135 
    136 ------------------------------------------------------------------------------
    137 */
    138 
    139 void ets_to_if2(
    140     enum Frame_Type_3GPP frame_type_3gpp,
    141     Word16 *ets_input_ptr,
    142     UWord8 *if2_output_ptr)
    143 {
    144     Word16  i;
    145     Word16  k;
    146     Word16  j = 0;
    147     Word16 *ptr_temp;
    148     Word16  bits_left;
    149     UWord8  accum;
    150 
    151     if (frame_type_3gpp < AMR_SID)
    152     {
    153         if2_output_ptr[j++] = (UWord8)(frame_type_3gpp) |
    154                               (ets_input_ptr[reorderBits[frame_type_3gpp][0]] << 4) |
    155                               (ets_input_ptr[reorderBits[frame_type_3gpp][1]] << 5) |
    156                               (ets_input_ptr[reorderBits[frame_type_3gpp][2]] << 6) |
    157                               (ets_input_ptr[reorderBits[frame_type_3gpp][3]] << 7);
    158 
    159         for (i = 4; i < numOfBits[frame_type_3gpp] - 7;)
    160         {
    161             if2_output_ptr[j]  =
    162                 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]];
    163             if2_output_ptr[j] |=
    164                 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 1;
    165             if2_output_ptr[j] |=
    166                 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 2;
    167             if2_output_ptr[j] |=
    168                 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 3;
    169             if2_output_ptr[j] |=
    170                 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 4;
    171             if2_output_ptr[j] |=
    172                 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 5;
    173             if2_output_ptr[j] |=
    174                 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 6;
    175             if2_output_ptr[j++] |=
    176                 (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << 7;
    177         }
    178 
    179         bits_left = 4 + numOfBits[frame_type_3gpp] -
    180                     ((4 + numOfBits[frame_type_3gpp]) & 0xFFF8);
    181 
    182         if (bits_left != 0)
    183         {
    184             if2_output_ptr[j] = 0;
    185 
    186             for (k = 0; k < bits_left; k++)
    187             {
    188                 if2_output_ptr[j] |=
    189                     (UWord8) ets_input_ptr[reorderBits[frame_type_3gpp][i++]] << k;
    190             }
    191         }
    192     }
    193     else
    194     {
    195         if (frame_type_3gpp != AMR_NO_DATA)
    196         {
    197             /* First octet contains 3GPP frame type and */
    198             /* first 4 bits of encoded parameters       */
    199             if2_output_ptr[j++] = (UWord8)(frame_type_3gpp) |
    200                                   (ets_input_ptr[0] << 4) | (ets_input_ptr[1] << 5) |
    201                                   (ets_input_ptr[2] << 6) | (ets_input_ptr[3] << 7);
    202             ptr_temp = &ets_input_ptr[4];
    203 
    204             bits_left = ((4 + numOfBits[frame_type_3gpp]) & 0xFFF8);
    205 
    206             for (i = (bits_left - 7) >> 3; i > 0; i--)
    207             {
    208                 accum  = (UWord8) * (ptr_temp++);
    209                 accum |= (UWord8) * (ptr_temp++) << 1;
    210                 accum |= (UWord8) * (ptr_temp++) << 2;
    211                 accum |= (UWord8) * (ptr_temp++) << 3;
    212                 accum |= (UWord8) * (ptr_temp++) << 4;
    213                 accum |= (UWord8) * (ptr_temp++) << 5;
    214                 accum |= (UWord8) * (ptr_temp++) << 6;
    215                 accum |= (UWord8) * (ptr_temp++) << 7;
    216 
    217                 if2_output_ptr[j++] = accum;
    218             }
    219 
    220             bits_left = 4 + numOfBits[frame_type_3gpp] - bits_left;
    221 
    222             if (bits_left != 0)
    223             {
    224                 if2_output_ptr[j] = 0;
    225 
    226                 for (i = 0; i < bits_left; i++)
    227                 {
    228                     if2_output_ptr[j] |= (ptr_temp[i] << i);
    229                 }
    230             }
    231         }
    232         else
    233         {
    234             /* When there is no data, LSnibble of first octet */
    235             /* is the 3GPP frame type, MSnibble is zeroed out */
    236             if2_output_ptr[j++] = (UWord8)(frame_type_3gpp);
    237         }
    238 
    239     }
    240 
    241     return;
    242 }
    243