ffmpeg | branch: master | Przemysław Sobala | Thu
May 20 11:50:27 2021 +0200| [575e52272d42f4278c6620f1a999c41425db2094] |
committer: Karthick J
lavf/dashenc.c: Fix creating audio-only HLS playlists
With audio/video HLS playlists, audio chunklists are treated as
alternative renditions for video chunklists. This is wrong for
audio-only HLS playlists.
fixes: 9252
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=575e52272d42f4278c6620f1a999c41425db2094
---
libavformat/dashenc.c | 139 ++
1 file changed, 85 insertions(+), 54 deletions(-)
diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
index ebbdfd627c..810ab22416 100644
--- a/libavformat/dashenc.c
+++ b/libavformat/dashenc.c
@@ -1256,14 +1256,10 @@ static int write_manifest(AVFormatContext *s, int final)
if (c->hls_playlist) {
char filename_hls[1024];
-const char *audio_group = "A1";
-char audio_codec_str[128] = "\0";
-int is_default = 1;
-int max_audio_bitrate = 0;
// Publish master playlist only the configured rate
if (c->master_playlist_created && (!c->master_publish_rate ||
- c->streams[0].segment_index % c->master_publish_rate))
+c->streams[0].segment_index % c->master_publish_rate))
return 0;
if (*c->dirname)
@@ -1282,60 +1278,95 @@ static int write_manifest(AVFormatContext *s, int final)
ff_hls_write_playlist_version(c->m3u8_out, 7);
-for (i = 0; i < s->nb_streams; i++) {
-char playlist_file[64];
-AVStream *st = s->streams[i];
-OutputStream *os = &c->streams[i];
-if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
-continue;
-if (os->segment_type != SEGMENT_TYPE_MP4)
-continue;
-get_hls_playlist_name(playlist_file, sizeof(playlist_file), NULL,
i);
-ff_hls_write_audio_rendition(c->m3u8_out, (char *)audio_group,
- playlist_file, NULL, i, is_default);
-max_audio_bitrate = FFMAX(st->codecpar->bit_rate +
- os->muxer_overhead, max_audio_bitrate);
-if (!av_strnstr(audio_codec_str, os->codec_str,
sizeof(audio_codec_str))) {
-if (strlen(audio_codec_str))
-av_strlcat(audio_codec_str, ",", sizeof(audio_codec_str));
-av_strlcat(audio_codec_str, os->codec_str,
sizeof(audio_codec_str));
+if (c->has_video) {
+// treat audio streams as alternative renditions for video streams
+const char *audio_group = "A1";
+char audio_codec_str[128] = "\0";
+int is_default = 1;
+int max_audio_bitrate = 0;
+
+for (i = 0; i < s->nb_streams; i++) {
+char playlist_file[64];
+AVStream *st = s->streams[i];
+OutputStream *os = &c->streams[i];
+if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
+continue;
+if (os->segment_type != SEGMENT_TYPE_MP4)
+continue;
+get_hls_playlist_name(playlist_file, sizeof(playlist_file),
NULL, i);
+ff_hls_write_audio_rendition(c->m3u8_out, (char *)audio_group,
+ playlist_file, NULL, i,
is_default);
+max_audio_bitrate = FFMAX(st->codecpar->bit_rate +
+ os->muxer_overhead,
max_audio_bitrate);
+if (!av_strnstr(audio_codec_str, os->codec_str,
sizeof(audio_codec_str))) {
+if (strlen(audio_codec_str))
+av_strlcat(audio_codec_str, ",",
sizeof(audio_codec_str));
+av_strlcat(audio_codec_str, os->codec_str,
sizeof(audio_codec_str));
+}
+is_default = 0;
}
-is_default = 0;
-}
-for (i = 0; i < s->nb_streams; i++) {
-char playlist_file[64];
-char codec_str[128];
-AVStream *st = s->streams[i];
-OutputStream *os = &c->streams[i];
-char *agroup = NULL;
-char *codec_str_ptr = NULL;
-int stream_bitrate = os->muxer_overhead;
-if (os->bit_rate > 0)
-stream_bitrate += os->bit_rate;
-else if (final)
-stream_bitrate += os->pos * 8 * AV_TIME_BASE /
c->total_duration;
-else if (os->first_segment_bit_rate > 0)
-stream_bitrate += os->first_segment_bit_rate;
-if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
-continue;
-if (os->segment_type != SEGMENT_TYPE_MP4)
-continue;
-av_strlcpy(codec_str, os->codec_str, sizeof(codec_str));
-if (max_audio_bitrate) {
-agroup