LCOV - code coverage report
Current view: top level - lib_enc - cod4t64_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 280 925 30.3 %
Date: 2025-05-03 01:55:50 Functions: 9 15 60.0 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : #include <stdint.h>
       5             : #include "options.h"     /* VMR-WB compilation switches            */
       6             : #include "cnst.h"        /* Common constants                       */
       7             : #include "rom_enc.h"     /* Encoder static table prototypes        */
       8             : #include "prot_fx.h"     /* Function prototypes                    */
       9             : #include "rom_com_fx.h"  /* Static table prototypes                */
      10             : #include "rom_com.h"     /* Static table prototypes                */
      11             : #include "prot_fx_enc.h" /* Function prototypes                    */
      12             : 
      13             : 
      14             : /*-------------------------------------------------------------------*
      15             :  * Local constants
      16             :  *-------------------------------------------------------------------*/
      17             : 
      18             : #define STEP   4
      19             : #define MSIZE  256
      20             : #define NB_MAX 8
      21             : 
      22             : /*-------------------------------------------------------------------*
      23             :  * Local function prototypes
      24             :  *-------------------------------------------------------------------*/
      25             : static Word16 quant_1p_N1_fx( const Word16 pos, const Word16 N );
      26             : static Word16 quant_3p_3N1_fx( const Word16 pos1, const Word16 pos2, const Word16 pos3, const Word16 N );
      27             : static Word32 quant_4p_4N_fx( const Word16 pos[], const Word16 N );
      28             : static Word32 quant_5p_5N_fx( const Word16 pos[], const Word16 N );
      29             : static Word32 quant_6p_6N_2_fx( const Word16 pos[], const Word16 N );
      30             : 
      31             : 
      32             : static Word32 fcb_encode_position_fx( const Word16 pos_vector[], Word32 n, const Word32 pos_num, const Word32 flag );
      33             : static Word32 fcb_encode_class_fx( const Word32 sector_6p_num[], const Word32 pulse_num, const Word32 pulse_pos_num );
      34             : static Word32 fcb_encode_PI_fx( const Word16 v[], const Word32 pulse_num );
      35             : static Word32 pre_process_fx( const Word16 v[], Word16 sector_6p[], Word32 sector_6p_num[], Word32 *pulse_pos_num );
      36             : 
      37             : /*---------------------------------------------------------------------*
      38             :  * ACELP_4t64()
      39             :  *
      40             :  * 20, 36, 44, 52, 64, 72, 88 bits algebraic codebook.
      41             :  * 4 tracks x 16 positions per track = 64 samples.
      42             :  *
      43             :  * 20 bits --> 4 pulses in a frame of 64 samples.
      44             :  * 36 bits --> 8 pulses in a frame of 64 samples.
      45             :  * 44 bits 13 + 9 + 13 + 9 --> 10 pulses in a frame of 64 samples.
      46             :  * 52 bits 13 + 13 + 13 + 13 --> 12 pulses in a frame of 64 samples.
      47             :  * 64 bits 2 + 2 + 2 + 2 + 14 + 14 + 14 + 14 -->
      48             :  *                               16 pulses in a frame of 64 samples.
      49             :  * 72 bits 10 + 2 + 10 + 2 + 10 + 14 + 10 + 14 -->
      50             :  *                               18 pulses in a frame of 64 samples.
      51             :  * 88 bits 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 -->
      52             :  *                               24 pulses in a frame of 64 samples.
      53             :  * All pulses can have two (2) possible amplitudes: +1 or -1.
      54             :  * Each pulse can have sixteen (16) possible positions.
      55             :  *---------------------------------------------------------------------*/
      56             : 
      57        6376 : Word16 acelp_4t64_fx(
      58             :     BSTR_ENC_HANDLE hBstr,   /* i/o: encoder bitstream handle                      */
      59             :     Word16 dn[],             /* i  : corr. between target and h[].                 */
      60             :     const Word16 cn[],       /* i  : residual after long term prediction            Q_new*/
      61             :     const Word16 H[],        /* i  : impulse response of weighted synthesis filter  Q12*/
      62             :     Word16 R[],              /* i  : autocorrelation values                        */
      63             :     const Word16 acelpautoc, /* i  : autocorrealtion flag                           */
      64             :     Word16 code[],           /* o  : algebraic (fixed) codebook excitation          Q9*/
      65             :     Word16 y[],              /* o  : filtered fixed codebook excitation             Q9*/
      66             :     Word16 nbbits,           /* i  : number of bits per codebook                    */
      67             :     const Word16 cmpl_flag,  /* i  : complexity reduction flag                      */
      68             :     const Word16 Opt_AMR_WB  /* i  : flag indicating AMR-WB IO mode                 */
      69             : )
      70             : {
      71             : 
      72             :     Word16 i, k, index, track;
      73             :     Word32 L_index;
      74             :     Word16 ind[NPMAXPT * NB_TRACK_FCB_4T + 32]; /* VE3: why +32 ???*/
      75        6376 :     Word16 codvec[NB_PULSE_MAX + 4] = { 0 };
      76        6376 :     Word16 saved_bits = 0;
      77             : 
      78             :     PulseConfig config;
      79             :     Word16 indexing_indices[6], wordcnt, bitcnt;
      80             : 
      81        6376 :     set16_fx( codvec, 0, NB_PULSE_MAX + 4 );
      82        6376 :     SWITCH( nbbits )
      83             :     {
      84             : 
      85           0 :         case 20: /* EVS/AMR-WB pulse indexing: 20 bits, 4 pulses, 4 tracks  */
      86           0 :             config.nbiter = 4;
      87           0 :             move16(); /* 4x12x16=768 loop                                        */
      88           0 :             config.alp = 16384;
      89           0 :             move16(); /* 2 in Q13*/
      90           0 :             config.nb_pulse = 4;
      91           0 :             move16();
      92           0 :             config.fixedpulses = 0;
      93           0 :             move16();
      94           0 :             config.nbpos[0] = 4;
      95           0 :             move16();
      96           0 :             config.nbpos[1] = 8;
      97           0 :             move16();
      98           0 :             BREAK;
      99             : 
     100        2035 :         case 28: /* EVS pulse indexing: 28 bits, 6 pulses, 4 tracks     */
     101        2035 :             config.nbiter = 4;
     102        2035 :             move16();          /* 4x20x16=1280 loops                                  */
     103        2035 :             config.alp = 8192; /*1 in Q13*/
     104        2035 :             move16();          /* coeff FOR sign setting                              */
     105        2035 :             config.nb_pulse = 6;
     106        2035 :             move16();
     107        2035 :             config.fixedpulses = 0;
     108        2035 :             move16();
     109        2035 :             config.nbpos[0] = 6;
     110        2035 :             move16();
     111        2035 :             config.nbpos[1] = 6;
     112        2035 :             move16();
     113        2035 :             config.nbpos[2] = 8;
     114        2035 :             move16();
     115        2035 :             BREAK;
     116             : 
     117        4322 :         case 36: /* EVS/AMR-WB pulse indexing: 36 bits, 8 pulses, 4 tracks  */
     118        4322 :             config.nbiter = 4;
     119        4322 :             move16();          /* 4x20x16=1280 loops                                      */
     120        4322 :             config.alp = 8192; /*1 in Q13*/
     121        4322 :             move16();          /* coeff FOR sign setting                                  */
     122        4322 :             config.nb_pulse = 8;
     123        4322 :             move16();
     124        4322 :             config.fixedpulses = 2;
     125        4322 :             move16();
     126        4322 :             config.nbpos[0] = 4;
     127        4322 :             move16();
     128        4322 :             config.nbpos[1] = 8;
     129        4322 :             move16();
     130        4322 :             config.nbpos[2] = 8;
     131        4322 :             move16();
     132        4322 :             BREAK;
     133             : 
     134           0 :         case 43: /* EVS pulse indexing:    43 bits, 10 pulses, 4 tracks */
     135             :         case 44: /* AMR-WB pulse indexing: 44 bits, 10 pulses, 4 tracks */
     136           0 :             config.nbiter = 4;
     137           0 :             move16();          /* 4x26x16=1664 loops                                  */
     138           0 :             config.alp = 8192; /*1 in Q13*/
     139           0 :             move16();
     140           0 :             config.nb_pulse = 10;
     141           0 :             move16();
     142           0 :             config.fixedpulses = 2;
     143           0 :             move16();
     144           0 :             config.nbpos[0] = 4;
     145           0 :             move16();
     146           0 :             config.nbpos[1] = 6;
     147           0 :             move16();
     148           0 :             config.nbpos[2] = 8;
     149           0 :             move16();
     150           0 :             config.nbpos[3] = 8;
     151           0 :             move16();
     152           0 :             BREAK;
     153             : 
     154           0 :         case 50: /* EVS pulse indexing:    50 bits, 12 pulses, 4 tracks */
     155             :         case 52: /* AMR-WB pulse indexing: 52 bits, 12 pulses, 4 tracks */
     156           0 :             config.nbiter = 4;
     157           0 :             move16();          /* 4x26x16=1664 loops                                  */
     158           0 :             config.alp = 8192; /*1 in Q13*/
     159           0 :             move16();
     160           0 :             config.nb_pulse = 12;
     161           0 :             move16();
     162           0 :             config.fixedpulses = 4;
     163           0 :             move16();
     164           0 :             config.nbpos[0] = 4;
     165           0 :             move16();
     166           0 :             config.nbpos[1] = 6;
     167           0 :             move16();
     168           0 :             config.nbpos[2] = 8;
     169           0 :             move16();
     170           0 :             config.nbpos[3] = 8;
     171           0 :             move16();
     172           0 :             BREAK;
     173             : 
     174          19 :         case 62: /* EVS pulse indexing:    62 bits, 16 pulses, 4 tracks */
     175             :         case 64: /* AMR-WB pulse indexing: 64 bits, 16 pulses, 4 tracks */
     176          19 :             config.nbiter = 3;
     177          19 :             move16();          /* 3x36x16=1728 loops                                  */
     178          19 :             config.alp = 6554; /*.8f in Q13*/
     179          19 :             move16();
     180          19 :             config.nb_pulse = 16;
     181          19 :             move16();
     182          19 :             config.fixedpulses = 4;
     183          19 :             move16();
     184          19 :             config.nbpos[0] = 4;
     185          19 :             move16();
     186          19 :             config.nbpos[1] = 4;
     187          19 :             move16();
     188          19 :             config.nbpos[2] = 6;
     189          19 :             move16();
     190          19 :             config.nbpos[3] = 6;
     191          19 :             move16();
     192          19 :             config.nbpos[4] = 8;
     193          19 :             move16();
     194          19 :             config.nbpos[5] = 8;
     195          19 :             move16();
     196          19 :             BREAK;
     197             : 
     198           0 :         case 72: /* AMR-WB pulse indexing: 72 bits, 18 pulses, 4 tracks */
     199           0 :             config.nbiter = 3;
     200           0 :             move16();          /* 3x35x16=1680 loops                                  */
     201           0 :             config.alp = 6144; /*.75f in Q13*/
     202           0 :             move16();
     203           0 :             config.nb_pulse = 18;
     204           0 :             move16();
     205           0 :             config.fixedpulses = 4;
     206           0 :             move16();
     207           0 :             config.nbpos[0] = 2;
     208           0 :             move16();
     209           0 :             config.nbpos[1] = 3;
     210           0 :             move16();
     211           0 :             config.nbpos[2] = 4;
     212           0 :             move16();
     213           0 :             config.nbpos[3] = 5;
     214           0 :             move16();
     215           0 :             config.nbpos[4] = 6;
     216           0 :             move16();
     217           0 :             config.nbpos[5] = 7;
     218           0 :             move16();
     219           0 :             config.nbpos[6] = 8;
     220           0 :             move16();
     221           0 :             BREAK;
     222             : 
     223           0 :         case 88: /* AMR-WB pulse indexing: 88 bits, 24 pulses, 4 tracks */
     224           0 :             config.nbiter = 2;
     225           0 :             move16();          /* 2x53x16=1696 loop                                   */
     226           0 :             config.alp = 4096; /*.5f in Q13*/
     227           0 :             move16();
     228           0 :             config.nb_pulse = 24;
     229           0 :             move16();
     230           0 :             config.fixedpulses = 4;
     231           0 :             move16();
     232           0 :             config.nbpos[0] = 2;
     233           0 :             move16();
     234           0 :             config.nbpos[1] = 2;
     235           0 :             move16();
     236           0 :             config.nbpos[2] = 3;
     237           0 :             move16();
     238           0 :             config.nbpos[3] = 4;
     239           0 :             move16();
     240           0 :             config.nbpos[4] = 5;
     241           0 :             move16();
     242           0 :             config.nbpos[5] = 6;
     243           0 :             move16();
     244           0 :             config.nbpos[6] = 7;
     245           0 :             move16();
     246           0 :             config.nbpos[7] = 8;
     247           0 :             move16();
     248           0 :             config.nbpos[8] = 8;
     249           0 :             move16();
     250           0 :             config.nbpos[9] = 8;
     251           0 :             move16();
     252           0 :             BREAK;
     253             : 
     254           0 :         case 87: /* EVS pulse indexing:   87 bits, 26 pulses, 4 tracks  */
     255           0 :             config.nbiter = 1;
     256           0 :             move16();
     257           0 :             config.alp = 4096; /*.5f in Q13*/
     258           0 :             move16();
     259           0 :             config.nb_pulse = 26;
     260           0 :             move16();
     261           0 :             config.fixedpulses = 4;
     262           0 :             move16();
     263           0 :             config.nbpos[0] = 4;
     264           0 :             move16();
     265           0 :             config.nbpos[1] = 6;
     266           0 :             move16();
     267           0 :             config.nbpos[2] = 6;
     268           0 :             move16();
     269           0 :             config.nbpos[3] = 8;
     270           0 :             move16();
     271           0 :             config.nbpos[4] = 8;
     272           0 :             move16();
     273           0 :             config.nbpos[5] = 8;
     274           0 :             move16();
     275           0 :             config.nbpos[6] = 8;
     276           0 :             move16();
     277           0 :             config.nbpos[7] = 8;
     278           0 :             move16();
     279           0 :             config.nbpos[8] = 8;
     280           0 :             move16();
     281           0 :             config.nbpos[9] = 8;
     282           0 :             move16();
     283           0 :             config.nbpos[10] = 8;
     284           0 :             move16();
     285           0 :             BREAK;
     286             :     }
     287             : 
     288             :     /* reduce the number of iterations as a compromise between the performance and complexity */
     289        6376 :     if ( cmpl_flag > 0 )
     290             :     {
     291        3531 :         config.nbiter = cmpl_flag;
     292        3531 :         move16();
     293             :     }
     294             : 
     295        6376 :     config.codetrackpos = TRACKPOS_FIXED_FIRST;
     296        6376 :     move16();
     297        6376 :     config.bits = nbbits;
     298        6376 :     move16();
     299             : 
     300        6376 :     IF( acelpautoc )
     301             :     {
     302        3389 :         E_ACELP_4tsearchx_fx( dn, cn, R, code, &config, ind );
     303             : 
     304             :         /* Generate weighted code */
     305        3389 :         E_ACELP_weighted_code( code, H, 12, y );
     306             :     }
     307             :     ELSE
     308             :     {
     309        2987 :         E_ACELP_4tsearch_fx( dn, cn, H, code, &config, ind, y );
     310             : 
     311      194155 :         FOR( i = 0; i < L_SUBFR; i++ )
     312             :         {
     313      191168 :             y[i] = shr( y[i], 3 );
     314      191168 :             move16(); /*Q9              */
     315             :         }
     316             :     }
     317             : 
     318             :     /*-----------------------------------------------------------------*
     319             :      * Indexing
     320             :      *-----------------------------------------------------------------*/
     321             : 
     322        6376 :     IF( !Opt_AMR_WB )
     323             :     {
     324        6376 :         saved_bits = E_ACELP_indexing_fx( code, &config, NB_TRACK_FCB_4T, indexing_indices );
     325             : 
     326        6376 :         saved_bits = 0;
     327        6376 :         move16();
     328             : 
     329        6376 :         wordcnt = shr( nbbits, 4 );
     330        6376 :         bitcnt = s_and( nbbits, 15 );
     331       17112 :         FOR( i = 0; i < wordcnt; i++ )
     332             :         {
     333       10736 :             push_indice( hBstr, IND_ALG_CDBK_4T64, indexing_indices[i], 16 );
     334             :         }
     335        6376 :         IF( bitcnt )
     336             :         {
     337        6376 :             push_indice( hBstr, IND_ALG_CDBK_4T64, indexing_indices[i], bitcnt );
     338             :         }
     339             :     }
     340             :     ELSE
     341             :     {
     342             :         /* AMR-WB pulse indexing */
     343             : 
     344           0 :         IF( EQ_16( nbbits, 20 ) )
     345             :         {
     346           0 :             FOR( track = 0; track < NB_TRACK_FCB_4T; track++ )
     347             :             {
     348           0 :                 k = i_mult2( track, NPMAXPT );
     349           0 :                 index = quant_1p_N1_fx( ind[k], 4 );
     350           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64, index, 5 );
     351             :             }
     352             :         }
     353           0 :         ELSE IF( EQ_16( nbbits, 36 ) )
     354             :         {
     355           0 :             FOR( track = 0; track < NB_TRACK_FCB_4T; track++ )
     356             :             {
     357             : 
     358           0 :                 k = i_mult2( track, NPMAXPT ); /* k = track * NPMAXPT;*/
     359           0 :                 index = quant_2p_2N1_fx( ind[k], ind[k + 1], 4 );
     360           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64, index, 9 );
     361             :             }
     362             :         }
     363           0 :         ELSE IF( EQ_16( nbbits, 44 ) ) /* AMR-WB pulse indexing */
     364             :         {
     365           0 :             FOR( track = 0; track < ( NB_TRACK_FCB_4T - 2 ); track++ )
     366             :             {
     367           0 :                 k = i_mult2( track, NPMAXPT );
     368           0 :                 index = quant_3p_3N1_fx( ind[k], ind[k + 1], ind[k + 2], 4 );
     369           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64, index, 13 );
     370             :             }
     371             : 
     372           0 :             FOR( track = 2; track < NB_TRACK_FCB_4T; track++ )
     373             :             {
     374           0 :                 k = i_mult2( track, NPMAXPT );
     375           0 :                 index = quant_2p_2N1_fx( ind[k], ind[k + 1], 4 );
     376           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64, index, 9 );
     377             :             }
     378             :         }
     379           0 :         ELSE IF( EQ_16( nbbits, 52 ) ) /* AMR-WB pulse indexing */
     380             :         {
     381           0 :             FOR( track = 0; track < NB_TRACK_FCB_4T; track++ )
     382             :             {
     383           0 :                 k = i_mult2( track, NPMAXPT );
     384           0 :                 index = quant_3p_3N1_fx( ind[k], ind[k + 1], ind[k + 2], 4 );
     385           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64, index, 13 );
     386             :             }
     387             :         }
     388           0 :         ELSE IF( EQ_16( nbbits, 64 ) ) /* AMR-WB pulse indexing */
     389             :         {
     390           0 :             FOR( track = 0; track < NB_TRACK_FCB_4T; track++ )
     391             :             {
     392           0 :                 k = i_mult2( track, NPMAXPT );
     393           0 :                 L_index = quant_4p_4N_fx( &ind[k], 4 );
     394           0 :                 index = extract_l( L_shr( L_index, 14 ) & 3 );
     395           0 :                 logic16();
     396           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 2 );
     397             :             }
     398             : 
     399           0 :             FOR( track = 0; track < NB_TRACK_FCB_4T; track++ )
     400             :             {
     401           0 :                 k = i_mult2( track, NPMAXPT );
     402           0 :                 L_index = quant_4p_4N_fx( &ind[k], 4 );
     403           0 :                 index = extract_l( L_index & 0x3FFF );
     404           0 :                 logic16();
     405           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 14 );
     406             :             }
     407             :         }
     408           0 :         ELSE IF( EQ_16( nbbits, 72 ) )
     409             :         {
     410           0 :             FOR( track = 0; track < ( NB_TRACK_FCB_4T - 2 ); track++ )
     411             :             {
     412           0 :                 k = i_mult2( track, NPMAXPT );
     413           0 :                 L_index = quant_5p_5N_fx( &ind[k], 4 );
     414           0 :                 index = extract_l( L_shr( L_index, 10 ) & 0x03FF );
     415           0 :                 logic16();
     416           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 10 );
     417             :             }
     418             : 
     419           0 :             FOR( track = 2; track < NB_TRACK_FCB_4T; track++ )
     420             :             {
     421           0 :                 k = i_mult2( track, NPMAXPT );
     422           0 :                 L_index = quant_4p_4N_fx( &ind[k], 4 );
     423           0 :                 index = extract_l( L_shr( L_index, 14 ) & 3 );
     424           0 :                 logic16();
     425           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 2 );
     426             :             }
     427             : 
     428           0 :             FOR( track = 0; track < ( NB_TRACK_FCB_4T - 2 ); track++ )
     429             :             {
     430           0 :                 k = i_mult2( track, NPMAXPT );
     431           0 :                 L_index = quant_5p_5N_fx( &ind[k], 4 );
     432           0 :                 index = extract_l( L_index & 0x03FF );
     433           0 :                 logic16();
     434           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 10 );
     435             :             }
     436             : 
     437           0 :             FOR( track = 2; track < NB_TRACK_FCB_4T; track++ )
     438             :             {
     439           0 :                 k = i_mult2( track, NPMAXPT );
     440           0 :                 L_index = quant_4p_4N_fx( &ind[k], 4 );
     441           0 :                 index = extract_l( L_index & 0x3FFF );
     442           0 :                 logic16();
     443           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 14 );
     444             :             }
     445             :         }
     446           0 :         ELSE IF( EQ_16( nbbits, 88 ) )
     447             :         {
     448           0 :             FOR( track = 0; track < NB_TRACK_FCB_4T; track++ )
     449             :             {
     450           0 :                 k = i_mult2( track, NPMAXPT );
     451           0 :                 L_index = quant_6p_6N_2_fx( &ind[k], 4 );
     452           0 :                 index = extract_l( L_shr( L_index, 11 ) & 0x07FF );
     453           0 :                 logic16();
     454           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 11 );
     455             :             }
     456             : 
     457           0 :             FOR( track = 0; track < NB_TRACK_FCB_4T; track++ )
     458             :             {
     459           0 :                 k = i_mult2( track, NPMAXPT );
     460           0 :                 L_index = quant_6p_6N_2_fx( &ind[k], 4 );
     461           0 :                 index = extract_l( L_index & 0x07FF );
     462           0 :                 logic16();
     463           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 11 );
     464             :             }
     465             :         }
     466             :     }
     467             : 
     468        6376 :     return saved_bits;
     469             : }
     470             : 
     471             : 
     472       58451 : Word16 acelp_4t64_ivas_fx(
     473             :     BSTR_ENC_HANDLE hBstr,   /* i/o: encoder bitstream handle                      */
     474             :     Word16 dn[],             /* i  : corr. between target and h[].                 */
     475             :     const Word16 cn[],       /* i  : residual after long term prediction            Q_new*/
     476             :     const Word16 H[],        /* i  : impulse response of weighted synthesis filter  Q12*/
     477             :     Word16 R[],              /* i  : autocorrelation values                        */
     478             :     const Word16 acelpautoc, /* i  : autocorrealtion flag                           */
     479             :     Word16 code[],           /* o  : algebraic (fixed) codebook excitation          Q9*/
     480             :     Word16 y[],              /* o  : filtered fixed codebook excitation             Q9*/
     481             :     Word16 nbbits,           /* i  : number of bits per codebook                    */
     482             :     const Word16 cmpl_flag,  /* i  : complexity reduction flag                      */
     483             :     const Word16 Opt_AMR_WB, /* i  : flag indicating AMR-WB IO mode                 */
     484             :     Word16 element_mode )
     485             : {
     486             : 
     487             :     Word16 i, k, index, track;
     488             :     Word32 L_index;
     489             :     Word16 ind[NPMAXPT * NB_TRACK_FCB_4T + 32]; /* VE3: why +32 ???*/
     490       58451 :     Word16 codvec[NB_PULSE_MAX + 4] = { 0 };
     491       58451 :     Word16 saved_bits = 0;
     492             : 
     493             :     PulseConfig config;
     494             :     Word16 indexing_indices[6], wordcnt, bitcnt;
     495             : 
     496       58451 :     set16_fx( codvec, 0, NB_PULSE_MAX + 4 );
     497       58451 :     SWITCH( nbbits )
     498             :     {
     499             : 
     500         696 :         case 20: /* EVS/AMR-WB pulse indexing: 20 bits, 4 pulses, 4 tracks  */
     501         696 :             config.nbiter = 4;
     502         696 :             move16(); /* 4x12x16=768 loop                                        */
     503         696 :             config.alp = 16384;
     504         696 :             move16(); /* 2 in Q13*/
     505         696 :             config.nb_pulse = 4;
     506         696 :             move16();
     507         696 :             config.fixedpulses = 0;
     508         696 :             move16();
     509         696 :             config.nbpos[0] = 4;
     510         696 :             move16();
     511         696 :             config.nbpos[1] = 8;
     512         696 :             move16();
     513         696 :             BREAK;
     514             : 
     515         274 :         case 28: /* EVS pulse indexing: 28 bits, 6 pulses, 4 tracks     */
     516         274 :             config.nbiter = 4;
     517         274 :             move16();          /* 4x20x16=1280 loops                                  */
     518         274 :             config.alp = 8192; /*1 in Q13*/
     519         274 :             move16();          /* coeff FOR sign setting                              */
     520         274 :             config.nb_pulse = 6;
     521         274 :             move16();
     522         274 :             config.fixedpulses = 0;
     523         274 :             move16();
     524         274 :             config.nbpos[0] = 6;
     525         274 :             move16();
     526         274 :             config.nbpos[1] = 6;
     527         274 :             move16();
     528         274 :             config.nbpos[2] = 8;
     529         274 :             move16();
     530         274 :             BREAK;
     531             : 
     532       57481 :         case 36: /* EVS/AMR-WB pulse indexing: 36 bits, 8 pulses, 4 tracks  */
     533       57481 :             config.nbiter = 4;
     534       57481 :             move16();          /* 4x20x16=1280 loops                                      */
     535       57481 :             config.alp = 8192; /*1 in Q13*/
     536       57481 :             move16();          /* coeff FOR sign setting                                  */
     537       57481 :             config.nb_pulse = 8;
     538       57481 :             move16();
     539       57481 :             config.fixedpulses = 2;
     540       57481 :             move16();
     541       57481 :             config.nbpos[0] = 4;
     542       57481 :             move16();
     543       57481 :             config.nbpos[1] = 8;
     544       57481 :             move16();
     545       57481 :             config.nbpos[2] = 8;
     546       57481 :             move16();
     547       57481 :             BREAK;
     548             : 
     549           0 :         case 43: /* EVS pulse indexing:    43 bits, 10 pulses, 4 tracks */
     550             :         case 44: /* AMR-WB pulse indexing: 44 bits, 10 pulses, 4 tracks */
     551           0 :             config.nbiter = 4;
     552           0 :             move16();          /* 4x26x16=1664 loops                                  */
     553           0 :             config.alp = 8192; /*1 in Q13*/
     554           0 :             move16();
     555           0 :             config.nb_pulse = 10;
     556           0 :             move16();
     557           0 :             config.fixedpulses = 2;
     558           0 :             move16();
     559           0 :             config.nbpos[0] = 4;
     560           0 :             move16();
     561           0 :             config.nbpos[1] = 6;
     562           0 :             move16();
     563           0 :             config.nbpos[2] = 8;
     564           0 :             move16();
     565           0 :             config.nbpos[3] = 8;
     566           0 :             move16();
     567           0 :             BREAK;
     568             : 
     569           0 :         case 50: /* EVS pulse indexing:    50 bits, 12 pulses, 4 tracks */
     570             :         case 52: /* AMR-WB pulse indexing: 52 bits, 12 pulses, 4 tracks */
     571           0 :             config.nbiter = 4;
     572           0 :             move16();          /* 4x26x16=1664 loops                                  */
     573           0 :             config.alp = 8192; /*1 in Q13*/
     574           0 :             move16();
     575           0 :             config.nb_pulse = 12;
     576           0 :             move16();
     577           0 :             config.fixedpulses = 4;
     578           0 :             move16();
     579           0 :             config.nbpos[0] = 4;
     580           0 :             move16();
     581           0 :             config.nbpos[1] = 6;
     582           0 :             move16();
     583           0 :             config.nbpos[2] = 8;
     584           0 :             move16();
     585           0 :             config.nbpos[3] = 8;
     586           0 :             move16();
     587           0 :             BREAK;
     588             : 
     589           0 :         case 62: /* EVS pulse indexing:    62 bits, 16 pulses, 4 tracks */
     590             :         case 64: /* AMR-WB pulse indexing: 64 bits, 16 pulses, 4 tracks */
     591           0 :             config.nbiter = 3;
     592           0 :             move16();          /* 3x36x16=1728 loops                                  */
     593           0 :             config.alp = 6554; /*.8f in Q13*/
     594           0 :             move16();
     595           0 :             config.nb_pulse = 16;
     596           0 :             move16();
     597           0 :             config.fixedpulses = 4;
     598           0 :             move16();
     599           0 :             config.nbpos[0] = 4;
     600           0 :             move16();
     601           0 :             config.nbpos[1] = 4;
     602           0 :             move16();
     603           0 :             config.nbpos[2] = 6;
     604           0 :             move16();
     605           0 :             config.nbpos[3] = 6;
     606           0 :             move16();
     607           0 :             config.nbpos[4] = 8;
     608           0 :             move16();
     609           0 :             config.nbpos[5] = 8;
     610           0 :             move16();
     611           0 :             BREAK;
     612             : 
     613           0 :         case 72: /* AMR-WB pulse indexing: 72 bits, 18 pulses, 4 tracks */
     614           0 :             config.nbiter = 3;
     615           0 :             move16();          /* 3x35x16=1680 loops                                  */
     616           0 :             config.alp = 6144; /*.75f in Q13*/
     617           0 :             move16();
     618           0 :             config.nb_pulse = 18;
     619           0 :             move16();
     620           0 :             config.fixedpulses = 4;
     621           0 :             move16();
     622           0 :             config.nbpos[0] = 2;
     623           0 :             move16();
     624           0 :             config.nbpos[1] = 3;
     625           0 :             move16();
     626           0 :             config.nbpos[2] = 4;
     627           0 :             move16();
     628           0 :             config.nbpos[3] = 5;
     629           0 :             move16();
     630           0 :             config.nbpos[4] = 6;
     631           0 :             move16();
     632           0 :             config.nbpos[5] = 7;
     633           0 :             move16();
     634           0 :             config.nbpos[6] = 8;
     635           0 :             move16();
     636           0 :             BREAK;
     637             : 
     638           0 :         case 88: /* AMR-WB pulse indexing: 88 bits, 24 pulses, 4 tracks */
     639           0 :             config.nbiter = 2;
     640           0 :             move16();          /* 2x53x16=1696 loop                                   */
     641           0 :             config.alp = 4096; /*.5f in Q13*/
     642           0 :             move16();
     643           0 :             config.nb_pulse = 24;
     644           0 :             move16();
     645           0 :             config.fixedpulses = 4;
     646           0 :             move16();
     647           0 :             config.nbpos[0] = 2;
     648           0 :             move16();
     649           0 :             config.nbpos[1] = 2;
     650           0 :             move16();
     651           0 :             config.nbpos[2] = 3;
     652           0 :             move16();
     653           0 :             config.nbpos[3] = 4;
     654           0 :             move16();
     655           0 :             config.nbpos[4] = 5;
     656           0 :             move16();
     657           0 :             config.nbpos[5] = 6;
     658           0 :             move16();
     659           0 :             config.nbpos[6] = 7;
     660           0 :             move16();
     661           0 :             config.nbpos[7] = 8;
     662           0 :             move16();
     663           0 :             config.nbpos[8] = 8;
     664           0 :             move16();
     665           0 :             config.nbpos[9] = 8;
     666           0 :             move16();
     667           0 :             BREAK;
     668             : 
     669           0 :         case 87: /* EVS pulse indexing:   87 bits, 26 pulses, 4 tracks  */
     670           0 :             config.nbiter = 1;
     671           0 :             move16();
     672           0 :             config.alp = 4096; /*.5f in Q13*/
     673           0 :             move16();
     674           0 :             config.nb_pulse = 26;
     675           0 :             move16();
     676           0 :             config.fixedpulses = 4;
     677           0 :             move16();
     678           0 :             config.nbpos[0] = 4;
     679           0 :             move16();
     680           0 :             config.nbpos[1] = 6;
     681           0 :             move16();
     682           0 :             config.nbpos[2] = 6;
     683           0 :             move16();
     684           0 :             config.nbpos[3] = 8;
     685           0 :             move16();
     686           0 :             config.nbpos[4] = 8;
     687           0 :             move16();
     688           0 :             config.nbpos[5] = 8;
     689           0 :             move16();
     690           0 :             config.nbpos[6] = 8;
     691           0 :             move16();
     692           0 :             config.nbpos[7] = 8;
     693           0 :             move16();
     694           0 :             config.nbpos[8] = 8;
     695           0 :             move16();
     696           0 :             config.nbpos[9] = 8;
     697           0 :             move16();
     698           0 :             config.nbpos[10] = 8;
     699           0 :             move16();
     700           0 :             BREAK;
     701             :     }
     702             : 
     703             :     /* reduce the number of iterations as a compromise between the performance and complexity */
     704       58451 :     if ( cmpl_flag > 0 )
     705             :     {
     706       57755 :         config.nbiter = cmpl_flag;
     707       57755 :         move16();
     708             :     }
     709             : 
     710       58451 :     config.codetrackpos = TRACKPOS_FIXED_FIRST;
     711       58451 :     move32();
     712       58451 :     config.bits = nbbits;
     713       58451 :     move16();
     714             : 
     715       58451 :     IF( acelpautoc )
     716             :     {
     717       57755 :         E_ACELP_4tsearchx_ivas_fx( dn, cn, R, code, &config, ind, element_mode );
     718             : 
     719             :         /* Generate weighted code */
     720       57755 :         E_ACELP_weighted_code( code, H, 12, y );
     721             :     }
     722             :     ELSE
     723             :     {
     724         696 :         E_ACELP_4tsearch_fx( dn, cn, H, code, &config, ind, y );
     725             : 
     726       45240 :         FOR( i = 0; i < L_SUBFR; i++ )
     727             :         {
     728       44544 :             y[i] = shr( y[i], 3 );
     729       44544 :             move16(); /*Q9              */
     730             :         }
     731             :     }
     732             : 
     733             :     /*-----------------------------------------------------------------*
     734             :      * Indexing
     735             :      *-----------------------------------------------------------------*/
     736             : 
     737       58451 :     IF( !Opt_AMR_WB )
     738             :     {
     739       58451 :         saved_bits = E_ACELP_indexing_fx( code, &config, NB_TRACK_FCB_4T, indexing_indices );
     740             : 
     741       58451 :         saved_bits = 0;
     742       58451 :         move16();
     743             : 
     744       58451 :         wordcnt = shr( nbbits, 4 );
     745       58451 :         bitcnt = s_and( nbbits, 15 );
     746      174383 :         FOR( i = 0; i < wordcnt; i++ )
     747             :         {
     748      115932 :             push_indice( hBstr, IND_ALG_CDBK_4T64, indexing_indices[i], 16 );
     749             :         }
     750       58451 :         IF( bitcnt )
     751             :         {
     752       58451 :             push_indice( hBstr, IND_ALG_CDBK_4T64, indexing_indices[i], bitcnt );
     753             :         }
     754             :     }
     755             :     ELSE
     756             :     {
     757             :         /* AMR-WB pulse indexing */
     758             : 
     759           0 :         IF( EQ_16( nbbits, 20 ) )
     760             :         {
     761           0 :             FOR( track = 0; track < NB_TRACK_FCB_4T; track++ )
     762             :             {
     763           0 :                 k = i_mult2( track, NPMAXPT );
     764           0 :                 index = quant_1p_N1_fx( ind[k], 4 );
     765           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64, index, 5 );
     766             :             }
     767             :         }
     768           0 :         ELSE IF( EQ_16( nbbits, 36 ) )
     769             :         {
     770           0 :             FOR( track = 0; track < NB_TRACK_FCB_4T; track++ )
     771             :             {
     772             : 
     773           0 :                 k = i_mult2( track, NPMAXPT ); /* k = track * NPMAXPT;*/
     774           0 :                 index = quant_2p_2N1_fx( ind[k], ind[k + 1], 4 );
     775           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64, index, 9 );
     776             :             }
     777             :         }
     778           0 :         ELSE IF( EQ_16( nbbits, 44 ) ) /* AMR-WB pulse indexing */
     779             :         {
     780           0 :             FOR( track = 0; track < ( NB_TRACK_FCB_4T - 2 ); track++ )
     781             :             {
     782           0 :                 k = i_mult2( track, NPMAXPT );
     783           0 :                 index = quant_3p_3N1_fx( ind[k], ind[k + 1], ind[k + 2], 4 );
     784           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64, index, 13 );
     785             :             }
     786             : 
     787           0 :             FOR( track = 2; track < NB_TRACK_FCB_4T; track++ )
     788             :             {
     789           0 :                 k = i_mult2( track, NPMAXPT );
     790           0 :                 index = quant_2p_2N1_fx( ind[k], ind[k + 1], 4 );
     791           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64, index, 9 );
     792             :             }
     793             :         }
     794           0 :         ELSE IF( EQ_16( nbbits, 52 ) ) /* AMR-WB pulse indexing */
     795             :         {
     796           0 :             FOR( track = 0; track < NB_TRACK_FCB_4T; track++ )
     797             :             {
     798           0 :                 k = i_mult2( track, NPMAXPT );
     799           0 :                 index = quant_3p_3N1_fx( ind[k], ind[k + 1], ind[k + 2], 4 );
     800           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64, index, 13 );
     801             :             }
     802             :         }
     803           0 :         ELSE IF( EQ_16( nbbits, 64 ) ) /* AMR-WB pulse indexing */
     804             :         {
     805           0 :             FOR( track = 0; track < NB_TRACK_FCB_4T; track++ )
     806             :             {
     807           0 :                 k = i_mult2( track, NPMAXPT );
     808           0 :                 L_index = quant_4p_4N_fx( &ind[k], 4 );
     809           0 :                 index = extract_l( L_shr( L_index, 14 ) & 3 );
     810           0 :                 logic16();
     811           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 2 );
     812             :             }
     813             : 
     814           0 :             FOR( track = 0; track < NB_TRACK_FCB_4T; track++ )
     815             :             {
     816           0 :                 k = i_mult2( track, NPMAXPT );
     817           0 :                 L_index = quant_4p_4N_fx( &ind[k], 4 );
     818           0 :                 index = extract_l( L_index & 0x3FFF );
     819           0 :                 logic16();
     820           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 14 );
     821             :             }
     822             :         }
     823           0 :         ELSE IF( EQ_16( nbbits, 72 ) )
     824             :         {
     825           0 :             FOR( track = 0; track < ( NB_TRACK_FCB_4T - 2 ); track++ )
     826             :             {
     827           0 :                 k = i_mult2( track, NPMAXPT );
     828           0 :                 L_index = quant_5p_5N_fx( &ind[k], 4 );
     829           0 :                 index = extract_l( L_shr( L_index, 10 ) & 0x03FF );
     830           0 :                 logic16();
     831           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 10 );
     832             :             }
     833             : 
     834           0 :             FOR( track = 2; track < NB_TRACK_FCB_4T; track++ )
     835             :             {
     836           0 :                 k = i_mult2( track, NPMAXPT );
     837           0 :                 L_index = quant_4p_4N_fx( &ind[k], 4 );
     838           0 :                 index = extract_l( L_shr( L_index, 14 ) & 3 );
     839           0 :                 logic16();
     840           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 2 );
     841             :             }
     842             : 
     843           0 :             FOR( track = 0; track < ( NB_TRACK_FCB_4T - 2 ); track++ )
     844             :             {
     845           0 :                 k = i_mult2( track, NPMAXPT );
     846           0 :                 L_index = quant_5p_5N_fx( &ind[k], 4 );
     847           0 :                 index = extract_l( L_index & 0x03FF );
     848           0 :                 logic16();
     849           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 10 );
     850             :             }
     851             : 
     852           0 :             FOR( track = 2; track < NB_TRACK_FCB_4T; track++ )
     853             :             {
     854           0 :                 k = i_mult2( track, NPMAXPT );
     855           0 :                 L_index = quant_4p_4N_fx( &ind[k], 4 );
     856           0 :                 index = extract_l( L_index & 0x3FFF );
     857           0 :                 logic16();
     858           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 14 );
     859             :             }
     860             :         }
     861           0 :         ELSE IF( EQ_16( nbbits, 88 ) )
     862             :         {
     863           0 :             FOR( track = 0; track < NB_TRACK_FCB_4T; track++ )
     864             :             {
     865           0 :                 k = i_mult2( track, NPMAXPT );
     866           0 :                 L_index = quant_6p_6N_2_fx( &ind[k], 4 );
     867           0 :                 index = extract_l( L_shr( L_index, 11 ) & 0x07FF );
     868           0 :                 logic16();
     869           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 11 );
     870             :             }
     871             : 
     872           0 :             FOR( track = 0; track < NB_TRACK_FCB_4T; track++ )
     873             :             {
     874           0 :                 k = i_mult2( track, NPMAXPT );
     875           0 :                 L_index = quant_6p_6N_2_fx( &ind[k], 4 );
     876           0 :                 index = extract_l( L_index & 0x07FF );
     877           0 :                 logic16();
     878           0 :                 push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 11 );
     879             :             }
     880             :         }
     881             :     }
     882             : 
     883       58451 :     return saved_bits;
     884             : }
     885             : 
     886             : /*---------------------------------------------------------------------*
     887             :  *encode class for 3p 4p 5p 6p/track                                   *
     888             :  *---------------------------------------------------------------------*/
     889             : 
     890        7258 : static Word32 fcb_encode_cl_fx(                         /* o:   class index of the pulse on a track       */
     891             :                                 const Word32 buffer[],  /* i:   pulses on a track                         */
     892             :                                 const Word32 pulse_num, /* i:   pulses number on a track                  */
     893             :                                 const Word32 pos_num    /* i:   number of the position which have pulse   */
     894             : )
     895             : {
     896             :     Word32 i, k;
     897             :     Word32 temp1, temp2;
     898             : 
     899        7258 :     temp1 = L_sub( L_add( pos_num, pulse_num ), 1 );
     900        7258 :     temp2 = L_add( pulse_num, 0 );
     901             : 
     902        7258 :     k = L_sub( PI_select_table[temp1][pulse_num], 1 );
     903        7258 :     temp1 = L_sub( temp1, 1 );
     904             : 
     905       14888 :     FOR( i = 0; i < pulse_num; i++ )
     906             :     {
     907        7630 :         k = L_sub( k, PI_select_table[temp1 - buffer[i]][temp2--] );
     908        7630 :         temp1 = L_sub( temp1, 1 );
     909             :     }
     910             : 
     911        7258 :     return k;
     912             : }
     913             : 
     914             : 
     915             : /*---------------------------------------------------------------------*
     916             :  *encode fcb pulse index                                               *
     917             :  *---------------------------------------------------------------------*/
     918       66960 : static Word32 fcb_encode_PI_fx(                        /* o:   return index of the  pulse on a track */
     919             :                                 const Word16 v[],      /* i:   pulse on a track                    Q9  */
     920             :                                 const Word32 pulse_num /* i:   number of the pulse on a track        */
     921             : )
     922             : {
     923             :     Word16 sector_p[7];
     924             :     Word32 pulse_pos_num;
     925             :     Word32 sector_p_num[7];
     926             :     Word32 code_index;
     927             :     Word32 sign;
     928             : 
     929             :     /*order the pulse position*/
     930       66960 :     sign = pre_process_fx( v, sector_p, sector_p_num, &pulse_pos_num );
     931             : 
     932             :     /*encode the position*/
     933       66960 :     code_index = fcb_encode_position_fx( sector_p, 16, pulse_pos_num, 1 );
     934             :     /*encode the class and compute class offset*/
     935       66960 :     code_index = L_add( code_index, fcb_encode_class_fx( sector_p_num, pulse_num, pulse_pos_num ) );
     936             : 
     937       66960 :     code_index = L_add( PI_offset[pulse_num][( ( pulse_num + 1L ) - pulse_pos_num )], L_add( L_shl( code_index, extract_l( pulse_pos_num ) ), sign ) );
     938             : 
     939       66960 :     return code_index;
     940             : }
     941             : 
     942             : 
     943             : /*---------------------------------------------------------------------*
     944             :  *encode the class and compute class offset                            *
     945             :  *---------------------------------------------------------------------*/
     946       66960 : static Word32 fcb_encode_class_fx(                               /* o:   class offset        */
     947             :                                    const Word32 sector_6p_num[], /* i:   position which have pulse on a track             */
     948             :                                    const Word32 pulse_num,       /* i:   pulse number on a track                          */
     949             :                                    const Word32 pulse_pos_num    /* i:   number of position which have pulse on a track   */
     950             : )
     951             : {
     952             :     Word32 i, j, k;
     953             :     Word32 mn9_offet;
     954             :     Word32 vector_class[6];
     955             :     Word32 *vector_class_ptr;
     956             : 
     957       66960 :     mn9_offet = L_deposit_l( 0 );
     958             : 
     959       66960 :     IF( LT_32( pulse_pos_num, pulse_num ) )
     960             :     {
     961        7258 :         vector_class_ptr = vector_class;
     962       21402 :         FOR( i = 0; i < pulse_pos_num; i++ )
     963             :         {
     964       21774 :             FOR( j = 0; j < ( sector_6p_num[i] - 1 ); j++ )
     965             :             {
     966             : 
     967        7630 :                 *vector_class_ptr++ = i;
     968        7630 :                 move32();
     969             :             }
     970             :         }
     971        7258 :         k = fcb_encode_cl_fx( vector_class, L_sub( pulse_num, pulse_pos_num ), pulse_pos_num );
     972       10635 :         FOR( i = 0; i < k; i++ )
     973             :         {
     974        3377 :             mn9_offet = L_add( mn9_offet, PI_factor[pulse_pos_num] );
     975             :         }
     976             :     }
     977       66960 :     return mn9_offet;
     978             : }
     979             : /*---------------------------------------------------------------------*
     980             :  *encode the position                                                  *
     981             :  *---------------------------------------------------------------------*/
     982       66960 : static Word32 fcb_encode_position_fx(                            /* o:   return index of the positions which have pulse*/
     983             :                                       const Word16 pos_vector[], /* i:   position of the pulse on a track              */
     984             :                                       Word32 n,
     985             :                                       const Word32 pos_num, /* i:   the number of position which have pulse   */
     986             :                                       const Word32 flag )
     987             : {
     988             :     Word32 i;
     989             :     Word32 mmm1;
     990             :     Word32 temp2;
     991       66960 :     mmm1 = L_sub( PI_select_table[n][pos_num], 1 );
     992       66960 :     temp2 = pos_num;
     993       66960 :     move16();
     994             : 
     995       66960 :     IF( flag ) /* no decrease */
     996             :     {
     997       66960 :         move16(); /*ptr init*/
     998      260210 :         FOR( i = 0; i < pos_num; i++ )
     999             :         {
    1000             :             /*mmm1 -= PI_select_table_fx[sub(n,pos_vector[i]-1)][temp2--];*/
    1001      193250 :             mmm1 = L_sub( mmm1, PI_select_table[n - ( pos_vector[i] + 1 )][temp2--] );
    1002             :         }
    1003             :     }
    1004             :     ELSE
    1005             :     {
    1006           0 :         move16(); /*ptr init*/
    1007           0 :         FOR( i = 0; i < pos_num; i++ )
    1008             :         {
    1009             :             /*mmm1 -= PI_select_table_fx[n-pos_vector[i]-1][temp2--];*/
    1010           0 :             mmm1 = L_sub( mmm1, PI_select_table[n - ( pos_vector[i] + 1 )][temp2--] );
    1011           0 :             n = L_sub( n, 1 );
    1012             :         }
    1013             :     }
    1014             : 
    1015       66960 :     return mmm1;
    1016             : }
    1017             : 
    1018             : /*-------------------------------------------------------------------*
    1019             :  * search_ixiy
    1020             :  *
    1021             :  * Find the best positions of 2 pulses in a subframe
    1022             :  *-------------------------------------------------------------------*/
    1023             : 
    1024             : /*------------------------------------------------------------*
    1025             :  * quant_1p_N1
    1026             :  *
    1027             :  * Quantization of 1 pulse with N+1 bits:
    1028             :  *-------------------------------------------------------------*/
    1029           0 : static Word16 quant_1p_N1_fx(                   /* o  : return N+1 bits             */
    1030             :                               const Word16 pos, /* i  : position of the pulse       */
    1031             :                               const Word16 N    /* i  : number of bits FOR position */
    1032             : )
    1033             : {
    1034             :     Word16 mask;
    1035             :     Word16 index;
    1036             : 
    1037             : 
    1038           0 :     mask = sub( shl( 1, N ), 1 ); /* mask = ((1<<N)-1) */
    1039             : 
    1040           0 :     index = s_and( pos, mask );
    1041           0 :     IF( s_and( pos, NB_POS_FCB_4T ) != 0 )
    1042             :     {
    1043           0 :         index = add( index, shl( 1, N ) ); /* index += 1 << N */
    1044             :     }
    1045           0 :     return index;
    1046             : }
    1047             : 
    1048             : 
    1049             : /*------------------------------------------------------------*
    1050             :  * quant_2p_2N1_fx
    1051             :  *
    1052             :  * Quantization of 2 pulses with 2*N+1 bits:
    1053             :  *-------------------------------------------------------------*/
    1054       67914 : Word16 quant_2p_2N1_fx(                    /* o:  return (2*N)+1 bits         */
    1055             :                         const Word16 pos1, /* i:  position of the pulse 1     */
    1056             :                         const Word16 pos2, /* i:  position of the pulse 2     */
    1057             :                         const Word16 N     /* i:  number of bits FOR position */
    1058             : )
    1059             : {
    1060             :     Word16 mask, tmp;
    1061             :     Word16 index;
    1062             : 
    1063       67914 :     mask = sub( shl( 1, N ), 1 ); /* mask = ((1<<N)-1) */
    1064             : 
    1065             :     /*----------------------------------------------------------------*
    1066             :      * sign of 1st pulse == sign of 2th pulse
    1067             :      *----------------------------------------------------------------*/
    1068             : 
    1069       67914 :     logic16();
    1070       67914 :     logic16();
    1071       67914 :     IF( ( ( pos2 ^ pos1 ) & NB_POS_FCB_4T ) == 0 )
    1072             :     {
    1073       35495 :         IF( LE_16( pos1, pos2 ) ) /* ((pos1 - pos2) <= 0) */
    1074             :         {
    1075             :             /* index = ((pos1 & mask) << N) + (pos2 & mask) */
    1076       35271 :             index = add( shl( s_and( pos1, mask ), N ), s_and( pos2, mask ) );
    1077             :         }
    1078             :         ELSE
    1079             :         {
    1080             :             /* index = ((pos2 & mask) << N) + (pos1 & mask) */
    1081         224 :             index = add( shl( s_and( pos2, mask ), N ), s_and( pos1, mask ) );
    1082             :         }
    1083       35495 :         logic16();
    1084       35495 :         IF( ( pos1 & NB_POS_FCB_4T ) != 0 )
    1085             :         {
    1086       17853 :             tmp = shl( N, 1 );
    1087       17853 :             index = add( index, shl( 1, tmp ) ); /* index += 1 << (2*N) */
    1088             :         }
    1089             :     }
    1090             :     /*----------------------------------------------------------------*
    1091             :      * sign of 1st pulse != sign of 2th pulse
    1092             :      *----------------------------------------------------------------*/
    1093             :     ELSE
    1094             :     {
    1095       32419 :         IF( LE_16( s_and( pos1, mask ), s_and( pos2, mask ) ) )
    1096             :         {
    1097             :             /* index = ((pos2 & mask) << N) + (pos1 & mask); */
    1098       32248 :             index = add( shl( s_and( pos2, mask ), N ), s_and( pos1, mask ) );
    1099       32248 :             IF( s_and( pos2, NB_POS_FCB_4T ) != 0 )
    1100             :             {
    1101       15784 :                 tmp = shl( N, 1 ); /* index += 1 << (2*N); */
    1102       15784 :                 index = add( index, shl( 1, tmp ) );
    1103             :             }
    1104             :         }
    1105             :         ELSE
    1106             :         {
    1107             :             /* index = ((pos1 & mask) << N) + (pos2 & mask); */
    1108         171 :             index = add( shl( s_and( pos1, mask ), N ), s_and( pos2, mask ) );
    1109         171 :             IF( s_and( pos1, NB_POS_FCB_4T ) != 0 )
    1110             :             {
    1111          69 :                 tmp = shl( N, 1 );
    1112          69 :                 index = add( index, shl( 1, tmp ) ); /* index += 1 << (2*N) */
    1113             :             }
    1114             :         }
    1115             :     }
    1116             : 
    1117       67914 :     return index;
    1118             : }
    1119             : /*---------------------------------------------------------------------*
    1120             :  * Quantization of 3 pulses with 3*N+1 bits:                           *
    1121             :  *---------------------------------------------------------------------*/
    1122           0 : static Word16 quant_3p_3N1_fx(                    /*  o  : return (3*N)+1 bits         */
    1123             :                                const Word16 pos1, /*  i  : position of the pulse 1     */
    1124             :                                const Word16 pos2, /*  i  : position of the pulse 2     */
    1125             :                                const Word16 pos3, /*  i  : position of the pulse 3     */
    1126             :                                const Word16 N     /*  i  : number of bits for position */
    1127             : )
    1128             : {
    1129             :     Word16 nb_pos;
    1130             :     Word16 index;
    1131             : 
    1132           0 :     nb_pos = shl( 1, sub( N, 1 ) ); /* nb_pos = (1<<(N-1)); */
    1133             :     /*-------------------------------------------------------*
    1134             :      * Quantization of 3 pulses with 3*N+1 bits:             *
    1135             :      *-------------------------------------------------------*/
    1136           0 :     logic16();
    1137           0 :     logic16();
    1138           0 :     logic16();
    1139           0 :     logic16();
    1140           0 :     IF( ( ( pos1 ^ pos2 ) & nb_pos ) == 0 )
    1141             :     {
    1142           0 :         index = quant_2p_2N1_fx( pos1, pos2, sub( N, 1 ) ); /* index = quant_2p_2N1_fx(pos1, pos2, (N-1)); */
    1143             :         /* index += (pos1 & nb_pos) << N; */
    1144           0 :         index = add( index, shl( (Word16) ( pos1 & nb_pos ), N ) );
    1145           0 :         logic16();
    1146             :         /* index += quant_1p_N1_fx(pos3, N) << (2*N); */
    1147           0 :         index = add( index, shl( quant_1p_N1_fx( pos3, N ), shl( N, 1 ) ) );
    1148             :     }
    1149           0 :     ELSE IF( ( ( pos1 ^ pos3 ) & nb_pos ) == 0 )
    1150             :     {
    1151           0 :         index = quant_2p_2N1_fx( pos1, pos3, sub( N, 1 ) ); /* index = quant_2p_2N1_fx(pos1, pos3, (N-1)); */
    1152           0 :         index = add( index, shl( (Word16) ( pos1 & nb_pos ), N ) );
    1153           0 :         logic16();
    1154             :         /* index += (pos1 & nb_pos) << N; */
    1155           0 :         index = add( index, shl( quant_1p_N1_fx( pos2, N ), shl( N, 1 ) ) );
    1156             :         /* index += quant_1p_N1_fx(pos2, N) <<
    1157             :          * (2*N); */
    1158             :     }
    1159             :     ELSE
    1160             :     {
    1161           0 :         index = quant_2p_2N1_fx( pos2, pos3, sub( N, 1 ) ); /* index = quant_2p_2N1_fx(pos2, pos3, (N-1)); */
    1162             :         /* index += (pos2 & nb_pos) << N;                      */
    1163           0 :         index = add( index, shl( (Word16) ( pos2 & nb_pos ), N ) );
    1164           0 :         logic16();
    1165             :         /* index += quant_1p_N1_fx(pos1, N) << (2*N);      */
    1166           0 :         index = add( index, shl( quant_1p_N1_fx( pos1, N ), shl( N, 1 ) ) );
    1167             :     }
    1168           0 :     return ( index );
    1169             : }
    1170             : /*---------------------------------------------------------------------*
    1171             :  * Quantization of 4 pulses with 4*N+1 bits:                           *
    1172             :  *---------------------------------------------------------------------*/
    1173           0 : static Word32 quant_4p_4N1_fx(                    /*  o  : return (4*N)+1 bits         */
    1174             :                                const Word16 pos1, /*  i  : position of the pulse 1     */
    1175             :                                const Word16 pos2, /*  i  : position of the pulse 2     */
    1176             :                                const Word16 pos3, /*  i  : position of the pulse 3     */
    1177             :                                const Word16 pos4, /*  i  : position of the pulse 4     */
    1178             :                                const Word16 N     /*  i  : number of bits for position */
    1179             : )
    1180             : {
    1181             :     Word16 nb_pos;
    1182             :     Word32 index;
    1183             : 
    1184           0 :     nb_pos = shl( 1, sub( N, 1 ) ); /* nb_pos = (1<<(N-1));  */
    1185             :     /*-------------------------------------------------------*
    1186             :      * Quantization of 4 pulses with 4*N+1 bits:             *
    1187             :      *-------------------------------------------------------*/
    1188           0 :     logic16();
    1189           0 :     logic16();
    1190           0 :     logic16();
    1191           0 :     logic16();
    1192           0 :     IF( ( ( pos1 ^ pos2 ) & nb_pos ) == 0 )
    1193             :     {
    1194           0 :         index = quant_2p_2N1_fx( pos1, pos2, sub( N, 1 ) ); /* index = quant_2p_2N1_fx(pos1, pos2, (N-1)); */
    1195             :         /* index += (pos1 & nb_pos) << N;      */
    1196           0 :         index = L_add( index, L_shl( L_deposit_l( (Word16) ( pos1 & nb_pos ) ), N ) );
    1197           0 :         logic16();
    1198             :         /* index += quant_2p_2N1_fx(pos3, pos4, N) << (2*N); */
    1199           0 :         index = L_add( index, L_shl( quant_2p_2N1_fx( pos3, pos4, N ), shl( N, 1 ) ) );
    1200             :     }
    1201           0 :     ELSE IF( ( ( pos1 ^ pos3 ) & nb_pos ) == 0 )
    1202             :     {
    1203           0 :         index = quant_2p_2N1_fx( pos1, pos3, sub( N, 1 ) );
    1204             :         /* index += (pos1 & nb_pos) << N; */
    1205           0 :         index = L_add( index, L_shl( L_deposit_l( (Word16) ( pos1 & nb_pos ) ), N ) );
    1206           0 :         logic16();
    1207             :         /* index += quant_2p_2N1_fx(pos2, pos4, N) << (2*N); */
    1208           0 :         index = L_add( index, L_shl( quant_2p_2N1_fx( pos2, pos4, N ), shl( N, 1 ) ) );
    1209             :     }
    1210             :     ELSE
    1211             :     {
    1212           0 :         index = quant_2p_2N1_fx( pos2, pos3, sub( N, 1 ) );
    1213             :         /* index += (pos2 & nb_pos) << N; */
    1214           0 :         index = L_add( index, L_shl( L_deposit_l( (Word16) ( pos2 & nb_pos ) ), N ) );
    1215           0 :         logic16();
    1216             :         /* index += quant_2p_2N1_fx(pos1, pos4, N) << (2*N); */
    1217           0 :         index = L_add( index, L_shl( quant_2p_2N1_fx( pos1, pos4, N ), shl( N, 1 ) ) );
    1218             :     }
    1219           0 :     return ( index );
    1220             : }
    1221             : /*---------------------------------------------------------------------*
    1222             :  * Quantization of 4 pulses with 4*N bits:                             *
    1223             :  *---------------------------------------------------------------------*/
    1224             : 
    1225           0 : static Word32 quant_4p_4N_fx(                     /*  o  : return 4*N bits             */
    1226             :                               const Word16 pos[], /*  i  : position of the pulse 1..4  */
    1227             :                               const Word16 N      /*  i  : number of bits for position */
    1228             : )
    1229             : {
    1230             :     Word16 i, j, k, nb_pos, n_1, tmp;
    1231             :     Word16 posA[4], posB[4];
    1232             :     Word32 index;
    1233             : 
    1234           0 :     n_1 = sub( N, 1 );
    1235           0 :     move16();
    1236           0 :     nb_pos = shl( 1, n_1 ); /* nb_pos = (1<<n_1); */
    1237             : 
    1238           0 :     i = 0;
    1239           0 :     move16();
    1240           0 :     j = 0;
    1241           0 :     move16();
    1242           0 :     FOR( k = 0; k < 4; k++ )
    1243             :     {
    1244           0 :         logic16();
    1245           0 :         IF( ( pos[k] & nb_pos ) == 0 )
    1246             :         {
    1247           0 :             posA[i++] = pos[k];
    1248           0 :             move16();
    1249             :         }
    1250             :         ELSE
    1251             :         {
    1252           0 :             posB[j++] = pos[k];
    1253           0 :             move16();
    1254             :         }
    1255             :     }
    1256             : 
    1257           0 :     SWITCH( i )
    1258             :     {
    1259           0 :         case 0:
    1260           0 :             tmp = sub( shl( N, 2 ), 3 ); /* index = 1 << ((4*N)-3); */
    1261           0 :             index = L_shl( 1L, tmp );
    1262             :             /* index += quant_4p_4N1_fx(posB[0], posB[1], posB[2], posB[3], n_1); */
    1263           0 :             index = L_add( index, quant_4p_4N1_fx( posB[0], posB[1], posB[2], posB[3], n_1 ) );
    1264           0 :             BREAK;
    1265           0 :         case 1:
    1266             :             /* index = quant_1p_N1_fx(posA[0], n_1) << ((3*n_1)+1); */
    1267           0 :             tmp = add( extract_l( L_shr( L_mult( 3, n_1 ), 1 ) ), 1 );
    1268           0 :             index = L_shl( quant_1p_N1_fx( posA[0], n_1 ), tmp );
    1269             :             /* index += quant_3p_3N1_fx(posB[0], posB[1], posB[2], n_1); */
    1270           0 :             index = L_add( index, quant_3p_3N1_fx( posB[0], posB[1], posB[2], n_1 ) );
    1271           0 :             BREAK;
    1272           0 :         case 2:
    1273           0 :             tmp = add( shl( n_1, 1 ), 1 ); /* index = quant_2p_2N1_fx(posA[0], posA[1], n_1) << ((2*n_1)+1); */
    1274           0 :             index = L_shl( quant_2p_2N1_fx( posA[0], posA[1], n_1 ), tmp );
    1275             :             /* index += quant_2p_2N1_fx(posB[0], posB[1], n_1); */
    1276           0 :             index = L_add( index, quant_2p_2N1_fx( posB[0], posB[1], n_1 ) );
    1277           0 :             BREAK;
    1278           0 :         case 3:
    1279             :             /* index = quant_3p_3N1_fx(posA[0], posA[1], posA[2], n_1) << N; */
    1280           0 :             index = L_shl( quant_3p_3N1_fx( posA[0], posA[1], posA[2], n_1 ), N );
    1281           0 :             index = L_add( index, quant_1p_N1_fx( posB[0], n_1 ) ); /* index += quant_1p_N1_fx(posB[0], n_1); */
    1282           0 :             BREAK;
    1283           0 :         case 4:
    1284           0 :             index = quant_4p_4N1_fx( posA[0], posA[1], posA[2], posA[3], n_1 );
    1285           0 :             BREAK;
    1286           0 :         default:
    1287           0 :             index = 0;
    1288           0 :             move32();
    1289           0 :             fprintf( stderr, "Error in function quant_4p_4N_fx\n" );
    1290             :     }
    1291           0 :     tmp = sub( shl( N, 2 ), 2 ); /* index += (i & 3) << ((4*N)-2); */
    1292           0 :     index = L_add( index, L_shl( ( L_deposit_l( i ) & ( 3L ) ), tmp ) );
    1293           0 :     logic16();
    1294             : 
    1295           0 :     return ( index );
    1296             : }
    1297             : 
    1298             : 
    1299           0 : static Word32 quant_5p_5N_fx(                     /*  o  : return 5*N bits             */
    1300             :                               const Word16 pos[], /*  i  : position of the pulse 1..5  */
    1301             :                               const Word16 N )    /*  i  : number of bits for position */
    1302             : {
    1303             :     Word16 i, j, k, nb_pos, n_1, tmp;
    1304             :     Word16 posA[5], posB[5];
    1305             :     Word32 index, tmp2;
    1306             : 
    1307           0 :     n_1 = sub( N, 1 );
    1308           0 :     nb_pos = shl( 1, n_1 ); /* nb_pos = (1<<n_1); */
    1309             : 
    1310           0 :     i = 0;
    1311           0 :     move16();
    1312           0 :     j = 0;
    1313           0 :     move16();
    1314           0 :     FOR( k = 0; k < 5; k++ )
    1315             :     {
    1316           0 :         logic16();
    1317           0 :         IF( ( pos[k] & nb_pos ) == 0 )
    1318             :         {
    1319           0 :             posA[i++] = pos[k];
    1320           0 :             move16();
    1321             :         }
    1322             :         ELSE
    1323             :         {
    1324           0 :             posB[j++] = pos[k];
    1325           0 :             move16();
    1326             :         }
    1327             :     }
    1328             : 
    1329           0 :     SWITCH( i )
    1330             :     {
    1331           0 :         case 0:
    1332           0 :             tmp = sub( extract_l( L_shr( L_mult( 5, N ), 1 ) ), 1 ); /* ((5*N)-1)) */
    1333           0 :             index = L_shl( 1L, tmp );                                /* index = 1 << ((5*N)-1); */
    1334           0 :             tmp = add( shl( N, 1 ), 1 );                             /* index += quant_3p_3N1_fx(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);*/
    1335           0 :             tmp2 = L_shl( quant_3p_3N1_fx( posB[0], posB[1], posB[2], n_1 ), tmp );
    1336           0 :             index = L_add( index, tmp2 );
    1337           0 :             index = L_add( index, quant_2p_2N1_fx( posB[3], posB[4], N ) ); /* index += quant_2p_2N1_fx(posB[3], posB[4], N); */
    1338           0 :             BREAK;
    1339           0 :         case 1:
    1340           0 :             tmp = sub( extract_l( L_shr( L_mult( 5, N ), 1 ) ), 1 ); /* index = 1 << ((5*N)-1); */
    1341           0 :             index = L_shl( 1L, tmp );
    1342           0 :             tmp = add( shl( N, 1 ), 1 ); /* index += quant_3p_3N1_fx(posB[0], posB[1], posB[2], n_1) <<((2*N)+1);  */
    1343           0 :             tmp2 = L_shl( quant_3p_3N1_fx( posB[0], posB[1], posB[2], n_1 ), tmp );
    1344           0 :             index = L_add( index, tmp2 );
    1345           0 :             index = L_add( index, quant_2p_2N1_fx( posB[3], posA[0], N ) ); /* index += quant_2p_2N1_fx(posB[3], posA[0], N); */
    1346           0 :             BREAK;
    1347           0 :         case 2:
    1348           0 :             tmp = sub( extract_l( L_shr( L_mult( 5, N ), 1 ) ), 1 ); /* ((5*N)-1)) */
    1349           0 :             index = L_shl( 1L, tmp );                                /* index = 1 << ((5*N)-1); */
    1350           0 :             tmp = add( shl( N, 1 ), 1 );                             /* index += quant_3p_3N1_fx(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);  */
    1351           0 :             tmp2 = L_shl( quant_3p_3N1_fx( posB[0], posB[1], posB[2], n_1 ), tmp );
    1352           0 :             index = L_add( index, tmp2 );
    1353           0 :             index = L_add( index, quant_2p_2N1_fx( posA[0], posA[1], N ) ); /* index += quant_2p_2N1_fx(posA[0], posA[1], N); */
    1354           0 :             BREAK;
    1355           0 :         case 3:
    1356           0 :             tmp = add( shl( N, 1 ), 1 ); /* index = quant_3p_3N1_fx(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
    1357           0 :             index = L_shl( quant_3p_3N1_fx( posA[0], posA[1], posA[2], n_1 ), tmp );
    1358           0 :             index = L_add( index, quant_2p_2N1_fx( posB[0], posB[1], N ) ); /* index += quant_2p_2N1_fx(posB[0], posB[1], N); */
    1359           0 :             BREAK;
    1360           0 :         case 4:
    1361           0 :             tmp = add( shl( N, 1 ), 1 ); /* index = quant_3p_3N1_fx(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
    1362           0 :             index = L_shl( quant_3p_3N1_fx( posA[0], posA[1], posA[2], n_1 ), tmp );
    1363           0 :             index = L_add( index, quant_2p_2N1_fx( posA[3], posB[0], N ) ); /* index += quant_2p_2N1_fx(posA[3], posB[0], N); */
    1364           0 :             BREAK;
    1365           0 :         case 5:
    1366           0 :             tmp = add( shl( N, 1 ), 1 ); /* index = quant_3p_3N1_fx(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
    1367           0 :             index = L_shl( quant_3p_3N1_fx( posA[0], posA[1], posA[2], n_1 ), tmp );
    1368           0 :             index = L_add( index, quant_2p_2N1_fx( posA[3], posA[4], N ) ); /* index += quant_2p_2N1_fx(posA[3], posA[4], N); */
    1369           0 :             BREAK;
    1370           0 :         default:
    1371           0 :             index = 0;
    1372           0 :             move32();
    1373           0 :             fprintf( stderr, "Error in function quant_5p_5N_fx\n" );
    1374             :     }
    1375             : 
    1376           0 :     return ( index );
    1377             : }
    1378             : 
    1379           0 : static Word32 quant_6p_6N_2_fx(                     /*  o  : return (6*N)-2 bits         */
    1380             :                                 const Word16 pos[], /*  i  : position of the pulse 1..6  */
    1381             :                                 const Word16 N )    /*  i  : number of bits for position */
    1382             : {
    1383             :     Word16 i, j, k, nb_pos, n_1;
    1384             :     Word16 posA[6], posB[6];
    1385             :     Word32 index;
    1386             : 
    1387             :     /* !!  N and n_1 are constants -> it doesn't need to be operated by Basic Operators */
    1388             : 
    1389           0 :     n_1 = sub( N, 1 );
    1390           0 :     nb_pos = shl( 1, n_1 ); /* nb_pos = (1<<n_1); */
    1391             : 
    1392           0 :     i = 0;
    1393           0 :     move16();
    1394           0 :     j = 0;
    1395           0 :     move16();
    1396           0 :     FOR( k = 0; k < 6; k++ )
    1397             :     {
    1398           0 :         logic16();
    1399           0 :         IF( ( pos[k] & nb_pos ) == 0 )
    1400             :         {
    1401           0 :             posA[i++] = pos[k];
    1402           0 :             move16();
    1403             :         }
    1404             :         ELSE
    1405             :         {
    1406           0 :             posB[j++] = pos[k];
    1407           0 :             move16();
    1408             :         }
    1409             :     }
    1410             : 
    1411           0 :     SWITCH( i )
    1412             :     {
    1413           0 :         case 0:
    1414           0 :             index = L_shl( 1L, sub( i_mult( 6, N ), 5 ) );                   /* index = 1 << ((6*N)-5); */
    1415           0 :             index = L_add( index, L_shl( quant_5p_5N_fx( posB, n_1 ), N ) ); /* index += quant_5p_5N_fx(posB, n_1) << N; */
    1416           0 :             index = L_add( index, quant_1p_N1_fx( posB[5], n_1 ) );          /* index += quant_1p_N1_fx(posB[5], n_1); */
    1417           0 :             BREAK;
    1418           0 :         case 1:
    1419           0 :             index = L_shl( 1L, sub( i_mult( 6, N ), 5 ) );                   /* index = 1 << ((6*N)-5); */
    1420           0 :             index = L_add( index, L_shl( quant_5p_5N_fx( posB, n_1 ), N ) ); /* index += quant_5p_5N_fx(posB, n_1) << N; */
    1421           0 :             index = L_add( index, quant_1p_N1_fx( posA[0], n_1 ) );          /* index += quant_1p_N1_fx(posA[0], n_1); */
    1422           0 :             BREAK;
    1423           0 :         case 2:
    1424           0 :             index = L_shl( 1L, sub( i_mult( 6, N ), 5 ) ); /* index = 1 << ((6*N)-5); */
    1425             :             /* index += quant_4p_4N_fx(posB, n_1) << ((2*n_1)+1); */
    1426           0 :             index = L_add( index, L_shl( quant_4p_4N_fx( posB, n_1 ), ( add( shl( n_1, 1 ), 1 ) ) ) );
    1427           0 :             index = L_add( index, quant_2p_2N1_fx( posA[0], posA[1], n_1 ) ); /* index += quant_2p_2N1_fx(posA[0], posA[1], n_1); */
    1428           0 :             BREAK;
    1429           0 :         case 3:
    1430           0 :             index = L_shl( quant_3p_3N1_fx( posA[0], posA[1], posA[2], n_1 ), ( add( i_mult( 3, n_1 ), 1 ) ) ); /* index = quant_3p_3N1_fx(posA[0], posA[1], posA[2], n_1) << ((3*n_1)+1); */
    1431           0 :             index = L_add( index, quant_3p_3N1_fx( posB[0], posB[1], posB[2], n_1 ) );                          /* index += quant_3p_3N1_fx(posB[0], posB[1], posB[2], n_1); */
    1432           0 :             BREAK;
    1433           0 :         case 4:
    1434           0 :             i = 2;
    1435           0 :             move16();
    1436           0 :             index = L_shl( quant_4p_4N_fx( posA, n_1 ), ( add( shl( n_1, 1 ), 1 ) ) ); /* index = quant_4p_4N_fx(posA, n_1) << ((2*n_1)+1); */
    1437           0 :             index = L_add( index, quant_2p_2N1_fx( posB[0], posB[1], n_1 ) );          /* index += quant_2p_2N1_fx(posB[0], posB[1], n_1); */
    1438           0 :             BREAK;
    1439           0 :         case 5:
    1440           0 :             i = 1;
    1441           0 :             move16();
    1442           0 :             index = L_shl( quant_5p_5N_fx( posA, n_1 ), N );        /* index = quant_5p_5N_fx(posA, n_1) << N; */
    1443           0 :             index = L_add( index, quant_1p_N1_fx( posB[0], n_1 ) ); /* index += quant_1p_N1_fx(posB[0], n_1); */
    1444           0 :             BREAK;
    1445           0 :         case 6:
    1446           0 :             i = 0;
    1447           0 :             move16();
    1448           0 :             index = L_shl( quant_5p_5N_fx( posA, n_1 ), N );        /* index = quant_5p_5N_fx(posA, n_1) << N; */
    1449           0 :             index = L_add( index, quant_1p_N1_fx( posA[5], n_1 ) ); /* index += quant_1p_N1_fx(posA[5], n_1); */
    1450           0 :             BREAK;
    1451           0 :         default:
    1452           0 :             index = 0;
    1453           0 :             fprintf( stderr, "Error in function quant_6p_6N_2_fx\n" );
    1454             :     }
    1455           0 :     index = L_add( index, L_shl( ( L_deposit_l( i ) & 3L ), sub( i_mult( 6, N ), 4 ) ) );
    1456           0 :     logic16(); /* index += (i & 3) << ((6*N)-4); */
    1457             : 
    1458           0 :     return ( index );
    1459             : }
    1460             : 
    1461             : 
    1462             : /*---------------------------------------------------------------------*
    1463             :  *order the pulse position                                             *
    1464             :  *---------------------------------------------------------------------*/
    1465       66960 : static Word32 pre_process_fx(                          /* o:   return sign value of pulse on a track              */
    1466             :                               const Word16 v[],        /* i:   the pulse vector                  Q9                 */
    1467             :                               Word16 pos_vector[],     /* o:   position of the pulse on a track                   */
    1468             :                               Word32 pos_vector_num[], /* o:   the pulse number on the position which have pulse Q0 */
    1469             :                               Word32 *pulse_pos_num    /* i:   the number of position which have pulse            */
    1470             : )
    1471             : {
    1472             :     Word16 j, k;
    1473             :     Word32 sign;
    1474             : 
    1475       66960 :     sign = L_deposit_l( 0 );
    1476       66960 :     j = 0;
    1477       66960 :     move16();
    1478     1138320 :     FOR( k = 0; k < 64; k += 4 ){
    1479     1071360 :         IF( v[k] ){
    1480      193250 :             pos_vector[j] = shr( k, 2 );
    1481      193250 :     move16();
    1482      193250 :     pos_vector_num[j] = L_shr( abs_s( v[k] ), 9 ); /* Q9: 512 -> 1, Q0 */
    1483      193250 :     move32();
    1484      193250 :     IF( v[k] > 0 )
    1485             :     {
    1486       95856 :         sign = L_shl( sign, 1 );
    1487             :     }
    1488             :     ELSE
    1489             :     {
    1490       97394 :         sign = L_add( L_shl( sign, 1 ), 1 );
    1491             :     }
    1492      193250 :     j = add( j, 1 );
    1493             : }
    1494             : }
    1495       66960 : *pulse_pos_num = L_deposit_l( j );
    1496       66960 : move32();
    1497             : 
    1498       66960 : return sign;
    1499             : }
    1500             : 
    1501             : 
    1502             : /*--------------------------------------------------------------------------*
    1503             :  * E_ACELP_code43bit_fx
    1504             :  *
    1505             :  * Fixed bit-length arithmetic coding of pulses
    1506             :  * v - (input) pulse vector
    1507             :  * s - (output) encoded state
    1508             :  * n - (output) range of possible states (0...n-1)
    1509             :  * p - (output) number of pulses found
    1510             :  * len - (input) length of pulse vector
    1511             :  * trackstep - (input) step between tracks
    1512             :  *--------------------------------------------------------------------------*/
    1513             : 
    1514       33480 : Word16 E_ACELP_code43bit_fx(
    1515             :     const Word16 code[], /*Q9*/
    1516             :     UWord32 *ps,
    1517             :     Word16 *p,
    1518             :     UWord16 idxs[] )
    1519             : {
    1520             :     Word16 i, j, k, track;
    1521             :     Word16 ind[32];
    1522             : 
    1523             :     Word16 tmp;
    1524             :     Word32 L_tmp;
    1525             :     Word32 joint_index;
    1526             :     static const Word32 joint_offset = 3611648; /*offset for 3 pulses per track*/
    1527       33480 :     move32();
    1528       33480 :     Word16 saved_bits = 0;
    1529       33480 :     move16();
    1530      100440 :     FOR( track = 0; track < 2; track++ )
    1531             :     {
    1532       66960 :         ps[track] = fcb_encode_PI_fx( code + track, 3 );
    1533       66960 :         move32();
    1534       66960 :         p[track] = 3;
    1535       66960 :         move16();
    1536             :     }
    1537             : 
    1538      100440 :     FOR( track = 2; track < NB_TRACK_FCB_4T; track++ )
    1539             :     {
    1540       66960 :         i = j = i_mult2( track, NPMAXPT );
    1541             : 
    1542     1117891 :         FOR( k = track; k < 64; k += 4 )
    1543             :         {
    1544     1053521 :             IF( code[k] )
    1545             :             {
    1546      131330 :                 tmp = shr( k, 2 );
    1547      131330 :                 IF( code[k] < 0 )
    1548             :                 {
    1549       65802 :                     tmp = add( tmp, 16 );
    1550             :                 }
    1551      131330 :                 ind[j] = tmp;
    1552      131330 :                 move16();
    1553      131330 :                 IF( GT_16( abs_s( code[k] ), 512 /*Q9*/ ) )
    1554             :                 {
    1555        2590 :                     ind[j + 1] = tmp;
    1556        2590 :                     move16();
    1557        2590 :                     BREAK;
    1558             :                 }
    1559      128740 :                 j = add( j, 1 );
    1560             :             }
    1561             :         }
    1562       66960 :         ps[track] = quant_2p_2N1_fx( ind[i], ind[i + 1], 4 );
    1563       66960 :         move32();
    1564       66960 :         p[track] = 2;
    1565       66960 :         move16();
    1566             :     }
    1567             :     /* joint_index = ps[0]*5472 + ps[1]; */
    1568       33480 :     L_tmp = L_shl( ps[0], 12 );
    1569       33480 :     L_tmp = L_add( L_tmp, L_shl( ps[0], 10 ) );
    1570       33480 :     L_tmp = L_add( L_tmp, L_shl( ps[0], 8 ) );
    1571       33480 :     L_tmp = L_add( L_tmp, L_shl( ps[0], 6 ) );
    1572       33480 :     L_tmp = L_add( L_tmp, L_shl( ps[0], 5 ) );
    1573       33480 :     joint_index = L_add( L_tmp, ps[1] );
    1574       33480 :     L_tmp = L_sub( joint_index, joint_offset );
    1575       33480 :     if ( L_tmp >= 0 )
    1576             :     {
    1577       28088 :         joint_index = L_add( joint_index, joint_offset );
    1578             :     }
    1579       33480 :     if ( L_tmp < 0 )
    1580             :     {
    1581        5392 :         saved_bits = add( saved_bits, 1 );
    1582             :     }
    1583       33480 :     idxs[0] = extract_l( L_add( L_shl( ps[2], 9 ), ps[3] ) );
    1584       33480 :     idxs[1] = extract_l( L_add( L_shl( joint_index, 2 ), L_shr( ps[2], 7 ) ) );
    1585       33480 :     idxs[2] = extract_l( L_shr( joint_index, 14 ) );
    1586       33480 :     move16();
    1587       33480 :     move16();
    1588       33480 :     move16();
    1589       33480 :     return saved_bits;
    1590             : }

Generated by: LCOV version 1.14