LCOV - code coverage report
Current view: top level - media/libopus/silk - quant_LTP_gains.c (source / functions) Hit Total Coverage
Test: output.info Lines: 0 37 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 1 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /***********************************************************************
       2             : Copyright (c) 2006-2011, Skype Limited. All rights reserved.
       3             : Redistribution and use in source and binary forms, with or without
       4             : modification, are permitted provided that the following conditions
       5             : are met:
       6             : - Redistributions of source code must retain the above copyright notice,
       7             : this list of conditions and the following disclaimer.
       8             : - Redistributions in binary form must reproduce the above copyright
       9             : notice, this list of conditions and the following disclaimer in the
      10             : documentation and/or other materials provided with the distribution.
      11             : - Neither the name of Internet Society, IETF or IETF Trust, nor the
      12             : names of specific contributors, may be used to endorse or promote
      13             : products derived from this software without specific prior written
      14             : permission.
      15             : THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
      16             : AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      17             : IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      18             : ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
      19             : LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
      20             : CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
      21             : SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
      22             : INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
      23             : CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      24             : ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
      25             : POSSIBILITY OF SUCH DAMAGE.
      26             : ***********************************************************************/
      27             : 
      28             : #ifdef HAVE_CONFIG_H
      29             : #include "config.h"
      30             : #endif
      31             : 
      32             : #include "main.h"
      33             : #include "tuning_parameters.h"
      34             : 
      35           0 : void silk_quant_LTP_gains(
      36             :     opus_int16                  B_Q14[ MAX_NB_SUBFR * LTP_ORDER ],          /* O    Quantized LTP gains             */
      37             :     opus_int8                   cbk_index[ MAX_NB_SUBFR ],                  /* O    Codebook Index                  */
      38             :     opus_int8                   *periodicity_index,                         /* O    Periodicity Index               */
      39             :     opus_int32                  *sum_log_gain_Q7,                           /* I/O  Cumulative max prediction gain  */
      40             :     opus_int                    *pred_gain_dB_Q7,                           /* O    LTP prediction gain             */
      41             :     const opus_int32            XX_Q17[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I    Correlation matrix in Q18       */
      42             :     const opus_int32            xX_Q17[ MAX_NB_SUBFR*LTP_ORDER ],           /* I    Correlation vector in Q18       */
      43             :     const opus_int              subfr_len,                                  /* I    Number of samples per subframe  */
      44             :     const opus_int              nb_subfr,                                   /* I    Number of subframes             */
      45             :     int                         arch                                        /* I    Run-time architecture           */
      46             : )
      47             : {
      48             :     opus_int             j, k, cbk_size;
      49             :     opus_int8            temp_idx[ MAX_NB_SUBFR ];
      50             :     const opus_uint8     *cl_ptr_Q5;
      51             :     const opus_int8      *cbk_ptr_Q7;
      52             :     const opus_uint8     *cbk_gain_ptr_Q7;
      53             :     const opus_int32     *XX_Q17_ptr, *xX_Q17_ptr;
      54             :     opus_int32           res_nrg_Q15_subfr, res_nrg_Q15, rate_dist_Q7_subfr, rate_dist_Q7, min_rate_dist_Q7;
      55             :     opus_int32           sum_log_gain_tmp_Q7, best_sum_log_gain_Q7, max_gain_Q7;
      56             :     opus_int             gain_Q7;
      57             : 
      58             :     /***************************************************/
      59             :     /* iterate over different codebooks with different */
      60             :     /* rates/distortions, and choose best */
      61             :     /***************************************************/
      62           0 :     min_rate_dist_Q7 = silk_int32_MAX;
      63           0 :     best_sum_log_gain_Q7 = 0;
      64           0 :     for( k = 0; k < 3; k++ ) {
      65             :         /* Safety margin for pitch gain control, to take into account factors
      66             :            such as state rescaling/rewhitening. */
      67           0 :         opus_int32 gain_safety = SILK_FIX_CONST( 0.4, 7 );
      68             : 
      69           0 :         cl_ptr_Q5  = silk_LTP_gain_BITS_Q5_ptrs[ k ];
      70           0 :         cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[        k ];
      71           0 :         cbk_gain_ptr_Q7 = silk_LTP_vq_gain_ptrs_Q7[ k ];
      72           0 :         cbk_size   = silk_LTP_vq_sizes[          k ];
      73             : 
      74             :         /* Set up pointers to first subframe */
      75           0 :         XX_Q17_ptr = XX_Q17;
      76           0 :         xX_Q17_ptr = xX_Q17;
      77             : 
      78           0 :         res_nrg_Q15 = 0;
      79           0 :         rate_dist_Q7 = 0;
      80           0 :         sum_log_gain_tmp_Q7 = *sum_log_gain_Q7;
      81           0 :         for( j = 0; j < nb_subfr; j++ ) {
      82           0 :             max_gain_Q7 = silk_log2lin( ( SILK_FIX_CONST( MAX_SUM_LOG_GAIN_DB / 6.0, 7 ) - sum_log_gain_tmp_Q7 )
      83             :                                         + SILK_FIX_CONST( 7, 7 ) ) - gain_safety;
      84           0 :             silk_VQ_WMat_EC(
      85             :                 &temp_idx[ j ],         /* O    index of best codebook vector                           */
      86             :                 &res_nrg_Q15_subfr,     /* O    residual energy                                         */
      87             :                 &rate_dist_Q7_subfr,    /* O    best weighted quantization error + mu * rate            */
      88             :                 &gain_Q7,               /* O    sum of absolute LTP coefficients                        */
      89             :                 XX_Q17_ptr,             /* I    correlation matrix                                      */
      90             :                 xX_Q17_ptr,             /* I    correlation vector                                      */
      91             :                 cbk_ptr_Q7,             /* I    codebook                                                */
      92             :                 cbk_gain_ptr_Q7,        /* I    codebook effective gains                                */
      93             :                 cl_ptr_Q5,              /* I    code length for each codebook vector                    */
      94             :                 subfr_len,              /* I    number of samples per subframe                          */
      95             :                 max_gain_Q7,            /* I    maximum sum of absolute LTP coefficients                */
      96             :                 cbk_size,               /* I    number of vectors in codebook                           */
      97             :                 arch                    /* I    Run-time architecture                                   */
      98             :             );
      99             : 
     100           0 :             res_nrg_Q15  = silk_ADD_POS_SAT32( res_nrg_Q15, res_nrg_Q15_subfr );
     101           0 :             rate_dist_Q7 = silk_ADD_POS_SAT32( rate_dist_Q7, rate_dist_Q7_subfr );
     102           0 :             sum_log_gain_tmp_Q7 = silk_max(0, sum_log_gain_tmp_Q7
     103             :                                 + silk_lin2log( gain_safety + gain_Q7 ) - SILK_FIX_CONST( 7, 7 ));
     104             : 
     105           0 :             XX_Q17_ptr += LTP_ORDER * LTP_ORDER;
     106           0 :             xX_Q17_ptr += LTP_ORDER;
     107             :         }
     108             : 
     109           0 :         if( rate_dist_Q7 <= min_rate_dist_Q7 ) {
     110           0 :             min_rate_dist_Q7 = rate_dist_Q7;
     111           0 :             *periodicity_index = (opus_int8)k;
     112           0 :             silk_memcpy( cbk_index, temp_idx, nb_subfr * sizeof( opus_int8 ) );
     113           0 :             best_sum_log_gain_Q7 = sum_log_gain_tmp_Q7;
     114             :         }
     115             :     }
     116             : 
     117           0 :     cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ *periodicity_index ];
     118           0 :     for( j = 0; j < nb_subfr; j++ ) {
     119           0 :         for( k = 0; k < LTP_ORDER; k++ ) {
     120           0 :             B_Q14[ j * LTP_ORDER + k ] = silk_LSHIFT( cbk_ptr_Q7[ cbk_index[ j ] * LTP_ORDER + k ], 7 );
     121             :         }
     122             :     }
     123             : 
     124           0 :     if( nb_subfr == 2 ) {
     125           0 :         res_nrg_Q15 = silk_RSHIFT32( res_nrg_Q15, 1 );
     126             :     } else {
     127           0 :         res_nrg_Q15 = silk_RSHIFT32( res_nrg_Q15, 2 );
     128             :     }
     129             : 
     130           0 :     *sum_log_gain_Q7 = best_sum_log_gain_Q7;
     131           0 :     *pred_gain_dB_Q7 = (opus_int)silk_SMULBB( -3, silk_lin2log( res_nrg_Q15 ) - ( 15 << 7 ) );
     132           0 : }

Generated by: LCOV version 1.13