Mercurial > hg > sv-dependency-builds
comparison src/opus-1.3/silk/sum_sqr_shift.c @ 69:7aeed7906520
Add Opus sources and macOS builds
author | Chris Cannam |
---|---|
date | Wed, 23 Jan 2019 13:48:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
68:85d5306e114e | 69:7aeed7906520 |
---|---|
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 "SigProc_FIX.h" | |
33 | |
34 /* Compute number of bits to right shift the sum of squares of a vector */ | |
35 /* of int16s to make it fit in an int32 */ | |
36 void silk_sum_sqr_shift( | |
37 opus_int32 *energy, /* O Energy of x, after shifting to the right */ | |
38 opus_int *shift, /* O Number of bits right shift applied to energy */ | |
39 const opus_int16 *x, /* I Input vector */ | |
40 opus_int len /* I Length of input vector */ | |
41 ) | |
42 { | |
43 opus_int i, shft; | |
44 opus_uint32 nrg_tmp; | |
45 opus_int32 nrg; | |
46 | |
47 /* Do a first run with the maximum shift we could have. */ | |
48 shft = 31-silk_CLZ32(len); | |
49 /* Let's be conservative with rounding and start with nrg=len. */ | |
50 nrg = len; | |
51 for( i = 0; i < len - 1; i += 2 ) { | |
52 nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); | |
53 nrg_tmp = silk_SMLABB_ovflw( nrg_tmp, x[ i + 1 ], x[ i + 1 ] ); | |
54 nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); | |
55 } | |
56 if( i < len ) { | |
57 /* One sample left to process */ | |
58 nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); | |
59 nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); | |
60 } | |
61 silk_assert( nrg >= 0 ); | |
62 /* Make sure the result will fit in a 32-bit signed integer with two bits | |
63 of headroom. */ | |
64 shft = silk_max_32(0, shft+3 - silk_CLZ32(nrg)); | |
65 nrg = 0; | |
66 for( i = 0 ; i < len - 1; i += 2 ) { | |
67 nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); | |
68 nrg_tmp = silk_SMLABB_ovflw( nrg_tmp, x[ i + 1 ], x[ i + 1 ] ); | |
69 nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); | |
70 } | |
71 if( i < len ) { | |
72 /* One sample left to process */ | |
73 nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); | |
74 nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); | |
75 } | |
76 | |
77 silk_assert( nrg >= 0 ); | |
78 | |
79 /* Output arguments */ | |
80 *shift = shft; | |
81 *energy = nrg; | |
82 } | |
83 |