| OLD | NEW |
| (Empty) | |
| 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 /* Convert Left/Right stereo signal to adaptive Mid/Side representation */ |
| 35 void silk_stereo_LR_to_MS( |
| 36 stereo_enc_state *state, /* I/O State
*/ |
| 37 opus_int16 x1[], /* I/O Left inp
ut signal, becomes mid signal */ |
| 38 opus_int16 x2[], /* I/O Right in
put signal, becomes side signal */ |
| 39 opus_int8 ix[ 2 ][ 3 ], /* O Quantiza
tion indices */ |
| 40 opus_int8 *mid_only_flag, /* O Flag: on
ly mid signal coded */ |
| 41 opus_int32 mid_side_rates_bps[], /* O Bitrates
for mid and side signals */ |
| 42 opus_int32 total_rate_bps, /* I Total bi
trate */ |
| 43 opus_int prev_speech_act_Q8, /* I Speech a
ctivity level in previous frame */ |
| 44 opus_int toMono, /* I Last fra
me before a stereo->mono transition */ |
| 45 opus_int fs_kHz, /* I Sample r
ate (kHz) */ |
| 46 opus_int frame_length /* I Number o
f samples */ |
| 47 ) |
| 48 { |
| 49 opus_int n, is10msFrame, denom_Q16, delta0_Q13, delta1_Q13; |
| 50 opus_int32 sum, diff, smooth_coef_Q16, pred_Q13[ 2 ], pred0_Q13, pred1_Q13; |
| 51 opus_int32 LP_ratio_Q14, HP_ratio_Q14, frac_Q16, frac_3_Q16, min_mid_rate_bp
s, width_Q14, w_Q24, deltaw_Q24; |
| 52 opus_int16 side[ MAX_FRAME_LENGTH + 2 ]; |
| 53 opus_int16 LP_mid[ MAX_FRAME_LENGTH ], HP_mid[ MAX_FRAME_LENGTH ]; |
| 54 opus_int16 LP_side[ MAX_FRAME_LENGTH ], HP_side[ MAX_FRAME_LENGTH ]; |
| 55 opus_int16 *mid = &x1[ -2 ]; |
| 56 |
| 57 /* Convert to basic mid/side signals */ |
| 58 for( n = 0; n < frame_length + 2; n++ ) { |
| 59 sum = x1[ n - 2 ] + (opus_int32)x2[ n - 2 ]; |
| 60 diff = x1[ n - 2 ] - (opus_int32)x2[ n - 2 ]; |
| 61 mid[ n ] = (opus_int16)silk_RSHIFT_ROUND( sum, 1 ); |
| 62 side[ n ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( diff, 1 ) ); |
| 63 } |
| 64 |
| 65 /* Buffering */ |
| 66 silk_memcpy( mid, state->sMid, 2 * sizeof( opus_int16 ) ); |
| 67 silk_memcpy( side, state->sSide, 2 * sizeof( opus_int16 ) ); |
| 68 silk_memcpy( state->sMid, &mid[ frame_length ], 2 * sizeof( opus_int16 ) )
; |
| 69 silk_memcpy( state->sSide, &side[ frame_length ], 2 * sizeof( opus_int16 ) )
; |
| 70 |
| 71 /* LP and HP filter mid signal */ |
| 72 for( n = 0; n < frame_length; n++ ) { |
| 73 sum = silk_RSHIFT_ROUND( silk_ADD_LSHIFT( mid[ n ] + mid[ n + 2 ], mid[
n + 1 ], 1 ), 2 ); |
| 74 LP_mid[ n ] = sum; |
| 75 HP_mid[ n ] = mid[ n + 1 ] - sum; |
| 76 } |
| 77 |
| 78 /* LP and HP filter side signal */ |
| 79 for( n = 0; n < frame_length; n++ ) { |
| 80 sum = silk_RSHIFT_ROUND( silk_ADD_LSHIFT( side[ n ] + side[ n + 2 ], sid
e[ n + 1 ], 1 ), 2 ); |
| 81 LP_side[ n ] = sum; |
| 82 HP_side[ n ] = side[ n + 1 ] - sum; |
| 83 } |
| 84 |
| 85 /* Find energies and predictors */ |
| 86 is10msFrame = frame_length == 10 * fs_kHz; |
| 87 smooth_coef_Q16 = is10msFrame ? |
| 88 SILK_FIX_CONST( STEREO_RATIO_SMOOTH_COEF / 2, 16 ) : |
| 89 SILK_FIX_CONST( STEREO_RATIO_SMOOTH_COEF, 16 ); |
| 90 smooth_coef_Q16 = silk_SMULWB( silk_SMULBB( prev_speech_act_Q8, prev_speech_
act_Q8 ), smooth_coef_Q16 ); |
| 91 |
| 92 pred_Q13[ 0 ] = silk_stereo_find_predictor( &LP_ratio_Q14, LP_mid, LP_side,
&state->mid_side_amp_Q0[ 0 ], frame_length, smooth_coef_Q16 ); |
| 93 pred_Q13[ 1 ] = silk_stereo_find_predictor( &HP_ratio_Q14, HP_mid, HP_side,
&state->mid_side_amp_Q0[ 2 ], frame_length, smooth_coef_Q16 ); |
| 94 /* Ratio of the norms of residual and mid signals */ |
| 95 frac_Q16 = silk_SMLABB( HP_ratio_Q14, LP_ratio_Q14, 3 ); |
| 96 frac_Q16 = silk_min( frac_Q16, SILK_FIX_CONST( 1, 16 ) ); |
| 97 |
| 98 /* Determine bitrate distribution between mid and side, and possibly reduce
stereo width */ |
| 99 total_rate_bps -= is10msFrame ? 1200 : 600; /* Subtract approximate bit
rate for coding stereo parameters */ |
| 100 if( total_rate_bps < 1 ) { |
| 101 total_rate_bps = 1; |
| 102 } |
| 103 min_mid_rate_bps = silk_SMLABB( 2000, fs_kHz, 900 ); |
| 104 silk_assert( min_mid_rate_bps < 32767 ); |
| 105 /* Default bitrate distribution: 8 parts for Mid and (5+3*frac) parts for Si
de. so: mid_rate = ( 8 / ( 13 + 3 * frac ) ) * total_ rate */ |
| 106 frac_3_Q16 = silk_MUL( 3, frac_Q16 ); |
| 107 mid_side_rates_bps[ 0 ] = silk_DIV32_varQ( total_rate_bps, SILK_FIX_CONST( 8
+ 5, 16 ) + frac_3_Q16, 16+3 ); |
| 108 /* If Mid bitrate below minimum, reduce stereo width */ |
| 109 if( mid_side_rates_bps[ 0 ] < min_mid_rate_bps ) { |
| 110 mid_side_rates_bps[ 0 ] = min_mid_rate_bps; |
| 111 mid_side_rates_bps[ 1 ] = total_rate_bps - mid_side_rates_bps[ 0 ]; |
| 112 /* width = 4 * ( 2 * side_rate - min_rate ) / ( ( 1 + 3 * frac ) * min_r
ate ) */ |
| 113 width_Q14 = silk_DIV32_varQ( silk_LSHIFT( mid_side_rates_bps[ 1 ], 1 ) -
min_mid_rate_bps, |
| 114 silk_SMULWB( SILK_FIX_CONST( 1, 16 ) + frac_3_Q16, min_mid_rate_bps
), 14+2 ); |
| 115 width_Q14 = silk_LIMIT( width_Q14, 0, SILK_FIX_CONST( 1, 14 ) ); |
| 116 } else { |
| 117 mid_side_rates_bps[ 1 ] = total_rate_bps - mid_side_rates_bps[ 0 ]; |
| 118 width_Q14 = SILK_FIX_CONST( 1, 14 ); |
| 119 } |
| 120 |
| 121 /* Smoother */ |
| 122 state->smth_width_Q14 = (opus_int16)silk_SMLAWB( state->smth_width_Q14, widt
h_Q14 - state->smth_width_Q14, smooth_coef_Q16 ); |
| 123 |
| 124 /* At very low bitrates or for inputs that are nearly amplitude panned, swit
ch to panned-mono coding */ |
| 125 *mid_only_flag = 0; |
| 126 if( toMono ) { |
| 127 /* Last frame before stereo->mono transition; collapse stereo width */ |
| 128 width_Q14 = 0; |
| 129 pred_Q13[ 0 ] = 0; |
| 130 pred_Q13[ 1 ] = 0; |
| 131 silk_stereo_quant_pred( pred_Q13, ix ); |
| 132 } else if( state->width_prev_Q14 == 0 && |
| 133 ( 8 * total_rate_bps < 13 * min_mid_rate_bps || silk_SMULWB( frac_Q16, s
tate->smth_width_Q14 ) < SILK_FIX_CONST( 0.05, 14 ) ) ) |
| 134 { |
| 135 /* Code as panned-mono; previous frame already had zero width */ |
| 136 /* Scale down and quantize predictors */ |
| 137 pred_Q13[ 0 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q1
3[ 0 ] ), 14 ); |
| 138 pred_Q13[ 1 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q1
3[ 1 ] ), 14 ); |
| 139 silk_stereo_quant_pred( pred_Q13, ix ); |
| 140 /* Collapse stereo width */ |
| 141 width_Q14 = 0; |
| 142 pred_Q13[ 0 ] = 0; |
| 143 pred_Q13[ 1 ] = 0; |
| 144 mid_side_rates_bps[ 0 ] = total_rate_bps; |
| 145 mid_side_rates_bps[ 1 ] = 0; |
| 146 *mid_only_flag = 1; |
| 147 } else if( state->width_prev_Q14 != 0 && |
| 148 ( 8 * total_rate_bps < 11 * min_mid_rate_bps || silk_SMULWB( frac_Q16, s
tate->smth_width_Q14 ) < SILK_FIX_CONST( 0.02, 14 ) ) ) |
| 149 { |
| 150 /* Transition to zero-width stereo */ |
| 151 /* Scale down and quantize predictors */ |
| 152 pred_Q13[ 0 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q1
3[ 0 ] ), 14 ); |
| 153 pred_Q13[ 1 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q1
3[ 1 ] ), 14 ); |
| 154 silk_stereo_quant_pred( pred_Q13, ix ); |
| 155 /* Collapse stereo width */ |
| 156 width_Q14 = 0; |
| 157 pred_Q13[ 0 ] = 0; |
| 158 pred_Q13[ 1 ] = 0; |
| 159 } else if( state->smth_width_Q14 > SILK_FIX_CONST( 0.95, 14 ) ) { |
| 160 /* Full-width stereo coding */ |
| 161 silk_stereo_quant_pred( pred_Q13, ix ); |
| 162 width_Q14 = SILK_FIX_CONST( 1, 14 ); |
| 163 } else { |
| 164 /* Reduced-width stereo coding; scale down and quantize predictors */ |
| 165 pred_Q13[ 0 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q1
3[ 0 ] ), 14 ); |
| 166 pred_Q13[ 1 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q1
3[ 1 ] ), 14 ); |
| 167 silk_stereo_quant_pred( pred_Q13, ix ); |
| 168 width_Q14 = state->smth_width_Q14; |
| 169 } |
| 170 |
| 171 /* Make sure to keep on encoding until the tapered output has been transmitt
ed */ |
| 172 if( *mid_only_flag == 1 ) { |
| 173 state->silent_side_len += frame_length - STEREO_INTERP_LEN_MS * fs_kHz; |
| 174 if( state->silent_side_len < LA_SHAPE_MS * fs_kHz ) { |
| 175 *mid_only_flag = 0; |
| 176 } else { |
| 177 /* Limit to avoid wrapping around */ |
| 178 state->silent_side_len = 10000; |
| 179 } |
| 180 } else { |
| 181 state->silent_side_len = 0; |
| 182 } |
| 183 |
| 184 if( *mid_only_flag == 0 && mid_side_rates_bps[ 1 ] < 1 ) { |
| 185 mid_side_rates_bps[ 1 ] = 1; |
| 186 mid_side_rates_bps[ 0 ] = silk_max_int( 1, total_rate_bps - mid_side_rat
es_bps[ 1 ]); |
| 187 } |
| 188 |
| 189 /* Interpolate predictors and subtract prediction from side channel */ |
| 190 pred0_Q13 = -state->pred_prev_Q13[ 0 ]; |
| 191 pred1_Q13 = -state->pred_prev_Q13[ 1 ]; |
| 192 w_Q24 = silk_LSHIFT( state->width_prev_Q14, 10 ); |
| 193 denom_Q16 = silk_DIV32_16( (opus_int32)1 << 16, STEREO_INTERP_LEN_MS * fs_k
Hz ); |
| 194 delta0_Q13 = -silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 0 ] - state->pred_pr
ev_Q13[ 0 ], denom_Q16 ), 16 ); |
| 195 delta1_Q13 = -silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 1 ] - state->pred_pr
ev_Q13[ 1 ], denom_Q16 ), 16 ); |
| 196 deltaw_Q24 = silk_LSHIFT( silk_SMULWB( width_Q14 - state->width_prev_Q14, d
enom_Q16 ), 10 ); |
| 197 for( n = 0; n < STEREO_INTERP_LEN_MS * fs_kHz; n++ ) { |
| 198 pred0_Q13 += delta0_Q13; |
| 199 pred1_Q13 += delta1_Q13; |
| 200 w_Q24 += deltaw_Q24; |
| 201 sum = silk_LSHIFT( silk_ADD_LSHIFT( mid[ n ] + mid[ n + 2 ], mid[ n + 1
], 1 ), 9 ); /* Q11 */ |
| 202 sum = silk_SMLAWB( silk_SMULWB( w_Q24, side[ n + 1 ] ), sum, pred0_Q13 )
; /* Q8 */ |
| 203 sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)mid[ n + 1 ], 11 ), pre
d1_Q13 ); /* Q8 */ |
| 204 x2[ n - 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) ); |
| 205 } |
| 206 |
| 207 pred0_Q13 = -pred_Q13[ 0 ]; |
| 208 pred1_Q13 = -pred_Q13[ 1 ]; |
| 209 w_Q24 = silk_LSHIFT( width_Q14, 10 ); |
| 210 for( n = STEREO_INTERP_LEN_MS * fs_kHz; n < frame_length; n++ ) { |
| 211 sum = silk_LSHIFT( silk_ADD_LSHIFT( mid[ n ] + mid[ n + 2 ], mid[ n + 1
], 1 ), 9 ); /* Q11 */ |
| 212 sum = silk_SMLAWB( silk_SMULWB( w_Q24, side[ n + 1 ] ), sum, pred0_Q13 )
; /* Q8 */ |
| 213 sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)mid[ n + 1 ], 11 ), pre
d1_Q13 ); /* Q8 */ |
| 214 x2[ n - 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) ); |
| 215 } |
| 216 state->pred_prev_Q13[ 0 ] = (opus_int16)pred_Q13[ 0 ]; |
| 217 state->pred_prev_Q13[ 1 ] = (opus_int16)pred_Q13[ 1 ]; |
| 218 state->width_prev_Q14 = (opus_int16)width_Q14; |
| 219 } |
| OLD | NEW |