/src/opus/silk/control_SNR.c
Line | Count | Source (jump to first uncovered line) |
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 | 0 | { |
87 | 0 | int id; |
88 | 0 | int bound; |
89 | 0 | const unsigned char *snr_table; |
90 | |
|
91 | 0 | psEncC->TargetRate_bps = TargetRate_bps; |
92 | 0 | if( psEncC->nb_subfr == 2 ) { |
93 | 0 | TargetRate_bps -= 2000 + psEncC->fs_kHz/16; |
94 | 0 | } |
95 | 0 | if( psEncC->fs_kHz == 8 ) { |
96 | 0 | bound = sizeof(silk_TargetRate_NB_21); |
97 | 0 | snr_table = silk_TargetRate_NB_21; |
98 | 0 | } else if( psEncC->fs_kHz == 12 ) { |
99 | 0 | bound = sizeof(silk_TargetRate_MB_21); |
100 | 0 | snr_table = silk_TargetRate_MB_21; |
101 | 0 | } else { |
102 | 0 | bound = sizeof(silk_TargetRate_WB_21); |
103 | 0 | snr_table = silk_TargetRate_WB_21; |
104 | 0 | } |
105 | 0 | id = (TargetRate_bps+200)/400; |
106 | 0 | id = silk_min(id - 10, bound-1); |
107 | 0 | if( id <= 0 ) { |
108 | 0 | psEncC->SNR_dB_Q7 = 0; |
109 | 0 | } else { |
110 | 0 | psEncC->SNR_dB_Q7 = snr_table[id]*21; |
111 | 0 | } |
112 | 0 | return SILK_NO_ERROR; |
113 | 0 | } |