LCOV - code coverage report
Current view: top level - lib_dec - dec4t64_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 223 451 49.4 %
Date: 2025-05-03 01:55:50 Functions: 9 16 56.2 %

          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" /* Compilation switches                   */
       6             : #include "cnst.h"    /* Common constants                       */
       7             : #include "prot_fx.h" /* Function prototypes                    */
       8             : #include "rom_com.h" /* Static table prototypes                */
       9             : #include "assert.h"  /* Static table prototypes                */
      10             : /*-------------------------------------------------------------------*
      11             :  * Local functions
      12             :  *-------------------------------------------------------------------*/
      13             : static void add_pulses_fx( const Word16 pos[], const Word16 nb_pulse, const Word16 track, Word16 code[] );
      14             : static void dec_1p_N1_fx( const Word32 index, const Word16 N, const Word16 offset, Word16 pos[] );
      15             : static void dec_2p_2N1_fx( const Word32 index, const Word16 N, const Word16 offset, Word16 pos[] );
      16             : static void dec_3p_3N1_fx( const Word32 index, const Word16 N, const Word16 offset, Word16 pos[] );
      17             : static void dec_4p_4N1_fx( const Word32 index, const Word16 N, const Word16 offset, Word16 pos[] );
      18             : static void dec_4p_4N_fx( const Word32 index, const Word16 N, const Word16 offset, Word16 pos[] );
      19             : static void dec_5p_5N_fx( const Word32 index, const Word16 N, const Word16 offset, Word16 pos[] );
      20             : static void dec_6p_6N2_fx( const Word32 index, const Word16 N, const Word16 offset, Word16 pos[] );
      21             : static void fcb_decode_PI_fx( Word32 code_index, Word16 sector_6p[], Word16 pulse_num );
      22             : 
      23             : 
      24             : /*==========================================================================*/
      25             : /* FUNCTION      : void dec_acelp_4t64_fx ()                                                            */
      26             : /*--------------------------------------------------------------------------*/
      27             : /* PURPOSE       :                                                              */
      28             : /*      * 20, 36       bits algebraic codebook decoder.                                                 */
      29             : /*  * 4 tracks x 16 positions per track = 64 samples.                                           */
      30             : /*  * 20 bits --> 4 pulses in a frame of 64 samples.                                         */
      31             : /*  * 36 bits --> 8 pulses in a frame of 64 samples.                                         */
      32             : /*  * All pulses can have two (2) possible amplitudes: +1 or -1.                        */
      33             : /*  * Each pulse can have sixteen (16) possible positions.                                      */
      34             : /*  * See cod4t64.c for more details of the algebraic code.                                     */
      35             : /*--------------------------------------------------------------------------*/
      36             : /* INPUT ARGUMENTS  :                                                                                                           */
      37             : /* _Word16 i_subfr          i  : subframe index                             */
      38             : /* _Word16 nbbits           i  : number of bits per codebook                */
      39             : /* _Word16 FCB_5Sx4T_fla    i  : 5Sx4Track flag for PI                      */
      40             : /*--------------------------------------------------------------------------*/
      41             : /* OUTPUT ARGUMENTS :                                                                                                           */
      42             : /* _Word16 code[]                       o  : algebraic (fixed) codebook excitation  Q12 */
      43             : /* _Word16 index_buf_4T[]   o  : 5Sx4Track buffer for PI                    */
      44             : /*--------------------------------------------------------------------------*/
      45             : /* INPUT/OUTPUT ARGUMENTS :                                                                                                     */
      46             : /*--------------------------------------------------------------------------*/
      47             : /* RETURN ARGUMENTS :                                                                                                           */
      48             : /*                                       _ None                                                                                                 */
      49             : /*--------------------------------------------------------------------------*/
      50             : /* CALLED FROM :                                                                                                                        */
      51             : /*==========================================================================*/
      52       55201 : void dec_acelp_4t64_fx(
      53             :     Decoder_State *st_fx, /* i/o: decoder state structure */
      54             :     Word16 nbbits,        /* i  : number of bits per codebook               */
      55             :     Word16 code[],        /* o  : algebraic (fixed) codebook excitation  Q9*/
      56             :     const Word16 Opt_AMR_WB )
      57             : {
      58             :     Word16 i, k, pos[7];
      59             :     Word32 L_index;
      60             :     Word32 ind1[NB_TRACK_FCB_4T];
      61             :     PulseConfig config;
      62             :     Word16 indexing_indices[6], wordcnt, bitcnt, index2;
      63             : 
      64       55201 :     IF( !Opt_AMR_WB )
      65             :     {
      66       55201 :         SWITCH( nbbits )
      67             :         {
      68         695 :             case 20:
      69         695 :                 config.nb_pulse = 4;
      70         695 :                 move16();
      71         695 :                 BREAK;
      72             : 
      73        2276 :             case 28:
      74        2276 :                 config.nb_pulse = 6;
      75        2276 :                 move16();
      76        2276 :                 BREAK;
      77             : 
      78       52211 :             case 36:
      79       52211 :                 config.nb_pulse = 8;
      80       52211 :                 move16();
      81       52211 :                 BREAK;
      82             : 
      83           0 :             case 43:
      84           0 :                 config.nb_pulse = 10;
      85           0 :                 move16();
      86           0 :                 BREAK;
      87             : 
      88           0 :             case 50:
      89           0 :                 config.nb_pulse = 12;
      90           0 :                 move16();
      91           0 :                 BREAK;
      92             : 
      93          19 :             case 62:
      94          19 :                 config.nb_pulse = 16;
      95          19 :                 move16();
      96          19 :                 BREAK;
      97             : 
      98           0 :             case 87:
      99           0 :                 config.nb_pulse = 26;
     100           0 :                 move16();
     101           0 :                 BREAK;
     102             :         }
     103             : 
     104       55201 :         config.bits = nbbits;
     105       55201 :         move16();
     106       55201 :         config.codetrackpos = TRACKPOS_FIXED_FIRST;
     107       55201 :         move16();
     108             : 
     109             : 
     110       55201 :         wordcnt = shr( nbbits, 4 );
     111       55201 :         bitcnt = s_and( nbbits, 15 );
     112      162651 :         FOR( i = 0; i < wordcnt; i++ )
     113             :         {
     114      107450 :             indexing_indices[i] = extract_l( get_next_indice_fx( st_fx, 16 ) );
     115      107450 :             move16();
     116             :         }
     117       55201 :         IF( bitcnt )
     118             :         {
     119       55201 :             indexing_indices[i] = extract_l( get_next_indice_fx( st_fx, bitcnt ) );
     120       55201 :             move16();
     121             :         }
     122             : 
     123       55201 :         D_ACELP_indexing_fx( code, config, NB_TRACK_FCB_4T, indexing_indices, &st_fx->BER_detect );
     124             :     }
     125             :     ELSE
     126             :     {
     127           0 :         FOR( i = 0; i < L_SUBFR; i++ )
     128             :         {
     129           0 :             code[i] = 0;
     130           0 :             move16();
     131             :         }
     132             : 
     133           0 :         IF( EQ_16( nbbits, 20 ) )
     134             :         {
     135           0 :             FOR( k = 0; k < NB_TRACK_FCB_4T; k++ )
     136             :             {
     137           0 :                 L_index = get_next_indice_fx( st_fx, 5 );
     138           0 :                 dec_1p_N1_fx( L_index, 4, 0, pos );
     139           0 :                 add_pulses_fx( pos, 1, k, code );
     140             :             }
     141             :         }
     142           0 :         ELSE IF( EQ_16( nbbits, 36 ) )
     143             :         {
     144           0 :             FOR( k = 0; k < NB_TRACK_FCB_4T; k++ )
     145             :             {
     146           0 :                 L_index = get_next_indice_fx( st_fx, 9 );
     147           0 :                 dec_2p_2N1_fx( L_index, 4, 0, pos );
     148           0 :                 add_pulses_fx( pos, 2, k, code );
     149             :             }
     150             :         }
     151           0 :         ELSE IF( EQ_16( nbbits, 44 ) ) /* AMR-WB pulse indexing */
     152             :         {
     153           0 :             FOR( k = 0; k < NB_TRACK_FCB_4T - 2; k++ )
     154             :             {
     155           0 :                 L_index = get_next_indice_fx( st_fx, 13 );
     156           0 :                 dec_3p_3N1_fx( L_index, 4, 0, pos );
     157           0 :                 add_pulses_fx( pos, 3, k, code );
     158             :             }
     159             : 
     160           0 :             FOR( k = 2; k < NB_TRACK_FCB_4T; k++ )
     161             :             {
     162           0 :                 L_index = get_next_indice_fx( st_fx, 9 );
     163           0 :                 dec_2p_2N1_fx( L_index, 4, 0, pos );
     164           0 :                 add_pulses_fx( pos, 2, k, code );
     165             :             }
     166             :         }
     167           0 :         ELSE IF( EQ_16( nbbits, 52 ) ) /* AMR-WB pulse indexing */
     168             :         {
     169           0 :             FOR( k = 0; k < NB_TRACK_FCB_4T; k++ )
     170             :             {
     171           0 :                 L_index = get_next_indice_fx( st_fx, 13 );
     172           0 :                 dec_3p_3N1_fx( L_index, 4, 0, pos );
     173           0 :                 add_pulses_fx( pos, 3, k, code );
     174             :             }
     175             :         }
     176           0 :         ELSE IF( EQ_16( nbbits, 64 ) ) /* AMR-WB pulse indexing */
     177             :         {
     178           0 :             FOR( k = 0; k < NB_TRACK_FCB_4T; k++ )
     179             :             {
     180           0 :                 ind1[k] = get_next_indice_fx( st_fx, 2 );
     181           0 :                 move32();
     182             :             }
     183           0 :             FOR( k = 0; k < NB_TRACK_FCB_4T; k++ )
     184             :             {
     185           0 :                 index2 = get_next_indice_fx( st_fx, 14 );
     186           0 :                 L_index = L_add( L_shl( ind1[k], 14 ), index2 );
     187           0 :                 dec_4p_4N_fx( L_index, 4, 0, pos );
     188           0 :                 add_pulses_fx( pos, 4, k, code );
     189             :             }
     190             :         }
     191           0 :         ELSE IF( EQ_16( nbbits, 72 ) )
     192             :         {
     193           0 :             FOR( k = 0; k < NB_TRACK_FCB_4T - 2; k++ )
     194             :             {
     195           0 :                 ind1[k] = get_next_indice_fx( st_fx, 10 );
     196           0 :                 move32();
     197             :             }
     198           0 :             FOR( k = 2; k < NB_TRACK_FCB_4T; k++ )
     199             :             {
     200           0 :                 ind1[k] = get_next_indice_fx( st_fx, 2 );
     201           0 :                 move32();
     202             :             }
     203           0 :             FOR( k = 0; k < NB_TRACK_FCB_4T - 2; k++ )
     204             :             {
     205           0 :                 index2 = get_next_indice_fx( st_fx, 10 );
     206           0 :                 L_index = L_add( L_shl( ind1[k], 10 ), index2 );
     207           0 :                 dec_5p_5N_fx( L_index, 4, 0, pos );
     208           0 :                 add_pulses_fx( pos, 5, k, code );
     209             :             }
     210           0 :             FOR( k = 2; k < NB_TRACK_FCB_4T; k++ )
     211             :             {
     212           0 :                 index2 = get_next_indice_fx( st_fx, 14 );
     213           0 :                 L_index = L_add( L_shl( ind1[k], 14 ), index2 );
     214           0 :                 dec_4p_4N_fx( L_index, 4, 0, pos );
     215           0 :                 add_pulses_fx( pos, 4, k, code );
     216             :             }
     217             :         }
     218           0 :         ELSE IF( EQ_16( nbbits, 88 ) )
     219             :         {
     220           0 :             FOR( k = 0; k < NB_TRACK_FCB_4T; k++ )
     221             :             {
     222           0 :                 ind1[k] = get_next_indice_fx( st_fx, 11 );
     223           0 :                 move16();
     224             :             }
     225           0 :             FOR( k = 0; k < NB_TRACK_FCB_4T; k++ )
     226             :             {
     227           0 :                 index2 = get_next_indice_fx( st_fx, 11 );
     228           0 :                 L_index = L_add( L_shl( ind1[k], 11 ), index2 );
     229           0 :                 dec_6p_6N2_fx( L_index, 4, 0, pos );
     230           0 :                 add_pulses_fx( pos, 6, k, code );
     231             :             }
     232             :         }
     233             :     }
     234             : 
     235       55201 :     return;
     236             : }
     237             : /*-------------------------------------------------------*
     238             :  * add_pulses()
     239             :  *
     240             :  * Add decoded pulses to the codeword
     241             :  *-------------------------------------------------------*/
     242      172762 : static void add_pulses_fx(
     243             :     const Word16 pos[],    /* i:   pulse position     */
     244             :     const Word16 nb_pulse, /* i:   nb. of pulses      */
     245             :     const Word16 track,    /* i:   no. of the tracks  */
     246             :     Word16 code[]          /* i/o: decoded codevector Q9*/
     247             : )
     248             : {
     249             : 
     250             :     Word16 i, k;
     251             :     Word16 *ptr;
     252      172762 :     ptr = code + track;
     253      172762 :     move16();
     254             : 
     255      543681 :     FOR( k = 0; k < nb_pulse; k++ )
     256             :     {
     257             :         /* i = ((pos[k] & (NB_POS-1))*NB_TRACK) + track */
     258      370919 :         logic16();
     259      370919 :         i = shl( s_and( pos[k], ( NB_POS_FCB_4T - 1 ) ), 2 );
     260             : 
     261      370919 :         logic16();
     262      370919 :         IF( ( pos[k] & NB_POS_FCB_4T ) == 0 )
     263             :         {
     264      186449 :             ptr[i] = add( ptr[i], 512 );
     265      186449 :             move16();
     266             :         }
     267             :         ELSE
     268             :         {
     269      184470 :             ptr[i] = sub( ptr[i], 512 );
     270      184470 :             move16();
     271             :         }
     272             :     }
     273      172762 :     return;
     274             : }
     275             : 
     276             : /*-------------------------------------------------------*
     277             :  * dec_1p_N1()
     278             :  *
     279             :  * Decode 1 pulse with N+1 bits
     280             :  *-------------------------------------------------------*/
     281       40351 : void dec_1p_N1_fx(
     282             :     const Word32 index,  /* i:   quantization index    */
     283             :     const Word16 N,      /* i:   nb. of bits           */
     284             :     const Word16 offset, /* i:   pulse position offset */
     285             :     Word16 pos[]         /* o:   pulse position        */
     286             : )
     287             : {
     288             :     Word16 pos1;
     289             :     Word32 mask, i;
     290             : 
     291       40351 :     mask = L_deposit_l( sub( shl( 1, N ), 1 ) ); /* mask = ((1<<N)-1); */
     292             : 
     293             : 
     294       40351 :     logic16();
     295       40351 :     pos1 = add( extract_l( index & mask ), offset );
     296             : 
     297             :     /* i = ((index >> N) & 1); */
     298       40351 :     i = L_shr( index, N ) & 1L;
     299             : 
     300       40351 :     IF( i != 0 )
     301             :     {
     302       19882 :         pos1 = add( pos1, NB_POS_FCB_4T );
     303             :     }
     304       40351 :     pos[0] = pos1;
     305       40351 :     move16();
     306       40351 : }
     307             : /*-------------------------------------------------------*
     308             :  * dec_2p_2N1()
     309             :  *
     310             :  * Decode 2 pulses with 2*N+1 bits:
     311             :  *-------------------------------------------------------*/
     312             : 
     313       66665 : void dec_2p_2N1_fx(
     314             :     const Word32 index,  /* i:   quantization index    */
     315             :     const Word16 N,      /* i:   nb. of bits           */
     316             :     const Word16 offset, /* i:   pulse position offset */
     317             :     Word16 pos[]         /* o:   pulse position        */
     318             : )
     319             : {
     320             : 
     321             :     Word16 pos1, pos2, tmp;
     322             :     Word32 mask, i;
     323             : 
     324       66665 :     mask = L_deposit_l( sub( shl( 1, N ), 1 ) ); /* mask = ((1<<N)-1); */
     325             : 
     326             :     /* pos1 = (((index >> N) & mask) + offset); */
     327       66665 :     logic16();
     328       66665 :     pos1 = extract_l( L_add( ( L_shr( index, N ) & mask ), L_deposit_l( offset ) ) );
     329             : 
     330             :     /* i = (index >> (2*N)) & 1; */
     331       66665 :     tmp = shl( N, 1 );
     332       66665 :     i = L_and( L_shr( index, tmp ), 1L );
     333             : 
     334             :     /* pos2 = ((index & mask) + offset); */
     335       66665 :     pos2 = add( extract_l( index & mask ), offset );
     336       66665 :     logic16();
     337             : 
     338             : 
     339       66665 :     IF( LT_16( pos2, pos1 ) )
     340             :     {
     341       32024 :         IF( i != 0 )
     342             :         {
     343       15531 :             pos1 = add( pos1, NB_POS_FCB_4T );
     344             :         }
     345             :         ELSE
     346             :         {
     347       16493 :             pos2 = add( pos2, NB_POS_FCB_4T );
     348             :         }
     349             :     }
     350             :     ELSE
     351             :     {
     352       34641 :         IF( i != 0 )
     353             :         {
     354       17242 :             pos1 = add( pos1, NB_POS_FCB_4T );
     355       17242 :             pos2 = add( pos2, NB_POS_FCB_4T );
     356             :         }
     357             :     }
     358             : 
     359       66665 :     pos[0] = pos1;
     360       66665 :     move16();
     361       66665 :     pos[1] = pos2;
     362       66665 :     move16();
     363             : 
     364       66665 :     return;
     365             : }
     366             : /*-------------------------------------------------------*
     367             :  * Dec_3p_3N1
     368             :  *
     369             :  * Decode 3 pulses with 3*N+1 bits:
     370             :  *-------------------------------------------------------*/
     371           0 : static void dec_3p_3N1_fx(
     372             :     const Word32 index,  /* i  : quantization index    */
     373             :     const Word16 N,      /* i  : nb. of bits           */
     374             :     const Word16 offset, /* i  : pulse position offset */
     375             :     Word16 pos[]         /* o  : pulse position        */
     376             : )
     377             : {
     378             :     Word16 j, tmp;
     379             :     Word32 mask, idx;
     380             : 
     381           0 :     tmp = sub( shl( N, 1 ), 1 ); /* mask = ((1<<((2*N)-1))-1); */
     382           0 :     mask = L_sub( L_shl( 1L, tmp ), 1L );
     383             : 
     384           0 :     idx = L_and( index, mask );
     385           0 :     j = offset;
     386           0 :     move16();
     387           0 :     tmp = sub( shl( N, 1 ), 1 );
     388             : 
     389           0 :     logic16();
     390           0 :     IF( ( L_shr( index, tmp ) & 1L ) != 0 )
     391             :     {
     392             :         /* IF (((index >> ((2*N)-1)) & 1) == 1){ */
     393           0 :         j = add( j, shl( 1, sub( N, 1 ) ) ); /* j += (1<<(N-1)); */
     394             :     }
     395           0 :     dec_2p_2N1_fx( idx, sub( N, 1 ), j, pos );
     396             : 
     397           0 :     mask = sub( shl( 1, add( N, 1 ) ), 1 ); /* mask = ((1<<(N+1))-1); */
     398           0 :     tmp = shl( N, 1 );                      /* idx = (index >> (2*N)) & mask; */
     399           0 :     idx = L_shr( index, tmp ) & mask;
     400           0 :     logic16();
     401             : 
     402           0 :     dec_1p_N1_fx( idx, N, offset, pos + 2 );
     403           0 : }
     404             : 
     405             : /*-------------------------------------------------------*
     406             :  * Dec_4p_4N1
     407             :  *
     408             :  * Decode 4 pulses with 4*N+1 bits:
     409             :  *-------------------------------------------------------*/
     410           0 : static void dec_4p_4N1_fx(
     411             :     const Word32 index,  /* i  : quantization index    */
     412             :     const Word16 N,      /* i  : nb. of bits           */
     413             :     const Word16 offset, /* i  : pulse position offset */
     414             :     Word16 pos[]         /* o  : pulse position        */
     415             : )
     416             : {
     417             :     Word16 j, tmp;
     418             :     Word32 mask, idx;
     419             : 
     420           0 :     tmp = sub( shl( N, 1 ), 1 ); /* mask = ((1<<((2*N)-1))-1); */
     421           0 :     mask = L_sub( L_shl( 1L, tmp ), 1L );
     422           0 :     idx = L_and( index, mask );
     423           0 :     j = offset;
     424           0 :     move16();
     425           0 :     tmp = sub( shl( N, 1 ), 1 );
     426             : 
     427           0 :     logic16();
     428           0 :     IF( ( L_shr( index, tmp ) & 1L ) != 0L )
     429             :     {
     430             :         /* (((index >> ((2*N)-1)) & 1) == 1) */
     431           0 :         j = add( j, shl( 1, sub( N, 1 ) ) ); /* j += (1<<(N-1)); */
     432             :     }
     433           0 :     dec_2p_2N1_fx( idx, sub( N, 1 ), j, pos );
     434             : 
     435             : 
     436           0 :     tmp = add( shl( N, 1 ), 1 ); /* mask = ((1<<((2*N)+1))-1); */
     437           0 :     mask = L_sub( L_shl( 1L, tmp ), 1L );
     438           0 :     idx = L_shr( index, shl( N, 1 ) ) & mask;
     439           0 :     logic16();                                /* idx = (index >> (2*N)) & mask; */
     440           0 :     dec_2p_2N1_fx( idx, N, offset, pos + 2 ); /* Dec_2p_2N1(idx, N, offset, pos+2); */
     441           0 : }
     442             : 
     443             : 
     444             : /*-------------------------------------------------------*
     445             :  * Dec_4p_4N
     446             :  *
     447             :  * Decode 4 pulses with 4*N bits:
     448             :  *-------------------------------------------------------*/
     449           0 : static void dec_4p_4N_fx(
     450             :     const Word32 index,  /* i  : quantization index    */
     451             :     const Word16 N,      /* i  : nb. of bits           */
     452             :     const Word16 offset, /* i  : pulse position offset */
     453             :     Word16 pos[]         /* o  : pulse position        */
     454             : )
     455             : {
     456             :     Word16 j, n_1, tmp;
     457             : 
     458           0 :     n_1 = sub( N, 1 );
     459           0 :     j = add( offset, shl( 1, n_1 ) ); /* j = offset + (1 << n_1) */
     460             : 
     461           0 :     tmp = sub( shl( N, 2 ), 2 );
     462           0 :     logic16();
     463           0 :     SWITCH( L_shr( index, tmp ) & 3 )
     464             :     {
     465             :             /* ((index >> ((4*N)-2)) & 3) */
     466           0 :         case 0:
     467           0 :             tmp = add( shl( n_1, 2 ), 1 );
     468             : 
     469           0 :             logic16();
     470           0 :             IF( ( L_shr( index, tmp ) & 1 ) == 0 )
     471             :             {
     472             :                 /* (((index >> ((4*n_1)+1)) & 1) == 0) */
     473           0 :                 dec_4p_4N1_fx( index, n_1, offset, pos );
     474             :             }
     475             :             ELSE
     476             :             {
     477           0 :                 dec_4p_4N1_fx( index, n_1, j, pos );
     478             :             }
     479           0 :             BREAK;
     480           0 :         case 1:
     481           0 :             tmp = add( extract_l( L_shr( L_mult( 3, n_1 ), 1 ) ), 1 ); /* Dec_1p_N1((index>>((3*n_1)+1)), n_1, offset, pos) */
     482           0 :             dec_1p_N1_fx( L_shr( index, tmp ), n_1, offset, pos );
     483           0 :             dec_3p_3N1_fx( index, n_1, j, pos + 1 );
     484           0 :             move16();
     485           0 :             BREAK;
     486           0 :         case 2:
     487           0 :             tmp = add( shl( n_1, 1 ), 1 ); /* Dec_2p_2N1((index>>((2*n_1)+1)), n_1, offset, pos) */
     488           0 :             dec_2p_2N1_fx( L_shr( index, tmp ), n_1, offset, pos );
     489           0 :             dec_2p_2N1_fx( index, n_1, j, pos + 2 );
     490           0 :             move16();
     491           0 :             BREAK;
     492           0 :         case 3:
     493           0 :             tmp = add( n_1, 1 ); /* Dec_3p_3N1((index>>(n_1+1)), n_1, offset, pos) */
     494           0 :             dec_3p_3N1_fx( L_shr( index, tmp ), n_1, offset, pos );
     495           0 :             dec_1p_N1_fx( index, n_1, j, pos + 3 );
     496           0 :             move16();
     497           0 :             BREAK;
     498             :     }
     499           0 : }
     500             : 
     501             : 
     502             : /*-------------------------------------------------------*
     503             :  * Dec_5p_5N
     504             :  *
     505             :  * Decode 5 pulses with 5*N bits:
     506             :  *-------------------------------------------------------*/
     507           0 : static void dec_5p_5N_fx(
     508             :     const Word32 index,  /* i  : quantization index    */
     509             :     const Word16 N,      /* i  : nb. of bits           */
     510             :     const Word16 offset, /* i  : pulse position offset */
     511             :     Word16 pos[]         /* o  : pulse position        */
     512             : )
     513             : {
     514             :     Word16 j, n_1, tmp;
     515             :     Word32 idx;
     516             : 
     517           0 :     n_1 = sub( N, 1 );
     518           0 :     j = add( offset, shl( 1, n_1 ) ); /* j = offset + (1 << n_1); */
     519           0 :     tmp = add( shl( N, 1 ), 1 );      /* idx = (index >> ((2*N)+1)); */
     520           0 :     idx = L_shr( index, tmp );
     521           0 :     tmp = sub( extract_l( L_shr( L_mult( 5, N ), 1 ) ), 1 ); /* ((5*N)-1)) */
     522             : 
     523           0 :     logic16();
     524           0 :     IF( ( L_shr( index, tmp ) & 1 ) == 0 ) /* ((index >> ((5*N)-1)) & 1)  */
     525             :     {
     526           0 :         dec_3p_3N1_fx( idx, n_1, offset, pos );
     527           0 :         dec_2p_2N1_fx( index, N, offset, pos + 3 );
     528           0 :         move16();
     529             :     }
     530             :     ELSE
     531             :     {
     532           0 :         dec_3p_3N1_fx( idx, n_1, j, pos );
     533           0 :         dec_2p_2N1_fx( index, N, offset, pos + 3 );
     534           0 :         move16();
     535             :     }
     536           0 : }
     537             : 
     538             : /*-------------------------------------------------------*
     539             :  * Dec_6p_6N_2
     540             :  *
     541             :  * Decode 6 pulses with 6*N+2 bits:
     542             :  *-------------------------------------------------------*/
     543           0 : static void dec_6p_6N2_fx(
     544             :     const Word32 index,  /* i  : quantization index    */
     545             :     const Word16 N,      /* i  : nb. of bits           */
     546             :     const Word16 offset, /* i  : pulse position offset */
     547             :     Word16 pos[]         /* o  : pulse position        */
     548             : )
     549             : {
     550             :     Word16 j, n_1, offsetA, offsetB, n_6;
     551             : 
     552           0 :     n_1 = sub( N, 1 );
     553           0 :     j = add( offset, shl( 1, n_1 ) ); /* j = offset + (1 << n_1); */
     554           0 :     n_6 = extract_l( L_mult0( N, 6 ) );
     555             : 
     556             :     /* !!  N and n_1 are constants -> it doesn't need to be operated by Basic Operators */
     557             : 
     558           0 :     offsetA = offsetB = j;
     559           0 :     move16();
     560           0 :     move16();
     561           0 :     logic16();
     562           0 :     IF( L_and( L_shr( index, sub( n_6, 5 ) ), 1L ) == 0 )
     563             :     {
     564             :         /* IF (((index >> ((6*N)-5)) & 1) == 0) */
     565           0 :         offsetA = offset;
     566           0 :         move16();
     567             :     }
     568             :     ELSE
     569             :     {
     570           0 :         offsetB = offset;
     571           0 :         move16();
     572             :     }
     573             : 
     574             : 
     575           0 :     logic16();
     576           0 :     SWITCH( L_shr( index, sub( n_6, 4 ) ) & 3 )
     577             :     {
     578             :             /* (index >> ((6*N)-4)) & 3 */
     579           0 :         case 0:
     580           0 :             dec_5p_5N_fx( L_shr( index, N ), n_1, offsetA, pos ); /* Dec_5p_5N(index>>N, n_1, offsetA, pos); */
     581           0 :             dec_1p_N1_fx( index, n_1, offsetA, pos + 5 );
     582           0 :             BREAK;
     583           0 :         case 1:
     584           0 :             dec_5p_5N_fx( L_shr( index, N ), n_1, offsetA, pos ); /* Dec_5p_5N(index>>N, n_1, offsetA, pos); */
     585           0 :             dec_1p_N1_fx( index, n_1, offsetB, pos + 5 );
     586           0 :             BREAK;
     587           0 :         case 2:
     588           0 :             dec_4p_4N_fx( L_shr( index, add( shl( n_1, 1 ), 1 ) ), n_1, offsetA, pos ); /* Dec_4p_4N(index>>((2*n_1)+1 ), n_1, offsetA, pos); */
     589           0 :             dec_2p_2N1_fx( index, n_1, offsetB, pos + 4 );
     590           0 :             BREAK;
     591           0 :         case 3:
     592           0 :             dec_3p_3N1_fx( L_shr( index, add( add( shl( n_1, 1 ), n_1 ), 1 ) ), n_1, offset, pos ); /* Dec_3p_3N1(index>>((3*n_1)+ 1), n_1, offset, pos); */
     593           0 :             dec_3p_3N1_fx( index, n_1, j, pos + 3 );
     594           0 :             BREAK;
     595             :     }
     596           0 : }
     597             : 
     598       65746 : static Word32 fcb_decode_class_all_p_fx(                         /* o:   The index of pulse positions                          */
     599             :                                          Word32 *code_index,     /* i:   fcb index information                              */
     600             :                                          Word16 sector_6p_num[], /* o:   Number of pulses for each position                 */
     601             :                                          Word16 pulse_num,       /* i:   Number of pulses on a track.                       */
     602             :                                          Word16 *pos_num         /* o:   Number of positions which have pulses on the track.*/
     603             : )
     604             : {
     605             :     Word16 i;
     606             :     Word32 mn9, j, k;
     607             :     Word16 pulse_pos_num;
     608             :     Word32 L_tmp, L_tmp1;
     609      138751 :     FOR( i = 1; i <= pulse_num; i++ ){
     610      138437 :         IF( LT_32( ( *code_index ), PI_offset[pulse_num][i] ) ){
     611       65432 :             BREAK;
     612             : }
     613             : }
     614             : 
     615             : /* (*code_index) -= PI_offset[pulse_num][i-1];*/
     616       65746 : ( *code_index ) = L_sub( ( *code_index ), PI_offset[pulse_num][i - 1] );
     617       65746 : move32();
     618             : 
     619             : /*pulse_pos_num = pulse_num - i + 2;*/
     620       65746 : pulse_pos_num = add( sub( pulse_num, i ), 2 );
     621             : 
     622             : /*  j = (*code_index)>>pulse_pos_num;*/
     623       65746 : j = L_shr( ( *code_index ), pulse_pos_num );
     624       65746 : IF( LT_32( j, PI_select_table[16][pulse_pos_num] ) )
     625             : {
     626       62335 :     k = L_deposit_l( 0 );
     627       62335 :     mn9 = L_add( j, 0 );
     628             : }
     629             : ELSE
     630             : {
     631        3411 :     L_tmp = L_deposit_l( 0 );
     632        3411 :     L_tmp1 = L_add( j, 0 );
     633        6822 :     WHILE( GE_32( L_tmp1, PI_select_table[16][pulse_pos_num] ) )
     634             :     {
     635        3411 :         L_tmp = L_add( L_tmp, 1 );
     636        3411 :         L_tmp1 = L_sub( L_tmp1, PI_select_table[16][pulse_pos_num] );
     637             :     }
     638        3411 :     k = L_add( L_tmp, 0 );
     639        3411 :     mn9 = L_add( L_tmp1, 0 );
     640             : }
     641             : /* mn9 = Mult_32_32(sub(j , k) , PI_select_table[16][pulse_pos_num]);*/
     642             : 
     643       65746 : test();
     644       65746 : IF( ( LT_16( pulse_pos_num, pulse_num ) ) && ( GT_16( pulse_pos_num, 1 ) ) )
     645             : {
     646       19893 :     FOR( i = 0; i < pulse_pos_num; i++ )
     647             :     {
     648       13262 :         sector_6p_num[i] = 1;
     649       13262 :         move16();
     650             :     }
     651        6631 :     sector_6p_num[k] = add( sector_6p_num[k], 1 );
     652        6631 :     move16();
     653             : }
     654             : ELSE{
     655             : 
     656       59115 :     IF( EQ_16( pulse_pos_num, 1 ) ){
     657         314 :         sector_6p_num[0] = pulse_num;
     658         314 : move16();
     659             : }
     660             : ELSE
     661             : {
     662      235204 :     FOR( i = 0; i < pulse_num; i++ )
     663             :     {
     664      176403 :         sector_6p_num[i] = 1;
     665      176403 :         move16();
     666             :     }
     667             : }
     668             : }
     669             : 
     670       65746 : *pos_num = pulse_pos_num;
     671       65746 : move16();
     672             : 
     673       65746 : return mn9;
     674             : }
     675             : 
     676       65746 : static void fcb_decode_position_fx(
     677             :     Word32 index,        /* i:   position index information        */
     678             :     Word16 pos_vector[], /* o:   the positon vector                */
     679             :     Word16 pos_num       /* i:   number of positions               */
     680             : )
     681             : {
     682             :     Word32 i, k, l;
     683             :     Word16 temp;
     684             : 
     685       65746 :     k = L_add( index, 0 );
     686       65746 :     l = L_deposit_l( 0 );
     687       65746 :     temp = pos_num;
     688       65746 :     move16();
     689      189979 :     FOR( i = 0; i < pos_num - 1; i++ )
     690             :     {
     691             :         /* k = PI_select_table[16-l][temp] - k ;*/
     692      124233 :         k = L_sub( PI_select_table[( 16 - l )][temp], k );
     693             : 
     694      428738 :         FOR( ; PI_select_table[( 16 - l )][temp] >= k; l += 2 );
     695             : 
     696      124233 :         IF( GT_32( k, PI_select_table[( 17 - l )][temp] ) )
     697             :         {
     698       68975 :             l = L_sub( l, 1 );
     699             :         }
     700             : 
     701             :         /* k = PI_select_table[17-l][temp--] - k ;*/
     702      124233 :         k = L_sub( PI_select_table[( 17 - l )][temp], k );
     703      124233 :         temp = sub( temp, 1 );
     704      124233 :         pos_vector[i] = extract_l( L_sub( l, 1 ) );
     705      124233 :         move16();
     706             :     }
     707       65746 :     pos_vector[i] = extract_l( L_add( l, k ) );
     708       65746 :     move16();
     709             : 
     710       65746 :     return;
     711             : }
     712             : 
     713       65746 : static void fcb_decode_PI_fx(                     /* o:   return pulse position number   */
     714             :                               Word32 code_index,  /* i:   fcb index information          */
     715             :                               Word16 sector_6p[], /* o:   decoded pulse position         */
     716             :                               Word16 pulse_num    /* i:   pulse number for the track     */
     717             : )
     718             : {
     719             :     Word16 i, l, j;
     720             :     Word32 mn9;
     721             :     Word16 pulse_pos_num;
     722             :     Word16 sector_6p_temp[7], sector_6p_num_temp[7];
     723             :     Word16 *sector_6p_ptr0;
     724             :     Word16 *sector_6p_ptr1;
     725             : 
     726             :     /*get the position number and the pulse number on every position */
     727       65746 :     mn9 = fcb_decode_class_all_p_fx( &code_index, sector_6p_num_temp, pulse_num, &pulse_pos_num );
     728             : 
     729             :     /* rebuild the vector*/
     730             :     /* decode the pulse position not same to the others*/
     731       65746 :     fcb_decode_position_fx( mn9, sector_6p_temp, pulse_pos_num );
     732      255725 :     FOR( i = pulse_pos_num - 1; i >= 0; i-- )
     733             :     {
     734             :         /*sector_6p_temp[i] +=  ((code_index&0x1)<<4) ;*/
     735      189979 :         sector_6p_temp[i] = add( sector_6p_temp[i], extract_l( L_shl( ( code_index & 0x1 ), 4 ) ) );
     736      189979 :         move16();
     737             :         /*code_index = code_index>>1;*/
     738      189979 :         code_index = L_shr( code_index, 1 );
     739             :     }
     740             : 
     741             :     /* decode the pulse position maybe some pulse position same to other pulse */
     742       65746 :     sector_6p_ptr0 = &sector_6p[pulse_num];
     743       65746 :     sector_6p_ptr1 = &sector_6p_temp[pulse_pos_num];
     744      255725 :     FOR( i = 0; i < pulse_pos_num; i++ )
     745             :     {
     746      189979 :         sector_6p_ptr1--;
     747      189979 :         j = sub( pulse_pos_num, add( 1, i ) );
     748      387217 :         FOR( l = 0; l < sector_6p_num_temp[j]; l++ )
     749             :         {
     750      197238 :             *--sector_6p_ptr0 = *sector_6p_ptr1;
     751      197238 :             move16();
     752             :         }
     753             :     }
     754             : 
     755       65746 :     return;
     756             : }
     757             : 
     758             : 
     759             : /*---------------------------------------------------------------------*
     760             :  * Read FCB index                                                      *
     761             :  *---------------------------------------------------------------------*/
     762             : 
     763       32873 : void D_ACELP_decode_43bit_fx( UWord16 idxs[], Word16 code[], Word16 *pulsestrack )
     764             : {
     765             :     Word32 ps[8];
     766             :     Word16 pos[7];
     767             :     Word32 joint_index;
     768       32873 :     Word32 joint_offset = 3611648; /*offset for 3 pulses per track*/
     769             : 
     770       32873 :     set16_fx( code, 0, L_SUBFR );
     771             : 
     772       32873 :     ps[3] = L_and( idxs[0], 0x1ff );
     773       32873 :     move32();
     774       32873 :     ps[2] = L_add( L_shl( L_and( idxs[1], 3 ), 7 ), L_shr( idxs[0], 9 ) );
     775       32873 :     move32();
     776       32873 :     joint_index = L_shr( L_add( L_shl( (Word32) idxs[2], 16 ), (Word32) idxs[1] ), 2 );
     777             : 
     778       32873 :     IF( GE_32( joint_index, joint_offset ) )
     779             :     {
     780       27443 :         joint_index = L_sub( joint_index, joint_offset );
     781             :     }
     782             : 
     783       32873 :     iDiv_and_mod_32( joint_index, 5472, &ps[0], &ps[1], 0 );
     784       32873 :     fcb_decode_PI_fx( ps[0], pos, 3 );
     785       32873 :     add_pulses_fx( pos, pulsestrack[0], 0, code );
     786       32873 :     fcb_decode_PI_fx( ps[1], pos, 3 );
     787       32873 :     add_pulses_fx( pos, pulsestrack[1], 1, code );
     788             : 
     789       32873 :     dec_2p_2N1_fx( ps[2], 4, 0, pos );
     790       32873 :     add_pulses_fx( pos, pulsestrack[2], 2, code );
     791       32873 :     dec_2p_2N1_fx( ps[3], 4, 0, pos );
     792       32873 :     add_pulses_fx( pos, pulsestrack[3], 3, code );
     793             : 
     794       32873 :     return;
     795             : }
     796             : 
     797             : 
     798             : /*-------------------------------------------------------*
     799             :  * dec_1p_N1()
     800             :  *
     801             :  * Decode 1 pulse with N+1 bits
     802             :  *-------------------------------------------------------*/
     803             : 
     804           0 : static void dec_1p_N1_L_subfr_fx(
     805             :     const Word32 index,  /* i  : quantization index    */
     806             :     const Word16 nb_pos, /* i  : number of positions   */
     807             :     const Word16 N,      /* i  : nb. of bits           */
     808             :     Word16 pos[]         /* o  : pulse position        */
     809             : )
     810             : {
     811             :     Word16 pos1;
     812             :     Word32 mask, i;
     813             : 
     814           0 :     mask = L_deposit_l( sub( shl( 1, N ), 1 ) );
     815           0 :     pos1 = extract_l( index & mask );
     816           0 :     i = L_shr( index, N ) & 1L;
     817             : 
     818           0 :     IF( EQ_32( i, 1 ) )
     819             :     {
     820           0 :         pos1 = add( pos1, nb_pos );
     821             :     }
     822             : 
     823           0 :     pos[0] = pos1;
     824           0 :     move16();
     825             : 
     826           0 :     return;
     827             : }
     828             : 
     829           0 : static void add_pulses_L_subfr_fx(
     830             :     const Word16 nb_pos,   /* i  : number of positions */
     831             :     const Word16 pos[],    /* i  : pulse position      */
     832             :     const Word16 nb_pulse, /* i  : nb. of pulses       */
     833             :     const Word16 track,    /* i  : no. of the tracks   */
     834             :     Word16 code[]          /* i/o: decoded codevector Q12 */
     835             : )
     836             : {
     837             :     Word16 i, k;
     838             :     Word16 *ptr;
     839           0 :     ptr = code + track;
     840             : 
     841           0 :     FOR( k = 0; k < nb_pulse; k++ )
     842             :     {
     843           0 :         i = shl( s_and( pos[k], sub( nb_pos, 1 ) ), 2 );
     844           0 :         IF( EQ_16( sub( pos[k], nb_pos ), 0 ) )
     845             :         {
     846           0 :             ptr[i] = add( ptr[i], 512 );
     847           0 :             move16();
     848             :         }
     849             :         ELSE
     850             :         {
     851           0 :             ptr[i] = sub( ptr[i], 512 );
     852           0 :             move16();
     853             :         }
     854             :     }
     855             : 
     856           0 :     return;
     857             : }
     858             : 
     859       25745 : void dec_acelp_fast_fx(
     860             :     Decoder_State *st,      /* i/o: decoder state structure                 */
     861             :     const Word16 cdk_index, /* i  : codebook index                          */
     862             :     Word16 code[],          /* o  : algebraic (fixed) codebook excitation   Q9*/
     863             :     const Word16 L_subfr    /* i  : subframe length                         */
     864             : )
     865             : {
     866             :     Word16 k, pos[7], skip_track;
     867             :     Word32 L_index;
     868             :     PulseConfig config;
     869             : 
     870       25745 :     skip_track = -1;
     871       25745 :     move16();
     872       25745 :     set16_fx( code, 0, L_subfr );
     873             : 
     874       25745 :     st->total_num_bits = extract_l( st->total_brate / FRAMES_PER_SEC );
     875             : 
     876       25745 :     IF( EQ_16( L_subfr, L_SUBFR ) )
     877             :     {
     878       22101 :         config = PulseConfTable[cdk_index];
     879             : 
     880       22101 :         IF( EQ_16( cdk_index, 2 ) )
     881             :         {
     882        8331 :             dec_acelp_2t32_fx( st, code ); // needs to be imported
     883             :         }
     884       13770 :         ELSE IF( EQ_16( config.nb_pulse, 2 ) )
     885             :         {
     886             :             /* 10 bits,  2 pulses, 4 tracks  1010 (used only even tracks) */
     887        4143 :             FOR( k = 0; k < NB_TRACK_FCB_4T - 1; k += 2 )
     888             :             {
     889        2762 :                 L_index = get_next_indice_fx( st, 5 ); // already fixed
     890        2762 :                 dec_1p_N1_fx( L_index, 4, 0, pos );    // already fixed
     891        2762 :                 add_pulses_fx( pos, 1, k, code );      // needs to be imported
     892             :             }
     893             :         }
     894       12389 :         ELSE IF( EQ_16( config.nb_pulse, 3 ) )
     895             :         {
     896       11048 :             IF( EQ_16( (Word16) config.codetrackpos, (Word16) TRACKPOS_FIXED_FIRST ) )
     897             :             {
     898             :                 /* 15 bits,  3 pulses, 4 tracks  1110 fixed track to first  ? */
     899       41500 :                 FOR( k = 0; k < NB_TRACK_FCB_4T - 1; k++ )
     900             :                 {
     901       31125 :                     L_index = get_next_indice_fx( st, 5 );
     902       31125 :                     dec_1p_N1_fx( L_index, 4, 0, pos );
     903       31125 :                     add_pulses_fx( pos, 1, k, code );
     904             :                 }
     905             :             }
     906         673 :             ELSE IF( EQ_16( (Word16) config.codetrackpos, (Word16) TRACKPOS_FREE_THREE ) )
     907             :             {
     908             :                 /* 17 bits,  3 pulses, 4 tracks  (used all tracks) - 1110, 1101, 1011, 0111 */
     909         673 :                 skip_track = get_next_indice_fx( st, 2 );
     910        3365 :                 FOR( k = 0; k < NB_TRACK_FCB_4T; k++ )
     911             :                 {
     912        2692 :                     IF( NE_16( k, skip_track ) )
     913             :                     {
     914        2019 :                         L_index = get_next_indice_fx( st, 5 );
     915        2019 :                         dec_1p_N1_fx( L_index, 4, 0, pos );
     916        2019 :                         add_pulses_fx( pos, 1, k, code );
     917             :                     }
     918             :                 }
     919             :             }
     920             :         }
     921             :         ELSE
     922             :         {
     923        1341 :             IF( EQ_16( config.bits, 20 ) )
     924             :             {
     925         422 :                 skip_track = -1;
     926         422 :                 move16();
     927             :             }
     928         919 :             ELSE IF( EQ_16( (Word16) config.codetrackpos, (Word16) TRACKPOS_FIXED_FIRST ) )
     929             :             {
     930         538 :                 skip_track = 0;
     931         538 :                 move16();
     932             :             }
     933         381 :             ELSE IF( EQ_16( (Word16) config.codetrackpos, (Word16) TRACKPOS_FREE_ONE ) )
     934             :             {
     935         381 :                 skip_track = get_next_indice_fx( st, 2 );
     936             :             }
     937             : 
     938        6705 :             FOR( k = 0; k < NB_TRACK_FCB_4T; k++ )
     939             :             {
     940        5364 :                 IF( EQ_16( k, skip_track ) )
     941             :                 {
     942         919 :                     L_index = get_next_indice_fx( st, 9 );
     943         919 :                     dec_2p_2N1_fx( L_index, 4, 0, pos );
     944         919 :                     add_pulses_fx( pos, 2, k, code );
     945             :                 }
     946             :                 ELSE
     947             :                 {
     948        4445 :                     L_index = get_next_indice_fx( st, 5 );
     949        4445 :                     dec_1p_N1_fx( L_index, 4, 0, pos );
     950        4445 :                     add_pulses_fx( pos, 1, k, code );
     951             :                 }
     952             :             }
     953             :         }
     954             :     }
     955             :     ELSE /* L_subfr == 2*L_SUBFR */
     956             :     {
     957        3644 :         config.bits = cdk_index;
     958        3644 :         move16();
     959             : 
     960        3644 :         IF( EQ_16( cdk_index, 14 ) )
     961             :         {
     962             :             /* 14 bits, 2 pulses, 2 tracks: 11 (used all tracks) */
     963             :             Word16 index, i0, i1;
     964             : 
     965        3644 :             index = get_next_indice_fx( st, 14 );
     966             : 
     967             : 
     968        3644 :             i0 = shl( s_and( shr( index, 7 ), ( NB_POS_FCB_2T_128 - 1 ) ), 1 );
     969        3644 :             i1 = add( shl( s_and( index, ( NB_POS_FCB_2T_128 - 1 ) ), 1 ), 1 );
     970             : 
     971        3644 :             code[i0] = -512; //-1 in Q9
     972        3644 :             move16();
     973        3644 :             IF( EQ_16( s_and( index, 0x2000 ), 0 ) )
     974             :             {
     975        1877 :                 code[i0] = 512; // 1 in Q9
     976        1877 :                 move16();
     977             :             }
     978             : 
     979        3644 :             code[i1] = -512; //-1 in Q9
     980        3644 :             move16();
     981        3644 :             IF( EQ_16( s_and( index, 0x40 ), 0 ) )
     982             :             {
     983        1900 :                 code[i1] = 512; // 1 in Q9
     984        1900 :                 move16();
     985             :             }
     986             :         }
     987           0 :         ELSE IF( EQ_16( cdk_index, 12 ) )
     988             :         {
     989             :             /* 12 bits, 2 pulses, 4 tracks: 1010 (used only even tracks) */
     990           0 :             FOR( k = 0; k < NB_TRACK_FCB_4T - 1; k += 2 )
     991             :             {
     992           0 :                 L_index = get_next_indice_fx( st, 6 );
     993           0 :                 dec_1p_N1_L_subfr_fx( L_index, NB_POS_FCB_4T_128, 5, pos );
     994           0 :                 add_pulses_L_subfr_fx( NB_POS_FCB_4T_128, pos, 1, k, code );
     995             :             }
     996             :         }
     997           0 :         ELSE IF( EQ_16( cdk_index, 18 ) )
     998             :         {
     999             :             /* 18 bits, 3 pulses, 4 tracks: 1110 (used first three tracks) */
    1000           0 :             FOR( k = 0; k < NB_TRACK_FCB_4T - 1; k++ )
    1001             :             {
    1002           0 :                 L_index = get_next_indice_fx( st, 6 );
    1003           0 :                 dec_1p_N1_L_subfr_fx( L_index, NB_POS_FCB_4T_128, 5, pos );
    1004           0 :                 add_pulses_L_subfr_fx( NB_POS_FCB_4T_128, pos, 1, k, code );
    1005             :             }
    1006             :         }
    1007           0 :         ELSE IF( EQ_16( cdk_index, 20 ) )
    1008             :         {
    1009             :             /* 20 bits, 3 pulses, 4 tracks (used all tracks): 1110, 1101, 1011, 0111 */
    1010           0 :             skip_track = get_next_indice_fx( st, 2 );
    1011           0 :             FOR( k = 0; k < NB_TRACK_FCB_4T; k++ )
    1012             :             {
    1013           0 :                 IF( NE_16( k, skip_track ) )
    1014             :                 {
    1015           0 :                     L_index = get_next_indice_fx( st, 6 );
    1016           0 :                     dec_1p_N1_L_subfr_fx( L_index, NB_POS_FCB_4T_128, 5, pos );
    1017           0 :                     add_pulses_L_subfr_fx( NB_POS_FCB_4T_128, pos, 1, k, code );
    1018             :                 }
    1019             :             }
    1020             :         }
    1021           0 :         ELSE IF( EQ_16( cdk_index, 24 ) )
    1022             :         {
    1023             :             /* 24 bits, 4 pulses, 4 tracks: 1111 */
    1024           0 :             FOR( k = 0; k < NB_TRACK_FCB_4T; k++ )
    1025             :             {
    1026           0 :                 L_index = get_next_indice_fx( st, 6 );
    1027           0 :                 dec_1p_N1_L_subfr_fx( L_index, NB_POS_FCB_4T_128, 5, pos );
    1028           0 :                 add_pulses_L_subfr_fx( NB_POS_FCB_4T_128, pos, 1, k, code );
    1029             :             }
    1030             :         }
    1031             :     }
    1032             : 
    1033       25745 :     return;
    1034             : }

Generated by: LCOV version 1.14