media/libopus/silk/stereo_MS_to_LR.c

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/media/libopus/silk/stereo_MS_to_LR.c	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,85 @@
     1.4 +/***********************************************************************
     1.5 +Copyright (c) 2006-2011, Skype Limited. All rights reserved.
     1.6 +Redistribution and use in source and binary forms, with or without
     1.7 +modification, are permitted provided that the following conditions
     1.8 +are met:
     1.9 +- Redistributions of source code must retain the above copyright notice,
    1.10 +this list of conditions and the following disclaimer.
    1.11 +- Redistributions in binary form must reproduce the above copyright
    1.12 +notice, this list of conditions and the following disclaimer in the
    1.13 +documentation and/or other materials provided with the distribution.
    1.14 +- Neither the name of Internet Society, IETF or IETF Trust, nor the
    1.15 +names of specific contributors, may be used to endorse or promote
    1.16 +products derived from this software without specific prior written
    1.17 +permission.
    1.18 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    1.19 +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    1.20 +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    1.21 +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    1.22 +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    1.23 +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    1.24 +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    1.25 +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    1.26 +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    1.27 +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    1.28 +POSSIBILITY OF SUCH DAMAGE.
    1.29 +***********************************************************************/
    1.30 +
    1.31 +#ifdef HAVE_CONFIG_H
    1.32 +#include "config.h"
    1.33 +#endif
    1.34 +
    1.35 +#include "main.h"
    1.36 +
    1.37 +/* Convert adaptive Mid/Side representation to Left/Right stereo signal */
    1.38 +void silk_stereo_MS_to_LR(
    1.39 +    stereo_dec_state            *state,                         /* I/O  State                                       */
    1.40 +    opus_int16                  x1[],                           /* I/O  Left input signal, becomes mid signal       */
    1.41 +    opus_int16                  x2[],                           /* I/O  Right input signal, becomes side signal     */
    1.42 +    const opus_int32            pred_Q13[],                     /* I    Predictors                                  */
    1.43 +    opus_int                    fs_kHz,                         /* I    Samples rate (kHz)                          */
    1.44 +    opus_int                    frame_length                    /* I    Number of samples                           */
    1.45 +)
    1.46 +{
    1.47 +    opus_int   n, denom_Q16, delta0_Q13, delta1_Q13;
    1.48 +    opus_int32 sum, diff, pred0_Q13, pred1_Q13;
    1.49 +
    1.50 +    /* Buffering */
    1.51 +    silk_memcpy( x1, state->sMid,  2 * sizeof( opus_int16 ) );
    1.52 +    silk_memcpy( x2, state->sSide, 2 * sizeof( opus_int16 ) );
    1.53 +    silk_memcpy( state->sMid,  &x1[ frame_length ], 2 * sizeof( opus_int16 ) );
    1.54 +    silk_memcpy( state->sSide, &x2[ frame_length ], 2 * sizeof( opus_int16 ) );
    1.55 +
    1.56 +    /* Interpolate predictors and add prediction to side channel */
    1.57 +    pred0_Q13  = state->pred_prev_Q13[ 0 ];
    1.58 +    pred1_Q13  = state->pred_prev_Q13[ 1 ];
    1.59 +    denom_Q16  = silk_DIV32_16( (opus_int32)1 << 16, STEREO_INTERP_LEN_MS * fs_kHz );
    1.60 +    delta0_Q13 = silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 0 ] - state->pred_prev_Q13[ 0 ], denom_Q16 ), 16 );
    1.61 +    delta1_Q13 = silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 1 ] - state->pred_prev_Q13[ 1 ], denom_Q16 ), 16 );
    1.62 +    for( n = 0; n < STEREO_INTERP_LEN_MS * fs_kHz; n++ ) {
    1.63 +        pred0_Q13 += delta0_Q13;
    1.64 +        pred1_Q13 += delta1_Q13;
    1.65 +        sum = silk_LSHIFT( silk_ADD_LSHIFT( x1[ n ] + x1[ n + 2 ], x1[ n + 1 ], 1 ), 9 );       /* Q11 */
    1.66 +        sum = silk_SMLAWB( silk_LSHIFT( (opus_int32)x2[ n + 1 ], 8 ), sum, pred0_Q13 );         /* Q8  */
    1.67 +        sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)x1[ n + 1 ], 11 ), pred1_Q13 );        /* Q8  */
    1.68 +        x2[ n + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) );
    1.69 +    }
    1.70 +    pred0_Q13 = pred_Q13[ 0 ];
    1.71 +    pred1_Q13 = pred_Q13[ 1 ];
    1.72 +    for( n = STEREO_INTERP_LEN_MS * fs_kHz; n < frame_length; n++ ) {
    1.73 +        sum = silk_LSHIFT( silk_ADD_LSHIFT( x1[ n ] + x1[ n + 2 ], x1[ n + 1 ], 1 ), 9 );       /* Q11 */
    1.74 +        sum = silk_SMLAWB( silk_LSHIFT( (opus_int32)x2[ n + 1 ], 8 ), sum, pred0_Q13 );         /* Q8  */
    1.75 +        sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)x1[ n + 1 ], 11 ), pred1_Q13 );        /* Q8  */
    1.76 +        x2[ n + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) );
    1.77 +    }
    1.78 +    state->pred_prev_Q13[ 0 ] = pred_Q13[ 0 ];
    1.79 +    state->pred_prev_Q13[ 1 ] = pred_Q13[ 1 ];
    1.80 +
    1.81 +    /* Convert to left/right signals */
    1.82 +    for( n = 0; n < frame_length; n++ ) {
    1.83 +        sum  = x1[ n + 1 ] + (opus_int32)x2[ n + 1 ];
    1.84 +        diff = x1[ n + 1 ] - (opus_int32)x2[ n + 1 ];
    1.85 +        x1[ n + 1 ] = (opus_int16)silk_SAT16( sum );
    1.86 +        x2[ n + 1 ] = (opus_int16)silk_SAT16( diff );
    1.87 +    }
    1.88 +}

mercurial