[FFmpeg-devel] [PATCH] hls: create an AVProgram for each variant
LYF
yefei.li at gmail.com
Fri Nov 16 07:12:27 CET 2012
Without the information, application may choose audio from one variant
and video from another variant, which leads to fetch two variants from
network. This enables av_find_best_stream() to find matching audio and
video streams, so that only one variant is fetched from network.
Signed-off-by: LYF <yefei.li at gmail.com>
---
libavformat/hls.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/libavformat/hls.c b/libavformat/hls.c
index ef5803b..e29ab02 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -504,6 +504,7 @@ static int hls_read_header(AVFormatContext *s)
struct variant *v = c->variants[i];
AVInputFormat *in_fmt = NULL;
char bitrate_str[20];
+ AVProgram * program = NULL;
if (v->n_segments == 0)
continue;
@@ -549,6 +550,13 @@ static int hls_read_header(AVFormatContext *s)
if (ret < 0)
goto fail;
snprintf(bitrate_str, sizeof(bitrate_str), "%d", v->bandwidth);
+
+ /* Create new AVprogram for variant i */
+ 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);
@@ -556,6 +564,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;
avcodec_copy_context(st->codec, v->ctx->streams[j]->codec);
if (v->bandwidth)
--
1.7.9.5
More information about the ffmpeg-devel
mailing list