LCOV - code coverage report
Current view: top level - media/libopus/silk - shell_coder.c (source / functions) Hit Total Coverage
Test: output.info Lines: 0 53 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 5 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             : 
      34             : /* shell coder; pulse-subframe length is hardcoded */
      35             : 
      36           0 : static OPUS_INLINE void combine_pulses(
      37             :     opus_int         *out,   /* O    combined pulses vector [len] */
      38             :     const opus_int   *in,    /* I    input vector       [2 * len] */
      39             :     const opus_int   len     /* I    number of OUTPUT samples     */
      40             : )
      41             : {
      42             :     opus_int k;
      43           0 :     for( k = 0; k < len; k++ ) {
      44           0 :         out[ k ] = in[ 2 * k ] + in[ 2 * k + 1 ];
      45             :     }
      46           0 : }
      47             : 
      48           0 : static OPUS_INLINE void encode_split(
      49             :     ec_enc                      *psRangeEnc,    /* I/O  compressor data structure                   */
      50             :     const opus_int              p_child1,       /* I    pulse amplitude of first child subframe     */
      51             :     const opus_int              p,              /* I    pulse amplitude of current subframe         */
      52             :     const opus_uint8            *shell_table    /* I    table of shell cdfs                         */
      53             : )
      54             : {
      55           0 :     if( p > 0 ) {
      56           0 :         ec_enc_icdf( psRangeEnc, p_child1, &shell_table[ silk_shell_code_table_offsets[ p ] ], 8 );
      57             :     }
      58           0 : }
      59             : 
      60           0 : static OPUS_INLINE void decode_split(
      61             :     opus_int16                  *p_child1,      /* O    pulse amplitude of first child subframe     */
      62             :     opus_int16                  *p_child2,      /* O    pulse amplitude of second child subframe    */
      63             :     ec_dec                      *psRangeDec,    /* I/O  Compressor data structure                   */
      64             :     const opus_int              p,              /* I    pulse amplitude of current subframe         */
      65             :     const opus_uint8            *shell_table    /* I    table of shell cdfs                         */
      66             : )
      67             : {
      68           0 :     if( p > 0 ) {
      69           0 :         p_child1[ 0 ] = ec_dec_icdf( psRangeDec, &shell_table[ silk_shell_code_table_offsets[ p ] ], 8 );
      70           0 :         p_child2[ 0 ] = p - p_child1[ 0 ];
      71             :     } else {
      72           0 :         p_child1[ 0 ] = 0;
      73           0 :         p_child2[ 0 ] = 0;
      74             :     }
      75           0 : }
      76             : 
      77             : /* Shell encoder, operates on one shell code frame of 16 pulses */
      78           0 : void silk_shell_encoder(
      79             :     ec_enc                      *psRangeEnc,                    /* I/O  compressor data structure                   */
      80             :     const opus_int              *pulses0                        /* I    data: nonnegative pulse amplitudes          */
      81             : )
      82             : {
      83             :     opus_int pulses1[ 8 ], pulses2[ 4 ], pulses3[ 2 ], pulses4[ 1 ];
      84             : 
      85             :     /* this function operates on one shell code frame of 16 pulses */
      86             :     silk_assert( SHELL_CODEC_FRAME_LENGTH == 16 );
      87             : 
      88             :     /* tree representation per pulse-subframe */
      89           0 :     combine_pulses( pulses1, pulses0, 8 );
      90           0 :     combine_pulses( pulses2, pulses1, 4 );
      91           0 :     combine_pulses( pulses3, pulses2, 2 );
      92           0 :     combine_pulses( pulses4, pulses3, 1 );
      93             : 
      94           0 :     encode_split( psRangeEnc, pulses3[  0 ], pulses4[ 0 ], silk_shell_code_table3 );
      95             : 
      96           0 :     encode_split( psRangeEnc, pulses2[  0 ], pulses3[ 0 ], silk_shell_code_table2 );
      97             : 
      98           0 :     encode_split( psRangeEnc, pulses1[  0 ], pulses2[ 0 ], silk_shell_code_table1 );
      99           0 :     encode_split( psRangeEnc, pulses0[  0 ], pulses1[ 0 ], silk_shell_code_table0 );
     100           0 :     encode_split( psRangeEnc, pulses0[  2 ], pulses1[ 1 ], silk_shell_code_table0 );
     101             : 
     102           0 :     encode_split( psRangeEnc, pulses1[  2 ], pulses2[ 1 ], silk_shell_code_table1 );
     103           0 :     encode_split( psRangeEnc, pulses0[  4 ], pulses1[ 2 ], silk_shell_code_table0 );
     104           0 :     encode_split( psRangeEnc, pulses0[  6 ], pulses1[ 3 ], silk_shell_code_table0 );
     105             : 
     106           0 :     encode_split( psRangeEnc, pulses2[  2 ], pulses3[ 1 ], silk_shell_code_table2 );
     107             : 
     108           0 :     encode_split( psRangeEnc, pulses1[  4 ], pulses2[ 2 ], silk_shell_code_table1 );
     109           0 :     encode_split( psRangeEnc, pulses0[  8 ], pulses1[ 4 ], silk_shell_code_table0 );
     110           0 :     encode_split( psRangeEnc, pulses0[ 10 ], pulses1[ 5 ], silk_shell_code_table0 );
     111             : 
     112           0 :     encode_split( psRangeEnc, pulses1[  6 ], pulses2[ 3 ], silk_shell_code_table1 );
     113           0 :     encode_split( psRangeEnc, pulses0[ 12 ], pulses1[ 6 ], silk_shell_code_table0 );
     114           0 :     encode_split( psRangeEnc, pulses0[ 14 ], pulses1[ 7 ], silk_shell_code_table0 );
     115           0 : }
     116             : 
     117             : 
     118             : /* Shell decoder, operates on one shell code frame of 16 pulses */
     119           0 : void silk_shell_decoder(
     120             :     opus_int16                  *pulses0,                       /* O    data: nonnegative pulse amplitudes          */
     121             :     ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
     122             :     const opus_int              pulses4                         /* I    number of pulses per pulse-subframe         */
     123             : )
     124             : {
     125             :     opus_int16 pulses3[ 2 ], pulses2[ 4 ], pulses1[ 8 ];
     126             : 
     127             :     /* this function operates on one shell code frame of 16 pulses */
     128             :     silk_assert( SHELL_CODEC_FRAME_LENGTH == 16 );
     129             : 
     130           0 :     decode_split( &pulses3[  0 ], &pulses3[  1 ], psRangeDec, pulses4,      silk_shell_code_table3 );
     131             : 
     132           0 :     decode_split( &pulses2[  0 ], &pulses2[  1 ], psRangeDec, pulses3[ 0 ], silk_shell_code_table2 );
     133             : 
     134           0 :     decode_split( &pulses1[  0 ], &pulses1[  1 ], psRangeDec, pulses2[ 0 ], silk_shell_code_table1 );
     135           0 :     decode_split( &pulses0[  0 ], &pulses0[  1 ], psRangeDec, pulses1[ 0 ], silk_shell_code_table0 );
     136           0 :     decode_split( &pulses0[  2 ], &pulses0[  3 ], psRangeDec, pulses1[ 1 ], silk_shell_code_table0 );
     137             : 
     138           0 :     decode_split( &pulses1[  2 ], &pulses1[  3 ], psRangeDec, pulses2[ 1 ], silk_shell_code_table1 );
     139           0 :     decode_split( &pulses0[  4 ], &pulses0[  5 ], psRangeDec, pulses1[ 2 ], silk_shell_code_table0 );
     140           0 :     decode_split( &pulses0[  6 ], &pulses0[  7 ], psRangeDec, pulses1[ 3 ], silk_shell_code_table0 );
     141             : 
     142           0 :     decode_split( &pulses2[  2 ], &pulses2[  3 ], psRangeDec, pulses3[ 1 ], silk_shell_code_table2 );
     143             : 
     144           0 :     decode_split( &pulses1[  4 ], &pulses1[  5 ], psRangeDec, pulses2[ 2 ], silk_shell_code_table1 );
     145           0 :     decode_split( &pulses0[  8 ], &pulses0[  9 ], psRangeDec, pulses1[ 4 ], silk_shell_code_table0 );
     146           0 :     decode_split( &pulses0[ 10 ], &pulses0[ 11 ], psRangeDec, pulses1[ 5 ], silk_shell_code_table0 );
     147             : 
     148           0 :     decode_split( &pulses1[  6 ], &pulses1[  7 ], psRangeDec, pulses2[ 3 ], silk_shell_code_table1 );
     149           0 :     decode_split( &pulses0[ 12 ], &pulses0[ 13 ], psRangeDec, pulses1[ 6 ], silk_shell_code_table0 );
     150           0 :     decode_split( &pulses0[ 14 ], &pulses0[ 15 ], psRangeDec, pulses1[ 7 ], silk_shell_code_table0 );
     151           0 : }

Generated by: LCOV version 1.13