[FFmpeg-devel] [PATCH] avformat/hlsenc: minus subtitle streams count when subtitle stream between video and audio streams
Steven Liu
liuqi05 at kuaishou.com
Tue Jul 20 15:07:36 EEST 2021
because subtitles streams will be written to webvtt m3u8 list
so the stream index should minus subtitles streams count when subtitle
between audio and video streams.
testcase:
before patch:
ffmpeg -i input -map 0:a:0 -map 0:s:0 -map 0:v:0 -f hls aaaa.m3u8
will EXC_BAD_ACCESS
after patch:
ffmpeg -i input -map 0:a:0 -map 0:s:0 -map 0:v:0 -f hls aaaa.m3u8
will ok
Signed-off-by: Steven Liu <liuqi05 at kuaishou.com>
---
libavformat/hlsenc.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index 5272ecabbb..28bfa73618 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -2292,6 +2292,7 @@ static int hls_write_header(AVFormatContext *s)
VariantStream *vs = NULL;
for (i = 0; i < hls->nb_varstreams; i++) {
+ int subtitle_streams = 0;
vs = &hls->var_streams[i];
ret = avformat_write_header(vs->avf, NULL);
@@ -2312,10 +2313,11 @@ static int hls_write_header(AVFormatContext *s)
}
if (outer_st->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE)
- inner_st = vs->avf->streams[j];
- else if (vs->vtt_avf)
+ inner_st = vs->avf->streams[j - subtitle_streams];
+ else if (vs->vtt_avf) {
inner_st = vs->vtt_avf->streams[0];
- else {
+ subtitle_streams++;
+ } else {
/* We have a subtitle stream, when the user does not want one */
inner_st = NULL;
continue;
@@ -2402,6 +2404,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
int is_ref_pkt = 1;
int ret = 0, can_split = 1, i, j;
int stream_index = 0;
+ int subtitle_streams = 0;
int range_length = 0;
const char *proto = NULL;
int use_temp_file = 0;
@@ -2411,13 +2414,16 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
for (i = 0; i < hls->nb_varstreams; i++) {
vs = &hls->var_streams[i];
for (j = 0; j < vs->nb_streams; j++) {
+ if (vs->streams[j]->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
+ subtitle_streams++;
+ }
if (vs->streams[j] == st) {
if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
oc = vs->vtt_avf;
stream_index = 0;
} else {
oc = vs->avf;
- stream_index = j;
+ stream_index = j - subtitle_streams;
}
break;
}
@@ -2646,7 +2652,6 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
if (ret < 0) {
return ret;
}
-
}
vs->packets_written++;
--
2.25.0
More information about the ffmpeg-devel
mailing list