xref: /aosp_15_r20/external/libopus/silk/control_SNR.c (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /***********************************************************************
2*a58d3d2aSXin Li Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3*a58d3d2aSXin Li Redistribution and use in source and binary forms, with or without
4*a58d3d2aSXin Li modification, are permitted provided that the following conditions
5*a58d3d2aSXin Li are met:
6*a58d3d2aSXin Li - Redistributions of source code must retain the above copyright notice,
7*a58d3d2aSXin Li this list of conditions and the following disclaimer.
8*a58d3d2aSXin Li - Redistributions in binary form must reproduce the above copyright
9*a58d3d2aSXin Li notice, this list of conditions and the following disclaimer in the
10*a58d3d2aSXin Li documentation and/or other materials provided with the distribution.
11*a58d3d2aSXin Li - Neither the name of Internet Society, IETF or IETF Trust, nor the
12*a58d3d2aSXin Li names of specific contributors, may be used to endorse or promote
13*a58d3d2aSXin Li products derived from this software without specific prior written
14*a58d3d2aSXin Li permission.
15*a58d3d2aSXin Li THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16*a58d3d2aSXin Li AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*a58d3d2aSXin Li IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*a58d3d2aSXin Li ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19*a58d3d2aSXin Li LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20*a58d3d2aSXin Li CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21*a58d3d2aSXin Li SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22*a58d3d2aSXin Li INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*a58d3d2aSXin Li CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24*a58d3d2aSXin Li ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25*a58d3d2aSXin Li POSSIBILITY OF SUCH DAMAGE.
26*a58d3d2aSXin Li ***********************************************************************/
27*a58d3d2aSXin Li 
28*a58d3d2aSXin Li #ifdef HAVE_CONFIG_H
29*a58d3d2aSXin Li #include "config.h"
30*a58d3d2aSXin Li #endif
31*a58d3d2aSXin Li 
32*a58d3d2aSXin Li #include "main.h"
33*a58d3d2aSXin Li #include "tuning_parameters.h"
34*a58d3d2aSXin Li 
35*a58d3d2aSXin Li /* These tables hold SNR values divided by 21 (so they fit in 8 bits)
36*a58d3d2aSXin Li    for different target bitrates spaced at 400 bps interval. The first
37*a58d3d2aSXin Li    10 values are omitted (0-4 kb/s) because they're all zeros.
38*a58d3d2aSXin Li    These tables were obtained by running different SNRs through the
39*a58d3d2aSXin Li    encoder and measuring the active bitrate. */
40*a58d3d2aSXin Li static const unsigned char silk_TargetRate_NB_21[117 - 10] = {
41*a58d3d2aSXin Li                                               0, 15, 39, 52, 61, 68,
42*a58d3d2aSXin Li      74, 79, 84, 88, 92, 95, 99,102,105,108,111,114,117,119,122,124,
43*a58d3d2aSXin Li     126,129,131,133,135,137,139,142,143,145,147,149,151,153,155,157,
44*a58d3d2aSXin Li     158,160,162,163,165,167,168,170,171,173,174,176,177,179,180,182,
45*a58d3d2aSXin Li     183,185,186,187,189,190,192,193,194,196,197,199,200,201,203,204,
46*a58d3d2aSXin Li     205,207,208,209,211,212,213,215,216,217,219,220,221,223,224,225,
47*a58d3d2aSXin Li     227,228,230,231,232,234,235,236,238,239,241,242,243,245,246,248,
48*a58d3d2aSXin Li     249,250,252,253,255
49*a58d3d2aSXin Li };
50*a58d3d2aSXin Li 
51*a58d3d2aSXin Li static const unsigned char silk_TargetRate_MB_21[165 - 10] = {
52*a58d3d2aSXin Li                                               0,  0, 28, 43, 52, 59,
53*a58d3d2aSXin Li      65, 70, 74, 78, 81, 85, 87, 90, 93, 95, 98,100,102,105,107,109,
54*a58d3d2aSXin Li     111,113,115,116,118,120,122,123,125,127,128,130,131,133,134,136,
55*a58d3d2aSXin Li     137,138,140,141,143,144,145,147,148,149,151,152,153,154,156,157,
56*a58d3d2aSXin Li     158,159,160,162,163,164,165,166,167,168,169,171,172,173,174,175,
57*a58d3d2aSXin Li     176,177,178,179,180,181,182,183,184,185,186,187,188,188,189,190,
58*a58d3d2aSXin Li     191,192,193,194,195,196,197,198,199,200,201,202,203,203,204,205,
59*a58d3d2aSXin Li     206,207,208,209,210,211,212,213,214,214,215,216,217,218,219,220,
60*a58d3d2aSXin Li     221,222,223,224,224,225,226,227,228,229,230,231,232,233,234,235,
61*a58d3d2aSXin Li     236,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,
62*a58d3d2aSXin Li     251,252,253,254,255
63*a58d3d2aSXin Li };
64*a58d3d2aSXin Li 
65*a58d3d2aSXin Li static const unsigned char silk_TargetRate_WB_21[201 - 10] = {
66*a58d3d2aSXin Li                                               0,  0,  0,  8, 29, 41,
67*a58d3d2aSXin Li      49, 56, 62, 66, 70, 74, 77, 80, 83, 86, 88, 91, 93, 95, 97, 99,
68*a58d3d2aSXin Li     101,103,105,107,108,110,112,113,115,116,118,119,121,122,123,125,
69*a58d3d2aSXin Li     126,127,129,130,131,132,134,135,136,137,138,140,141,142,143,144,
70*a58d3d2aSXin Li     145,146,147,148,149,150,151,152,153,154,156,157,158,159,159,160,
71*a58d3d2aSXin Li     161,162,163,164,165,166,167,168,169,170,171,171,172,173,174,175,
72*a58d3d2aSXin Li     176,177,177,178,179,180,181,181,182,183,184,185,185,186,187,188,
73*a58d3d2aSXin Li     189,189,190,191,192,192,193,194,195,195,196,197,198,198,199,200,
74*a58d3d2aSXin Li     200,201,202,203,203,204,205,206,206,207,208,209,209,210,211,211,
75*a58d3d2aSXin Li     212,213,214,214,215,216,216,217,218,219,219,220,221,221,222,223,
76*a58d3d2aSXin Li     224,224,225,226,226,227,228,229,229,230,231,232,232,233,234,234,
77*a58d3d2aSXin Li     235,236,237,237,238,239,240,240,241,242,243,243,244,245,246,246,
78*a58d3d2aSXin Li     247,248,249,249,250,251,252,253,255
79*a58d3d2aSXin Li };
80*a58d3d2aSXin Li 
81*a58d3d2aSXin Li /* Control SNR of redidual quantizer */
silk_control_SNR(silk_encoder_state * psEncC,opus_int32 TargetRate_bps)82*a58d3d2aSXin Li opus_int silk_control_SNR(
83*a58d3d2aSXin Li     silk_encoder_state          *psEncC,                        /* I/O  Pointer to Silk encoder state               */
84*a58d3d2aSXin Li     opus_int32                  TargetRate_bps                  /* I    Target max bitrate (bps)                    */
85*a58d3d2aSXin Li )
86*a58d3d2aSXin Li {
87*a58d3d2aSXin Li     int id;
88*a58d3d2aSXin Li     int bound;
89*a58d3d2aSXin Li     const unsigned char *snr_table;
90*a58d3d2aSXin Li 
91*a58d3d2aSXin Li     psEncC->TargetRate_bps = TargetRate_bps;
92*a58d3d2aSXin Li     if( psEncC->nb_subfr == 2 ) {
93*a58d3d2aSXin Li         TargetRate_bps -= 2000 + psEncC->fs_kHz/16;
94*a58d3d2aSXin Li     }
95*a58d3d2aSXin Li     if( psEncC->fs_kHz == 8 ) {
96*a58d3d2aSXin Li         bound = sizeof(silk_TargetRate_NB_21);
97*a58d3d2aSXin Li         snr_table = silk_TargetRate_NB_21;
98*a58d3d2aSXin Li     } else if( psEncC->fs_kHz == 12 ) {
99*a58d3d2aSXin Li         bound = sizeof(silk_TargetRate_MB_21);
100*a58d3d2aSXin Li         snr_table = silk_TargetRate_MB_21;
101*a58d3d2aSXin Li     } else {
102*a58d3d2aSXin Li         bound = sizeof(silk_TargetRate_WB_21);
103*a58d3d2aSXin Li         snr_table = silk_TargetRate_WB_21;
104*a58d3d2aSXin Li     }
105*a58d3d2aSXin Li     id = (TargetRate_bps+200)/400;
106*a58d3d2aSXin Li     id = silk_min(id - 10, bound-1);
107*a58d3d2aSXin Li     if( id <= 0 ) {
108*a58d3d2aSXin Li         psEncC->SNR_dB_Q7 = 0;
109*a58d3d2aSXin Li     } else {
110*a58d3d2aSXin Li         psEncC->SNR_dB_Q7 = snr_table[id]*21;
111*a58d3d2aSXin Li     }
112*a58d3d2aSXin Li     return SILK_NO_ERROR;
113*a58d3d2aSXin Li }
114