From c110cbf6b59dfa0f3fc712b4e3c9095e33c57b50 Mon Sep 17 00:00:00 2001 From: LYF Date: Fri, 16 Nov 2012 14:12:27 +0800 Subject: [PATCH] hls: Create an AVProgram for each variant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without the information, an application may choose audio from one variant and video from another variant, which leads to fetching two variants from the network. This enables av_find_best_stream() to find matching audio and video streams, so that only one variant is fetched. Signed-off-by: Martin Storsjö --- libavformat/hls.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libavformat/hls.c b/libavformat/hls.c index d69a3809e4..b01dd3e791 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -489,6 +489,8 @@ static int hls_read_header(AVFormatContext *s) struct variant *v = c->variants[i]; AVInputFormat *in_fmt = NULL; char bitrate_str[20]; + AVProgram *program; + if (v->n_segments == 0) continue; @@ -528,6 +530,12 @@ static int hls_read_header(AVFormatContext *s) if (ret < 0) goto fail; snprintf(bitrate_str, sizeof(bitrate_str), "%d", v->bandwidth); + + program = av_new_program(s, i); + if (!program) + goto fail; + av_dict_set(&program->metadata, "variant_bitrate", bitrate_str, 0); + /* Create new AVStreams for each stream in this variant */ for (j = 0; j < v->ctx->nb_streams; j++) { AVStream *st = avformat_new_stream(s, NULL); @@ -536,6 +544,7 @@ static int hls_read_header(AVFormatContext *s) ret = AVERROR(ENOMEM); goto fail; } + ff_program_add_stream_index(s, i, stream_offset + j); st->id = i; avpriv_set_pts_info(st, ist->pts_wrap_bits, ist->time_base.num, ist->time_base.den); avcodec_copy_context(st->codec, v->ctx->streams[j]->codec);