LCOV - code coverage report
Current view: top level - lib_enc - ivas_sns_enc.c (source / functions) Hit Total Coverage
Test: Coverage on main @ 6baab0c613aa6c7100498ed7b93676aa8198a493 Lines: 180 182 98.9 %
Date: 2025-05-28 04:28:20 Functions: 5 5 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 <assert.h>
      34             : #include <stdint.h>
      35             : #include "options.h"
      36             : #include <math.h>
      37             : #include "cnst.h"
      38             : #include "prot.h"
      39             : #include "ivas_prot.h"
      40             : #include "rom_com.h"
      41             : #include "ivas_rom_com.h"
      42             : #include "ivas_cnst.h"
      43             : #ifdef DEBUGGING
      44             : #include "debug.h"
      45             : #endif
      46             : #include "wmc_auto.h"
      47             : 
      48             : 
      49             : /*-------------------------------------------------------------------
      50             :  * sns_1st_cod()
      51             :  *
      52             :  *
      53             :  *-------------------------------------------------------------------*/
      54             : 
      55             : /* r  : codebook index */
      56     5583392 : static int16_t sns_1st_cod(
      57             :     const float *sns, /* i  : vector to quantize                */
      58             :     const int16_t L_frame,
      59             :     const int16_t core,
      60             :     float *snsq /* o  : quantized sns    */
      61             : )
      62             : {
      63             :     int16_t index;
      64     5583392 :     const int16_t split_len = M / 2;
      65             :     const int16_t *means;
      66     5583392 :     const float means_fix2float = 1.f / powf( 2, SNS_MEANS_BITS_4_FRAC );
      67             : 
      68             :     /* remove means */
      69     5583392 :     means = NULL;
      70     5583392 :     switch ( L_frame )
      71             :     {
      72      884506 :         case L_FRAME16k:
      73      884506 :             means = &sns_1st_means_16k[core - 1][0];
      74      884506 :             break;
      75     2045359 :         case L_FRAME25_6k:
      76     2045359 :             means = &sns_1st_means_25k6[core - 1][0];
      77     2045359 :             break;
      78     2653527 :         case L_FRAME32k:
      79     2653527 :             means = &sns_1st_means_32k[core - 1][0];
      80     2653527 :             break;
      81           0 :         default:
      82           0 :             assert( !"illegal frame length in sns_1st_cod" );
      83             :     }
      84             : 
      85    94917664 :     for ( int16_t i = 0; i < M; ++i )
      86             :     {
      87    89334272 :         snsq[i] = sns[i] - means[i] * means_fix2float;
      88             :     }
      89             : 
      90     5583392 :     index = 0;
      91    16750176 :     for ( int16_t split = 0; split < 2; ++split )
      92             :     {
      93             :         const int16_t *cdbk_ptr;
      94             :         int16_t j0, j1, index_split;
      95             :         float dist_min;
      96    11166784 :         const float cdbk_fix2float = 1.f / powf( 2, SNS_CDBKS_BITS_4_FRAC );
      97    11166784 :         const int16_t *const cdbk = &sns_1st_cdbk[split][core - 1][0];
      98             : 
      99    11166784 :         j0 = split * split_len;
     100    11166784 :         j1 = j0 + split_len;
     101             : 
     102    11166784 :         cdbk_ptr = cdbk;
     103    11166784 :         dist_min = 1.0e30f;
     104    11166784 :         index_split = 0;
     105   368503872 :         for ( int16_t i = 0; i < 32; ++i )
     106             :         {
     107             :             float dist;
     108             : 
     109   357337088 :             dist = 0.f;
     110  3216033792 :             for ( int16_t j = j0; j < j1; ++j )
     111             :             {
     112             :                 float tmp;
     113             : 
     114  2858696704 :                 tmp = snsq[j] - ( *cdbk_ptr++ ) * cdbk_fix2float;
     115  2858696704 :                 dist += tmp * tmp;
     116             :             }
     117             : 
     118   357337088 :             if ( dist < dist_min )
     119             :             {
     120    54094338 :                 dist_min = dist;
     121    54094338 :                 index_split = i;
     122             :             }
     123             :         }
     124             : 
     125             :         /* set quantized vector */
     126    11166784 :         cdbk_ptr = &cdbk[index_split * split_len];
     127   100501056 :         for ( int16_t j = j0; j < j1; ++j )
     128             :         {
     129    89334272 :             snsq[j] = ( *cdbk_ptr++ ) * cdbk_fix2float + means[j] * means_fix2float;
     130             :         }
     131             : 
     132             :         /* for second split shift by five bits to store both indices as one 10 bit value */
     133    11166784 :         if ( split == 1 )
     134             :         {
     135     5583392 :             index_split <<= 5;
     136             :         }
     137             : 
     138    11166784 :         index += index_split;
     139             :     }
     140             : 
     141     5583392 :     return index;
     142             : }
     143             : 
     144             : 
     145             : /*-------------------------------------------------------------------
     146             :  * sns_2st_cod()
     147             :  *
     148             :  *
     149             :  *-------------------------------------------------------------------*/
     150             : 
     151             : /* r  : number of allocated bits        */
     152     8865453 : static int16_t sns_2st_cod(
     153             :     const float *sns, /* i  : normalized vector to quantize   */
     154             :     float *snsq,      /* i/o: i:1st stage   o:1st+2nd stage   */
     155             :     int16_t *indx     /* o  : index[] (4 bits per words)      */
     156             : )
     157             : {
     158             :     int16_t i, nbits;
     159             :     float x[M];
     160             :     int16_t nq, xq[M];
     161     8865453 :     float scale = 1.0f / 2.5f;
     162             : 
     163   150712701 :     for ( i = 0; i < M; i++ )
     164             :     {
     165   141847248 :         x[i] = ( sns[i] - snsq[i] ) / scale;
     166             :     }
     167             : 
     168             :     /* quantize */
     169     8865453 :     AVQ_cod_lpc( x, xq, indx, 2 );
     170             : 
     171   150712701 :     for ( i = 0; i < M; i++ )
     172             :     {
     173   141847248 :         snsq[i] += scale * (float) xq[i];
     174             :     }
     175             : 
     176             :     /* total number of bits using entropic code to index the quantizer number */
     177     8865453 :     nbits = 0;
     178             : 
     179    26596359 :     for ( i = 0; i < 2; i++ )
     180             :     {
     181    17730906 :         nq = indx[i];
     182    17730906 :         nbits += ( 2 + ( nq * 4 ) ); /* 2 bits to specify Q2,Q3,Q4,ext */
     183             : 
     184    17730906 :         if ( nq > 6 )
     185             :         {
     186       15711 :             nbits += nq - 3; /* unary code (Q7=1110, ...) */
     187             :         }
     188    17715195 :         else if ( nq > 4 )
     189             :         {
     190      744403 :             nbits += nq - 4; /* Q5=0, Q6=10 */
     191             :         }
     192    16970792 :         else if ( nq == 0 )
     193             :         {
     194     2492337 :             nbits += 3; /* Q0=110 */
     195             :         }
     196             :     }
     197             : 
     198     8865453 :     return ( nbits );
     199             : }
     200             : 
     201             : 
     202             : /*-------------------------------------------------------------------
     203             :  * sns_avq_cod()
     204             :  *
     205             :  * Stereo noise-shaping AVQ encoder for 1 channel
     206             :  *-------------------------------------------------------------------*/
     207             : 
     208     1140142 : void sns_avq_cod(
     209             :     const float *sns,    /* i  : Input sns vectors               */
     210             :     const float *snsmid, /* i  : Input mid-sns vectors           */
     211             :     float *sns_q,        /* o  : Quantized LFS vectors           */
     212             :     float *snsmid_q,     /* o  : Quantized mid-LFS vectors       */
     213             :     int16_t *index,      /* o  : Quantization indices            */
     214             :     const int16_t core,  /* i  : core                            */
     215             :     const int16_t L_frame,
     216             :     const int16_t low_brate_mode /* i  : flag low bit operating mode     */
     217             : )
     218             : {
     219             :     int16_t i;
     220             :     float snsmid_q0[M];
     221             :     int16_t indxt[256], nbits, nbt, nit;
     222             : 
     223     1140142 :     index[0] = sns_1st_cod( sns, L_frame, core, sns_q );
     224     1140142 :     nit = 1 + 2;
     225     1140142 :     if ( !low_brate_mode )
     226             :     {
     227     1137711 :         nbt = sns_2st_cod( sns, sns_q, &index[1] );
     228     1137711 :         nit += index[1] + index[2];
     229             :     }
     230             :     else
     231             :     {
     232        2431 :         index[1] = SNS_LOW_BR_MODE;
     233        2431 :         index[2] = 0;
     234             :     }
     235             : 
     236     1140142 :     index += nit;
     237     1140142 :     nit = 0;
     238     1140142 :     *index = 0;
     239             : 
     240     1140142 :     if ( core == TCX_10_CORE )
     241             :     {
     242      192148 :         index++;
     243             : 
     244      192148 :         index[0] = sns_1st_cod( snsmid, L_frame, core, snsmid_q );
     245      192148 :         nit = 1 + 2;
     246      192148 :         if ( !low_brate_mode )
     247             :         {
     248      189916 :             nbits = sns_2st_cod( snsmid, snsmid_q, &index[1] );
     249      189916 :             nit += index[1] + index[2];
     250             :         }
     251             :         else
     252             :         {
     253        2232 :             index[1] = SNS_LOW_BR_MODE;
     254        2232 :             index[2] = 0;
     255        2232 :             nbits = 0;
     256             :         }
     257             : 
     258             : 
     259      192148 :         nbt = 10 + nbits;
     260             : 
     261      192148 :         if ( !low_brate_mode )
     262             :         {
     263     3228572 :             for ( i = 0; i < M; i++ )
     264             :             {
     265     3038656 :                 snsmid_q0[i] = sns_q[i];
     266             :             }
     267      189916 :             nbits = sns_2st_cod( snsmid, snsmid_q0, indxt );
     268      189916 :             if ( nbits < nbt )
     269             :             {
     270      129110 :                 nbt = nbits;
     271      129110 :                 nit = 2 + indxt[0] + indxt[1];
     272      129110 :                 index[-1] = 1;
     273             : 
     274     2194870 :                 for ( i = 0; i < M; i++ )
     275             :                 {
     276     2065760 :                     snsmid_q[i] = snsmid_q0[i];
     277             :                 }
     278             : 
     279     1096000 :                 for ( i = 0; i < nit; i++ )
     280             :                 {
     281      966890 :                     index[i] = indxt[i];
     282             :                 }
     283             :             }
     284             :         }
     285      192148 :         index += nit;
     286             :     }
     287             : 
     288     1140142 :     return;
     289             : }
     290             : 
     291             : 
     292             : /*-------------------------------------------------------------------
     293             :  * sns_avq_cod_stereo()
     294             :  *
     295             :  * Stereo noise-shaping AVQ encoder for 2 channels
     296             :  *-------------------------------------------------------------------*/
     297             : 
     298     3673955 : void sns_avq_cod_stereo(
     299             :     const float *snsl, /* i  : Input sns vector (left channel)         */
     300             :     const float *snsr, /* i  : Input sns vector (right channel)        */
     301             :     const int16_t L_frame,
     302             :     float *snsl_q,   /* o  : Quantized sns vector (left channel)     */
     303             :     float *snsr_q,   /* o  : Quantized sns vector (right channel)    */
     304             :     int16_t *indexl, /* o  : Quantization indices (left channel)     */
     305             :     int16_t *indexr  /* o  : Quantization indices (right channel)    */
     306             : )
     307             : {
     308             :     int16_t i, flag_zero;
     309             :     float mid[M], side[M], mid_q[M], side_q[M], ener_side;
     310             : 
     311             :     /* Compute side */
     312     3673955 :     ener_side = 0.f;
     313    62457235 :     for ( i = 0; i < M; i++ )
     314             :     {
     315    58783280 :         side[i] = snsl[i] - snsr[i];
     316    58783280 :         ener_side += side[i] * side[i];
     317             :     }
     318             : #ifdef DEBUG_MODE_MDCT
     319             :     {
     320             :         float ener_mid = 0;
     321             :         /* Compute mid */
     322             :         for ( i = 0; i < M; i++ )
     323             :         {
     324             :             mid[i] = ( snsl[i] + snsr[i] ) * 0.5f;
     325             :             ener_mid += mid[i] * mid[i];
     326             :         }
     327             :         dbgwrite( &ener_side, sizeof( float ), 1, 1, "./res/ener_side" );
     328             :         dbgwrite( &ener_mid, sizeof( float ), 1, 1, "./res/ener_mid" );
     329             :     }
     330             : #endif
     331             : 
     332     3673955 :     if ( ener_side < 12.f )
     333             :     {
     334             :         /* MS coding */
     335     3096808 :         *indexl++ = 2;
     336     3096808 :         *indexr++ = 3;
     337             : 
     338             :         /* Compute mid */
     339    52645736 :         for ( i = 0; i < M; i++ )
     340             :         {
     341    49548928 :             mid[i] = ( snsl[i] + snsr[i] ) * 0.5f;
     342             :         }
     343             : 
     344             :         /* Quantize mid */
     345     3096808 :         indexl[0] = sns_1st_cod( mid, L_frame, TCX_20_CORE, mid_q );
     346     3096808 :         sns_2st_cod( mid, mid_q, &indexl[1] );
     347             : 
     348             :         /* Quantize side */
     349     3096808 :         indexr[0] = -1;
     350    52645736 :         for ( i = 0; i < M; i++ )
     351             :         {
     352    49548928 :             side_q[i] = 0.f;
     353             :         }
     354     3096808 :         sns_2st_cod( side, side_q, &indexr[1] );
     355             : 
     356             :         /* Detect zero side */
     357     3096808 :         flag_zero = 1;
     358    14109365 :         for ( i = 0; i < M; i++ )
     359             :         {
     360    13553442 :             if ( side_q[i] != 0 )
     361             :             {
     362     2540885 :                 flag_zero = 0;
     363     2540885 :                 break;
     364             :             }
     365             :         }
     366     3096808 :         if ( flag_zero )
     367             :         {
     368      555923 :             indexr[0] = -2;
     369             :         }
     370             : 
     371             :         /* Go back to LR */
     372    52645736 :         for ( i = 0; i < M; i++ )
     373             :         {
     374    49548928 :             snsl_q[i] = mid_q[i] + side_q[i] * 0.5f;
     375    49548928 :             snsr_q[i] = mid_q[i] - side_q[i] * 0.5f;
     376             :         }
     377             :     }
     378             :     else
     379             :     {
     380             :         /* LR coding */
     381      577147 :         *indexl++ = 0;
     382      577147 :         *indexr++ = 1;
     383             : 
     384             :         /* Quantize left */
     385      577147 :         indexl[0] = sns_1st_cod( snsl, L_frame, TCX_20_CORE, snsl_q );
     386      577147 :         sns_2st_cod( snsl, snsl_q, &indexl[1] );
     387             : 
     388             :         /* Quantize right */
     389      577147 :         indexr[0] = sns_1st_cod( snsr, L_frame, TCX_20_CORE, snsr_q );
     390      577147 :         sns_2st_cod( snsr, snsr_q, &indexr[1] );
     391             :     }
     392             : 
     393     3673955 :     return;
     394             : }
     395             : 
     396      751300 : int16_t quantize_sns(
     397             :     float sns_in[CPE_CHANNELS][NB_DIV][M],
     398             :     float snsQ_out[CPE_CHANNELS][NB_DIV][M],
     399             :     Encoder_State **sts,
     400             :     int16_t *indices,
     401             :     int16_t *zero_side_flag,
     402             :     int16_t *sns_stereo_mode )
     403             : {
     404             :     int16_t nSubframes, k, ch, i;
     405             :     int16_t nbits, idxIndices;
     406             :     Encoder_State *st;
     407             :     float weights[M];
     408             : 
     409      751300 :     nbits = 0;
     410      751300 :     idxIndices = 0;
     411      751300 :     set_f( weights, 1.0f, M );
     412             : 
     413      751300 :     sns_stereo_mode[0] = SNS_STEREO_MODE_LR;
     414      751300 :     sns_stereo_mode[1] = SNS_STEREO_MODE_LR;
     415      751300 :     zero_side_flag[0] = 0;
     416      751300 :     zero_side_flag[1] = 0;
     417             : 
     418             :     /* use snsQ_out as buffer, move input vectors */
     419     2253900 :     for ( ch = 0; ch < CPE_CHANNELS; ++ch )
     420             :     {
     421     1502600 :         nSubframes = ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV;
     422     3045775 :         for ( k = 0; k < nSubframes; ++k )
     423             :         {
     424     1543175 :             mvr2r( sns_in[ch][k], snsQ_out[ch][k], M );
     425             :         }
     426             :     }
     427             : 
     428             :     /* stereo mode decision */
     429      751300 :     if ( sts[0]->core == sts[1]->core )
     430             :     {
     431      746251 :         nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV;
     432             : 
     433     1510265 :         for ( k = 0; k < nSubframes; ++k )
     434             :         {
     435             :             float side[M];
     436             :             float ener_side;
     437             : 
     438      764014 :             v_sub( snsQ_out[0][k], snsQ_out[1][k], side, M );
     439      764014 :             ener_side = dotp( side, side, M );
     440             : 
     441      764014 :             sns_stereo_mode[k] = ener_side < 12.f;
     442      764014 :             zero_side_flag[k] = ener_side < 1.f;
     443             : 
     444      764014 :             if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS )
     445             :             {
     446      644120 :                 convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 0.5f );
     447             :             }
     448             :         }
     449             :     }
     450             : 
     451             :     /* run MSVQ */
     452     2253900 :     for ( ch = 0; ch < CPE_CHANNELS; ++ch )
     453             :     {
     454     1502600 :         st = sts[ch];
     455     1502600 :         nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV;
     456             : 
     457     3045775 :         for ( k = 0; k < nSubframes; ++k )
     458             :         {
     459     1543175 :             const int16_t is_side = ch == 1 && sns_stereo_mode[k] == SNS_STEREO_MODE_MS;
     460     1543175 :             const float *const *cdbks = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20 : ivas_sns_cdbks_tcx10;
     461     1543175 :             const int16_t *levels = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_levels : ivas_sns_cdbks_tcx10_levels;
     462     1543175 :             const int16_t *bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_bits : ivas_sns_cdbks_tcx10_bits;
     463     1543175 :             int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 );
     464     1543175 :             float *snsQ = snsQ_out[ch][k];
     465     1543175 :             const float *sns_ptr = snsQ_out[ch][k];
     466             : 
     467     1543175 :             if ( is_side )
     468             :             {
     469      644120 :                 const float *const *side_cdbks = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20 : ivas_sns_cdbks_side_tcx10;
     470      644120 :                 const int16_t *side_levels = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20_levels : ivas_sns_cdbks_side_tcx10_levels;
     471             : 
     472      644120 :                 if ( zero_side_flag[k] )
     473             :                 {
     474      159682 :                     set_zero( snsQ, M );
     475      159682 :                     continue;
     476             :                 }
     477             : 
     478      484438 :                 nStages = SNS_MSVQ_NSTAGES_SIDE;
     479      484438 :                 bits = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20_bits : ivas_sns_cdbks_side_tcx10_bits;
     480      484438 :                 msvq_enc( side_cdbks, NULL, NULL, snsQ, side_levels, 3, nStages, weights, M, M, 0, NULL, &indices[idxIndices] );
     481      484438 :                 msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], 0, NULL, snsQ, NULL );
     482             :             }
     483             :             else
     484             :             {
     485      899055 :                 msvq_enc( cdbks, NULL, NULL, sns_ptr, levels, 3, nStages, weights, M, M, 0, NULL, &indices[idxIndices] );
     486      899055 :                 msvq_dec( cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], 0, NULL, snsQ, NULL );
     487             :             }
     488     1383493 :             idxIndices += nStages;
     489             : 
     490     5899601 :             for ( i = 0; i < nStages; ++i )
     491             :             {
     492     4516108 :                 nbits += bits[i];
     493             :             }
     494             :         }
     495             :     }
     496             : 
     497             :     /* get back to L/F representation */
     498      751300 :     if ( sns_stereo_mode[0] == SNS_STEREO_MODE_MS || sns_stereo_mode[1] == SNS_STEREO_MODE_MS )
     499             :     {
     500      628952 :         nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV;
     501     1274898 :         for ( k = 0; k < nSubframes; ++k )
     502             :         {
     503      645946 :             if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS )
     504             :             {
     505      644120 :                 convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 1.f );
     506             :             }
     507             :         }
     508             :     }
     509             : 
     510      751300 :     return nbits;
     511             : }

Generated by: LCOV version 1.14