diff options
author | Alex Converse <alex.converse@gmail.com> | 2011-09-23 16:28:23 -0700 |
---|---|---|
committer | Alex Converse <alex.converse@gmail.com> | 2011-09-23 16:36:16 -0700 |
commit | 9fba8ebe0acdc28193d37b5e1f4c0d73c589ede2 (patch) | |
tree | 6484e3e990f0170fb7540a1c33d10c30d543c17c /libavformat | |
parent | 0c378ea1f76e226eff460c84634e7227e3705372 (diff) | |
download | ffmpeg-9fba8ebe0acdc28193d37b5e1f4c0d73c589ede2.tar.gz |
mpegps: Handle buffer exhaustion when reading packets.
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/mpeg.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index bc450495ae..f797da7e27 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -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, |