[FFmpeg-cvslog] hls: create an AVProgram for each variant

LYF git at videolan.org
Wed Nov 21 02:05:10 CET 2012


ffmpeg | branch: master | LYF <yefei.li at gmail.com> | Fri Nov 16 14:12:27 2012 +0800| [23db5418ed2ebaddbbc57a45b81caa6e94724587] | committer: Michael Niedermayer

hls: create an AVProgram for each variant

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>
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=23db5418ed2ebaddbbc57a45b81caa6e94724587
---

 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)



More information about the ffmpeg-cvslog mailing list