diff options
author | Anssi Hannula <anssi.hannula@iki.fi> | 2016-11-06 23:23:20 +0200 |
---|---|---|
committer | Anssi Hannula <anssi.hannula@iki.fi> | 2016-11-07 19:06:08 +0200 |
commit | 7568b0f553b0c93c42dff5abb6ef87984bbd45aa (patch) | |
tree | 2973a235adbbdca578ac9a3df6359536719b11dd | |
parent | fc20e300580cf3f9f73fa15c4a782a4a4a1fa2cf (diff) | |
download | ffmpeg-7568b0f553b0c93c42dff5abb6ef87984bbd45aa.tar.gz |
avformat/hls: Add missing error check for avcodec_parameters_copy()
Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
(cherry picked from commit e2193b53eab9f207544a75ebaf51871b7a1a7931)
-rw-r--r-- | libavformat/hls.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/libavformat/hls.c b/libavformat/hls.c index ce52bf5d9d..2bf86fadc6 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -1528,9 +1528,13 @@ static void add_stream_to_programs(AVFormatContext *s, struct playlist *pls, AVS av_dict_set_int(&stream->metadata, "variant_bitrate", bandwidth, 0); } -static void set_stream_info_from_input_stream(AVStream *st, struct playlist *pls, AVStream *ist) +static int set_stream_info_from_input_stream(AVStream *st, struct playlist *pls, AVStream *ist) { - avcodec_parameters_copy(st->codecpar, ist->codecpar); + int err; + + err = avcodec_parameters_copy(st->codecpar, ist->codecpar); + if (err < 0) + return err; if (pls->is_id3_timestamped) /* custom timestamps via id3 */ avpriv_set_pts_info(st, 33, 1, MPEG_TIME_BASE); @@ -1538,11 +1542,15 @@ static void set_stream_info_from_input_stream(AVStream *st, struct playlist *pls avpriv_set_pts_info(st, ist->pts_wrap_bits, ist->time_base.num, ist->time_base.den); st->internal->need_context_update = 1; + + return 0; } /* add new subdemuxer streams to our context, if any */ static int update_streams_from_subdemuxer(AVFormatContext *s, struct playlist *pls) { + int err; + while (pls->n_main_streams < pls->ctx->nb_streams) { int ist_idx = pls->n_main_streams; AVStream *st = avformat_new_stream(s, NULL); @@ -1552,11 +1560,13 @@ static int update_streams_from_subdemuxer(AVFormatContext *s, struct playlist *p return AVERROR(ENOMEM); st->id = pls->index; - set_stream_info_from_input_stream(st, pls, ist); - dynarray_add(&pls->main_streams, &pls->n_main_streams, st); add_stream_to_programs(s, pls, st); + + err = set_stream_info_from_input_stream(st, pls, ist); + if (err < 0) + return err; } return 0; @@ -1990,8 +2000,13 @@ static int hls_read_packet(AVFormatContext *s, AVPacket *pkt) /* There may be more situations where this would be useful, but this at least * handles newly probed codecs properly (i.e. request_probe by mpegts). */ - if (ist->codecpar->codec_id != st->codecpar->codec_id) - set_stream_info_from_input_stream(st, pls, ist); + if (ist->codecpar->codec_id != st->codecpar->codec_id) { + ret = set_stream_info_from_input_stream(st, pls, ist); + if (ret < 0) { + av_packet_unref(pkt); + return ret; + } + } return 0; } |