diff options
Diffstat (limited to 'lib/rbcodec/codecs/libopus/silk/control_SNR.c')
-rw-r--r-- | lib/rbcodec/codecs/libopus/silk/control_SNR.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/lib/rbcodec/codecs/libopus/silk/control_SNR.c b/lib/rbcodec/codecs/libopus/silk/control_SNR.c new file mode 100644 index 0000000000..9a6db27543 --- /dev/null +++ b/lib/rbcodec/codecs/libopus/silk/control_SNR.c | |||
@@ -0,0 +1,113 @@ | |||
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 | #include "tuning_parameters.h" | ||
34 | |||
35 | /* These tables hold SNR values divided by 21 (so they fit in 8 bits) | ||
36 | for different target bitrates spaced at 400 bps interval. The first | ||
37 | 10 values are omitted (0-4 kb/s) because they're all zeros. | ||
38 | These tables were obtained by running different SNRs through the | ||
39 | encoder and measuring the active bitrate. */ | ||
40 | static const unsigned char silk_TargetRate_NB_21[117 - 10] = { | ||
41 | 0, 15, 39, 52, 61, 68, | ||
42 | 74, 79, 84, 88, 92, 95, 99,102,105,108,111,114,117,119,122,124, | ||
43 | 126,129,131,133,135,137,139,142,143,145,147,149,151,153,155,157, | ||
44 | 158,160,162,163,165,167,168,170,171,173,174,176,177,179,180,182, | ||
45 | 183,185,186,187,189,190,192,193,194,196,197,199,200,201,203,204, | ||
46 | 205,207,208,209,211,212,213,215,216,217,219,220,221,223,224,225, | ||
47 | 227,228,230,231,232,234,235,236,238,239,241,242,243,245,246,248, | ||
48 | 249,250,252,253,255 | ||
49 | }; | ||
50 | |||
51 | static const unsigned char silk_TargetRate_MB_21[165 - 10] = { | ||
52 | 0, 0, 28, 43, 52, 59, | ||
53 | 65, 70, 74, 78, 81, 85, 87, 90, 93, 95, 98,100,102,105,107,109, | ||
54 | 111,113,115,116,118,120,122,123,125,127,128,130,131,133,134,136, | ||
55 | 137,138,140,141,143,144,145,147,148,149,151,152,153,154,156,157, | ||
56 | 158,159,160,162,163,164,165,166,167,168,169,171,172,173,174,175, | ||
57 | 176,177,178,179,180,181,182,183,184,185,186,187,188,188,189,190, | ||
58 | 191,192,193,194,195,196,197,198,199,200,201,202,203,203,204,205, | ||
59 | 206,207,208,209,210,211,212,213,214,214,215,216,217,218,219,220, | ||
60 | 221,222,223,224,224,225,226,227,228,229,230,231,232,233,234,235, | ||
61 | 236,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250, | ||
62 | 251,252,253,254,255 | ||
63 | }; | ||
64 | |||
65 | static const unsigned char silk_TargetRate_WB_21[201 - 10] = { | ||
66 | 0, 0, 0, 8, 29, 41, | ||
67 | 49, 56, 62, 66, 70, 74, 77, 80, 83, 86, 88, 91, 93, 95, 97, 99, | ||
68 | 101,103,105,107,108,110,112,113,115,116,118,119,121,122,123,125, | ||
69 | 126,127,129,130,131,132,134,135,136,137,138,140,141,142,143,144, | ||
70 | 145,146,147,148,149,150,151,152,153,154,156,157,158,159,159,160, | ||
71 | 161,162,163,164,165,166,167,168,169,170,171,171,172,173,174,175, | ||
72 | 176,177,177,178,179,180,181,181,182,183,184,185,185,186,187,188, | ||
73 | 189,189,190,191,192,192,193,194,195,195,196,197,198,198,199,200, | ||
74 | 200,201,202,203,203,204,205,206,206,207,208,209,209,210,211,211, | ||
75 | 212,213,214,214,215,216,216,217,218,219,219,220,221,221,222,223, | ||
76 | 224,224,225,226,226,227,228,229,229,230,231,232,232,233,234,234, | ||
77 | 235,236,237,237,238,239,240,240,241,242,243,243,244,245,246,246, | ||
78 | 247,248,249,249,250,251,252,253,255 | ||
79 | }; | ||
80 | |||
81 | /* Control SNR of redidual quantizer */ | ||
82 | opus_int silk_control_SNR( | ||
83 | silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ | ||
84 | opus_int32 TargetRate_bps /* I Target max bitrate (bps) */ | ||
85 | ) | ||
86 | { | ||
87 | int id; | ||
88 | int bound; | ||
89 | const unsigned char *snr_table; | ||
90 | |||
91 | psEncC->TargetRate_bps = TargetRate_bps; | ||
92 | if( psEncC->nb_subfr == 2 ) { | ||
93 | TargetRate_bps -= 2000 + psEncC->fs_kHz/16; | ||
94 | } | ||
95 | if( psEncC->fs_kHz == 8 ) { | ||
96 | bound = sizeof(silk_TargetRate_NB_21); | ||
97 | snr_table = silk_TargetRate_NB_21; | ||
98 | } else if( psEncC->fs_kHz == 12 ) { | ||
99 | bound = sizeof(silk_TargetRate_MB_21); | ||
100 | snr_table = silk_TargetRate_MB_21; | ||
101 | } else { | ||
102 | bound = sizeof(silk_TargetRate_WB_21); | ||
103 | snr_table = silk_TargetRate_WB_21; | ||
104 | } | ||
105 | id = (TargetRate_bps+200)/400; | ||
106 | id = silk_min(id - 10, bound-1); | ||
107 | if( id <= 0 ) { | ||
108 | psEncC->SNR_dB_Q7 = 0; | ||
109 | } else { | ||
110 | psEncC->SNR_dB_Q7 = snr_table[id]*21; | ||
111 | } | ||
112 | return SILK_NO_ERROR; | ||
113 | } | ||