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 "SigProc_FIX.h" | 32 #include "SigProc_FIX.h" |
33 #include "resampler_private.h" | 33 #include "resampler_private.h" |
| 34 #include "stack_alloc.h" |
34 | 35 |
35 static inline opus_int16 *silk_resampler_private_IIR_FIR_INTERPOL( | 36 static inline opus_int16 *silk_resampler_private_IIR_FIR_INTERPOL( |
36 opus_int16 *out, | 37 opus_int16 *out, |
37 opus_int16 *buf, | 38 opus_int16 *buf, |
38 opus_int32 max_index_Q16, | 39 opus_int32 max_index_Q16, |
39 opus_int32 index_increment_Q16 | 40 opus_int32 index_increment_Q16 |
40 ) | 41 ) |
41 { | 42 { |
42 opus_int32 index_Q16, res_Q15; | 43 opus_int32 index_Q16, res_Q15; |
43 opus_int16 *buf_ptr; | 44 opus_int16 *buf_ptr; |
(...skipping 20 matching lines...) Expand all Loading... |
64 void silk_resampler_private_IIR_FIR( | 65 void silk_resampler_private_IIR_FIR( |
65 void *SS, /* I/O Resampler state
*/ | 66 void *SS, /* I/O Resampler state
*/ |
66 opus_int16 out[], /* O Output signal
*/ | 67 opus_int16 out[], /* O Output signal
*/ |
67 const opus_int16 in[], /* I Input signal
*/ | 68 const opus_int16 in[], /* I Input signal
*/ |
68 opus_int32 inLen /* I Number of input samp
les */ | 69 opus_int32 inLen /* I Number of input samp
les */ |
69 ) | 70 ) |
70 { | 71 { |
71 silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; | 72 silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; |
72 opus_int32 nSamplesIn; | 73 opus_int32 nSamplesIn; |
73 opus_int32 max_index_Q16, index_increment_Q16; | 74 opus_int32 max_index_Q16, index_increment_Q16; |
74 opus_int16 buf[ RESAMPLER_MAX_BATCH_SIZE_IN + RESAMPLER_ORDER_FIR_12 ]; | 75 VARDECL( opus_int16, buf ); |
| 76 SAVE_STACK; |
| 77 |
| 78 ALLOC( buf, 2 * S->batchSize + RESAMPLER_ORDER_FIR_12, opus_int16 ); |
75 | 79 |
76 /* Copy buffered samples to start of buffer */ | 80 /* Copy buffered samples to start of buffer */ |
77 silk_memcpy( buf, S->sFIR, RESAMPLER_ORDER_FIR_12 * sizeof( opus_int32 ) ); | 81 silk_memcpy( buf, S->sFIR.i16, RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 )
); |
78 | 82 |
79 /* Iterate over blocks of frameSizeIn input samples */ | 83 /* Iterate over blocks of frameSizeIn input samples */ |
80 index_increment_Q16 = S->invRatio_Q16; | 84 index_increment_Q16 = S->invRatio_Q16; |
81 while( 1 ) { | 85 while( 1 ) { |
82 nSamplesIn = silk_min( inLen, S->batchSize ); | 86 nSamplesIn = silk_min( inLen, S->batchSize ); |
83 | 87 |
84 /* Upsample 2x */ | 88 /* Upsample 2x */ |
85 silk_resampler_private_up2_HQ( S->sIIR, &buf[ RESAMPLER_ORDER_FIR_12 ],
in, nSamplesIn ); | 89 silk_resampler_private_up2_HQ( S->sIIR, &buf[ RESAMPLER_ORDER_FIR_12 ],
in, nSamplesIn ); |
86 | 90 |
87 max_index_Q16 = silk_LSHIFT32( nSamplesIn, 16 + 1 ); /* + 1 beca
use 2x upsampling */ | 91 max_index_Q16 = silk_LSHIFT32( nSamplesIn, 16 + 1 ); /* + 1 beca
use 2x upsampling */ |
88 out = silk_resampler_private_IIR_FIR_INTERPOL( out, buf, max_index_Q16,
index_increment_Q16 ); | 92 out = silk_resampler_private_IIR_FIR_INTERPOL( out, buf, max_index_Q16,
index_increment_Q16 ); |
89 in += nSamplesIn; | 93 in += nSamplesIn; |
90 inLen -= nSamplesIn; | 94 inLen -= nSamplesIn; |
91 | 95 |
92 if( inLen > 0 ) { | 96 if( inLen > 0 ) { |
93 /* More iterations to do; copy last part of filtered signal to begin
ning of buffer */ | 97 /* More iterations to do; copy last part of filtered signal to begin
ning of buffer */ |
94 silk_memcpy( buf, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 *
sizeof( opus_int32 ) ); | 98 silk_memcpy( buf, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 *
sizeof( opus_int16 ) ); |
95 } else { | 99 } else { |
96 break; | 100 break; |
97 } | 101 } |
98 } | 102 } |
99 | 103 |
100 /* Copy last part of filtered signal to the state for the next call */ | 104 /* Copy last part of filtered signal to the state for the next call */ |
101 silk_memcpy( S->sFIR, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * size
of( opus_int32 ) ); | 105 silk_memcpy( S->sFIR.i16, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 *
sizeof( opus_int16 ) ); |
| 106 RESTORE_STACK; |
102 } | 107 } |
103 | |
OLD | NEW |