summaryrefslogtreecommitdiff
path: root/apps/codecs/libspeex/nb_celp.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libspeex/nb_celp.c')
-rw-r--r--apps/codecs/libspeex/nb_celp.c44
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;