LCOV - code coverage report
Current view: top level - lib_enc - decision_matrix_enc_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main @ e95243e9e67ddeb69dddf129509de1b3d95b402e Lines: 213 389 54.8 %
Date: 2025-09-14 03:13:15 Functions: 5 5 100.0 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include <assert.h>
       6             : #include <stdint.h>
       7             : #include "options.h"
       8             : #include "cnst.h" /* Common constants                     */
       9             : //#include "prot_fx.h"
      10             : #include "stat_enc.h"
      11             : #include "rom_com_fx.h"
      12             : #include "rom_com.h"     /* Common constants                       */
      13             : #include "prot_fx.h"     /* Function prototypes                    */
      14             : #include "prot_fx_enc.h" /* Function prototypes                    */
      15             : #include "basop_util.h"  /* Function prototypes                    */
      16             : 
      17             : 
      18             : /*-----------------------------------------------------------------*
      19             :  * decision_matrix_enc()
      20             :  *
      21             :  * Select operating point (combination of technologies) based on input signal properties and command-line parameters:
      22             :  *
      23             :  *             7.20        8.00        9.60        13.20        16.40         24.40            32               48               64               96      128
      24             :  *  Mode       1           1           2           1            2             2                2                2                1                2       2
      25             :  * ----------------------------------------------------------------------------------------------------------------------------------------------------------------
      26             :  *  NB
      27             :  *  speech     ACELP@12k8  ACELP@12k8  ACELP@12k8  ACELP@12k8
      28             :  *  audio      LR MDCT     LR MDCT     TCX         LR MDCT
      29             :  *  inactive   GSC@12k8    GSC@12k8    TCX         GSC@12k8
      30             :  * ----------------------------------------------------------------------------------------------------------------------------------------------------------------
      31             :  *  WB
      32             :  *  speech     ACELP@12k8  ACELP@12k8  ACELP@12k8  ACELP@12k8   ACELP@16k     ACELP@16k        ACELP@16k        TCX              ACELP@16k        TCX     TCX
      33             :  *             +0b WB BWE  +0b WB BWE  +TD WB BWE  +TD WB BWE
      34             :  *  audio      GSC@12k8    GSC@12k8    TCX         LR MDCT      TCX           TCX              HQ               TCX              HQ               TCX     TCX
      35             :  *             +0b WB BWE  +0b WB BWE  +IGF
      36             :  *  inactive   GSC@12k8    GSC@12k8    TCX         GSC@12k8     TCX           TCX              AVQ@16k          TCX              AVQ@16k          TCX     TCX
      37             :  *             +0b WB BWE  +0b WB BWE  +IGF        +FD WB BWE
      38             :  * ----------------------------------------------------------------------------------------------------------------------------------------------------------------
      39             :  *  SWB
      40             :  *  speech                                         ACELP@12k8   ACELP@16k     ACELP@16k        ACELP@16k        TCX              ACELP@16k        TCX     TCX
      41             :  *                                                 +TD SWB BWE  +TD SWB BWE   +TD SWB BWE      +TD SWB BWE      +IGF             +HR SWB BWE
      42             :  *  audio                                          LR MDCT/GSC  TCX           TCX              HQ               TCX              HQ               TCX     TCX
      43             :  *                                                 +FD SWB BWE  +IGF          +IGF             +FD SWB BWE      +IGF
      44             :  *  inactive                                       GSC@12k8     TCX           TCX              AVQ@16k          TCX              AVQ@16k          TCX     TCX
      45             :  *                                                 +FD SWB BWE  +IGF          +IGF             +FD SWB BWE      +IGF             +HR SWB BWE
      46             :  * ----------------------------------------------------------------------------------------------------------------------------------------------------------------
      47             :  *  FB
      48             :  *  speech                                                      ACELP@16k     ACELP@16k        ACELP@16k        TCX              ACELP@16k        TCX     TCX
      49             :  *                                                              +TD FB BWE    +TD FB BWE       +TD FB BWE       +IGF             +HR FB BWE
      50             :  *  audio                                                       TCX           TCX              HQ               TCX              HQ               TCX     TCX
      51             :  *                                                              +IGF          +IGF             +FD FB BWE       +IGF
      52             :  *  inactive                                                    TCX           TCX              AVQ@16k          TCX              AVQ@16k          TCX     TCX
      53             :  *                                                              +IGF          +IGF             +FD FB BWE       +IGF             +HR FB BWE
      54             :  * ---------------------------------------------------------------------------------------------------------------------------------------------------------------
      55             :  *
      56             :  * Note: the GSC technology is part of the ACELP core as AUDIO st_fx->coder_type (it is used also at 13.2 and 16.4 kbps for SWB unvoiced noisy speech)
      57             :  * Note2: FB processing is optional and is activated via "-band FB" option on the encoder command line
      58             :  * Note3: NB (0-4kHz), WB (0-8kHz), SWB (0-16kHz), FB (0-20kHz)
      59             :  *
      60             :  * Signalling of modes (x marks a mode that must be signalled in the bitstream)
      61             :  *
      62             :  *                     7.20           8.00           9.6            13.2           16.4           24.4           32             48             64
      63             :  *                     NB WB SWB FB   NB WB SWB FB   NB WB SWB FB   NB WB SWB FB   NB WB SWB FB   NB WB SWB FB   NB WB SWB FB   NB WB SWB FB   NB WB SWB FB
      64             :  * GC, 12k8            x  x           x  x           x  x           x  x   x       x  x   x       x
      65             :  * UC, 12k8            x  x           x  x           x  x
      66             :  * VC, 12k8            x  x           x  x           x  x           x  x   x       x  x   x       x
      67             :  * TC, 12k8            x  x           x  x           x  x           x  x   x       x  x   x       x
      68             :  * GC, 16k                                                                                           x   x   x      x   x   x      x   x   x      x   x   x
      69             :  * TC, 16k                                                                                           x   x   x      x   x   x      x   x   x      x   x   x
      70             :  * AC(GSC)             x  x           x  x           x  x           x  x   x       x  x   x       x
      71             :  * IC                  x  x           x  x           x  x           x  x   x       x  x   x       x  x   x   x      x   x   x      x   x   x      x   x   x
      72             :  *
      73             :  * GC, 12k8, FS        x  x           x  x           x  x           x  x   x       x  x   x       x
      74             :  * GC, 16k, FS                                                                                       x   x   x      x   x   x      x   x   x          x   x
      75             :  * VC, 12k8, FS                                                     x  x   x       x  x   x       x
      76             :  * TC, 12k8, FS                                                                                   x
      77             :  * TC, 16k, FS                                                                                       x   x   x      x   x   x      x   x   x          x   x
      78             :  *
      79             :  * LR MDCT             x              x              x              x  x   x   x   x  x   x   x
      80             :  *
      81             :  *-----------------------------------------------------------------*/
      82             : 
      83        2050 : void decision_matrix_enc_fx(
      84             :     Encoder_State *st_fx, /* i  : encoder state structure                   */
      85             :     Word16 *hq_core_type  /* o  : HQ core type                              Q0*/
      86             : )
      87             : {
      88        2050 :     SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR;
      89             : 
      90             :     /* initialization */
      91        2050 :     st_fx->core = -1;
      92        2050 :     move16();
      93        2050 :     st_fx->extl = -1;
      94        2050 :     move16();
      95        2050 :     st_fx->extl_brate = 0;
      96        2050 :     move16();
      97        2050 :     *hq_core_type = -1;
      98        2050 :     move16();
      99        2050 :     st_fx->igf = 0;
     100        2050 :     move16();
     101             :     /* SID and FRAME_NO_DATA frames */
     102        2050 :     test();
     103        2050 :     test();
     104        2050 :     IF( st_fx->Opt_DTX_ON && ( EQ_32( st_fx->core_brate, SID_2k40 ) || EQ_32( st_fx->core_brate, FRAME_NO_DATA ) ) )
     105             :     {
     106           0 :         st_fx->core = ACELP_CORE;
     107           0 :         move16();
     108             : 
     109           0 :         test();
     110           0 :         IF( GE_32( st_fx->input_Fs, 32000 ) && GE_16( st_fx->bwidth, SWB ) )
     111             :         {
     112           0 :             st_fx->extl = SWB_CNG;
     113           0 :             move16();
     114             :         }
     115             : 
     116           0 :         st_fx->rf_mode = 0;
     117           0 :         move16();
     118             : 
     119           0 :         return;
     120             :     }
     121             : 
     122        2050 :     st_fx->core_brate = L_deposit_l( 0 );
     123             : 
     124             :     /* SC-VBR */
     125        2050 :     IF( st_fx->Opt_SC_VBR )
     126             :     {
     127             :         /* SC-VBR */
     128           0 :         st_fx->core = ACELP_CORE;
     129           0 :         move16();
     130           0 :         st_fx->core_brate = ACELP_7k20;
     131           0 :         move32();
     132           0 :         st_fx->total_brate = ACELP_7k20;
     133           0 :         move32();
     134             : 
     135           0 :         test();
     136           0 :         test();
     137           0 :         test();
     138           0 :         IF( EQ_16( hSC_VBR->ppp_mode, 1 ) )
     139             :         {
     140             :             /* PPP mode */
     141           0 :             st_fx->core_brate = PPP_NELP_2k80;
     142           0 :             move16();
     143             :         }
     144           0 :         ELSE IF( ( ( EQ_16( st_fx->coder_type, UNVOICED ) || EQ_16( st_fx->coder_type, TRANSITION ) ) && st_fx->sp_aud_decision1 == 0 ) || NE_16( st_fx->bwidth, NB ) )
     145             :         {
     146           0 :             test();
     147           0 :             test();
     148           0 :             test();
     149           0 :             test();
     150           0 :             test();
     151           0 :             test();
     152           0 :             test();
     153           0 :             test();
     154           0 :             test();
     155           0 :             test();
     156           0 :             test();
     157           0 :             IF( EQ_16( st_fx->coder_type, UNVOICED ) && EQ_16( st_fx->vad_flag, 1 ) &&
     158             :                 ( ( GE_16( st_fx->last_bwidth, SWB ) && EQ_16( st_fx->last_Opt_SC_VBR, 1 ) ) || LT_16( st_fx->last_bwidth, SWB ) ) &&
     159             :                 ( NE_16( st_fx->last_core, HQ_CORE ) || NE_16( st_fx->bwidth, NB ) ) )
     160             :             {
     161             :                 /* NELP mode */
     162           0 :                 hSC_VBR->nelp_mode = 1;
     163           0 :                 move16();
     164           0 :                 st_fx->core_brate = PPP_NELP_2k80;
     165           0 :                 move32();
     166             :             }
     167           0 :             ELSE IF( EQ_16( st_fx->coder_type, TRANSITION ) || ( EQ_16( st_fx->coder_type, UNVOICED ) && NE_16( hSC_VBR->nelp_mode, 1 ) ) ||
     168             :                      ( ( EQ_16( st_fx->coder_type, AUDIO ) || EQ_16( st_fx->coder_type, INACTIVE ) ) && NE_16( st_fx->bwidth, NB ) ) )
     169             : 
     170             :             {
     171             :                 /* silence portions */
     172           0 :                 st_fx->core_brate = ACELP_8k00;
     173           0 :                 move32();
     174           0 :                 st_fx->total_brate = ACELP_8k00;
     175           0 :                 move32();
     176             :             }
     177             :         }
     178             : 
     179           0 :         return;
     180             :     }
     181             : 
     182             :     /*---------------------------------------------------------------------*
     183             :      * NB
     184             :      *---------------------------------------------------------------------*/
     185             : 
     186        2050 :     ELSE IF( EQ_16( st_fx->bwidth, NB ) )
     187             :     {
     188           0 :         st_fx->core = ACELP_CORE;
     189           0 :         move16();
     190             : 
     191             : #ifdef DEBUGGING
     192             :         if ( st_fx->total_brate >= HQCORE_NB_MIN_RATE && ( st_fx->force == FORCE_MUSIC || ( st_fx->force == -1 && st_fx->sp_aud_decision1 == 1 ) ) )
     193             :         {
     194             :             st_fx->core = HQ_CORE;
     195             :         }
     196             : #else
     197           0 :         test();
     198           0 :         IF( GE_32( st_fx->total_brate, HQCORE_NB_MIN_RATE ) && EQ_16( st_fx->sp_aud_decision1, 1 ) )
     199             :         {
     200           0 :             st_fx->core = HQ_CORE;
     201           0 :             move16();
     202             :         }
     203             : #endif
     204             :     }
     205             : 
     206             :     /*---------------------------------------------------------------------*
     207             :      * WB
     208             :      *---------------------------------------------------------------------*/
     209             : 
     210        2050 :     ELSE IF( EQ_16( st_fx->bwidth, WB ) )
     211             :     {
     212           0 :         st_fx->core = ACELP_CORE;
     213           0 :         move16();
     214             : 
     215             : #ifdef DEBUGGING
     216             :         if ( ( st_fx->total_brate >= HQCORE_WB_MIN_RATE && ( st_fx->force == FORCE_MUSIC || ( st_fx->force == -1 && st_fx->sp_aud_decision1 == 1 ) ) ) || st_fx->total_brate >= HQ_96k )
     217             : #else
     218           0 :         test();
     219           0 :         test();
     220           0 :         IF( ( GE_32( st_fx->total_brate, HQCORE_WB_MIN_RATE ) && EQ_16( st_fx->sp_aud_decision1, 1 ) ) ||
     221             :             GE_32( st_fx->total_brate, HQ_96k ) )
     222             : #endif
     223             :         {
     224           0 :             st_fx->core = HQ_CORE;
     225           0 :             move16();
     226             :         }
     227             :         ELSE
     228             :         {
     229           0 :             test();
     230           0 :             test();
     231           0 :             test();
     232           0 :             test();
     233           0 :             IF( EQ_16( st_fx->bwidth, WB ) && LT_32( st_fx->total_brate, ACELP_9k60 ) )
     234             :             {
     235           0 :                 st_fx->extl = WB_BWE;
     236           0 :                 move16();
     237             :             }
     238           0 :             ELSE IF( EQ_16( st_fx->bwidth, WB ) && GE_32( st_fx->total_brate, ACELP_9k60 ) && LE_32( st_fx->total_brate, ACELP_16k40 ) )
     239             :             {
     240             :                 /* Note: WB BWE is used exceptionally at 13.2 kbps if GSC is selected instead of LR-MDCT */
     241           0 :                 test();
     242           0 :                 test();
     243           0 :                 test();
     244           0 :                 IF( EQ_16( st_fx->sp_aud_decision1, 1 ) || EQ_16( st_fx->coder_type, INACTIVE ) || ( st_fx->sp_aud_decision1 == 0 && EQ_16( st_fx->sp_aud_decision2, 1 ) ) )
     245             :                 {
     246           0 :                     st_fx->extl = WB_BWE;
     247           0 :                     move16();
     248           0 :                     st_fx->extl_brate = WB_BWE_0k35;
     249           0 :                     move32();
     250             :                 }
     251             :                 ELSE
     252             :                 {
     253           0 :                     st_fx->extl = WB_TBE;
     254           0 :                     move16();
     255           0 :                     st_fx->extl_brate = WB_TBE_1k05;
     256           0 :                     move32();
     257             :                 }
     258             :             }
     259             :         }
     260             :     }
     261             : 
     262             :     /*---------------------------------------------------------------------*
     263             :      * SWB and FB
     264             :      *---------------------------------------------------------------------*/
     265             : 
     266        2050 :     ELSE IF( EQ_16( st_fx->bwidth, SWB ) || EQ_16( st_fx->bwidth, FB ) )
     267             :     {
     268             : #ifdef DEBUGGING
     269             :         if ( ( st_fx->total_brate >= HQCORE_WB_MIN_RATE && ( st_fx->force == FORCE_MUSIC || ( st_fx->force == -1 && st_fx->sp_aud_decision1 == 1 ) ) ) || st_fx->total_brate >= HQ_96k )
     270             : #else
     271        2050 :         test();
     272        2050 :         test();
     273        2050 :         IF( ( GE_32( st_fx->total_brate, HQCORE_SWB_MIN_RATE ) && EQ_16( st_fx->sp_aud_decision1, 1 ) ) ||
     274             :             GE_32( st_fx->total_brate, HQ_96k ) )
     275             : #endif
     276             :         {
     277         627 :             st_fx->core = HQ_CORE;
     278         627 :             move16();
     279             :         }
     280             :         ELSE
     281             :         {
     282        1423 :             st_fx->core = ACELP_CORE;
     283        1423 :             move16();
     284             : 
     285        1423 :             test();
     286        1423 :             test();
     287        1423 :             IF( GE_32( st_fx->total_brate, ACELP_13k20 ) && LT_32( st_fx->total_brate, ACELP_48k ) )
     288             :             {
     289             :                 /* Note: SWB BWE is not used in case of GSC noisy speech */
     290             :                 /* Note: SWB BWE is used exceptionally at 13.2 kbps if GSC is selected instead of LR-MDCT */
     291         749 :                 test();
     292         749 :                 test();
     293         749 :                 test();
     294         749 :                 test();
     295         749 :                 IF( ( EQ_16( st_fx->sp_aud_decision1, 1 ) || EQ_16( st_fx->coder_type, INACTIVE ) || ( st_fx->sp_aud_decision1 == 0 && EQ_16( st_fx->sp_aud_decision2, 1 ) ) ) && st_fx->GSC_noisy_speech == 0 )
     296             :                 {
     297           8 :                     st_fx->extl = SWB_BWE;
     298           8 :                     move16();
     299           8 :                     st_fx->extl_brate = SWB_BWE_1k6;
     300           8 :                     move32();
     301             : 
     302           8 :                     test();
     303           8 :                     IF( EQ_16( st_fx->bwidth, FB ) && GE_32( st_fx->total_brate, ACELP_24k40 ) )
     304             :                     {
     305           0 :                         st_fx->extl = FB_BWE;
     306           0 :                         move16();
     307           0 :                         st_fx->extl_brate = FB_BWE_1k8;
     308           0 :                         move32();
     309             :                     }
     310             :                 }
     311             :                 ELSE
     312             :                 {
     313         741 :                     st_fx->extl = SWB_TBE;
     314         741 :                     move16();
     315         741 :                     st_fx->extl_brate = SWB_TBE_1k6;
     316         741 :                     move32();
     317         741 :                     if ( GE_32( st_fx->total_brate, ACELP_24k40 ) )
     318             :                     {
     319           0 :                         st_fx->extl_brate = SWB_TBE_2k8;
     320           0 :                         move32();
     321             :                     }
     322             : 
     323         741 :                     test();
     324         741 :                     IF( EQ_16( st_fx->bwidth, FB ) && GE_32( st_fx->total_brate, ACELP_24k40 ) )
     325             :                     {
     326           0 :                         st_fx->extl = FB_TBE;
     327           0 :                         move16();
     328             :                         {
     329           0 :                             st_fx->extl_brate = FB_TBE_3k0;
     330           0 :                             move32();
     331             :                         }
     332             :                     }
     333             :                 }
     334             :             }
     335         674 :             ELSE IF( GE_32( st_fx->total_brate, ACELP_48k ) )
     336             :             {
     337         674 :                 st_fx->extl = SWB_BWE_HIGHRATE;
     338         674 :                 move16();
     339         674 :                 st_fx->extl_brate = SWB_BWE_16k;
     340         674 :                 move32();
     341             : 
     342         674 :                 if ( EQ_16( st_fx->bwidth, FB ) )
     343             :                 {
     344           0 :                     st_fx->extl = FB_BWE_HIGHRATE;
     345           0 :                     move32();
     346             :                 }
     347             :             }
     348             :         }
     349             :     }
     350             : 
     351             :     /*-----------------------------------------------------------------*
     352             :      * Set HQ core type
     353             :      *-----------------------------------------------------------------*/
     354             : 
     355        2050 :     IF( EQ_16( st_fx->core, HQ_CORE ) )
     356             :     {
     357         627 :         *hq_core_type = NORMAL_HQ_CORE;
     358         627 :         move16();
     359             : 
     360         627 :         test();
     361         627 :         test();
     362         627 :         IF( ( EQ_16( st_fx->bwidth, SWB ) || EQ_16( st_fx->bwidth, WB ) ) && LE_32( st_fx->total_brate, LRMDCT_CROSSOVER_POINT ) )
     363             :         {
     364             :             /* note that FB (bitrate >= 24400 bps) is always coded with NORMAL_HQ_CORE */
     365         301 :             *hq_core_type = LOW_RATE_HQ_CORE;
     366         301 :             move16();
     367             :         }
     368         326 :         ELSE IF( EQ_16( st_fx->bwidth, NB ) )
     369             :         {
     370           0 :             *hq_core_type = LOW_RATE_HQ_CORE;
     371           0 :             move16();
     372             :         }
     373             :     }
     374             : 
     375             :     /* set core bitrate */
     376        2050 :     st_fx->core_brate = L_sub( st_fx->total_brate, st_fx->extl_brate );
     377             : 
     378        2050 :     IF( st_fx->ini_frame == 0 )
     379             :     {
     380             :         /* avoid switching in the very first frame */
     381           2 :         st_fx->last_core = st_fx->core;
     382           2 :         move16();
     383           2 :         st_fx->last_core_brate = st_fx->core_brate;
     384           2 :         move32();
     385           2 :         st_fx->last_extl = st_fx->extl;
     386           2 :         move16();
     387             :     }
     388             : 
     389             :     /*-----------------------------------------------------------------*
     390             :      * set inactive coder_type flag in ACELP core
     391             :      *-----------------------------------------------------------------*/
     392             : 
     393        2050 :     st_fx->inactive_coder_type_flag = 0; /* AVQ by default */
     394        2050 :     move16();
     395             : 
     396        2050 :     if ( LE_32( st_fx->total_brate, MAX_GSC_INACTIVE_BRATE ) )
     397             :     {
     398        1050 :         st_fx->inactive_coder_type_flag = 1; /* GSC */
     399        1050 :         move16();
     400             :     }
     401             : 
     402        2050 :     return;
     403             : }
     404             : 
     405             : /*---------------------------------------------------------------------*
     406             :  * signalling_mode1_tcx20_enc()
     407             :  *
     408             :  * write MODE1 TCX20 signalling information into the bitstream
     409             :  *---------------------------------------------------------------------*/
     410             : 
     411         524 : Word16 signalling_mode1_tcx20_enc_fx(
     412             :     Encoder_State *st, /* i  : encoder state structure   */
     413             :     Word16 push /*Q0*/ )
     414             : {
     415             :     Word16 num_bits;
     416             :     Word16 nBits, idx, start_idx;
     417             :     BSTR_ENC_HANDLE hBstr;
     418             : 
     419         524 :     hBstr = st->hBstr;
     420         524 :     assert( st->core == TCX_20_CORE );
     421             : 
     422         524 :     num_bits = 0;
     423         524 :     move16();
     424             : 
     425             :     /* Use ACELP signaling for LR MDCT */
     426         524 :     IF( LE_32( st->total_brate, ACELP_16k40 ) )
     427             :     {
     428             :         /* find the section in the ACELP signalling table corresponding to bitrate */
     429         524 :         idx = 0;
     430         524 :         move16();
     431       18340 :         WHILE( NE_32( acelp_sig_tbl[idx], st->total_brate ) )
     432             :         {
     433       17816 :             idx = add( idx, 1 );
     434             :         }
     435             : 
     436             :         /* retrieve the number of bits for signalling */
     437         524 :         idx = add( idx, 1 );
     438         524 :         nBits = extract_l( acelp_sig_tbl[idx] ); /*Q0*/
     439             : 
     440             :         /* retrieve the signalling index */
     441         524 :         idx = add( idx, 1 );
     442         524 :         start_idx = idx;
     443         524 :         move16();
     444       16768 :         WHILE( NE_32( acelp_sig_tbl[idx], SIG2IND_fx( LR_MDCT, st->bwidth, 0, 0 ) ) )
     445             :         {
     446       16244 :             idx = add( idx, 1 );
     447             :         }
     448             : 
     449         524 :         num_bits = add( num_bits, nBits );
     450         524 :         IF( push != 0 )
     451             :         {
     452         262 :             push_indice( hBstr, IND_ACELP_SIGNALLING, sub( idx, start_idx ), nBits );
     453             :         }
     454             : 
     455             :         /* HQ/TCX core switching flag */
     456         524 :         num_bits = add( num_bits, 1 );
     457         524 :         IF( push != 0 )
     458             :         {
     459         262 :             push_indice( hBstr, IND_MDCT_CORE, 1, 1 );
     460             :         }
     461             :     }
     462             :     ELSE
     463             :     {
     464           0 :         IF( LE_32( st->core_brate, ACELP_64k ) )
     465             :         {
     466             :             /* write ACELP/HQ core indication flag */
     467           0 :             num_bits = add( num_bits, 1 );
     468           0 :             IF( push != 0 )
     469             :             {
     470           0 :                 push_indice( hBstr, IND_CORE, 1, 1 );
     471             :             }
     472             :         }
     473             : 
     474             :         /* HQ/TCX core switching flag */
     475           0 :         num_bits = add( num_bits, 1 );
     476           0 :         IF( push != 0 )
     477             :         {
     478           0 :             push_indice( hBstr, IND_MDCT_CORE, 1, 1 );
     479             :         }
     480             : 
     481           0 :         num_bits = add( num_bits, 2 );
     482           0 :         IF( push != 0 )
     483             :         {
     484             :             /* write band-width (needed for different I/O sampling rate support) */
     485           0 :             IF( EQ_16( st->bwidth, NB ) )
     486             :             {
     487           0 :                 push_indice( hBstr, IND_HQ_BWIDTH, 0, 2 );
     488             :             }
     489           0 :             ELSE IF( EQ_16( st->bwidth, WB ) )
     490             :             {
     491           0 :                 push_indice( hBstr, IND_HQ_BWIDTH, 1, 2 );
     492             :             }
     493           0 :             ELSE IF( EQ_16( st->bwidth, SWB ) )
     494             :             {
     495           0 :                 push_indice( hBstr, IND_HQ_BWIDTH, 2, 2 );
     496             :             }
     497             :             ELSE /* st->bwidth == FB */
     498             :             {
     499           0 :                 push_indice( hBstr, IND_HQ_BWIDTH, 3, 2 );
     500             :             }
     501             :         }
     502             :     }
     503             : 
     504         524 :     return num_bits;
     505             : }
     506             : 
     507             : /*---------------------------------------------------------------------*
     508             :  * signalling_enc()
     509             :  *
     510             :  * write signalling information into the bit-stream
     511             :  *---------------------------------------------------------------------*/
     512             : 
     513        1854 : void signalling_enc_fx(
     514             :     Encoder_State *st_fx /* i  : encoder state structure   */
     515             : )
     516             : {
     517             :     Word16 nBits, idx, start_idx;
     518             :     Word32 k, total_brate_temp;
     519        1854 :     SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR;
     520             :     BSTR_ENC_HANDLE hBstr;
     521             : 
     522        1854 :     hBstr = st_fx->hBstr;
     523             : 
     524        1854 :     IF( EQ_16( st_fx->mdct_sw, MODE2 ) )
     525             :     {
     526             : 
     527          66 :         assert( !st_fx->tcxonly );
     528          66 :         assert( st_fx->core == HQ_CORE );
     529             : 
     530          66 :         push_next_indice( hBstr, 1, 1 ); /* TCX */
     531          66 :         push_next_indice( hBstr, 1, 1 ); /* HQ_CORE */
     532             : 
     533             :         /* write ACELP->HQ core switching flag */
     534          66 :         test();
     535          66 :         IF( ( st_fx->last_core == ACELP_CORE ) || EQ_16( st_fx->last_core, AMR_WB_CORE ) )
     536             :         {
     537           6 :             push_indice( hBstr, IND_HQ_SWITCHING_FLG, 1, 1 );
     538             : 
     539             :             /* write ACELP L_frame info */
     540           6 :             IF( EQ_16( st_fx->last_L_frame, L_FRAME ) )
     541             :             {
     542           0 :                 push_indice( hBstr, IND_LAST_L_FRAME, 0, 1 );
     543             :             }
     544             :             ELSE
     545             :             {
     546           6 :                 push_indice( hBstr, IND_LAST_L_FRAME, 1, 1 );
     547             :             }
     548             :         }
     549             :         ELSE
     550             :         {
     551          60 :             push_indice( hBstr, IND_HQ_SWITCHING_FLG, 0, 1 );
     552             :         }
     553             : 
     554          66 :         return;
     555             :     }
     556        1788 :     IF( ( st_fx->core == ACELP_CORE ) )
     557             :     {
     558             :         Word16 ppp_mode, nelp_mode, sig;
     559             : 
     560        1423 :         ppp_mode = 0;
     561        1423 :         nelp_mode = 0;
     562        1423 :         move16();
     563        1423 :         move16();
     564        1423 :         IF( st_fx->Opt_SC_VBR )
     565             :         {
     566           0 :             ppp_mode = hSC_VBR->ppp_mode;
     567           0 :             nelp_mode = hSC_VBR->nelp_mode;
     568           0 :             move16();
     569           0 :             move16();
     570             :         }
     571             : 
     572        1423 :         test();
     573        1423 :         test();
     574        1423 :         IF( EQ_16( ppp_mode, 1 ) || EQ_16( nelp_mode, 1 ) )
     575             :         {
     576             :             /* 1 bit to distinguish between 2.8kbps PPP/NELP frame and SID frame */
     577           0 :             push_indice( hBstr, IND_CORE, 0, 1 );
     578             :             /* SC-VBR: 0 - PPP_NB, 1 - PPP_WB, 2 - NELP_NB, 3 - NELP_WB */
     579           0 :             test();
     580           0 :             test();
     581           0 :             test();
     582           0 :             test();
     583           0 :             test();
     584           0 :             test();
     585           0 :             test();
     586           0 :             test();
     587           0 :             IF( EQ_16( st_fx->coder_type, VOICED ) && EQ_16( st_fx->bwidth, NB ) && EQ_16( ppp_mode, 1 ) )
     588             :             {
     589           0 :                 push_indice( hBstr, IND_PPP_NELP_MODE, 0, 2 );
     590             :             }
     591           0 :             ELSE IF( EQ_16( st_fx->coder_type, VOICED ) && NE_16( st_fx->bwidth, NB ) && EQ_16( ppp_mode, 1 ) )
     592             :             {
     593           0 :                 push_indice( hBstr, IND_PPP_NELP_MODE, 1, 2 );
     594             :             }
     595           0 :             ELSE IF( EQ_16( st_fx->coder_type, UNVOICED ) && EQ_16( st_fx->bwidth, NB ) && EQ_16( nelp_mode, 1 ) )
     596             :             {
     597           0 :                 push_indice( hBstr, IND_PPP_NELP_MODE, 2, 2 );
     598             :             }
     599           0 :             ELSE IF( EQ_16( st_fx->coder_type, UNVOICED ) && NE_16( st_fx->bwidth, NB ) && EQ_16( nelp_mode, 1 ) )
     600             :             {
     601           0 :                 push_indice( hBstr, IND_PPP_NELP_MODE, 3, 2 );
     602             :             }
     603             :         }
     604        1423 :         ELSE IF( NE_32( st_fx->core_brate, SID_2k40 ) && ( st_fx->core_brate != FRAME_NO_DATA ) )
     605             :         {
     606             :             /* write the ACELP/HQ core selection bit */
     607        1423 :             IF( GE_32( st_fx->total_brate, ACELP_24k40 ) )
     608             :             {
     609         674 :                 push_indice( hBstr, IND_CORE, 0, 1 );
     610             :             }
     611             : 
     612             :             /* find the section in the ACELP signalling table corresponding to bitrate */
     613        1423 :             idx = 0;
     614        1423 :             move16();
     615        9062 :             WHILE( LT_16( idx, MAX_ACELP_SIG ) )
     616             :             {
     617        9062 :                 IF( LE_32( st_fx->total_brate, brate_tbl[idx] ) )
     618             :                 {
     619        1423 :                     BREAK;
     620             :                 }
     621        7639 :                 idx++;
     622             :             }
     623        1423 :             total_brate_temp = brate_tbl[idx]; /*Q0*/
     624        1423 :             move32();
     625             : 
     626        1423 :             idx = 0;
     627        1423 :             move16();
     628       84179 :             WHILE( NE_32( acelp_sig_tbl[idx], total_brate_temp ) )
     629             :             {
     630       82756 :                 idx++;
     631             :             }
     632             : 
     633             :             /* retrieve the number of bits for signalling */
     634        1423 :             nBits = (Word16) acelp_sig_tbl[++idx]; /*Q0*/
     635        1423 :             move16();
     636             : 
     637             :             /* retrieve the signalling index */
     638        1423 :             start_idx = ++idx;
     639        1423 :             move16();
     640        1423 :             IF( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && EQ_16( st_fx->bwidth, SWB ) && LE_32( st_fx->total_brate, ACELP_9k60 ) )
     641             :             {
     642             :                 /* patch to signal SWB as NB in Stereo */
     643           0 :                 sig = (Word16) SIG2IND( st_fx->coder_type, NB, st_fx->sharpFlag, st_fx->rf_mode ); /*Q0*/
     644             :             }
     645             :             ELSE
     646             :             {
     647        1423 :                 sig = (Word16) SIG2IND( st_fx->coder_type, st_fx->bwidth, st_fx->sharpFlag, st_fx->rf_mode ); /*Q0*/
     648             :             }
     649             : 
     650       11515 :             WHILE( NE_16( (Word16) acelp_sig_tbl[idx], sig ) )
     651             :             {
     652       10092 :                 idx++;
     653             :             }
     654             : 
     655        1423 :             push_indice( hBstr, IND_ACELP_SIGNALLING, idx - start_idx, nBits );
     656             :         }
     657             : 
     658             :         /* write extension layer flag to distinguish between TBE (0) and BWE (1) */
     659        1423 :         IF( st_fx->extl_brate > 0 )
     660             :         {
     661        1423 :             test();
     662        1423 :             test();
     663        1423 :             test();
     664        1423 :             test();
     665        1423 :             IF( EQ_16( st_fx->extl, WB_TBE ) || EQ_16( st_fx->extl, SWB_TBE ) || EQ_16( st_fx->extl, FB_TBE ) )
     666             :             {
     667         741 :                 push_indice( hBstr, IND_BWE_FLAG, 0, 1 );
     668             :             }
     669         682 :             ELSE IF( EQ_16( st_fx->extl, WB_BWE ) || EQ_16( st_fx->extl, SWB_BWE ) || EQ_16( st_fx->extl, FB_BWE ) )
     670             :             {
     671           8 :                 push_indice( hBstr, IND_BWE_FLAG, 1, 1 );
     672             :             }
     673             :         }
     674             :     }
     675             :     ELSE /* HQ core */
     676             :     {
     677             :         /* write ACELP->HQ switching frame flag */
     678         365 :         test();
     679         365 :         IF( ( st_fx->last_core == ACELP_CORE ) || EQ_16( st_fx->last_core, AMR_WB_CORE ) )
     680             :         {
     681          19 :             push_indice( hBstr, IND_HQ_SWITCHING_FLG, 1, 1 );
     682             :             /* write ACELP L_frame info */
     683          19 :             IF( EQ_16( st_fx->last_L_frame, L_FRAME ) )
     684             :             {
     685           4 :                 push_indice( hBstr, IND_LAST_L_FRAME, 0, 1 );
     686             :             }
     687             :             ELSE
     688             :             {
     689          15 :                 push_indice( hBstr, IND_LAST_L_FRAME, 1, 1 );
     690             :             }
     691             :         }
     692             :         ELSE
     693             :         {
     694         346 :             push_indice( hBstr, IND_HQ_SWITCHING_FLG, 0, 1 );
     695             :         }
     696             : 
     697             :         /* HQ/TCX core switching flag */
     698         365 :         push_indice( hBstr, IND_MDCT_CORE, 0, 1 );
     699             : 
     700             :         /* Use ACELP signaling for LR MDCT */
     701         365 :         IF( LE_32( st_fx->total_brate, ACELP_16k40 ) )
     702             :         {
     703             :             /* find the section in the ACELP signalling table corresponding to bitrate */
     704          39 :             idx = 0;
     705        1365 :             WHILE( NE_32( acelp_sig_tbl[idx], st_fx->total_brate ) )
     706             :             {
     707        1326 :                 idx++;
     708             :             }
     709             : 
     710             :             /* retrieve the number of bits for signalling */
     711          39 :             nBits = extract_l( acelp_sig_tbl[++idx] ); /*Q0*/
     712             : 
     713             :             /* retrieve the signalling index */
     714          39 :             start_idx = ++idx;
     715          39 :             move16();
     716          39 :             k = SIG2IND_fx( LR_MDCT, st_fx->bwidth, 0, 0 ); /*Q0*/
     717        1248 :             WHILE( NE_32( acelp_sig_tbl[idx], k ) )
     718             :             {
     719        1209 :                 idx++;
     720             :             }
     721             : 
     722          39 :             push_indice( hBstr, IND_ACELP_SIGNALLING, idx - start_idx, nBits );
     723             :         }
     724             :         ELSE
     725             :         {
     726             : 
     727         326 :             IF( LE_32( st_fx->core_brate, ACELP_64k ) )
     728             :             {
     729             :                 /* write ACELP/HQ core indication flag */
     730         326 :                 push_indice( hBstr, IND_CORE, 1, 1 );
     731             :             }
     732             : 
     733             :             /* write band-width (needed for different I/O sampling rate support) */
     734         326 :             IF( EQ_16( st_fx->bwidth, NB ) )
     735             :             {
     736           0 :                 push_indice( hBstr, IND_HQ_BWIDTH, 0, 2 );
     737             :             }
     738         326 :             ELSE IF( EQ_16( st_fx->bwidth, WB ) )
     739             :             {
     740           0 :                 push_indice( hBstr, IND_HQ_BWIDTH, 1, 2 );
     741             :             }
     742         326 :             ELSE IF( EQ_16( st_fx->bwidth, SWB ) )
     743             :             {
     744         326 :                 push_indice( hBstr, IND_HQ_BWIDTH, 2, 2 );
     745             :             }
     746             :             ELSE /* st_fx->bwidth == FB */
     747             :             {
     748           0 :                 push_indice( hBstr, IND_HQ_BWIDTH, 3, 2 );
     749             :             }
     750             :         }
     751             :     }
     752             : 
     753        1788 :     return;
     754             : }
     755             : 
     756             : /*---------------------------------------------------------------------*
     757             :  * signalling_enc_rf()
     758             :  *
     759             :  * write channel-aware signalling information into the bitstream
     760             :  *---------------------------------------------------------------------*/
     761     1129872 : void signaling_enc_rf_fx(
     762             :     Encoder_State *st /* i  : encoder state structure   */
     763             : )
     764             : {
     765             :     Word16 i;
     766             :     Word16 sfr;
     767     1129872 :     RF_ENC_HANDLE hRF = st->hRF;
     768             : 
     769             :     /* write partial copy into bitstream */
     770     1129872 :     IF( EQ_16( st->rf_mode, 1 ) )
     771             :     {
     772           0 :         enc_prm_rf_ivas_fx( st, hRF->rf_indx_frametype[st->rf_fec_offset], st->rf_fec_offset );
     773           0 :         hRF->rf_indx_tbeGainFr[0] = hRF->RF_bwe_gainFr_ind; /*Q0*/
     774           0 :         move16();
     775             :     }
     776             : 
     777             :     /* Shift the RF indices such that the partial copy associated with
     778             :        (n-fec_offset)th frame is included in the bitstream in nth frame. */
     779     1129872 :     IF( hRF != NULL )
     780             :     {
     781           0 :         FOR( i = st->rf_fec_offset; i >= 0; i-- )
     782             :         {
     783             :             /* rf frame type */
     784           0 :             hRF->rf_indx_frametype[i + 1] = hRF->rf_indx_frametype[i];
     785           0 :             move16();
     786             :             /* rf target bits buffer */
     787           0 :             hRF->rf_targetbits_buff[i + 1] = hRF->rf_targetbits_buff[i];
     788           0 :             move16();
     789             :             /* lsf indx */
     790           0 :             hRF->rf_indx_lsf[i + 1][0] = hRF->rf_indx_lsf[i][0];
     791           0 :             hRF->rf_indx_lsf[i + 1][1] = hRF->rf_indx_lsf[i][1];
     792           0 :             hRF->rf_indx_lsf[i + 1][2] = hRF->rf_indx_lsf[i][2];
     793           0 :             move16();
     794           0 :             move16();
     795           0 :             move16();
     796             :             /* ES pred energy */
     797           0 :             hRF->rf_indx_EsPred[i + 1] = hRF->rf_indx_EsPred[i];
     798           0 :             move16();
     799             :             /* LTF mode, sfr params: pitch, fcb and gain */
     800           0 :             FOR( sfr = 0; sfr < st->nb_subfr; sfr++ )
     801             :             {
     802           0 :                 hRF->rf_indx_ltfMode[i + 1][sfr] = hRF->rf_indx_ltfMode[i][sfr];
     803           0 :                 hRF->rf_indx_pitch[i + 1][sfr] = hRF->rf_indx_pitch[i][sfr];
     804           0 :                 hRF->rf_indx_fcb[i + 1][sfr] = hRF->rf_indx_fcb[i][sfr];
     805           0 :                 hRF->rf_indx_gain[i + 1][sfr] = hRF->rf_indx_gain[i][sfr];
     806           0 :                 move16();
     807           0 :                 move16();
     808           0 :                 move16();
     809           0 :                 move16();
     810             :             }
     811             : 
     812             :             /* shift the nelp indices */
     813           0 :             hRF->rf_indx_nelp_iG1[i + 1] = hRF->rf_indx_nelp_iG1[i];
     814           0 :             hRF->rf_indx_nelp_iG2[i + 1][0] = hRF->rf_indx_nelp_iG2[i][0];
     815           0 :             hRF->rf_indx_nelp_iG2[i + 1][1] = hRF->rf_indx_nelp_iG2[i][1];
     816           0 :             hRF->rf_indx_nelp_fid[i + 1] = hRF->rf_indx_nelp_fid[i];
     817           0 :             move16();
     818           0 :             move16();
     819           0 :             move16();
     820           0 :             move16();
     821             :             /* tbe gain Fr shift */
     822           0 :             hRF->rf_indx_tbeGainFr[i + 1] = hRF->rf_indx_tbeGainFr[i];
     823           0 :             hRF->rf_clas[i + 1] = hRF->rf_clas[i];
     824           0 :             hRF->rf_gain_tcx[i + 1] = hRF->rf_gain_tcx[i];
     825           0 :             hRF->rf_tcxltp_param[i + 1] = hRF->rf_tcxltp_param[i];
     826           0 :             move16();
     827           0 :             move16();
     828           0 :             move16();
     829           0 :             move16();
     830             :         }
     831             :     }
     832     1129872 :     return;
     833             : }
     834             : 
     835        3100 : void signalling_enc_rf_fx(
     836             :     Encoder_State *st /* i  : encoder state structure   */
     837             : )
     838             : {
     839             :     Word16 i;
     840             :     Word16 sfr;
     841        3100 :     RF_ENC_HANDLE hRF = st->hRF;
     842             : 
     843             :     /* write partial copy into bitstream */
     844        3100 :     IF( EQ_16( st->rf_mode, 1 ) )
     845             :     {
     846           0 :         enc_prm_rf_fx( st, hRF->rf_indx_frametype[st->rf_fec_offset], st->rf_fec_offset );
     847           0 :         hRF->rf_indx_tbeGainFr[0] = hRF->RF_bwe_gainFr_ind; /*Q0*/
     848             :     }
     849             : 
     850             :     /* Shift the RF indices such that the partial copy associated with
     851             :        (n-fec_offset)th frame is included in the bitstream in nth frame. */
     852             : 
     853        6200 :     FOR( i = st->rf_fec_offset; i >= 0; i-- )
     854             :     {
     855             :         /* rf frame type */
     856        3100 :         hRF->rf_indx_frametype[i + 1] = hRF->rf_indx_frametype[i];
     857             :         /* rf target bits buffer */
     858        3100 :         hRF->rf_targetbits_buff[i + 1] = hRF->rf_targetbits_buff[i];
     859             : 
     860             :         /* lsf indx */
     861        3100 :         hRF->rf_indx_lsf[i + 1][0] = hRF->rf_indx_lsf[i][0];
     862        3100 :         hRF->rf_indx_lsf[i + 1][1] = hRF->rf_indx_lsf[i][1];
     863        3100 :         hRF->rf_indx_lsf[i + 1][2] = hRF->rf_indx_lsf[i][2];
     864             : 
     865             :         /* ES pred energy */
     866        3100 :         hRF->rf_indx_EsPred[i + 1] = hRF->rf_indx_EsPred[i];
     867             : 
     868             :         /* LTF mode, sfr params: pitch, fcb and gain */
     869       16550 :         FOR( sfr = 0; sfr < st->nb_subfr; sfr++ )
     870             :         {
     871       13450 :             hRF->rf_indx_ltfMode[i + 1][sfr] = hRF->rf_indx_ltfMode[i][sfr];
     872       13450 :             hRF->rf_indx_pitch[i + 1][sfr] = hRF->rf_indx_pitch[i][sfr];
     873       13450 :             hRF->rf_indx_fcb[i + 1][sfr] = hRF->rf_indx_fcb[i][sfr];
     874       13450 :             hRF->rf_indx_gain[i + 1][sfr] = hRF->rf_indx_gain[i][sfr];
     875             :         }
     876             : 
     877             :         /* shift the nelp indices */
     878        3100 :         hRF->rf_indx_nelp_iG1[i + 1] = hRF->rf_indx_nelp_iG1[i];
     879        3100 :         hRF->rf_indx_nelp_iG2[i + 1][0] = hRF->rf_indx_nelp_iG2[i][0];
     880        3100 :         hRF->rf_indx_nelp_iG2[i + 1][1] = hRF->rf_indx_nelp_iG2[i][1];
     881        3100 :         hRF->rf_indx_nelp_fid[i + 1] = hRF->rf_indx_nelp_fid[i];
     882             : 
     883             :         /* tbe gain Fr shift */
     884        3100 :         hRF->rf_indx_tbeGainFr[i + 1] = hRF->rf_indx_tbeGainFr[i];
     885        3100 :         hRF->rf_clas[i + 1] = hRF->rf_clas[i];
     886        3100 :         hRF->rf_gain_tcx[i + 1] = hRF->rf_gain_tcx[i];
     887        3100 :         hRF->rf_tcxltp_param[i + 1] = hRF->rf_tcxltp_param[i];
     888             :     }
     889             : 
     890        3100 :     return;
     891             : }

Generated by: LCOV version 1.14