diff options
Diffstat (limited to 'apps/codecs/libspeex/nb_celp.c')
-rw-r--r-- | apps/codecs/libspeex/nb_celp.c | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/apps/codecs/libspeex/nb_celp.c b/apps/codecs/libspeex/nb_celp.c index 85e4ca015e..e41ad6e703 100644 --- a/apps/codecs/libspeex/nb_celp.c +++ b/apps/codecs/libspeex/nb_celp.c | |||
@@ -1257,7 +1257,7 @@ int nb_decode(void *state, SpeexBits *bits, void *vout) | |||
1257 | speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance); | 1257 | speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance); |
1258 | if (advance < 0) | 1258 | if (advance < 0) |
1259 | { | 1259 | { |
1260 | speex_warning ("Invalid wideband mode encountered. Corrupted stream?"); | 1260 | speex_notify("Invalid mode encountered. The stream is corrupted."); |
1261 | return -2; | 1261 | return -2; |
1262 | } | 1262 | } |
1263 | advance -= (SB_SUBMODE_BITS+1); | 1263 | advance -= (SB_SUBMODE_BITS+1); |
@@ -1272,7 +1272,7 @@ int nb_decode(void *state, SpeexBits *bits, void *vout) | |||
1272 | speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance); | 1272 | speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance); |
1273 | if (advance < 0) | 1273 | if (advance < 0) |
1274 | { | 1274 | { |
1275 | speex_warning ("Invalid wideband mode encountered: corrupted stream?"); | 1275 | speex_notify("Invalid mode encountered. The stream is corrupted."); |
1276 | return -2; | 1276 | return -2; |
1277 | } | 1277 | } |
1278 | advance -= (SB_SUBMODE_BITS+1); | 1278 | advance -= (SB_SUBMODE_BITS+1); |
@@ -1280,7 +1280,7 @@ int nb_decode(void *state, SpeexBits *bits, void *vout) | |||
1280 | wideband = speex_bits_unpack_unsigned(bits, 1); | 1280 | wideband = speex_bits_unpack_unsigned(bits, 1); |
1281 | if (wideband) | 1281 | if (wideband) |
1282 | { | 1282 | { |
1283 | speex_warning ("More than two wideband layers found: corrupted stream?"); | 1283 | speex_notify("More than two wideband layers found. The stream is corrupted."); |
1284 | return -2; | 1284 | return -2; |
1285 | } | 1285 | } |
1286 | 1286 | ||
@@ -1305,7 +1305,7 @@ int nb_decode(void *state, SpeexBits *bits, void *vout) | |||
1305 | return ret; | 1305 | return ret; |
1306 | } else if (m>8) /* Invalid mode */ | 1306 | } else if (m>8) /* Invalid mode */ |
1307 | { | 1307 | { |
1308 | speex_warning("Invalid mode encountered: corrupted stream?"); | 1308 | speex_notify("Invalid mode encountered. The stream is corrupted."); |
1309 | return -2; | 1309 | return -2; |
1310 | } | 1310 | } |
1311 | 1311 | ||
@@ -1526,7 +1526,11 @@ int nb_decode(void *state, SpeexBits *bits, void *vout) | |||
1526 | #ifdef EPIC_48K | 1526 | #ifdef EPIC_48K |
1527 | } | 1527 | } |
1528 | #endif | 1528 | #endif |
1529 | 1529 | /* Ensuring that things aren't blowing up as would happen if e.g. an encoder is | |
1530 | crafting packets to make us produce NaNs and slow down the decoder (vague DoS threat). | ||
1531 | We can probably be even more aggressive and limit to 15000 or so. */ | ||
1532 | sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), st->subframeSize); | ||
1533 | |||
1530 | tmp = gain_3tap_to_1tap(pitch_gain); | 1534 | tmp = gain_3tap_to_1tap(pitch_gain); |
1531 | 1535 | ||
1532 | pitch_average += tmp; | 1536 | pitch_average += tmp; |
@@ -1698,7 +1702,7 @@ int nb_decode(void *state, SpeexBits *bits, void *vout) | |||
1698 | for (i=0;i<st->lpcSize;i+=2) | 1702 | for (i=0;i<st->lpcSize;i+=2) |
1699 | { | 1703 | { |
1700 | /*pi_g += -st->interp_qlpc[i] + st->interp_qlpc[i+1];*/ | 1704 | /*pi_g += -st->interp_qlpc[i] + st->interp_qlpc[i+1];*/ |
1701 | pi_g = ADD32(pi_g, SUB32(EXTEND32(st->interp_qlpc[i+1]),EXTEND32(st->interp_qlpc[i]))); | 1705 | pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i]))); |
1702 | } | 1706 | } |
1703 | st->pi_gain[sub] = pi_g; | 1707 | st->pi_gain[sub] = pi_g; |
1704 | } | 1708 | } |
@@ -1716,6 +1720,14 @@ int nb_decode(void *state, SpeexBits *bits, void *vout) | |||
1716 | /*for (i=0;i<st->frameSize;i++) | 1720 | /*for (i=0;i<st->frameSize;i++) |
1717 | printf ("%d\n", (int)st->frame[i]);*/ | 1721 | printf ("%d\n", (int)st->frame[i]);*/ |
1718 | 1722 | ||
1723 | /* Tracking output level */ | ||
1724 | st->level = 1+PSHR32(ol_gain,SIG_SHIFT); | ||
1725 | st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level); | ||
1726 | st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level); | ||
1727 | if (st->max_level < st->min_level+1) | ||
1728 | st->max_level = st->min_level+1; | ||
1729 | /*printf ("%f %f %f %d\n", og, st->min_level, st->max_level, update);*/ | ||
1730 | |||
1719 | /* Store the LSPs for interpolation in the next frame */ | 1731 | /* Store the LSPs for interpolation in the next frame */ |
1720 | for (i=0;i<st->lpcSize;i++) | 1732 | for (i=0;i<st->lpcSize;i++) |
1721 | st->old_qlsp[i] = qlsp[i]; | 1733 | st->old_qlsp[i] = qlsp[i]; |
@@ -1924,6 +1936,9 @@ int nb_encoder_ctl(void *state, int request, void *ptr) | |||
1924 | case SPEEX_SET_WIDEBAND: | 1936 | case SPEEX_SET_WIDEBAND: |
1925 | st->isWideband = *((spx_int32_t*)ptr); | 1937 | st->isWideband = *((spx_int32_t*)ptr); |
1926 | break; | 1938 | break; |
1939 | case SPEEX_GET_STACK: | ||
1940 | *((char**)ptr) = st->stack; | ||
1941 | break; | ||
1927 | default: | 1942 | default: |
1928 | speex_warning_int("Unknown nb_ctl request: ", request); | 1943 | speex_warning_int("Unknown nb_ctl request: ", request); |
1929 | return -1; | 1944 | return -1; |
@@ -2006,7 +2021,19 @@ int nb_decoder_ctl(void *state, int request, void *ptr) | |||
2006 | case SPEEX_GET_HIGHPASS: | 2021 | case SPEEX_GET_HIGHPASS: |
2007 | (*(spx_int32_t*)ptr) = st->highpass_enabled; | 2022 | (*(spx_int32_t*)ptr) = st->highpass_enabled; |
2008 | break; | 2023 | break; |
2009 | 2024 | case SPEEX_GET_ACTIVITY: | |
2025 | { | ||
2026 | float ret; | ||
2027 | ret = log(st->level/st->min_level)/log(st->max_level/st->min_level); | ||
2028 | if (ret>1) | ||
2029 | ret = 1; | ||
2030 | /* Done in a strange way to catch NaNs as well */ | ||
2031 | if (!(ret > 0)) | ||
2032 | ret = 0; | ||
2033 | /*printf ("%f %f %f %f\n", st->level, st->min_level, st->max_level, ret);*/ | ||
2034 | (*(spx_int32_t*)ptr) = (int)(100*ret); | ||
2035 | } | ||
2036 | break; | ||
2010 | case SPEEX_GET_PI_GAIN: | 2037 | case SPEEX_GET_PI_GAIN: |
2011 | { | 2038 | { |
2012 | int i; | 2039 | int i; |
@@ -2031,6 +2058,9 @@ int nb_decoder_ctl(void *state, int request, void *ptr) | |||
2031 | case SPEEX_SET_WIDEBAND: | 2058 | case SPEEX_SET_WIDEBAND: |
2032 | st->isWideband = *((spx_int32_t*)ptr); | 2059 | st->isWideband = *((spx_int32_t*)ptr); |
2033 | break; | 2060 | break; |
2061 | case SPEEX_GET_STACK: | ||
2062 | *((char**)ptr) = st->stack; | ||
2063 | break; | ||
2034 | default: | 2064 | default: |
2035 | speex_warning_int("Unknown nb_ctl request: ", request); | 2065 | speex_warning_int("Unknown nb_ctl request: ", request); |
2036 | return -1; | 2066 | return -1; |