summaryrefslogtreecommitdiff
path: root/libavcodec/mpegaudiodec.c
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2011-12-30 13:08:21 -0800
committerJustin Ruggles <justin.ruggles@gmail.com>2011-12-31 14:19:09 -0500
commit464f26889c99f194d112fcf1197795d341fad38b (patch)
tree081529cdfc90718f8d26563cedfb8ab9ae031cb6 /libavcodec/mpegaudiodec.c
parent481a7ff5bd44dc63fcdabe34474a921269c97f99 (diff)
mpegaudiodec: fix seeking.
The safe bitstream reader does not allow using skip_bits_long() to seek to a point before the start of the buffer, which was needed by the mp3 decoder. This change instead calculates the start point of the first valid granule and skips to that position. Signed-off-by: Justin Ruggles <justin.ruggles@gmail.com>
Diffstat (limited to 'libavcodec/mpegaudiodec.c')
-rw-r--r--libavcodec/mpegaudiodec.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c
index 63ae455199..ad3b199e24 100644
--- a/libavcodec/mpegaudiodec.c
+++ b/libavcodec/mpegaudiodec.c
@@ -1551,25 +1551,27 @@ static int mp_decode_layer3(MPADecodeContext *s)
#if !UNCHECKED_BITSTREAM_READER
s->gb.size_in_bits_plus8 += EXTRABYTES * 8;
#endif
- skip_bits_long(&s->gb, 8*(s->last_buf_size - main_data_begin));
- }
-
- for (gr = 0; gr < nb_granules; gr++) {
- for (ch = 0; ch < s->nb_channels; ch++) {
- g = &s->granules[ch][gr];
- if (get_bits_count(&s->gb) < 0) {
- av_log(s->avctx, AV_LOG_DEBUG, "mdb:%d, lastbuf:%d skipping granule %d\n",
- main_data_begin, s->last_buf_size, gr);
- skip_bits_long(&s->gb, g->part2_3_length);
+ s->last_buf_size <<= 3;
+ for (gr = 0, ch = 0; gr < nb_granules && (s->last_buf_size >> 3) < main_data_begin; gr++, ch = 0) {
+ for (; ch < s->nb_channels && (s->last_buf_size >> 3) < main_data_begin; ch++) {
+ g = &s->granules[ch][gr];
+ s->last_buf_size += g->part2_3_length;
memset(g->sb_hybrid, 0, sizeof(g->sb_hybrid));
- if (get_bits_count(&s->gb) >= s->gb.size_in_bits && s->in_gb.buffer) {
- skip_bits_long(&s->in_gb, get_bits_count(&s->gb) - s->gb.size_in_bits);
- s->gb = s->in_gb;
- s->in_gb.buffer = NULL;
- }
- continue;
}
+ }
+ skip_bits_long(&s->gb, s->last_buf_size - 8 * main_data_begin);
+ if (get_bits_count(&s->gb) >= s->gb.size_in_bits && s->in_gb.buffer) {
+ skip_bits_long(&s->in_gb, get_bits_count(&s->gb) - s->gb.size_in_bits);
+ s->gb = s->in_gb;
+ s->in_gb.buffer = NULL;
+ }
+ } else {
+ gr = ch = 0;
+ }
+ for (; gr < nb_granules; gr++, ch = 0) {
+ for (; ch < s->nb_channels; ch++) {
+ g = &s->granules[ch][gr];
bits_pos = get_bits_count(&s->gb);
if (!s->lsf) {