From 1ef0e8a6bf894974445e303c6e428aac7f0aaa75 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Fri, 8 Feb 2013 13:54:36 +0100 Subject: [PATCH] asfdec: do not assume every AVStream has a corresponding ASFStream This won't be true for ID3 attached picture. Also stop allocating now useless dummy ASFStreams for ASF native attached pictures. --- libavformat/asfdec.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/libavformat/asfdec.c b/libavformat/asfdec.c index 0a315d4e36..d4694310fc 100644 --- a/libavformat/asfdec.c +++ b/libavformat/asfdec.c @@ -22,6 +22,7 @@ //#define DEBUG #include "libavutil/attributes.h" +#include "libavutil/avassert.h" #include "libavutil/avstring.h" #include "libavutil/bswap.h" #include "libavutil/common.h" @@ -193,7 +194,6 @@ static int asf_read_picture(AVFormatContext *s, int len) enum AVCodecID id = AV_CODEC_ID_NONE; char mimetype[64]; uint8_t *desc = NULL; - ASFStream *ast = NULL; AVStream *st = NULL; int ret, type, picsize, desc_len; @@ -248,12 +248,10 @@ static int asf_read_picture(AVFormatContext *s, int len) goto fail; st = avformat_new_stream(s, NULL); - ast = av_mallocz(sizeof(*ast)); - if (!st || !ast) { + if (!st) { ret = AVERROR(ENOMEM); goto fail; } - st->priv_data = ast; st->disposition |= AV_DISPOSITION_ATTACHED_PIC; st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_id = id; @@ -271,7 +269,6 @@ static int asf_read_picture(AVFormatContext *s, int len) return 0; fail: - av_freep(&ast); av_freep(&desc); av_free_packet(&pkt); return ret; @@ -1107,6 +1104,7 @@ static int ff_asf_parse_packet(AVFormatContext *s, AVIOContext *pb, AVPacket *pk asf->asf_st = s->streams[asf->stream_index]->priv_data; } asf_st = asf->asf_st; + av_assert0(asf_st); if (asf->packet_replic_size == 1) { // frag_offset is here used as the beginning timestamp @@ -1316,6 +1314,8 @@ static void asf_reset_header(AVFormatContext *s) for (i = 0; i < s->nb_streams; i++) { asf_st = s->streams[i]->priv_data; + if (!asf_st) + continue; av_free_packet(&asf_st->pkt); asf_st->frag_offset = 0; asf_st->seq = 0; @@ -1364,6 +1364,7 @@ static int64_t asf_read_pts(AVFormatContext *s, int stream_index, i = pkt->stream_index; asf_st = s->streams[i]->priv_data; + av_assert0(asf_st); // assert((asf_st->packet_pos - s->data_offset) % s->packet_size == 0); pos = asf_st->packet_pos;