* and finaly avoid deadlock at the end of audio stream
authorZdenek Kabelac <kabi@informatics.muni.cz>
Tue, 23 Oct 2001 20:20:01 +0000 (20:20 +0000)
committerZdenek Kabelac <kabi@informatics.muni.cz>
Tue, 23 Oct 2001 20:20:01 +0000 (20:20 +0000)
Originally committed as revision 183 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/mpegaudiodec.c

index 38f21ca..8af8047 100644 (file)
@@ -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;