aboutsummaryrefslogtreecommitdiff
path: root/libavcodec/mpegaudiodec.c
diff options
context:
space:
mode:
authorZdenek Kabelac2001-10-23 20:20:01 +0000
committerZdenek Kabelac2001-10-23 20:20:01 +0000
commit2d83f323d63332e5ecaa481d8f9301c0ea92b6ba (patch)
treec6ca0225989dce111b0ac18cc20a196062c4c105 /libavcodec/mpegaudiodec.c
parentde5123dc35da1baa2028c4f26b2d756f6f0451e2 (diff)
* and finaly avoid deadlock at the end of audio stream
Originally committed as revision 183 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/mpegaudiodec.c')
-rw-r--r--libavcodec/mpegaudiodec.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c
index 38f21cacc4..8af804772b 100644
--- a/libavcodec/mpegaudiodec.c
+++ b/libavcodec/mpegaudiodec.c
@@ -2271,9 +2271,9 @@ static int decode_frame(AVCodecContext * avctx,
if (len > buf_size)
len = buf_size;
else if (len > 0) {
- memcpy(s->inbuf_ptr, buf_ptr, len);
- buf_ptr += len;
- buf_size -= len;
+ memcpy(s->inbuf_ptr, buf_ptr, len);
+ buf_ptr += len;
+ buf_size -= len;
s->inbuf_ptr += len;
}
if ((s->inbuf_ptr - s->inbuf) >= HEADER_SIZE) {
@@ -2282,7 +2282,7 @@ static int decode_frame(AVCodecContext * avctx,
(s->inbuf[2] << 8) | s->inbuf[3];
if (check_header(header) < 0) {
/* no sync found : move by one byte (inefficient, but simple!) */
- memcpy(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf);
+ memcpy(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
s->inbuf_ptr--;
dprintf("skip %x\n", header);
/* reset free format frame size to give a chance
@@ -2291,14 +2291,14 @@ static int decode_frame(AVCodecContext * avctx,
} else {
if (decode_header(s, header) == 1) {
/* free format: compute frame size */
- s->frame_size = -1;
- memcpy(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf);
+ s->frame_size = -1;
+ memcpy(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
s->inbuf_ptr--;
} else {
/* update codec info */
avctx->sample_rate = s->sample_rate;
avctx->channels = s->nb_channels;
- avctx->bit_rate = s->bit_rate;
+ avctx->bit_rate = s->bit_rate;
}
}
}
@@ -2359,13 +2359,12 @@ static int decode_frame(AVCodecContext * avctx,
len = s->frame_size - len;
if (len > buf_size)
len = buf_size;
- else if (len > 0)
- {
+ else if (len < 4)
+ len = buf_size > 4 ? 4 : buf_size;
memcpy(s->inbuf_ptr, buf_ptr, len);
buf_ptr += len;
s->inbuf_ptr += len;
buf_size -= len;
- }
} else {
out_size = mp_decode_frame(s, out_samples);
s->inbuf_ptr = s->inbuf;