diff options
author | Jonathan Baecker <jonbae77@gmail.com> | 2024-09-30 21:40:20 +0200 |
---|---|---|
committer | Steven Liu <lq@chinaffmpeg.org> | 2024-10-13 22:59:22 +0800 |
commit | 425c3234206c042273e001c8865391a53ce5855e (patch) | |
tree | d0c405003829e505098034e3968f8b76ae0f7adf /libavformat | |
parent | de976eaf30df33e86c58c8c9af9905c1d8441934 (diff) | |
download | ffmpeg-425c3234206c042273e001c8865391a53ce5855e.tar.gz |
avformat/hlsenc: Respect `append_list` flag in subtitle
Ensure that when the `-hls_flags append_list` option is set,
that *.vtt files in stream_vtt.m3u8 are correctly updated.
This fixes https://trac.ffmpeg.org/ticket/11208
Reviewed-by: Steven Liu <lq@chinaffmpeg.org>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/hlsenc.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index 571d6b2752..8d4322796d 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -1202,6 +1202,22 @@ static int hls_append_segment(struct AVFormatContext *s, HLSContext *hls, return 0; } +static int extract_segment_number(const char *filename) { + const char *dot = strrchr(filename, '.'); + const char *num_start = dot - 1; + + while (num_start > filename && *num_start >= '0' && *num_start <= '9') { + num_start--; + } + + num_start++; + + if (num_start == dot) + return -1; + + return atoi(num_start); +} + static int parse_playlist(AVFormatContext *s, const char *url, VariantStream *vs) { HLSContext *hls = s->priv_data; @@ -1295,6 +1311,20 @@ static int parse_playlist(AVFormatContext *s, const char *url, VariantStream *vs goto fail; } ff_format_set_url(vs->avf, new_file); + + if (vs->has_subtitle) { + int vtt_index = extract_segment_number(line); + const char *vtt_basename = av_basename(vs->vtt_basename); + int len = strlen(vtt_basename) + 11; + char *vtt_file = av_mallocz(len); + if (!vtt_file) { + ret = AVERROR(ENOMEM); + goto fail; + } + snprintf(vtt_file, len, vtt_basename, vtt_index); + ff_format_set_url(vs->vtt_avf, vtt_file); + } + is_segment = 0; new_start_pos = avio_tell(vs->avf->pb); vs->size = new_start_pos - vs->start_pos; |