LCOV - code coverage report
Current view: top level - lib_enc - cod4t64_fast.c (source / functions) Hit Total Coverage
Test: Coverage on main -- short test vectors @ 6c9ddc4024a9c0e1ecb8f643f114a84a0e26ec6b Lines: 296 314 94.3 %
Date: 2025-05-23 08:37:30 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : #include <stdint.h>
      34             : #include "options.h"
      35             : #ifdef DEBUGGING
      36             : #include "debug.h"
      37             : #endif
      38             : #include <math.h>
      39             : #include "cnst.h"
      40             : #include "prot.h"
      41             : #include "ivas_prot.h"
      42             : #include "rom_com.h"
      43             : #include "wmc_auto.h"
      44             : 
      45             : /*-------------------------------------------------------------------*
      46             :  * Local constants
      47             :  *-------------------------------------------------------------------*/
      48             : 
      49             : #define BETA_BN1 2.0f
      50             : #define BETA_BN2 2.25f
      51             : 
      52             : #define L_SUBFR_MAX       2 * L_SUBFR
      53             : #define MAX_NUM_INTER     5
      54             : #define MAX_PULSES_STEREO 5
      55             : 
      56             : /*---------------------------------------------------------------------*
      57             :  * Quantization of 1 pulse with N+1 bits:                              *
      58             :  *---------------------------------------------------------------------*/
      59             : 
      60             : /*! r: return index (N+1 bits) */
      61       46536 : static int16_t quant_1p_N1_L_subfr(
      62             :     const int16_t nb_pos, /* i  : number of positions         */
      63             :     const int16_t pos,    /* i  : position of the pulse       */
      64             :     const int16_t N       /* i  : number of bits for position */
      65             : )
      66             : {
      67             :     int16_t mask, index;
      68             : 
      69       46536 :     mask = ( ( 1 << N ) - 1 );
      70             : 
      71       46536 :     index = ( pos & mask );
      72             : 
      73       46536 :     if ( ( pos & nb_pos ) != 0 )
      74             :     {
      75       23011 :         index += 1 << N;
      76             :     }
      77             : 
      78       46536 :     return index;
      79             : }
      80             : 
      81             : /*-------------------------------------------------------------------*
      82             :  * Function find_best_pulse()
      83             :  *
      84             :  * Find best pulse
      85             :  *-------------------------------------------------------------------*/
      86             : 
      87      105571 : static int16_t find_best_pulse(
      88             :     const int16_t L_subfr,
      89             :     const int16_t nb_tracks,
      90             :     const int16_t track,
      91             :     const float dn[],
      92             :     const float sign[],
      93             :     int16_t *s )
      94             : {
      95             :     int16_t m, i;
      96             :     float temp, max_val;
      97             : 
      98      105571 :     max_val = FLT_MIN;
      99      105571 :     m = track;
     100     2468019 :     for ( i = track; i < L_subfr; i += nb_tracks )
     101             :     {
     102     2362448 :         temp = dn[i] * sign[i];
     103             : 
     104     2362448 :         if ( temp >= max_val )
     105             :         {
     106      346219 :             max_val = temp;
     107      346219 :             m = i;
     108             :         }
     109             :     }
     110             : 
     111      105571 :     *s = (int16_t) sign[m];
     112             : 
     113      105571 :     return m;
     114             : }
     115             : 
     116             : 
     117             : /*-------------------------------------------------------------------*
     118             :  * Function  acelp_fast()
     119             :  *
     120             :  * Fast algebraic codebook search.
     121             :  * Supports 10, 15, 17, 20, 24, and 26 bits codebooks.
     122             :  *-------------------------------------------------------------------*/
     123             : 
     124       28713 : void acelp_fast(
     125             :     BSTR_ENC_HANDLE hBstr,        /* i/o: encoder bitstream handle                      */
     126             :     const int16_t cdk_index,      /* i  : codebook index                                */
     127             :     const float dn_orig[L_SUBFR], /* i  : corr. between target and h[].                 */
     128             :     const float cn[L_SUBFR],      /* i  : residual after long term prediction           */
     129             :     const float H[L_SUBFR],       /* i  : impulse response of weighted synthesis filter */
     130             :     float code[L_SUBFR],          /* o  : algebraic (fixed) codebook excitation         */
     131             :     float y[],                    /* o  : filtered fixed codebook excitation            */
     132             :     const int16_t L_subfr         /* i  : subframe length                               */
     133             : )
     134             : {
     135             :     int16_t i, j, q, bits, bits_track, nb_pos, nb_pulse, track, nb_iter, nb_tracks;
     136             :     int16_t skip_track[MAX_NUM_INTER], skip_track_max;
     137             :     PulseConfig config;
     138             :     enum TRACKPOS codetrackpos;
     139             :     int16_t m[MAX_PULSES_STEREO], s[MAX_PULSES_STEREO], m_max[MAX_PULSES_STEREO], s_max[MAX_PULSES_STEREO];
     140             :     int16_t track_order[NB_TRACK_FCB_4T * MAX_NUM_INTER], m0_track[NB_TRACK_FCB_4T];
     141             :     int16_t ind_stream[NPMAXPT * NB_TRACK_FCB_4T], idx;
     142             :     float G, G1, G2, G3, Gn, Gd, dn[L_SUBFR_MAX];
     143             :     float tmpF, y_tmp[L_SUBFR_MAX];
     144             :     float crit_num, crit_den, crit_num_max, crit_den_max;
     145             :     float h_buf[4 * L_SUBFR_MAX], *h, *h_inv, *p_hn, alp_buf[2 * L_SUBFR_MAX], *alp, *alp_pos0, *alp_pos1, *alp_pos2, *alp_pos3;
     146             :     float dndn, cncn, s_coef, bn_orig[L_SUBFR_MAX], cncn_track[NB_TRACK_FCB_4T];
     147             :     float max_val, temp, sign[L_SUBFR_MAX], max_track[MAX_NUM_INTER];
     148             :     float beta1, beta2;
     149             : 
     150             :     /*-----------------------------------------------------------------*
     151             :      * Initialization
     152             :      *-----------------------------------------------------------------*/
     153             : 
     154       28713 :     nb_iter = NB_TRACK_FCB_4T;
     155       28713 :     nb_tracks = NB_TRACK_FCB_4T;
     156       28713 :     nb_pulse = 0; /* to avoid compilation warnings */
     157             : 
     158       28713 :     if ( L_subfr == L_SUBFR )
     159             :     {
     160       24627 :         config = PulseConfTable[cdk_index];
     161       24627 :         bits = config.bits;
     162       24627 :         nb_pulse = config.nb_pulse;
     163       24627 :         codetrackpos = config.codetrackpos;
     164             : 
     165       24627 :         if ( cdk_index == 2 )
     166             :         {
     167             :             /* 12 bits, 2 pulses, 2 tracks:  11 (used all tracks) */
     168        8783 :             nb_tracks = NB_TRACK_FCB_2T;
     169        8783 :             nb_iter = NB_TRACK_FCB_2T;
     170             :         }
     171       15844 :         else if ( nb_pulse == 2 )
     172             :         {
     173             :             /* 10 bits,  2 pulses, 4 tracks:  1010 (used only even tracks) */
     174        1437 :             nb_iter = NB_TRACK_FCB_4T - 2;
     175             :         }
     176       14407 :         else if ( nb_pulse == 3 )
     177             :         {
     178       13041 :             if ( codetrackpos == TRACKPOS_FIXED_FIRST )
     179             :             {
     180             :                 /* 15 bits,  3 pulses, 4 tracks:  1110 (fixed track to first) */
     181       12350 :                 nb_iter = NB_TRACK_FCB_4T - 1;
     182             :             }
     183         691 :             else if ( codetrackpos == TRACKPOS_FREE_THREE )
     184             :             {
     185             :                 /* 17 bits,  3 pulses, 4 tracks  (used all tracks): 1110, 1101, 1011, 0111 */
     186         691 :                 nb_iter = NB_TRACK_FCB_4T;
     187             :             }
     188             :         }
     189             :     }
     190             :     else /* L_subfr == 2*L_SUBFFR */
     191             :     {
     192        4086 :         bits = cdk_index;
     193        4086 :         codetrackpos = -1; /* to avoid compilation warnings */
     194             : 
     195        4086 :         if ( cdk_index == 14 )
     196             :         {
     197             :             /* 14 bits, 2 pulses, 2 tracks: 11 (used all tracks) */
     198        4086 :             nb_pulse = 2;
     199        4086 :             nb_iter = NB_TRACK_FCB_2T;
     200        4086 :             codetrackpos = TRACKPOS_FIXED_TWO;
     201        4086 :             nb_tracks = NB_TRACK_FCB_2T;
     202             :         }
     203           0 :         else if ( cdk_index == 12 )
     204             :         {
     205             :             /* 12 bits, 2 pulses, 4 tracks: 1010 (used only even tracks) */
     206           0 :             nb_pulse = 2;
     207           0 :             nb_iter = NB_TRACK_FCB_4T - 2;
     208           0 :             codetrackpos = TRACKPOS_FIXED_EVEN;
     209             :         }
     210           0 :         else if ( cdk_index == 18 )
     211             :         {
     212             :             /* 18 bits, 3 pulses, 4 tracks: 1110 (used first three tracks) */
     213           0 :             nb_pulse = 3;
     214           0 :             nb_iter = NB_TRACK_FCB_4T - 1;
     215           0 :             codetrackpos = TRACKPOS_FIXED_FIRST;
     216             :         }
     217           0 :         else if ( cdk_index == 20 )
     218             :         {
     219             :             /* 20 bits, 3 pulses, 4 tracks (used all tracks): 1110, 1101, 1011, 0111 */
     220           0 :             nb_pulse = 3;
     221           0 :             nb_iter = NB_TRACK_FCB_4T;
     222           0 :             codetrackpos = TRACKPOS_FREE_THREE;
     223             :         }
     224           0 :         else if ( cdk_index == 24 )
     225             :         {
     226             :             /* 24 bits, 4 pulses, 4 tracks: 1111 */
     227           0 :             nb_pulse = 4;
     228           0 :             nb_iter = NB_TRACK_FCB_4T;
     229           0 :             codetrackpos = TRACKPOS_FIXED_FIRST;
     230             :         }
     231             :     }
     232             : 
     233       28713 :     beta1 = BETA_BN1;
     234       28713 :     beta2 = BETA_BN2;
     235             : 
     236       28713 :     if ( cdk_index <= 2 )
     237             :     {
     238       10220 :         beta1 = BETA_BN1 * 2;
     239       10220 :         beta2 = BETA_BN2 * 2;
     240             :     }
     241             : 
     242             :     /*-----------------------------------------------------------------*
     243             :      * Find signal bn[] and sign pre-selection vector sign[].
     244             :      *-----------------------------------------------------------------*/
     245             : 
     246       28713 :     dndn = sum2_f( dn_orig, L_subfr ) + 0.01f;
     247             : 
     248       28713 :     cncn = 0.1f;
     249      117827 :     for ( q = 0; q < nb_tracks; q++ )
     250             :     {
     251       89114 :         cncn_track[q] = 0.1f;
     252             : 
     253     2188250 :         for ( i = 0; i < L_subfr; i += nb_tracks )
     254             :         {
     255     2099136 :             cncn_track[q] += ( cn[i + q] * cn[i + q] );
     256             :         }
     257       89114 :         cncn += cncn_track[q];
     258             :     }
     259             : 
     260       28713 :     s_coef = sqrtf( dndn / cncn );
     261             : 
     262     2127849 :     for ( i = 0; i < L_subfr; i++ )
     263             :     {
     264     2099136 :         temp = ( s_coef * cn[i] ) + ( beta1 * dn_orig[i] );
     265     2099136 :         bn_orig[i] = temp;
     266             : 
     267     2099136 :         if ( temp >= 0 )
     268             :         {
     269     1047253 :             sign[i] = 1.0f;
     270             :         }
     271             :         else
     272             :         {
     273     1051883 :             sign[i] = -1.0f;
     274             :         }
     275             :     }
     276             : 
     277             :     /*-----------------------------------------------------------------*
     278             :      * Compute buffer h_buf[].
     279             :      *-----------------------------------------------------------------*/
     280             : 
     281       28713 :     h = h_buf;
     282       28713 :     h_inv = h_buf + ( 2 * L_subfr );
     283             : 
     284     2127849 :     for ( i = 0; i < L_subfr; i++ )
     285             :     {
     286     2099136 :         *h++ = 0.0f;
     287     2099136 :         *h_inv++ = 0.0f;
     288             :     }
     289             : 
     290     2127849 :     for ( i = 0; i < L_subfr; i++ )
     291             :     {
     292     2099136 :         h[i] = H[i];
     293     2099136 :         h_inv[i] = -H[i];
     294             :     }
     295             : 
     296             :     /*-----------------------------------------------------------------*
     297             :      * Approximate FI[i][j] by alp[abs(i-j)] and compute buffer alp_buf[].
     298             :      *-----------------------------------------------------------------*/
     299             : 
     300       28713 :     alp = alp_buf + L_subfr;
     301             : 
     302     2127849 :     for ( i = 0; i < L_subfr; i++ )
     303             :     {
     304     2099136 :         *alp = 0.0f;
     305             : 
     306    87057312 :         for ( j = i; j < L_subfr; j++ )
     307             :         {
     308    84958176 :             *alp += H[j] * H[j - i];
     309             :         }
     310     2099136 :         alp_buf[L_subfr - i] = *alp++;
     311             :     }
     312             : 
     313       28713 :     alp = alp_buf + L_subfr;
     314             : 
     315      117827 :     for ( q = 0; q < nb_tracks; q++ )
     316             :     {
     317       89114 :         max_track[q] = 0.0f;
     318             : 
     319     2188250 :         for ( i = q; i < L_subfr; i += nb_tracks )
     320             :         {
     321     2099136 :             temp = bn_orig[i] * sign[i];
     322             : 
     323     2099136 :             if ( temp >= max_track[q] )
     324             :             {
     325      308675 :                 max_track[q] = temp;
     326      308675 :                 m0_track[q] = i;
     327             :             }
     328             :         }
     329             :     }
     330             : 
     331             :     /*-----------------------------------------------------------------*
     332             :      * Track re-order
     333             :      *-----------------------------------------------------------------*/
     334             : 
     335       28713 :     if ( nb_tracks == NB_TRACK_FCB_2T )
     336             :     {
     337       12869 :         track_order[0] = 0;
     338       12869 :         track_order[1] = 1;
     339       12869 :         track_order[2] = 1;
     340       12869 :         track_order[3] = 0;
     341             :     }
     342             :     else
     343             :     {
     344             :         /* skip certain tracks if number of pulses is lower than number of tracks */
     345       15844 :         if ( nb_pulse == 2 && nb_tracks == NB_TRACK_FCB_4T )
     346             :         {
     347        1437 :             max_track[NB_TRACK_FCB_4T - 3] = -1;
     348        1437 :             max_track[NB_TRACK_FCB_4T - 1] = -1;
     349             :         }
     350       14407 :         else if ( nb_pulse == 3 && codetrackpos == TRACKPOS_FIXED_FIRST )
     351             :         {
     352       12350 :             max_track[NB_TRACK_FCB_4T - 1] = -1;
     353             :         }
     354             : 
     355       79220 :         for ( q = 0; q < nb_tracks; q++ )
     356             :         {
     357       63376 :             i = maximum( max_track, nb_tracks, &tmpF );
     358       63376 :             track_order[q] = i;
     359       63376 :             max_track[i] = -1.0f;
     360             :         }
     361             : 
     362       15844 :         track_order[4] = track_order[1];
     363       15844 :         track_order[5] = track_order[0];
     364       15844 :         track_order[6] = track_order[2];
     365       15844 :         track_order[7] = track_order[3];
     366             : 
     367       15844 :         track_order[8] = track_order[2];
     368       15844 :         track_order[9] = track_order[0];
     369       15844 :         track_order[10] = track_order[1];
     370       15844 :         track_order[11] = track_order[3];
     371             : 
     372       15844 :         track_order[12] = track_order[3];
     373       15844 :         track_order[13] = track_order[0];
     374       15844 :         track_order[14] = track_order[1];
     375       15844 :         track_order[15] = track_order[2];
     376             : 
     377       15844 :         if ( cdk_index == 3 )
     378             :         {
     379       12350 :             track_order[12] = track_order[2];
     380       12350 :             track_order[13] = track_order[1];
     381       12350 :             track_order[14] = track_order[0];
     382             : 
     383       12350 :             track_order[16] = track_order[1];
     384       12350 :             track_order[17] = track_order[2];
     385       12350 :             track_order[18] = track_order[0];
     386       12350 :             nb_iter = 5;
     387             :         }
     388        3494 :         else if ( cdk_index == 4 )
     389             :         {
     390         691 :             track_order[16] = track_order[2];
     391         691 :             track_order[17] = track_order[3];
     392         691 :             track_order[18] = track_order[1];
     393         691 :             track_order[19] = track_order[0];
     394         691 :             nb_iter = 5;
     395             :         }
     396             :     }
     397             : 
     398             :     /*-----------------------------------------------------------------*
     399             :      * Main searching loop
     400             :      *-----------------------------------------------------------------*/
     401             : 
     402       28713 :     crit_num_max = -1.0f;
     403       28713 :     crit_den_max = 1.0f;
     404       28713 :     skip_track_max = -1;
     405             : 
     406      127994 :     for ( q = 0; q < nb_iter; q++ )
     407             :     {
     408             :         /*-----------------------------------------------------------------*
     409             :          * First pulse search
     410             :          *-----------------------------------------------------------------*/
     411             : 
     412       99281 :         track = track_order[q * nb_tracks];
     413       99281 :         m[0] = m0_track[track];
     414       99281 :         s[0] = (int16_t) sign[m[0]];
     415             : 
     416             :         /*-----------------------------------------------------------------*
     417             :          * Second pulse search
     418             :          *-----------------------------------------------------------------*/
     419             : 
     420       99281 :         if ( nb_tracks == NB_TRACK_FCB_2T )
     421             :         {
     422       25738 :             Gn = s[0] * dn_orig[m[0]];
     423       25738 :             Gd = alp[0];
     424       25738 :             G = Gn / Gd;
     425       25738 :             G *= s[0];
     426             : 
     427       25738 :             track = track_order[q * nb_tracks + 1];
     428       25738 :             alp_pos0 = alp - m[0] + track;
     429             : 
     430     1110858 :             for ( i = track; i < L_subfr; i += NB_TRACK_FCB_2T )
     431             :             {
     432     1085120 :                 dn[i] = dn_orig[i] - G * ( *alp_pos0 );
     433     1085120 :                 alp_pos0 += NB_TRACK_FCB_2T;
     434             :             }
     435             : 
     436       25738 :             m[1] = find_best_pulse( L_subfr, NB_TRACK_FCB_2T, track, dn, sign, &s[1] );
     437             :         }
     438             :         else
     439             :         {
     440       73543 :             Gn = s[0] * dn_orig[m[0]];
     441       73543 :             Gd = alp[0];
     442       73543 :             G = Gn;
     443       73543 :             G *= s[0];
     444             : 
     445       73543 :             track = track_order[q * nb_tracks + 1];
     446       73543 :             alp_pos0 = alp - m[0] + track;
     447             : 
     448       73543 :             dndn = 0.1f;
     449     1250231 :             for ( i = track; i < L_subfr; i += nb_tracks )
     450             :             {
     451     1176688 :                 dn[i] = Gd * dn_orig[i] - G * ( *alp_pos0 );
     452     1176688 :                 alp_pos0 += nb_tracks;
     453     1176688 :                 dndn += ( dn[i] * dn[i] );
     454             :             }
     455             : 
     456       73543 :             s_coef = sqrtf( dndn / cncn_track[track] );
     457             : 
     458       73543 :             max_val = FLT_MIN;
     459       73543 :             m[1] = track;
     460     1250231 :             for ( i = track; i < L_subfr; i += nb_tracks )
     461             :             {
     462     1176688 :                 dn[i] = ( s_coef * cn[i] ) + ( beta2 * dn[i] );
     463     1176688 :                 temp = dn[i] * sign[i];
     464             : 
     465     1176688 :                 if ( temp >= max_val )
     466             :                 {
     467      220147 :                     max_val = temp;
     468      220147 :                     m[1] = i;
     469             :                 }
     470             :             }
     471             : 
     472       73543 :             s[1] = (int16_t) sign[m[1]];
     473             :         }
     474             : 
     475             :         /*-----------------------------------------------------------------*
     476             :          * Third pulse search
     477             :          *-----------------------------------------------------------------*/
     478             : 
     479       99281 :         if ( nb_pulse >= 3 )
     480             :         {
     481       70669 :             Gn += s[1] * dn_orig[m[1]];
     482       70669 :             Gd += alp[0] + 2 * s[0] * s[1] * alp[m[0] - m[1]];
     483       70669 :             G = Gn;
     484       70669 :             G1 = G * s[1];
     485       70669 :             G *= s[0];
     486             : 
     487       70669 :             track = track_order[q * nb_tracks + 2];
     488       70669 :             alp_pos0 = alp - m[0] + track;
     489       70669 :             alp_pos1 = alp - m[1] + track;
     490             : 
     491     1201373 :             for ( i = track; i < L_subfr; i += nb_tracks )
     492             :             {
     493     1130704 :                 dn[i] = Gd * dn_orig[i] - G * ( *alp_pos0 ) - G1 * ( *alp_pos1 );
     494     1130704 :                 alp_pos0 += nb_tracks;
     495     1130704 :                 alp_pos1 += nb_tracks;
     496             :             }
     497             : 
     498       70669 :             m[2] = find_best_pulse( L_subfr, nb_tracks, track, dn, sign, &s[2] );
     499             :         }
     500             : 
     501             :         /*-----------------------------------------------------------------*
     502             :          * Fourth pulse search
     503             :          *-----------------------------------------------------------------*/
     504             : 
     505       99281 :         if ( nb_pulse >= 4 )
     506             :         {
     507        5464 :             Gn += s[2] * dn_orig[m[2]];
     508        5464 :             Gd += alp[0] + 2 * s[0] * s[2] * alp[m[0] - m[2]] + 2 * s[1] * s[2] * alp[m[1] - m[2]];
     509        5464 :             G = Gn;
     510        5464 :             G1 = G * s[1];
     511        5464 :             G2 = G * s[2];
     512        5464 :             G *= s[0];
     513             : 
     514        5464 :             track = track_order[q * nb_tracks + 3];
     515        5464 :             alp_pos0 = alp - m[0] + track;
     516        5464 :             alp_pos1 = alp - m[1] + track;
     517        5464 :             alp_pos2 = alp - m[2] + track;
     518             : 
     519       92888 :             for ( i = track; i < L_subfr; i += nb_tracks )
     520             :             {
     521       87424 :                 dn[i] = Gd * dn_orig[i] - G * ( *alp_pos0 ) - G1 * ( *alp_pos1 ) - G2 * ( *alp_pos2 );
     522       87424 :                 alp_pos0 += nb_tracks;
     523       87424 :                 alp_pos1 += nb_tracks;
     524       87424 :                 alp_pos2 += nb_tracks;
     525             :             }
     526             : 
     527        5464 :             m[3] = find_best_pulse( L_subfr, nb_tracks, track, dn, sign, &s[3] );
     528             :         }
     529             :         else
     530             :         {
     531       93817 :             skip_track[q] = track_order[q * nb_tracks + 3];
     532             :         }
     533             : 
     534             :         /*-----------------------------------------------------------------*
     535             :          * Fifth pulse search
     536             :          *-----------------------------------------------------------------*/
     537             : 
     538       99281 :         if ( nb_pulse >= 5 )
     539             :         {
     540        3700 :             Gn += s[3] * dn_orig[m[3]];
     541        3700 :             Gd += alp[0] + 2 * s[0] * s[3] * alp[m[0] - m[3]] + 2 * s[1] * s[3] * alp[m[1] - m[3]] + 2 * s[2] * s[3] * alp[m[2] - m[3]];
     542        3700 :             G = Gn;
     543        3700 :             G1 = G * s[1];
     544        3700 :             G2 = G * s[2];
     545        3700 :             G3 = G * s[3];
     546        3700 :             G *= s[0];
     547             : 
     548        3700 :             if ( cdk_index == 6 )
     549             :             {
     550        2176 :                 track = 0; /* always track 0 */
     551             : 
     552        2176 :                 alp_pos0 = alp - m[0];
     553        2176 :                 alp_pos1 = alp - m[1];
     554        2176 :                 alp_pos2 = alp - m[2];
     555        2176 :                 alp_pos3 = alp - m[3];
     556             : 
     557       36992 :                 for ( i = track; i < L_subfr; i += nb_tracks )
     558             :                 {
     559       34816 :                     dn[i] = Gd * dn_orig[i] - G * ( *alp_pos0 ) - G1 * ( *alp_pos1 ) - G2 * ( *alp_pos2 ) - G3 * ( *alp_pos3 );
     560       34816 :                     alp_pos0 += nb_tracks;
     561       34816 :                     alp_pos1 += nb_tracks;
     562       34816 :                     alp_pos2 += nb_tracks;
     563       34816 :                     alp_pos3 += nb_tracks;
     564             :                 }
     565             : 
     566        2176 :                 m[4] = find_best_pulse( L_subfr, nb_tracks, track, dn, sign, &s[4] );
     567             :             }
     568             :             else /* cdk_index == 7 (26 bits codebook) */
     569             :             {
     570        1524 :                 alp_pos0 = alp - m[0];
     571        1524 :                 alp_pos1 = alp - m[1];
     572        1524 :                 alp_pos2 = alp - m[2];
     573        1524 :                 alp_pos3 = alp - m[3];
     574             : 
     575       99060 :                 for ( i = 0; i < L_subfr; i++ )
     576             :                 {
     577       97536 :                     dn[i] = Gd * dn_orig[i] - G * ( *alp_pos0 ) - G1 * ( *alp_pos1 ) - G2 * ( *alp_pos2 ) - G3 * ( *alp_pos3 );
     578       97536 :                     alp_pos0++;
     579       97536 :                     alp_pos1++;
     580       97536 :                     alp_pos2++;
     581       97536 :                     alp_pos3++;
     582             :                 }
     583             : 
     584        1524 :                 i = emaximum( dn, L_subfr, &temp );
     585        1524 :                 track = i % nb_tracks;
     586             : 
     587        1524 :                 m[4] = find_best_pulse( L_subfr, nb_tracks, track, dn, sign, &s[4] );
     588             :             }
     589        3700 :             skip_track[q] = track;
     590             :         }
     591             : 
     592             :         /*-----------------------------------------------------------------*
     593             :          * - Build the filtered codeword and criterion computing.
     594             :          * - Memorize the best code positions & signs, and the best filtered codevector.
     595             :          *-----------------------------------------------------------------*/
     596             : 
     597       99281 :         crit_num = 0.0f;
     598       99281 :         set_zero( y_tmp, L_subfr );
     599             : 
     600      377676 :         for ( j = 0; j < nb_pulse; j++ )
     601             :         {
     602      278395 :             p_hn = ( ( s[j] > 0 ) ? h - m[j] : h_inv - m[j] );
     603             : 
     604    19141691 :             for ( i = 0; i < L_subfr; i++ )
     605             :             {
     606    18863296 :                 y_tmp[i] += *p_hn++;
     607             :             }
     608             : 
     609      278395 :             crit_num += s[j] * dn_orig[m[j]];
     610             :         }
     611             : 
     612       99281 :         crit_num = crit_num * crit_num;
     613       99281 :         crit_den = sum2_f( y_tmp, L_subfr );
     614             : 
     615       99281 :         if ( crit_num * crit_den_max >= crit_den * crit_num_max )
     616             :         {
     617       58119 :             crit_num_max = crit_num;
     618       58119 :             crit_den_max = crit_den;
     619             : 
     620      215635 :             for ( j = 0; j < nb_pulse; j++ )
     621             :             {
     622      157516 :                 m_max[j] = m[j];
     623      157516 :                 s_max[j] = s[j];
     624             :             }
     625             : 
     626       58119 :             mvr2r( y_tmp, y, L_subfr );
     627       58119 :             skip_track_max = skip_track[q];
     628             :         }
     629             :     }
     630             : 
     631             :     /*-----------------------------------------------------------------*
     632             :      * Reconstruct the best codevector,
     633             :      * compute index of codevector and write it into the bitstream.
     634             :      *-----------------------------------------------------------------*/
     635             : 
     636       28713 :     set_zero( code, L_subfr );
     637      102837 :     for ( q = 0; q < nb_pulse; q++ )
     638             :     {
     639       74124 :         code[m_max[q]] += s_max[q];
     640             :     }
     641             : 
     642       28713 :     if ( bits == 12 || bits == 14 )
     643             :     {
     644             :         /* 12 bits, 2 pulses, 2 tracks  11 used all tracks */
     645       12869 :         i = 6;
     646       12869 :         j = 0x800;
     647       12869 :         q = 0x20;
     648             : 
     649       12869 :         if ( L_subfr == 2 * L_SUBFR )
     650             :         {
     651             :             /* 14 bits, 2 pulses, 2 tracks: 11 (used all tracks) */
     652        4086 :             i = 7;
     653        4086 :             j = 0x2000;
     654        4086 :             q = 0x40;
     655             :         }
     656             : 
     657       12869 :         if ( m_max[0] % NB_TRACK_FCB_2T == 1 )
     658             :         {
     659        7168 :             idx = ( ( m_max[1] / NB_TRACK_FCB_2T ) << i ) + ( m_max[0] / NB_TRACK_FCB_2T );
     660             : 
     661        7168 :             if ( s_max[1] < 0.0f )
     662             :             {
     663        3543 :                 idx += j;
     664             :             }
     665             : 
     666        7168 :             if ( s_max[0] < 0.0f )
     667             :             {
     668        3491 :                 idx += q;
     669             :             }
     670             :         }
     671             :         else
     672             :         {
     673        5701 :             idx = ( ( m_max[0] / NB_TRACK_FCB_2T ) << i ) + ( m_max[1] / NB_TRACK_FCB_2T );
     674             : 
     675        5701 :             if ( s_max[0] < 0.0f )
     676             :             {
     677        2766 :                 idx += j;
     678             :             }
     679             : 
     680        5701 :             if ( s_max[1] < 0.0f )
     681             :             {
     682        2927 :                 idx += q;
     683             :             }
     684             :         }
     685             : 
     686       12869 :         push_indice( hBstr, IND_ALG_CDBK_2T32, idx, bits );
     687             :     }
     688             :     else
     689             :     {
     690             :         /* compute index of codevector */
     691       15844 :         set_s( ind_stream, -1, NPMAXPT * nb_tracks );
     692             : 
     693       15844 :         bits_track = 4;
     694       15844 :         nb_pos = NB_POS_FCB_4T;
     695             : 
     696       15844 :         if ( L_subfr == 2 * L_SUBFR )
     697             :         {
     698           0 :             bits_track = 5;
     699           0 :             nb_pos = NB_POS_FCB_4T_128;
     700             :         }
     701             : 
     702       64230 :         for ( q = 0; q < nb_pulse; q++ )
     703             :         {
     704       48386 :             i = ( m_max[q] % NB_TRACK_FCB_4T ) * NPMAXPT; /* track number */
     705       48386 :             if ( ind_stream[i] >= 0 )
     706             :             {
     707         925 :                 i++;
     708             :             }
     709       48386 :             ind_stream[i] = m_max[q] / NB_TRACK_FCB_4T; /* pos of pulse */
     710             : 
     711       48386 :             if ( s_max[q] < 0 )
     712             :             {
     713       24006 :                 ind_stream[i] += nb_pos;
     714             :             }
     715             :         }
     716             : 
     717       15844 :         if ( codetrackpos == TRACKPOS_FREE_THREE || codetrackpos == TRACKPOS_FREE_ONE )
     718             :         {
     719        1072 :             push_indice( hBstr, IND_ALG_CDBK_4T64, skip_track_max, 2 );
     720             :         }
     721             : 
     722       15844 :         if ( nb_pulse < 5 )
     723             :         {
     724       74595 :             for ( q = 0; q < NB_TRACK_FCB_4T; q++ )
     725             :             {
     726       59676 :                 j = q * NPMAXPT;
     727       59676 :                 if ( ind_stream[j] != -1 )
     728             :                 {
     729       43761 :                     idx = quant_1p_N1_L_subfr( nb_pos, ind_stream[j], bits_track );
     730       43761 :                     push_indice( hBstr, IND_ALG_CDBK_4T64, idx, bits_track + 1 );
     731             :                 }
     732             :             }
     733             :         }
     734             :         else
     735             :         {
     736        4625 :             for ( q = 0; q < NB_TRACK_FCB_4T; q++ )
     737             :             {
     738        3700 :                 j = q * NPMAXPT;
     739        3700 :                 if ( q == skip_track_max )
     740             :                 {
     741         925 :                     idx = quant_2p_2N1( ind_stream[j], ind_stream[j + 1], bits_track );
     742         925 :                     push_indice( hBstr, IND_ALG_CDBK_4T64, idx, ( 2 * bits_track ) + 1 );
     743             :                 }
     744             :                 else
     745             :                 {
     746        2775 :                     idx = quant_1p_N1_L_subfr( nb_pos, ind_stream[j], bits_track );
     747        2775 :                     push_indice( hBstr, IND_ALG_CDBK_4T64, idx, bits_track + 1 );
     748             :                 }
     749             :             }
     750             :         }
     751             :     }
     752             : 
     753       28713 :     return;
     754             : }

Generated by: LCOV version 1.14