aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat
diff options
context:
space:
mode:
authorJonathan Baecker <jonbae77@gmail.com>2024-09-30 21:40:20 +0200
committerSteven Liu <lq@chinaffmpeg.org>2024-10-13 22:59:22 +0800
commit425c3234206c042273e001c8865391a53ce5855e (patch)
treed0c405003829e505098034e3968f8b76ae0f7adf /libavformat
parentde976eaf30df33e86c58c8c9af9905c1d8441934 (diff)
downloadffmpeg-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.c30
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;