Index: webrtc/modules/audio_coding/codecs/ilbc/decode.c |
diff --git a/webrtc/modules/audio_coding/codecs/ilbc/decode.c b/webrtc/modules/audio_coding/codecs/ilbc/decode.c |
index 4c8497a568cc6635adb4a4b34bd525b3cc16d586..a6e045dc67599bd77d60f4d4982404557d345526 100644 |
--- a/webrtc/modules/audio_coding/codecs/ilbc/decode.c |
+++ b/webrtc/modules/audio_coding/codecs/ilbc/decode.c |
@@ -28,6 +28,7 @@ |
#include "decode_residual.h" |
#include "unpack_bits.h" |
#include "hp_output.h" |
+#include "init_decode.h" |
#ifndef WEBRTC_ARCH_BIG_ENDIAN |
#include "swap_bytes.h" |
#endif |
@@ -36,7 +37,7 @@ |
* main decoder function |
*---------------------------------------------------------------*/ |
-void WebRtcIlbcfix_DecodeImpl( |
+int WebRtcIlbcfix_DecodeImpl( |
int16_t *decblock, /* (o) decoded signal block */ |
const uint16_t *bytes, /* (i) encoded signal bits */ |
IlbcDecoder *iLBCdec_inst, /* (i/o) the decoder state |
@@ -44,6 +45,9 @@ void WebRtcIlbcfix_DecodeImpl( |
int16_t mode /* (i) 0: bad packet, PLC, |
1: normal */ |
) { |
+ const int old_mode = iLBCdec_inst->mode; |
+ const int old_use_enhancer = iLBCdec_inst->use_enhancer; |
+ |
size_t i; |
int16_t order_plus_one; |
@@ -100,7 +104,9 @@ void WebRtcIlbcfix_DecodeImpl( |
lsfdeq, LPC_FILTERORDER, iLBCdec_inst); |
/* Decode the residual using the cb and gain indexes */ |
- WebRtcIlbcfix_DecodeResidual(iLBCdec_inst, iLBCbits_inst, decresidual, syntdenum); |
+ if (!WebRtcIlbcfix_DecodeResidual(iLBCdec_inst, iLBCbits_inst, |
+ decresidual, syntdenum)) |
+ goto error; |
/* preparing the plc for a future loss! */ |
WebRtcIlbcfix_DoThePlc( |
@@ -241,4 +247,11 @@ void WebRtcIlbcfix_DecodeImpl( |
if (mode==0) { /* PLC was used */ |
iLBCdec_inst->prev_enh_pl=1; |
} |
+ |
+ return 0; // Success. |
+ |
+error: |
+ // The decoder got sick from eating that data. Reset it and return. |
+ WebRtcIlbcfix_InitDecode(iLBCdec_inst, old_mode, old_use_enhancer); |
+ return -1; // Error |
} |