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

LYF git at videolan.org
Mon Jul 29 14:36:06 CEST 2013


ffmpeg | branch: master | LYF <yefei.li at gmail.com> | Fri Nov 16 14:12:27 2012 +0800| [c110cbf6b59dfa0f3fc712b4e3c9095e33c57b50] | committer: Martin Storsjö

hls: Create an AVProgram for each variant

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ö <martin at martin.st>

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

 libavformat/hls.c |    9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/libavformat/hls.c b/libavformat/hls.c
index d69a380..b01dd3e 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);



More information about the ffmpeg-cvslog mailing list