mirror of https://git.ffmpeg.org/ffmpeg.git
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@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
8b6aeb1fcd
commit
23db5418ed
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue