Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(425)

Side by Side Diff: third_party/opus/src/silk/NLSF_encode.c

Issue 2962373002: [Opus] Update to v1.2.1 (Closed)
Patch Set: Pre-increment instead of post-increment Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/opus/src/silk/NLSF_del_dec_quant.c ('k') | third_party/opus/src/silk/NSQ.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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.
(...skipping 19 matching lines...) Expand all
30 #endif 30 #endif
31 31
32 #include "main.h" 32 #include "main.h"
33 #include "stack_alloc.h" 33 #include "stack_alloc.h"
34 34
35 /***********************/ 35 /***********************/
36 /* NLSF vector encoder */ 36 /* NLSF vector encoder */
37 /***********************/ 37 /***********************/
38 opus_int32 silk_NLSF_encode( /* O Returns RD value in Q25 */ 38 opus_int32 silk_NLSF_encode( /* O Returns RD value in Q25 */
39 opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ 39 opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */
40 opus_int16 *pNLSF_Q15, /* I/O Quantize d NLSF vector [ LPC_ORDER ] */ 40 opus_int16 *pNLSF_Q15, /* I/O (Un)quan tized NLSF vector [ LPC_ORDER ] */
41 const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ 41 const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */
42 const opus_int16 *pW_QW, /* I NLSF wei ght vector [ LPC_ORDER ] */ 42 const opus_int16 *pW_Q2, /* I NLSF wei ght vector [ LPC_ORDER ] */
43 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 */
44 const opus_int nSurvivors, /* I Max surv ivors after first stage */ 44 const opus_int nSurvivors, /* I Max surv ivors after first stage */
45 const opus_int signalType /* I Signal t ype: 0/1/2 */ 45 const opus_int signalType /* I Signal t ype: 0/1/2 */
46 ) 46 )
47 { 47 {
48 opus_int i, s, ind1, bestIndex, prob_Q8, bits_q7; 48 opus_int i, s, ind1, bestIndex, prob_Q8, bits_q7;
49 opus_int32 W_tmp_Q9, ret; 49 opus_int32 W_tmp_Q9, ret;
50 VARDECL( opus_int32, err_Q26 ); 50 VARDECL( opus_int32, err_Q24 );
51 VARDECL( opus_int32, RD_Q25 ); 51 VARDECL( opus_int32, RD_Q25 );
52 VARDECL( opus_int, tempIndices1 ); 52 VARDECL( opus_int, tempIndices1 );
53 VARDECL( opus_int8, tempIndices2 ); 53 VARDECL( opus_int8, tempIndices2 );
54 opus_int16 res_Q15[ MAX_LPC_ORDER ];
55 opus_int16 res_Q10[ MAX_LPC_ORDER ]; 54 opus_int16 res_Q10[ MAX_LPC_ORDER ];
56 opus_int16 NLSF_tmp_Q15[ MAX_LPC_ORDER ]; 55 opus_int16 NLSF_tmp_Q15[ MAX_LPC_ORDER ];
57 opus_int16 W_tmp_QW[ MAX_LPC_ORDER ];
58 opus_int16 W_adj_Q5[ MAX_LPC_ORDER ]; 56 opus_int16 W_adj_Q5[ MAX_LPC_ORDER ];
59 opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; 57 opus_uint8 pred_Q8[ MAX_LPC_ORDER ];
60 opus_int16 ec_ix[ MAX_LPC_ORDER ]; 58 opus_int16 ec_ix[ MAX_LPC_ORDER ];
61 const opus_uint8 *pCB_element, *iCDF_ptr; 59 const opus_uint8 *pCB_element, *iCDF_ptr;
60 const opus_int16 *pCB_Wght_Q9;
62 SAVE_STACK; 61 SAVE_STACK;
63 62
64 silk_assert( nSurvivors <= NLSF_VQ_MAX_SURVIVORS );
65 silk_assert( signalType >= 0 && signalType <= 2 ); 63 silk_assert( signalType >= 0 && signalType <= 2 );
66 silk_assert( NLSF_mu_Q20 <= 32767 && NLSF_mu_Q20 >= 0 ); 64 silk_assert( NLSF_mu_Q20 <= 32767 && NLSF_mu_Q20 >= 0 );
67 65
68 /* NLSF stabilization */ 66 /* NLSF stabilization */
69 silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->deltaMin_Q15, psNLSF_CB->order ); 67 silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->deltaMin_Q15, psNLSF_CB->order );
70 68
71 /* First stage: VQ */ 69 /* First stage: VQ */
72 ALLOC( err_Q26, psNLSF_CB->nVectors, opus_int32 ); 70 ALLOC( err_Q24, psNLSF_CB->nVectors, opus_int32 );
73 silk_NLSF_VQ( err_Q26, pNLSF_Q15, psNLSF_CB->CB1_NLSF_Q8, psNLSF_CB->nVector s, psNLSF_CB->order ); 71 silk_NLSF_VQ( err_Q24, pNLSF_Q15, psNLSF_CB->CB1_NLSF_Q8, psNLSF_CB->CB1_Wgh t_Q9, psNLSF_CB->nVectors, psNLSF_CB->order );
74 72
75 /* Sort the quantization errors */ 73 /* Sort the quantization errors */
76 ALLOC( tempIndices1, nSurvivors, opus_int ); 74 ALLOC( tempIndices1, nSurvivors, opus_int );
77 silk_insertion_sort_increasing( err_Q26, tempIndices1, psNLSF_CB->nVectors, nSurvivors ); 75 silk_insertion_sort_increasing( err_Q24, tempIndices1, psNLSF_CB->nVectors, nSurvivors );
78 76
79 ALLOC( RD_Q25, nSurvivors, opus_int32 ); 77 ALLOC( RD_Q25, nSurvivors, opus_int32 );
80 ALLOC( tempIndices2, nSurvivors * MAX_LPC_ORDER, opus_int8 ); 78 ALLOC( tempIndices2, nSurvivors * MAX_LPC_ORDER, opus_int8 );
81 79
82 /* Loop over survivors */ 80 /* Loop over survivors */
83 for( s = 0; s < nSurvivors; s++ ) { 81 for( s = 0; s < nSurvivors; s++ ) {
84 ind1 = tempIndices1[ s ]; 82 ind1 = tempIndices1[ s ];
85 83
86 /* Residual after first stage */ 84 /* Residual after first stage */
87 pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ ind1 * psNLSF_CB->order ]; 85 pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ ind1 * psNLSF_CB->order ];
86 pCB_Wght_Q9 = &psNLSF_CB->CB1_Wght_Q9[ ind1 * psNLSF_CB->order ];
88 for( i = 0; i < psNLSF_CB->order; i++ ) { 87 for( i = 0; i < psNLSF_CB->order; i++ ) {
89 NLSF_tmp_Q15[ i ] = silk_LSHIFT16( (opus_int16)pCB_element[ i ], 7 ) ; 88 NLSF_tmp_Q15[ i ] = silk_LSHIFT16( (opus_int16)pCB_element[ i ], 7 ) ;
90 res_Q15[ i ] = pNLSF_Q15[ i ] - NLSF_tmp_Q15[ i ]; 89 W_tmp_Q9 = pCB_Wght_Q9[ i ];
91 } 90 res_Q10[ i ] = (opus_int16)silk_RSHIFT( silk_SMULBB( pNLSF_Q15[ i ] - NLSF_tmp_Q15[ i ], W_tmp_Q9 ), 14 );
92 91 W_adj_Q5[ i ] = silk_DIV32_varQ( (opus_int32)pW_Q2[ i ], silk_SMULBB ( W_tmp_Q9, W_tmp_Q9 ), 21 );
93 /* Weights from codebook vector */
94 silk_NLSF_VQ_weights_laroia( W_tmp_QW, NLSF_tmp_Q15, psNLSF_CB->order );
95
96 /* Apply square-rooted weights */
97 for( i = 0; i < psNLSF_CB->order; i++ ) {
98 W_tmp_Q9 = silk_SQRT_APPROX( silk_LSHIFT( (opus_int32)W_tmp_QW[ i ], 18 - NLSF_W_Q ) );
99 res_Q10[ i ] = (opus_int16)silk_RSHIFT( silk_SMULBB( res_Q15[ i ], W _tmp_Q9 ), 14 );
100 }
101
102 /* Modify input weights accordingly */
103 for( i = 0; i < psNLSF_CB->order; i++ ) {
104 W_adj_Q5[ i ] = silk_DIV32_16( silk_LSHIFT( (opus_int32)pW_QW[ i ], 5 ), W_tmp_QW[ i ] );
105 } 92 }
106 93
107 /* Unpack entropy table indices and predictor for current CB1 index */ 94 /* Unpack entropy table indices and predictor for current CB1 index */
108 silk_NLSF_unpack( ec_ix, pred_Q8, psNLSF_CB, ind1 ); 95 silk_NLSF_unpack( ec_ix, pred_Q8, psNLSF_CB, ind1 );
109 96
110 /* Trellis quantizer */ 97 /* Trellis quantizer */
111 RD_Q25[ s ] = silk_NLSF_del_dec_quant( &tempIndices2[ s * MAX_LPC_ORDER ], res_Q10, W_adj_Q5, pred_Q8, ec_ix, 98 RD_Q25[ s ] = silk_NLSF_del_dec_quant( &tempIndices2[ s * MAX_LPC_ORDER ], res_Q10, W_adj_Q5, pred_Q8, ec_ix,
112 psNLSF_CB->ec_Rates_Q5, psNLSF_CB->quantStepSize_Q16, psNLSF_CB->inv QuantStepSize_Q6, NLSF_mu_Q20, psNLSF_CB->order ); 99 psNLSF_CB->ec_Rates_Q5, psNLSF_CB->quantStepSize_Q16, psNLSF_CB->inv QuantStepSize_Q6, NLSF_mu_Q20, psNLSF_CB->order );
113 100
114 /* Add rate for first stage */ 101 /* Add rate for first stage */
(...skipping 13 matching lines...) Expand all
128 NLSFIndices[ 0 ] = (opus_int8)tempIndices1[ bestIndex ]; 115 NLSFIndices[ 0 ] = (opus_int8)tempIndices1[ bestIndex ];
129 silk_memcpy( &NLSFIndices[ 1 ], &tempIndices2[ bestIndex * MAX_LPC_ORDER ], psNLSF_CB->order * sizeof( opus_int8 ) ); 116 silk_memcpy( &NLSFIndices[ 1 ], &tempIndices2[ bestIndex * MAX_LPC_ORDER ], psNLSF_CB->order * sizeof( opus_int8 ) );
130 117
131 /* Decode */ 118 /* Decode */
132 silk_NLSF_decode( pNLSF_Q15, NLSFIndices, psNLSF_CB ); 119 silk_NLSF_decode( pNLSF_Q15, NLSFIndices, psNLSF_CB );
133 120
134 ret = RD_Q25[ 0 ]; 121 ret = RD_Q25[ 0 ];
135 RESTORE_STACK; 122 RESTORE_STACK;
136 return ret; 123 return ret;
137 } 124 }
OLDNEW
« no previous file with comments | « third_party/opus/src/silk/NLSF_del_dec_quant.c ('k') | third_party/opus/src/silk/NSQ.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698