diff options
author | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2012-12-04 23:13:00 +0400 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2012-12-05 00:16:54 +0400 |
commit | a5bd4409319614f166a83934baddceed7e6c58b4 (patch) | |
tree | d1f9dee2841c4c53b46b6c01039ad292ed49e8ca | |
parent | 7fcd66c40d0257796c912a6f500a98cbea89e704 (diff) |
Don't update the internal decoder state until we know the packet is valid
-rw-r--r-- | src/opus_decoder.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/opus_decoder.c b/src/opus_decoder.c index 98de210a..015ae17a 100644 --- a/src/opus_decoder.c +++ b/src/opus_decoder.c @@ -785,17 +785,20 @@ int opus_decode_native(OpusDecoder *st, const unsigned char *data, return frame_size; } tot_offset = 0; - st->mode = packet_mode; - st->bandwidth = packet_bandwidth; - st->frame_size = packet_frame_size; - st->stream_channels = packet_stream_channels; if (count < 0) return count; tot_offset += offset; - if (count*st->frame_size > frame_size) + if (count*packet_frame_size > frame_size) return OPUS_BUFFER_TOO_SMALL; + + /* Update the state as the last step to avoid updating it on an invalid packet */ + st->mode = packet_mode; + st->bandwidth = packet_bandwidth; + st->frame_size = packet_frame_size; + st->stream_channels = packet_stream_channels; + nb_samples=0; for (i=0;i<count;i++) { |