mpegps: Handle buffer exhaustion when reading packets.
authorAlex Converse <alex.converse@gmail.com>
Fri, 23 Sep 2011 23:28:23 +0000 (16:28 -0700)
committerAlex Converse <alex.converse@gmail.com>
Fri, 23 Sep 2011 23:36:16 +0000 (16:36 -0700)
libavformat/mpeg.c

index bc45049..f797da7 100644 (file)
@@ -418,7 +418,7 @@ static int mpegps_read_packet(AVFormatContext *s,
 {
     MpegDemuxContext *m = s->priv_data;
     AVStream *st;
-    int len, startcode, i, es_type;
+    int len, startcode, i, es_type, ret;
     enum CodecID codec_id = CODEC_ID_NONE;
     enum AVMediaType type;
     int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work
@@ -562,7 +562,13 @@ static int mpegps_read_packet(AVFormatContext *s,
             return AVERROR(EINVAL);
     }
     av_new_packet(pkt, len);
-    avio_read(s->pb, pkt->data, pkt->size);
+    ret = avio_read(s->pb, pkt->data, pkt->size);
+    if (ret < 0) {
+        pkt->size = 0;
+    } else if (ret < pkt->size) {
+        pkt->size = ret;
+        memset(pkt->data + ret, 0, FF_INPUT_BUFFER_PADDING_SIZE);
+    }
     pkt->pts = pts;
     pkt->dts = dts;
     pkt->pos = dummy_pos;
@@ -571,7 +577,7 @@ static int mpegps_read_packet(AVFormatContext *s,
             pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0,
             pkt->size);
 
-    return 0;
+    return (ret < 0) ? ret : 0;
 }
 
 static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,