| OLD | NEW | 
|---|
| 1 /*********************************************************************** | 1 /*********************************************************************** | 
| 2 Copyright (c) 2006-2011, Skype Limited. All rights reserved. | 2 Copyright (c) 2006-2011, Skype Limited. All rights reserved. | 
| 3 Redistribution and use in source and binary forms, with or without | 3 Redistribution and use in source and binary forms, with or without | 
| 4 modification, are permitted provided that the following conditions | 4 modification, are permitted provided that the following conditions | 
| 5 are met: | 5 are met: | 
| 6 - Redistributions of source code must retain the above copyright notice, | 6 - Redistributions of source code must retain the above copyright notice, | 
| 7 this list of conditions and the following disclaimer. | 7 this list of conditions and the following disclaimer. | 
| 8 - Redistributions in binary form must reproduce the above copyright | 8 - Redistributions in binary form must reproduce the above copyright | 
| 9 notice, this list of conditions and the following disclaimer in the | 9 notice, this list of conditions and the following disclaimer in the | 
| 10 documentation and/or other materials provided with the distribution. | 10 documentation and/or other materials provided with the distribution. | 
| 11 - Neither the name of Internet Society, IETF or IETF Trust, nor the | 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 | 12 names of specific contributors, may be used to endorse or promote | 
| 13 products derived from this software without specific prior written | 13 products derived from this software without specific prior written | 
| 14 permission. | 14 permission. | 
| 15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” | 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 | 16 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
| 17 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 17 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
| 18 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | 18 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | 
| 19 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 19 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
| 20 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 20 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
| 21 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 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 | 22 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 
| 23 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 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 | 24 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 
| 25 POSSIBILITY OF SUCH DAMAGE. | 25 POSSIBILITY OF SUCH DAMAGE. | 
| 26 ***********************************************************************/ | 26 ***********************************************************************/ | 
| 27 | 27 | 
| 28 #ifdef HAVE_CONFIG_H | 28 #ifdef HAVE_CONFIG_H | 
| 29 #include "config.h" | 29 #include "config.h" | 
| 30 #endif | 30 #endif | 
| 31 | 31 | 
| 32 #include "main.h" | 32 #include "main.h" | 
|  | 33 #include "stack_alloc.h" | 
| 33 | 34 | 
| 34 /***********************/ | 35 /***********************/ | 
| 35 /* NLSF vector encoder */ | 36 /* NLSF vector encoder */ | 
| 36 /***********************/ | 37 /***********************/ | 
| 37 opus_int32 silk_NLSF_encode(                                    /* O    Returns 
     RD value in Q25                     */ | 38 opus_int32 silk_NLSF_encode(                                    /* O    Returns 
     RD value in Q25                     */ | 
| 38           opus_int8             *NLSFIndices,                   /* I    Codebook
      path vector [ LPC_ORDER + 1 ]      */ | 39           opus_int8             *NLSFIndices,                   /* I    Codebook
      path vector [ LPC_ORDER + 1 ]      */ | 
| 39           opus_int16            *pNLSF_Q15,                     /* I/O  Quantize
     d NLSF vector [ LPC_ORDER ]         */ | 40           opus_int16            *pNLSF_Q15,                     /* I/O  Quantize
     d NLSF vector [ LPC_ORDER ]         */ | 
| 40     const silk_NLSF_CB_struct   *psNLSF_CB,                     /* I    Codebook
      object                             */ | 41     const silk_NLSF_CB_struct   *psNLSF_CB,                     /* I    Codebook
      object                             */ | 
| 41     const opus_int16            *pW_QW,                         /* I    NLSF wei
     ght vector [ LPC_ORDER ]            */ | 42     const opus_int16            *pW_QW,                         /* I    NLSF wei
     ght vector [ LPC_ORDER ]            */ | 
| 42     const opus_int              NLSF_mu_Q20,                    /* I    Rate wei
     ght for the RD optimization         */ | 43     const opus_int              NLSF_mu_Q20,                    /* I    Rate wei
     ght for the RD optimization         */ | 
| 43     const opus_int              nSurvivors,                     /* I    Max surv
     ivors after first stage             */ | 44     const opus_int              nSurvivors,                     /* I    Max surv
     ivors after first stage             */ | 
| 44     const opus_int              signalType                      /* I    Signal t
     ype: 0/1/2                          */ | 45     const opus_int              signalType                      /* I    Signal t
     ype: 0/1/2                          */ | 
| 45 ) | 46 ) | 
| 46 { | 47 { | 
| 47     opus_int         i, s, ind1, bestIndex, prob_Q8, bits_q7; | 48     opus_int         i, s, ind1, bestIndex, prob_Q8, bits_q7; | 
| 48     opus_int32       W_tmp_Q9; | 49     opus_int32       W_tmp_Q9; | 
| 49     opus_int32       err_Q26[      NLSF_VQ_MAX_VECTORS ]; | 50     VARDECL( opus_int32, err_Q26 ); | 
| 50     opus_int32       RD_Q25[       NLSF_VQ_MAX_SURVIVORS ]; | 51     VARDECL( opus_int32, RD_Q25 ); | 
| 51     opus_int         tempIndices1[ NLSF_VQ_MAX_SURVIVORS ]; | 52     VARDECL( opus_int, tempIndices1 ); | 
| 52     opus_int8        tempIndices2[ NLSF_VQ_MAX_SURVIVORS * MAX_LPC_ORDER ]; | 53     VARDECL( opus_int8, tempIndices2 ); | 
| 53     opus_int16       res_Q15[      MAX_LPC_ORDER ]; | 54     opus_int16       res_Q15[      MAX_LPC_ORDER ]; | 
| 54     opus_int16       res_Q10[      MAX_LPC_ORDER ]; | 55     opus_int16       res_Q10[      MAX_LPC_ORDER ]; | 
| 55     opus_int16       NLSF_tmp_Q15[ MAX_LPC_ORDER ]; | 56     opus_int16       NLSF_tmp_Q15[ MAX_LPC_ORDER ]; | 
| 56     opus_int16       W_tmp_QW[     MAX_LPC_ORDER ]; | 57     opus_int16       W_tmp_QW[     MAX_LPC_ORDER ]; | 
| 57     opus_int16       W_adj_Q5[     MAX_LPC_ORDER ]; | 58     opus_int16       W_adj_Q5[     MAX_LPC_ORDER ]; | 
| 58     opus_uint8       pred_Q8[      MAX_LPC_ORDER ]; | 59     opus_uint8       pred_Q8[      MAX_LPC_ORDER ]; | 
| 59     opus_int16       ec_ix[        MAX_LPC_ORDER ]; | 60     opus_int16       ec_ix[        MAX_LPC_ORDER ]; | 
| 60     const opus_uint8 *pCB_element, *iCDF_ptr; | 61     const opus_uint8 *pCB_element, *iCDF_ptr; | 
|  | 62     SAVE_STACK; | 
| 61 | 63 | 
| 62     silk_assert( nSurvivors <= NLSF_VQ_MAX_SURVIVORS ); | 64     silk_assert( nSurvivors <= NLSF_VQ_MAX_SURVIVORS ); | 
| 63     silk_assert( signalType >= 0 && signalType <= 2 ); | 65     silk_assert( signalType >= 0 && signalType <= 2 ); | 
| 64     silk_assert( NLSF_mu_Q20 <= 32767 && NLSF_mu_Q20 >= 0 ); | 66     silk_assert( NLSF_mu_Q20 <= 32767 && NLSF_mu_Q20 >= 0 ); | 
| 65 | 67 | 
| 66     /* NLSF stabilization */ | 68     /* NLSF stabilization */ | 
| 67     silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->deltaMin_Q15, psNLSF_CB->order ); | 69     silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->deltaMin_Q15, psNLSF_CB->order ); | 
| 68 | 70 | 
| 69     /* First stage: VQ */ | 71     /* First stage: VQ */ | 
|  | 72     ALLOC( err_Q26, psNLSF_CB->nVectors, opus_int32 ); | 
| 70     silk_NLSF_VQ( err_Q26, pNLSF_Q15, psNLSF_CB->CB1_NLSF_Q8, psNLSF_CB->nVector
     s, psNLSF_CB->order ); | 73     silk_NLSF_VQ( err_Q26, pNLSF_Q15, psNLSF_CB->CB1_NLSF_Q8, psNLSF_CB->nVector
     s, psNLSF_CB->order ); | 
