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.173
     22     ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
     23     Available from http://www.3gpp.org
     24 
     25 (C) 2007, 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: homing_amr_wb_dec.cpp
     35 
     36      Date: 4/25/2007
     37 
     38 ------------------------------------------------------------------------------
     39  REVISION HISTORY
     40 
     41 
     42  Description:
     43 
     44 ------------------------------------------------------------------------------
     45 
     46 
     47 
     48 INPUT AND OUTPUT DEFINITIONS
     49 
     50 Input
     51     int16 input_frame[],            16-bit input frame
     52     int16 mode                      16-bit mode
     53     int16 nparms                    16-bit number of parameters
     54 Returns
     55     Int16 i             number of leading zeros on x
     56 
     57 
     58 ------------------------------------------------------------------------------
     59  FUNCTION DESCRIPTION
     60 
     61     Performs the homing routines
     62 
     63     int16 dhf_test(int16 input_frame[], int16 mode, int16 nparms)
     64     int16 decoder_homing_frame_test(int16 input_frame[], int16 mode)
     65     int16 decoder_homing_frame_test_first(int16 input_frame[], int16 mode)
     66 
     67 ------------------------------------------------------------------------------
     68  REQUIREMENTS
     69 
     70 
     71 ------------------------------------------------------------------------------
     72  REFERENCES
     73 
     74 ------------------------------------------------------------------------------
     75  PSEUDO-CODE
     76 
     77 ------------------------------------------------------------------------------
     78 */
     79 
     80 
     81 /*----------------------------------------------------------------------------
     82 ; INCLUDES
     83 ----------------------------------------------------------------------------*/
     84 
     85 #include "pv_amr_wb_type_defs.h"
     86 #include "pvamrwbdecoder_cnst.h"
     87 #include "pvamrwbdecoder.h"
     88 #include "pvamrwbdecoder_basic_op.h"
     89 #include "get_amr_wb_bits.h"
     90 #include "pvamrwbdecoder_api.h"
     91 #include "pvamrwbdecoder.h"
     92 
     93 /*----------------------------------------------------------------------------
     94 ; MACROS
     95 ; Define module specific macros here
     96 ----------------------------------------------------------------------------*/
     97 
     98 
     99 /*----------------------------------------------------------------------------
    100 ; DEFINES
    101 ; Include all pre-processor statements here. Include conditional
    102 ; compile variables also.
    103 ----------------------------------------------------------------------------*/
    104 #define DHF_PARMS_MAX 32 /* homing frame pattern             */
    105 #define NUM_OF_SPMODES 9
    106 
    107 #define PRML 15
    108 #define PRMN_7k NBBITS_7k/PRML + 1
    109 #define PRMN_9k NBBITS_9k/PRML + 1
    110 #define PRMN_12k NBBITS_12k/PRML + 1
    111 #define PRMN_14k NBBITS_14k/PRML + 1
    112 #define PRMN_16k NBBITS_16k/PRML + 1
    113 #define PRMN_18k NBBITS_18k/PRML + 1
    114 #define PRMN_20k NBBITS_20k/PRML + 1
    115 #define PRMN_23k NBBITS_23k/PRML + 1
    116 #define PRMN_24k NBBITS_24k/PRML + 1
    117 
    118 /*----------------------------------------------------------------------------
    119 ; LOCAL FUNCTION DEFINITIONS
    120 ; Function Prototype declaration
    121 ----------------------------------------------------------------------------*/
    122 #ifdef __cplusplus
    123 extern "C"
    124 {
    125 #endif
    126 
    127     int16 dhf_test(int16 input_frame[], int32 mode, int16 nparms);
    128 
    129 #ifdef __cplusplus
    130 }
    131 #endif
    132 
    133 /*----------------------------------------------------------------------------
    134 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    135 ; Variable declaration - defined here and used outside this module
    136 ----------------------------------------------------------------------------*/
    137 const int16 prmnofsf[NUM_OF_SPMODES] =
    138 {
    139     63,  81, 100,
    140     108, 116, 128,
    141     136, 152, 156
    142 };
    143 
    144 
    145 const int16 dfh_M7k[PRMN_7k] =
    146 {
    147     3168, 29954, 29213, 16121,
    148     64, 13440, 30624, 16430,
    149     19008
    150 };
    151 
    152 const int16 dfh_M9k[PRMN_9k] =
    153 {
    154     3168, 31665,  9943, 9123,
    155     15599,  4358, 20248, 2048,
    156     17040, 27787, 16816, 13888
    157 };
    158 
    159 const int16 dfh_M12k[PRMN_12k] =
    160 {
    161     3168, 31665,  9943,  9128,
    162     3647,  8129, 30930, 27926,
    163     18880, 12319,   496,  1042,
    164     4061, 20446, 25629, 28069,
    165     13948
    166 };
    167 
    168 const int16 dfh_M14k[PRMN_14k] =
    169 {
    170     3168, 31665,  9943,  9131,
    171     24815,   655, 26616, 26764,
    172     7238, 19136,  6144,    88,
    173     4158, 25733, 30567, 30494,
    174     221, 20321, 17823
    175 };
    176 
    177 const int16 dfh_M16k[PRMN_16k] =
    178 {
    179     3168, 31665,  9943,  9131,
    180     24815,   700,  3824,  7271,
    181     26400,  9528,  6594, 26112,
    182     108,  2068, 12867, 16317,
    183     23035, 24632,  7528,  1752,
    184     6759, 24576
    185 };
    186 
    187 const int16 dfh_M18k[PRMN_18k] =
    188 {
    189     3168, 31665,  9943,  9135,
    190     14787, 14423, 30477, 24927,
    191     25345, 30154,   916,  5728,
    192     18978,  2048,   528, 16449,
    193     2436,  3581, 23527, 29479,
    194     8237, 16810, 27091, 19052,
    195     0
    196 };
    197 
    198 const int16 dfh_M20k[PRMN_20k] =
    199 {
    200     3168, 31665,  9943,  9129,
    201     8637, 31807, 24646,   736,
    202     28643,  2977,  2566, 25564,
    203     12930, 13960,  2048,   834,
    204     3270,  4100, 26920, 16237,
    205     31227, 17667, 15059, 20589,
    206     30249, 29123, 0
    207 };
    208 
    209 const int16 dfh_M23k[PRMN_23k] =
    210 {
    211     3168, 31665,  9943,  9132,
    212     16748,  3202, 28179, 16317,
    213     30590, 15857, 19960,  8818,
    214     21711, 21538,  4260, 16690,
    215     20224,  3666,  4194,  9497,
    216     16320, 15388,  5755, 31551,
    217     14080,  3574, 15932,    50,
    218     23392, 26053, 31216
    219 };
    220 
    221 const int16 dfh_M24k[PRMN_24k] =
    222 {
    223     3168, 31665,  9943,  9134,
    224     24776,  5857, 18475, 28535,
    225     29662, 14321, 16725,  4396,
    226     29353, 10003, 17068, 20504,
    227     720,     0,  8465, 12581,
    228     28863, 24774,  9709, 26043,
    229     7941, 27649, 13965, 15236,
    230     18026, 22047, 16681,  3968
    231 };
    232 
    233 
    234 /*----------------------------------------------------------------------------
    235 ; EXTERNAL FUNCTION REFERENCES
    236 ; Declare functions defined elsewhere and referenced in this module
    237 ----------------------------------------------------------------------------*/
    238 
    239 /*----------------------------------------------------------------------------
    240 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    241 ; Declare variables used in this module but defined elsewhere
    242 ----------------------------------------------------------------------------*/
    243 
    244 /*----------------------------------------------------------------------------
    245 ; FUNCTION CODE
    246 ----------------------------------------------------------------------------*/
    247 
    248 int16 dhf_test(int16 input_frame[], int32 mode, int16 nparms)
    249 {
    250     int16 i, j, tmp, shift;
    251     int16 param[DHF_PARMS_MAX];
    252     int16 *prms;
    253 
    254     /* overall table with the parameters of the
    255     decoder homing frames for all modes */
    256 
    257     const int16 *dhf[] =
    258     {
    259         dfh_M7k,
    260         dfh_M9k,
    261         dfh_M12k,
    262         dfh_M14k,
    263         dfh_M16k,
    264         dfh_M18k,
    265         dfh_M20k,
    266         dfh_M23k,
    267         dfh_M24k,
    268         dfh_M24k
    269     };
    270 
    271     prms = input_frame;
    272     j = 0;
    273     i = 0;
    274 
    275     if (mode != MRDTX)
    276     {
    277         if (mode != MODE_24k)
    278         {
    279             /* convert the received serial bits */
    280             tmp = nparms - 15;
    281             while (tmp > j)
    282             {
    283                 param[i] = Serial_parm(15, &prms);
    284                 j += 15;
    285                 i++;
    286             }
    287             tmp = nparms - j;
    288             param[i] = Serial_parm(tmp, &prms);
    289             shift = 15 - tmp;
    290             param[i] = shl_int16(param[i], shift);
    291         }
    292         else
    293         {
    294             /*If mode is 23.85Kbit/s, remove high band energy bits */
    295             for (i = 0; i < 10; i++)
    296             {
    297                 param[i] = Serial_parm(15, &prms);
    298             }
    299             param[10] = Serial_parm(15, &prms) & 0x61FF;
    300 
    301             for (i = 11; i < 17; i++)
    302             {
    303                 param[i] = Serial_parm(15, &prms);
    304             }
    305             param[17] = Serial_parm(15, &prms) & 0xE0FF;
    306 
    307             for (i = 18; i < 24; i++)
    308             {
    309                 param[i] = Serial_parm(15, &prms);
    310             }
    311             param[24] = Serial_parm(15, &prms) & 0x7F0F;
    312 
    313             for (i = 25; i < 31; i++)
    314             {
    315                 param[i] = Serial_parm(15, &prms);
    316             }
    317 
    318             tmp = Serial_parm(8, &prms);
    319             param[31] = shl_int16(tmp, 7);
    320             shift = 0;
    321         }
    322 
    323         /* check if the parameters matches the parameters of the corresponding decoder homing frame */
    324         tmp = i;
    325         j = 0;
    326         for (i = 0; i < tmp; i++)
    327         {
    328             j = (param[i] ^ dhf[mode][i]);
    329             if (j)
    330             {
    331                 break;
    332             }
    333         }
    334         tmp = 0x7fff;
    335         tmp >>= shift;
    336         tmp = shl_int16(tmp, shift);
    337         tmp = (dhf[mode][i] & tmp);
    338         tmp = (param[i] ^ tmp);
    339         j = (int16)(j | tmp);
    340 
    341     }
    342     else
    343     {
    344         j = 1;
    345     }
    346 
    347     return (!j);
    348 }
    349 
    350 /*----------------------------------------------------------------------------
    351 ; FUNCTION CODE
    352 ----------------------------------------------------------------------------*/
    353 
    354 
    355 int16 pvDecoder_AmrWb_homing_frame_test(int16 input_frame[], int16 mode)
    356 {
    357     /* perform test for COMPLETE parameter frame */
    358     return dhf_test(input_frame, mode, AMR_WB_COMPRESSED[mode]);
    359 }
    360 
    361 /*----------------------------------------------------------------------------
    362 ; FUNCTION CODE
    363 ----------------------------------------------------------------------------*/
    364 
    365 
    366 int16 pvDecoder_AmrWb_homing_frame_test_first(int16 input_frame[], int16 mode)
    367 {
    368     /* perform test for FIRST SUBFRAME of parameter frame ONLY */
    369     return dhf_test(input_frame, mode, prmnofsf[mode]);
    370 }
    371