LCOV - code coverage report
Current view: top level - lib_dec - ivas_stereo_mdct_stereo_dec.c (source / functions) Hit Total Coverage
Test: Coverage on main -- short test vectors @ 964def597416c4579d8c5a50af2e69abfcc047a0 Lines: 211 221 95.5 %
Date: 2025-12-04 05:56:58 Functions: 9 9 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 "ivas_cnst.h"
      38             : #include "ivas_prot.h"
      39             : #include "prot.h"
      40             : #include "wmc_auto.h"
      41             : 
      42             : 
      43             : /*-------------------------------------------------------------------*
      44             :  * Local function prototypes
      45             :  *-------------------------------------------------------------------*/
      46             : 
      47             : static void inverseBwMS( const int16_t startLine, const int16_t stopLine, float x0[], float x1[], const float norm_fac );
      48             : 
      49             : 
      50             : /*-------------------------------------------------------------------*
      51             :  * parse_stereo_from_bitstream
      52             :  *
      53             :  *
      54             :  *-------------------------------------------------------------------*/
      55             : 
      56     2770262 : void parse_stereo_from_bitstream(
      57             :     STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo decoder structure   */
      58             :     Decoder_State **sts,                     /* i/o: decoder state structure         */
      59             :     const int16_t mct_on,                    /* i  : flag mct block (1) or stereo (0)*/
      60             :     const int16_t isSBAStereoMode,           /* i  : flag core coding for SBA        */
      61             :     Decoder_State *st0,                      /* i/o: decoder state structure for Bstr*/
      62             :     int16_t ms_mask[NB_DIV][MAX_SFB]         /* o  : bandwise MS mask                */
      63             : )
      64             : {
      65             :     int16_t i, k, nSubframes, mdct_stereo_mode;
      66             :     STEREO_MDCT_BAND_PARAMETERS *sfbConf;
      67             : #ifdef DEBUGGING
      68             :     int16_t nbits_start = st0->next_bit_pos;
      69             : #endif
      70             : 
      71     2770262 :     if ( !isSBAStereoMode )
      72             :     {
      73     2175133 :         nSubframes = ( sts[0]->core == TCX_10_CORE || ( sts[0]->core != sts[1]->core ) ) ? NB_DIV : 1;
      74     2175133 :         sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10;
      75     2175133 :         if ( sts[0]->last_core_from_bs == ACELP_CORE )
      76             :         {
      77        6742 :             sfbConf = &hStereoMdct->stbParamsTCX20afterACELP;
      78             :         }
      79             : 
      80     2175133 :         if ( hStereoMdct->use_itd )
      81             :         {
      82             :             int16_t I;
      83             : 
      84       53517 :             hStereoMdct->itd_mode = get_next_indice( st0, STEREO_DFT_ITD_MODE_NBITS );
      85             :             /*(*nb_bits) += STEREO_DFT_ITD_MODE_NBITS;*/ /*ITD mode flag: 1bit*/
      86             : 
      87       53517 :             hStereoMdct->itd = 0.f;
      88       53517 :             if ( hStereoMdct->itd_mode )
      89             :             {
      90       23898 :                 /*(*nb_bits) += */ read_itd( st0, &I );
      91       23898 :                 stereo_dft_dequantize_itd( &I, &hStereoMdct->itd, st0->output_Fs );
      92             :             }
      93             :         }
      94             : 
      95     4419345 :         for ( k = 0; k < nSubframes; k++ )
      96             :         {
      97     2244212 :             mdct_stereo_mode = get_next_indice( st0, 1 );
      98     2244212 :             if ( mdct_stereo_mode )
      99             :             {
     100     2208104 :                 mdct_stereo_mode = 1 + get_next_indice( st0, 1 );
     101             :             }
     102     2244212 :             switch ( mdct_stereo_mode )
     103             :             {
     104       36108 :                 case 0:
     105       36108 :                     hStereoMdct->mdct_stereo_mode[k] = SMDCT_DUAL_MONO;
     106       36108 :                     break;
     107     1330780 :                 case 1:
     108     1330780 :                     hStereoMdct->mdct_stereo_mode[k] = SMDCT_MS_FULL;
     109     1330780 :                     break;
     110      877324 :                 case 2:
     111      877324 :                     hStereoMdct->mdct_stereo_mode[k] = SMDCT_BW_MS;
     112      877324 :                     break;
     113           0 :                 default:
     114           0 :                     assert( !"Not supported stereo mode\n" );
     115             :             }
     116             : 
     117     2244212 :             if ( !mct_on )
     118             :             {
     119      746796 :                 if ( sts[0]->core == sts[1]->core || k == 0 )
     120             :                 {
     121      743602 :                     hStereoMdct->global_ild[k] = get_next_indice( st0, SMDCT_GLOBAL_ILD_BITS );
     122     1487204 :                     assert( ( hStereoMdct->global_ild[k] > 0 ) && ( hStereoMdct->global_ild[k] < SMDCT_ILD_RANGE ) );
     123             :                 }
     124             :                 else
     125             :                 {
     126        3194 :                     hStereoMdct->global_ild[1] = hStereoMdct->global_ild[0];
     127             :                 }
     128             :             }
     129             : 
     130     2244212 :             set_s( ms_mask[k], ( hStereoMdct->mdct_stereo_mode[k] == SMDCT_MS_FULL ) ? 1 : 0, sfbConf->nBandsStereoCore );
     131             : 
     132     2244212 :             if ( hStereoMdct->mdct_stereo_mode[k] == SMDCT_BW_MS )
     133             :             {
     134    39068233 :                 for ( i = 0; i < sfbConf->nBandsStereoCore; i++ )
     135             :                 {
     136    38190909 :                     ms_mask[k][i] = get_next_indice( st0, 1 );
     137             :                 }
     138             :             }
     139             : 
     140     2244212 :             if ( st0->igf )
     141             :             {
     142     1147694 :                 mdct_stereo_mode = get_next_indice( st0, 1 );
     143     1147694 :                 if ( mdct_stereo_mode )
     144             :                 {
     145      674663 :                     mdct_stereo_mode = 1 + get_next_indice( st0, 1 );
     146             :                 }
     147             : 
     148     1147694 :                 switch ( mdct_stereo_mode )
     149             :                 {
     150      473031 :                     case 0:
     151      473031 :                         hStereoMdct->IGFStereoMode[k] = SMDCT_DUAL_MONO;
     152      473031 :                         break;
     153      527200 :                     case 1:
     154      527200 :                         hStereoMdct->IGFStereoMode[k] = SMDCT_MS_FULL;
     155      527200 :                         break;
     156      147463 :                     case 2:
     157      147463 :                         hStereoMdct->IGFStereoMode[k] = SMDCT_BW_MS;
     158      147463 :                         break;
     159           0 :                     default:
     160           0 :                         assert( !"Not supported stereo mode\n" );
     161             :                 }
     162             : 
     163     1147694 :                 set_s( &ms_mask[k][sfbConf->nBandsStereoCore], ( hStereoMdct->IGFStereoMode[k] == SMDCT_MS_FULL ) ? 1 : 0, sfbConf->sfbCnt - sfbConf->nBandsStereoCore );
     164             : 
     165     1147694 :                 if ( hStereoMdct->IGFStereoMode[k] == SMDCT_BW_MS )
     166             :                 {
     167     1009097 :                     for ( i = sfbConf->nBandsStereoCore; i < sfbConf->sfbCnt; i++ )
     168             :                     {
     169      861634 :                         ms_mask[k][i] = get_next_indice( st0, 1 );
     170             :                     }
     171             :                 }
     172             :             }
     173             :             else
     174             :             {
     175     1096518 :                 hStereoMdct->IGFStereoMode[k] = SMDCT_DUAL_MONO;
     176             :             }
     177             :         }
     178             :     }
     179             : 
     180     2770262 :     if ( !mct_on )
     181             :     {
     182     1313318 :         hStereoMdct->split_ratio = SMDCT_EQUAL_RATIO_RANGE; /* Equal bits to both channels */
     183     1313318 :         hStereoMdct->split_ratio = get_next_indice( st0, SMDCT_NBBITS_SPLIT_RATIO );
     184             : 
     185     1313318 :         assert( hStereoMdct->split_ratio > 0 );
     186             :     }
     187             : 
     188             : #ifdef DEBUGGING
     189             :     {
     190             :         int16_t nBitsStereo = st0->next_bit_pos - nbits_start;
     191             : 
     192             :         assert( nBitsStereo <= st0->bits_frame_nominal );
     193             :     }
     194             : #endif
     195             : 
     196     2770262 :     return;
     197             : }
     198             : 
     199             : 
     200             : /*-------------------------------------------------------------------*
     201             :  * stereo_decoder_tcx()
     202             :  *
     203             :  * apply stereo processing (inverse MS and global ILD)
     204             :  *-------------------------------------------------------------------*/
     205             : 
     206             : #define NF_RED_FAC 0.75f
     207             : 
     208     2280782 : void stereo_decoder_tcx(
     209             :     STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: MDCT stereo decoder structure           */
     210             :     int16_t ms_mask[NB_DIV][MAX_SFB],  /* i  : bandwise MS mask                        */
     211             :     float *spec_r_0[NB_DIV],           /* i/o: spectrum right channel                  */
     212             :     float *spec_l[],                   /* i/o: spectrum left channel  [NB_DIV][N]      */
     213             :     float *spec_r[],                   /* i/o: spectrum right channel [NB_DIV][N]      */
     214             :     const int16_t mdct_stereo_mode[],  /* i  : stereo mode (FB/band wise MS, dual mono */
     215             :     const int16_t core_l,              /* i  : core for left channel (TCX20/TCX10)     */
     216             :     const int16_t core_r,              /* i  : core for right channel (TCX20/TCX10)    */
     217             :     const int16_t igf,                 /* i  : flag for IGF activity                   */
     218             :     const int16_t L_frameTCX_l,        /* i  : TCX frame length of left channel        */
     219             :     const int16_t L_frameTCX_r,        /* i  : TCX frame length of right channel       */
     220             :     const int16_t mct_on,              /* i  : flag mct block (1) or stereo (0)        */
     221             :     const int16_t last_core_l,         /* i  : last core for left channel              */
     222             :     const int16_t last_core_r,         /* i  : last core for right channel             */
     223             :     const int16_t tmp_plc_upmix        /* i  : indicates temp upmix for PLC decision   */
     224             : )
     225             : {
     226             :     int16_t i, k, sfb, nSubframes;
     227     2280782 :     STEREO_MDCT_BAND_PARAMETERS *sfbConf = NULL;
     228             :     float nrgRatio;
     229             : 
     230     2280782 :     nSubframes = 2;
     231     2280782 :     if ( ( core_l <= TCX_20_CORE && core_r <= TCX_20_CORE ) || tmp_plc_upmix )
     232             :     {
     233     2211179 :         nSubframes = 1;
     234             :     }
     235             : 
     236     4631167 :     for ( k = 0; k < nSubframes; k++ )
     237             :     {
     238     2350385 :         sfbConf = ( core_l == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10;
     239             : 
     240     2350385 :         if ( last_core_l == ACELP_CORE || last_core_r == ACELP_CORE )
     241             :         {
     242        6834 :             sfbConf = &hStereoMdct->stbParamsTCX20afterACELP;
     243             :         }
     244             : 
     245     2350385 :         if ( mdct_stereo_mode[k] == SMDCT_MS_FULL )
     246             :         {
     247   642143007 :             for ( i = 0; i < sfbConf->sfbOffset[sfbConf->nBandsStereoCore]; i++ )
     248             :             {
     249   640748414 :                 if ( spec_r_0[k][i] == 0.0f )
     250             :                 {
     251   243005501 :                     spec_r[k][i] *= NF_RED_FAC;
     252             :                 }
     253             :             }
     254     1394593 :             inverseMS( sfbConf->sfbOffset[sfbConf->nBandsStereoCore], spec_l[k], spec_r[k], SQRT2_OVER_2 );
     255             :         }
     256      955792 :         else if ( mdct_stereo_mode[k] == SMDCT_BW_MS )
     257             :         {
     258    41038704 :             for ( sfb = 0; sfb < sfbConf->nBandsStereoCore; sfb++ )
     259             :             {
     260    40119564 :                 if ( ms_mask[k][sfb] )
     261             :                 {
     262   315431524 :                     for ( i = sfbConf->sfbOffset[sfb]; i < sfbConf->sfbOffset[sfb + 1]; i++ )
     263             :                     {
     264   291385102 :                         if ( spec_r_0[k][i] == 0.0f )
     265             :                         {
     266    76223638 :                             spec_r[k][i] *= NF_RED_FAC;
     267             :                         }
     268             :                     }
     269    24046422 :                     inverseBwMS( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], spec_l[k], spec_r[k], SQRT2_OVER_2 );
     270             :                 }
     271             :             }
     272             :         }
     273             : #ifdef DEBUGGING
     274             :         else if ( mdct_stereo_mode[k] != SMDCT_DUAL_MONO )
     275             :         {
     276             :             assert( !"Not supported MDCT stereo mode!\n" );
     277             :         }
     278             : #endif
     279             : 
     280     2350385 :         if ( igf )
     281             :         {
     282     1192139 :             if ( hStereoMdct->IGFStereoMode[k] == SMDCT_MS_FULL )
     283             :             {
     284   167340344 :                 for ( i = sfbConf->sfbOffset[sfbConf->nBandsStereoCore]; i < sfbConf->sfbOffset[sfbConf->sfbCnt]; i++ )
     285             :                 {
     286   166793402 :                     if ( spec_r_0[k][i] == 0.0f )
     287             :                     {
     288    54492454 :                         spec_r[k][i] *= NF_RED_FAC;
     289             :                     }
     290             :                 }
     291      546942 :                 inverseMS( sfbConf->sfbOffset[sfbConf->sfbCnt] - sfbConf->sfbOffset[sfbConf->nBandsStereoCore], &spec_l[k][sfbConf->sfbOffset[sfbConf->nBandsStereoCore]], &spec_r[k][sfbConf->sfbOffset[sfbConf->nBandsStereoCore]], SQRT2_OVER_2 );
     292             :             }
     293      645197 :             else if ( hStereoMdct->IGFStereoMode[k] == SMDCT_BW_MS )
     294             :             {
     295     1031613 :                 for ( sfb = sfbConf->nBandsStereoCore; sfb < sfbConf->sfbCnt; sfb++ )
     296             :                 {
     297      881349 :                     if ( ms_mask[k][sfb] )
     298             :                     {
     299    22501638 :                         for ( i = sfbConf->sfbOffset[sfb]; i < sfbConf->sfbOffset[sfb + 1]; i++ )
     300             :                         {
     301    22032902 :                             if ( spec_r_0[k][i] == 0.0f )
     302             :                             {
     303     6227880 :                                 spec_r[k][i] *= NF_RED_FAC;
     304             :                             }
     305             :                         }
     306      468736 :                         inverseBwMS( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], spec_l[k], spec_r[k], SQRT2_OVER_2 );
     307             :                     }
     308             :                 }
     309             :             }
     310             : #ifdef DEBUGGING
     311             :             else if ( hStereoMdct->IGFStereoMode[k] != SMDCT_DUAL_MONO )
     312             :             {
     313             :                 assert( !"Not supported MDCT stereo mode!\n" );
     314             :             }
     315             : #endif
     316             :         }
     317             : 
     318     2350385 :         if ( !mct_on )
     319             :         {
     320      852969 :             nrgRatio = (float) SMDCT_ILD_RANGE / hStereoMdct->global_ild[k] - 1; /* nrgRatio = nrg[1]/nrg[0] */
     321      852969 :             hStereoMdct->smooth_ratio = 0.8f * hStereoMdct->smooth_ratio + 0.2f * nrgRatio;
     322             :             /* set flag to reverse dmx computation in case of right-side panning, only relevant for mono output */
     323      852969 :             if ( hStereoMdct->smooth_ratio > 1.3f )
     324             :             {
     325       99912 :                 hStereoMdct->reverse_dmx = 1;
     326             :             }
     327      753057 :             else if ( hStereoMdct->smooth_ratio < 0.9f )
     328             :             {
     329      114306 :                 hStereoMdct->reverse_dmx = 0;
     330             :             }
     331             : 
     332      852969 :             if ( ( nrgRatio > 1.0f ) && ( k < ( ( core_r == TCX_10_CORE ) ? NB_DIV : 1 ) ) )
     333             :             {
     334      281195 :                 v_multc( spec_r[k], nrgRatio, spec_r[k], L_frameTCX_r );
     335             :             }
     336      571774 :             else if ( ( nrgRatio < 1.0f ) && ( k < ( ( core_l == TCX_10_CORE ) ? NB_DIV : 1 ) ) )
     337             :             {
     338      152624 :                 v_multc( spec_l[k], 1.0f / nrgRatio, spec_l[k], L_frameTCX_l );
     339             :             }
     340             :         }
     341             :     } /* for k */
     342             : 
     343     2280782 :     return;
     344             : }
     345             : 
     346             : 
     347             : /*-------------------------------------------------------------------*
     348             :  * inverseBwMS()
     349             :  *
     350             :  * Band-wise M/S stereo processing
     351             :  *-------------------------------------------------------------------*/
     352             : 
     353    26917129 : static void inverseBwMS(
     354             :     const int16_t startLine, /* i  : start line of sfb               */
     355             :     const int16_t stopLine,  /* i  : stop line of sfb                */
     356             :     float x0[],              /* i/o: mid/left channel coefficients   */
     357             :     float x1[],              /* i/o: side/right channel coefficients */
     358             :     const float norm_fac     /* i  : normalization factor            */
     359             : )
     360             : {
     361             :     int16_t j;
     362             :     float tmpValue;
     363             : 
     364  1155252881 :     for ( j = startLine; j < stopLine; j++ )
     365             :     {
     366  1128335752 :         tmpValue = x0[j];
     367  1128335752 :         x0[j] = ( x0[j] + x1[j] ) * norm_fac;
     368  1128335752 :         x1[j] = ( tmpValue - x1[j] ) * norm_fac;
     369             :     }
     370             : 
     371    26917129 :     return;
     372             : }
     373             : 
     374             : 
     375             : /*-------------------------------------------------------------------*
     376             :  * inverseMS()
     377             :  *
     378             :  * M/S stereo processing
     379             :  *-------------------------------------------------------------------*/
     380             : 
     381     2401971 : void inverseMS(
     382             :     const int16_t L_frame, /* i  : frame length                    */
     383             :     float x0[],            /* i/o: mid/left channel coefficients   */
     384             :     float x1[],            /* i/o: side/right channel coefficients */
     385             :     const float norm_fac   /* i  : normalization factor            */
     386             : )
     387             : {
     388     2401971 :     inverseBwMS( 0, L_frame, x0, x1, norm_fac );
     389             : 
     390     2401971 :     return;
     391             : }
     392             : 
     393             : 
     394             : /*-------------------------------------------------------------------*
     395             :  * initMdctStereoDecData()
     396             :  *
     397             :  * Initialize MDCT stereo decoder configuration
     398             :  *-------------------------------------------------------------------*/
     399             : 
     400     5289027 : void initMdctStereoDecData(
     401             :     STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */
     402             :     const int16_t igf,                 /* i  : flag indicating IGF activity     */
     403             :     const H_IGF_GRID igfGrid,          /* i  : IGF grid configuration           */
     404             :     const int32_t element_brate,       /* i  : element bitrate                  */
     405             :     const int16_t bwidth               /* i  : audio bandwidth                  */
     406             : )
     407             : {
     408             :     int16_t tcx_coded_lines;
     409             : 
     410     5289027 :     tcx_coded_lines = getNumTcxCodedLines( bwidth );
     411             : 
     412             :     /*Initialize sfb parameteres for TCX20 */
     413     5289027 :     stereo_mdct_init_bands( tcx_coded_lines, TCX_20_CORE, element_brate, igf, &igfGrid[IGF_GRID_LB_NORM], &hStereoMdct->stbParamsTCX20.sfbOffset[0], &hStereoMdct->stbParamsTCX20.sfbCnt );
     414             : 
     415             :     /*Initialize sfb parameteres for TCX10 */
     416     5289027 :     stereo_mdct_init_bands( tcx_coded_lines, TCX_10_CORE, element_brate, igf, &igfGrid[IGF_GRID_LB_SHORT], &hStereoMdct->stbParamsTCX10.sfbOffset[0], &hStereoMdct->stbParamsTCX10.sfbCnt );
     417             : 
     418             :     /*Initialize sfb parameteres for transition frames */
     419     5289027 :     stereo_mdct_init_bands( tcx_coded_lines, -1, element_brate, igf, &igfGrid[IGF_GRID_LB_TRAN], &hStereoMdct->stbParamsTCX20afterACELP.sfbOffset[0], &hStereoMdct->stbParamsTCX20afterACELP.sfbCnt );
     420             : 
     421     5289027 :     if ( igf )
     422             :     {
     423             :         /* calculate the igf start band from the igf start line */
     424     2201187 :         stereo_mdct_init_igf_start_band( &( hStereoMdct->stbParamsTCX20 ), 1.0f, bwidth, element_brate );
     425     2201187 :         stereo_mdct_init_igf_start_band( &( hStereoMdct->stbParamsTCX10 ), 0.5f, bwidth, element_brate );
     426     2201187 :         stereo_mdct_init_igf_start_band( &( hStereoMdct->stbParamsTCX20afterACELP ), 1.25f, bwidth, element_brate );
     427             :     }
     428             :     else
     429             :     {
     430     3087840 :         hStereoMdct->stbParamsTCX20.sfbIgfStart = -1;
     431     3087840 :         hStereoMdct->stbParamsTCX10.sfbIgfStart = -1;
     432     3087840 :         hStereoMdct->stbParamsTCX20afterACELP.sfbIgfStart = -1;
     433     3087840 :         hStereoMdct->stbParamsTCX10.nBandsStereoCore = hStereoMdct->stbParamsTCX10.sfbCnt;
     434     3087840 :         hStereoMdct->stbParamsTCX20.nBandsStereoCore = hStereoMdct->stbParamsTCX20.sfbCnt;
     435     3087840 :         hStereoMdct->stbParamsTCX20afterACELP.nBandsStereoCore = hStereoMdct->stbParamsTCX20afterACELP.sfbCnt;
     436             :     }
     437             : 
     438     5289027 :     return;
     439             : }
     440             : 
     441             : 
     442             : /*-------------------------------------------------------------------*
     443             :  * initMdctStereoDtxData()
     444             :  *
     445             :  * Allocate and initialize structures for MDCT-Stereo DTX operation
     446             :  *-------------------------------------------------------------------*/
     447             : 
     448          89 : ivas_error initMdctStereoDtxData(
     449             :     CPE_DEC_HANDLE hCPE /* i/o: CPE handle */
     450             : )
     451             : {
     452             :     int16_t ch;
     453             :     ivas_error error;
     454             : 
     455          89 :     error = IVAS_ERR_OK;
     456             : 
     457         267 :     for ( ch = 0; ch < CPE_CHANNELS; ch++ )
     458             :     {
     459         178 :         DEC_CORE_HANDLE st = hCPE->hCoreCoder[ch];
     460             : 
     461         178 :         if ( st->hFdCngDec == NULL )
     462             :         {
     463             :             /* Create FD_CNG instance */
     464           0 :             if ( ( error = createFdCngDec( &st->hFdCngDec ) ) != IVAS_ERR_OK )
     465             :             {
     466           0 :                 return error;
     467             :             }
     468             : 
     469             :             /* Init FD-CNG */
     470           0 :             initFdCngDec( st );
     471             :         }
     472             : 
     473         178 :         if ( st->first_CNG == 0 )
     474             :         {
     475         178 :             if ( ch == 1 && st->cng_sba_flag )
     476             :             {
     477          49 :                 st->hFdCngDec->hFdCngCom->seed += 3;
     478             :             }
     479             :         }
     480             : 
     481         178 :         if ( st->cldfbAna == NULL )
     482             :         {
     483             :             /* open analysis for max. sampling rate 48kHz */
     484         154 :             if ( ( error = openCldfb( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK )
     485             :             {
     486           0 :                 return error;
     487             :             }
     488             :         }
     489             : 
     490         178 :         if ( st->cldfbBPF == NULL )
     491             :         {
     492             :             /* open analysis BPF for max. internal sampling rate 16kHz */
     493         154 :             if ( ( error = openCldfb( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK )
     494             :             {
     495           0 :                 return error;
     496             :             }
     497             :         }
     498             :     }
     499             : 
     500          89 :     return error;
     501             : }
     502             : 
     503             : /*-------------------------------------------------------------------*
     504             :  * synchonize_channels_mdct_sid()
     505             :  *
     506             :  * Synchronize channels in SID frame in MDCT stereo
     507             :  *-------------------------------------------------------------------*/
     508             : 
     509    16699767 : void synchonize_channels_mdct_sid(
     510             :     Decoder_State *sts[CPE_CHANNELS], /* i/o: decoder state structure   */
     511             :     const int16_t n                   /* i  : channel number            */
     512             : )
     513             : {
     514             :     Decoder_State *st;
     515             : 
     516    16699767 :     st = sts[n];
     517             : 
     518    16699767 :     if ( st->element_mode == IVAS_CPE_MDCT && st->total_brate == SID_2k40 )
     519             :     {
     520        3328 :         if ( n == 1 )
     521             :         {
     522             :             /* synchronize channels */
     523        1664 :             sts[1]->L_frame = sts[0]->L_frame;
     524        1664 :             sts[1]->cng_type = sts[0]->cng_type;
     525        1664 :             sts[1]->bwidth = sts[0]->bwidth;
     526        1664 :             sts[0]->hFdCngDec->hFdCngCom->coherence[0] = sts[1]->hFdCngDec->hFdCngCom->coherence[0]; /* coherence is stored in sts[1] - see ivas_decision_matrix_dec() and FdCngDecodeMDCTStereoSID() */
     527        1664 :             sts[0]->hFdCngDec->hFdCngCom->no_side_flag = sts[1]->hFdCngDec->hFdCngCom->no_side_flag;
     528             : 
     529             :             /* configure when there is a switching from DFT CNG to MDCT CNG */
     530        1664 :             if ( sts[0]->first_CNG == 1 && sts[1]->first_CNG == 0 )
     531             :             {
     532           0 :                 configureFdCngDec( st->hFdCngDec, st->bwidth, st->element_brate, st->L_frame, st->last_L_frame, st->element_mode );
     533             :             }
     534             :         }
     535             : 
     536        3328 :         if ( sts[0]->first_CNG == 0 )
     537             :         {
     538             :             /* configure CNG after reading first side info from SID to get correct values for L_frame and bwidth if first SID is also first valid frame */
     539         178 :             configureFdCngDec( st->hFdCngDec, st->bwidth, st->element_brate, st->L_frame, st->last_L_frame, st->element_mode );
     540             :         }
     541             :     }
     542             : 
     543    16699767 :     return;
     544             : }
     545             : 
     546             : 
     547             : /*-------------------------------------------------------------------*
     548             :  * updateBuffersForDmxMdctStereo()
     549             :  *
     550             :  * synch buffers between channels for mono output and
     551             :  * apply passive downmix to certain buffers to enable smooth transitions
     552             :  * between active/inactive coding in MDCT-Stereo DTX
     553             :  *-------------------------------------------------------------------*/
     554             : 
     555        4095 : void updateBuffersForDmxMdctStereo(
     556             :     CPE_DEC_HANDLE hCPE,                  /* i/o: CPE handle                              */
     557             :     const int16_t output_frame,           /* i  : output frame length                     */
     558             :     float *output[CPE_CHANNELS],          /* i/o: decoder output                          */
     559             :     float synth[CPE_CHANNELS][L_FRAME48k] /* i/o: decoder synthesis                       */
     560             : )
     561             : {
     562             :     int16_t delay_buf_out_len, tcxltp_mem_in_len, delta, i;
     563             :     Decoder_State *sts[CPE_CHANNELS];
     564             : 
     565        4095 :     sts[0] = hCPE->hCoreCoder[0];
     566        4095 :     sts[1] = hCPE->hCoreCoder[1];
     567             : 
     568             :     /* synch buffers for inactive frames, but not for transition frames */
     569        4095 :     if ( hCPE->last_element_brate <= IVAS_SID_5k2 )
     570             :     {
     571        3952 :         mvr2r( output[0], output[1], output_frame );
     572        3952 :         mvr2r( synth[0], synth[1], output_frame );
     573             :     }
     574             : 
     575        4095 :     if ( hCPE->element_brate == IVAS_SID_5k2 && hCPE->last_element_brate > IVAS_SID_5k2 )
     576             :     {
     577             :         /* in the first SID frame after an active frame, create mid noise shape here, in SID frames that follow inactive frames, it is done directly in the SID decoding since the mid shape is being used in CNG then */
     578        3494 :         for ( int16_t p = 0; p < sts[0]->hFdCngDec->hFdCngCom->npart; p++ )
     579             :         {
     580        3351 :             sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[p] = 0.5f * ( sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[p] + sts[1]->hFdCngDec->hFdCngCom->sidNoiseEst[p] );
     581             :         }
     582             :     }
     583             : 
     584             :     /* for transition of active->inactive frame, apply passive downmix on buffers */
     585        4095 :     if ( hCPE->last_element_brate <= IVAS_SID_5k2 )
     586             :     {
     587        3952 :         delta = 1;
     588        3952 :         if ( output_frame == L_FRAME16k )
     589             :         {
     590        1044 :             delta = 2;
     591             :         }
     592        2908 :         else if ( output_frame == L_FRAME32k )
     593             :         {
     594        1074 :             delta = 4;
     595             :         }
     596        1834 :         else if ( output_frame == L_FRAME48k )
     597             :         {
     598        1834 :             delta = 6;
     599             :         }
     600             : 
     601        3952 :         delay_buf_out_len = delta * HQ_DELAY_COMP;
     602        3952 :         tcxltp_mem_in_len = NS2SA( sts[0]->output_Fs, TCXLTP_DELAY_NS );
     603             : 
     604        3952 :         assert( delay_buf_out_len > tcxltp_mem_in_len );
     605             : 
     606       38728 :         for ( i = 0; i < tcxltp_mem_in_len; i++ )
     607             :         {
     608       34776 :             sts[0]->hTcxLtpDec->tcxltp_mem_in[i] = INV_SQRT2 * ( sts[0]->hTcxLtpDec->tcxltp_mem_in[i] + sts[1]->hTcxLtpDec->tcxltp_mem_in[i] );
     609       34776 :             sts[0]->delay_buf_out[i] = INV_SQRT2 * ( sts[0]->delay_buf_out[i] + sts[1]->delay_buf_out[i] );
     610       34776 :             sts[0]->hHQ_core->old_out[i] = INV_SQRT2 * ( sts[0]->hHQ_core->old_out[i] + sts[1]->hHQ_core->old_out[i] );
     611       34776 :             sts[0]->hTcxLtpDec->tcxltp_mem_out[i] = INV_SQRT2 * ( sts[0]->hTcxLtpDec->tcxltp_mem_out[i] + sts[1]->hTcxLtpDec->tcxltp_mem_out[i] );
     612             :         }
     613      143056 :         for ( ; i < delay_buf_out_len; i++ )
     614             :         {
     615      139104 :             sts[0]->delay_buf_out[i] = INV_SQRT2 * ( sts[0]->delay_buf_out[i] + sts[1]->delay_buf_out[i] );
     616      139104 :             sts[0]->hHQ_core->old_out[i] = INV_SQRT2 * ( sts[0]->hHQ_core->old_out[i] + sts[1]->hHQ_core->old_out[i] );
     617      139104 :             sts[0]->hTcxLtpDec->tcxltp_mem_out[i] = INV_SQRT2 * ( sts[0]->hTcxLtpDec->tcxltp_mem_out[i] + sts[1]->hTcxLtpDec->tcxltp_mem_out[i] );
     618             :         }
     619     2612152 :         for ( ; i < output_frame; i++ )
     620             :         {
     621     2608200 :             sts[0]->hHQ_core->old_out[i] = INV_SQRT2 * ( sts[0]->hHQ_core->old_out[i] + sts[1]->hHQ_core->old_out[i] );
     622     2608200 :             sts[0]->hTcxLtpDec->tcxltp_mem_out[i] = INV_SQRT2 * ( sts[0]->hTcxLtpDec->tcxltp_mem_out[i] + sts[1]->hTcxLtpDec->tcxltp_mem_out[i] );
     623             :         }
     624             :     }
     625             : 
     626        4095 :     return;
     627             : }
     628             : 
     629             : 
     630             : /*-------------------------------------------------------------------*
     631             :  * applyDmxMdctStereo()
     632             :  *
     633             :  * apply passive downmix to certain buffers to enable smooth transitions
     634             :  * between active/inactive coding in MDCT-Stereo DTX
     635             :  *-------------------------------------------------------------------*/
     636             : 
     637       48470 : void applyDmxMdctStereo(
     638             :     const CPE_DEC_HANDLE hCPE,   /* i  : CPE handle          */
     639             :     float *output[CPE_CHANNELS], /* i/o: core decoder output */
     640             :     const int16_t output_frame   /* i  : output frame length */
     641             : )
     642             : {
     643             :     int16_t crossfade_len, i;
     644             :     int16_t dmx_len;
     645             :     float fade, step;
     646             : 
     647       48470 :     step = 1.f;
     648       48470 :     fade = 1.f;
     649       48470 :     dmx_len = output_frame;
     650             : 
     651       48470 :     if ( hCPE->last_element_brate <= IVAS_SID_5k2 )
     652             :     {
     653         131 :         crossfade_len = NS2SA( hCPE->hCoreCoder[0]->output_Fs, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS );
     654         131 :         step /= crossfade_len;
     655             :     }
     656             :     /* for first inactive CNG frame after active decoding we have to do a fade-OUT FROM the passive DMX */
     657       48339 :     else if ( hCPE->element_brate <= IVAS_SID_5k2 && hCPE->last_element_brate > IVAS_SID_5k2 )
     658             :     {
     659         143 :         crossfade_len = output_frame / 4;
     660         143 :         step /= -crossfade_len;
     661         143 :         fade = 0.f;
     662         143 :         dmx_len = crossfade_len;
     663             :     }
     664       48196 :     else if ( hCPE->last_element_mode == IVAS_CPE_DFT && hCPE->last_element_brate <= IVAS_32k )
     665             :     {
     666          69 :         crossfade_len = NS2SA( hCPE->hCoreCoder[0]->output_Fs, DELAY_CLDFB_NS );
     667          69 :         step /= crossfade_len;
     668             :     }
     669             :     else
     670             :     {
     671       48127 :         crossfade_len = 0;
     672             :     }
     673             : 
     674             :     /* apply crossfade */
     675       88978 :     for ( i = 0; i < crossfade_len; i++ )
     676             :     {
     677       40508 :         output[0][i] = output[0][i] * fade + ( output[0][i] + output[1][i] ) * INV_SQRT2 * ( 1 - fade );
     678       40508 :         fade -= step;
     679             :     }
     680             : 
     681             :     /* apply passive downmix on all-active-frame part */
     682    34766362 :     for ( ; i < dmx_len; i++ )
     683             :     {
     684    34717892 :         output[0][i] = ( output[0][i] + output[1][i] ) * INV_SQRT_2;
     685             :     }
     686             : 
     687       48470 :     return;
     688             : }

Generated by: LCOV version 1.14