| 71 | 74 | 
| 72     /* Sort the quantization errors */ | 75     /* Sort the quantization errors */ | 
|  | 76     ALLOC( tempIndices1, nSurvivors, opus_int ); | 
| 73     silk_insertion_sort_increasing( err_Q26, tempIndices1, psNLSF_CB->nVectors, 
     nSurvivors ); | 77     silk_insertion_sort_increasing( err_Q26, tempIndices1, psNLSF_CB->nVectors, 
     nSurvivors ); | 
| 74 | 78 | 
|  | 79     ALLOC( RD_Q25, nSurvivors, opus_int32 ); | 
|  | 80     ALLOC( tempIndices2, nSurvivors * MAX_LPC_ORDER, opus_int8 ); | 
|  | 81 | 
| 75     /* Loop over survivors */ | 82     /* Loop over survivors */ | 
| 76     for( s = 0; s < nSurvivors; s++ ) { | 83     for( s = 0; s < nSurvivors; s++ ) { | 
| 77         ind1 = tempIndices1[ s ]; | 84         ind1 = tempIndices1[ s ]; | 
| 78 | 85 | 
| 79         /* Residual after first stage */ | 86         /* Residual after first stage */ | 
| 80         pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ ind1 * psNLSF_CB->order ]; | 87         pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ ind1 * psNLSF_CB->order ]; | 
| 81         for( i = 0; i < psNLSF_CB->order; i++ ) { | 88         for( i = 0; i < psNLSF_CB->order; i++ ) { | 
| 82             NLSF_tmp_Q15[ i ] = silk_LSHIFT16( (opus_int16)pCB_element[ i ], 7 )
     ; | 89             NLSF_tmp_Q15[ i ] = silk_LSHIFT16( (opus_int16)pCB_element[ i ], 7 )
     ; | 
| 83             res_Q15[ i ] = pNLSF_Q15[ i ] - NLSF_tmp_Q15[ i ]; | 90             res_Q15[ i ] = pNLSF_Q15[ i ] - NLSF_tmp_Q15[ i ]; | 
| 84         } | 91         } | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 117 | 124 | 
| 118     /* Find the lowest rate-distortion error */ | 125     /* Find the lowest rate-distortion error */ | 
| 119     silk_insertion_sort_increasing( RD_Q25, &bestIndex, nSurvivors, 1 ); | 126     silk_insertion_sort_increasing( RD_Q25, &bestIndex, nSurvivors, 1 ); | 
| 120 | 127 | 
| 121     NLSFIndices[ 0 ] = (opus_int8)tempIndices1[ bestIndex ]; | 128     NLSFIndices[ 0 ] = (opus_int8)tempIndices1[ bestIndex ]; | 
| 122     silk_memcpy( &NLSFIndices[ 1 ], &tempIndices2[ bestIndex * MAX_LPC_ORDER ], 
     psNLSF_CB->order * sizeof( opus_int8 ) ); | 129     silk_memcpy( &NLSFIndices[ 1 ], &tempIndices2[ bestIndex * MAX_LPC_ORDER ], 
     psNLSF_CB->order * sizeof( opus_int8 ) ); | 
| 123 | 130 | 
| 124     /* Decode */ | 131     /* Decode */ | 
| 125     silk_NLSF_decode( pNLSF_Q15, NLSFIndices, psNLSF_CB ); | 132     silk_NLSF_decode( pNLSF_Q15, NLSFIndices, psNLSF_CB ); | 
| 126 | 133 | 
|  | 134     RESTORE_STACK; | 
| 127     return RD_Q25[ 0 ]; | 135     return RD_Q25[ 0 ]; | 
| 128 } | 136 } | 
| OLD | NEW | 
|---|