diff mbox series

[FFmpeg-devel] lavf/dashenc.c: Fix creating audio-only HLS playlists

Message ID 20210521114642.66802-1-przemyslaw.sobala@gmail.com
State Accepted
Headers show
Series [FFmpeg-devel] lavf/dashenc.c: Fix creating audio-only HLS playlists | expand

Checks

Context Check Description
andriy/configure warning Failed to apply patch

Commit Message

Przemysław Sobala May 21, 2021, 11:46 a.m. UTC
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

Please correct indentation of introduced if statement's body, before
applying.
---
 libavformat/dashenc.c | 39 +++++++++++++++++++++++++++++++++++----
 1 file changed, 35 insertions(+), 4 deletions(-)

Comments

Przemysław Sobala May 24, 2021, 12:39 p.m. UTC | #1
Hello all,
I wanted to follow Carl's advice (
https://trac.ffmpeg.org/ticket/9252#comment:4) and prepared a patch with
hidden indentation changes, via git format-patch --ignore-space-change
origin/master (see my previous message) but that patch does not apply then.
So once again I'm sending the whole patch that applies correctly, as an
attachment.

Really, contributing to FFmpeg should be made easier (e.g. reviewing
indentation changes is easy when sent as GitHub merge request)

--
Best regards.
Przemysław Sobala


On Fri, 21 May 2021 at 13:46, Przemysław Sobala <przemyslaw.sobala@gmail.com>
wrote:

> 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
>
> Please correct indentation of introduced if statement's body, before
> applying.
> ---
>  libavformat/dashenc.c | 39 +++++++++++++++++++++++++++++++++++----
>  1 file changed, 35 insertions(+), 4 deletions(-)
>
> diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
> index 07f191e2a2..c5da02840b 100644
> --- a/libavformat/dashenc.c
> +++ b/libavformat/dashenc.c
> @@ -1256,10 +1256,6 @@ 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 ||
> @@ -1282,6 +1278,13 @@ static int write_manifest(AVFormatContext *s, int
> final)
>
>          ff_hls_write_playlist_version(c->m3u8_out, 7);
>
> +        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];
> @@ -1336,6 +1339,34 @@ static int write_manifest(AVFormatContext *s, int
> final)
>                                          playlist_file, agroup,
>                                          codec_str_ptr, NULL, NULL);
>              }
> +
> +        } else {
> +            // treat audio streams as separate renditions
> +
> +            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];
> +                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_AUDIO)
> +                    continue;
> +                if (os->segment_type != SEGMENT_TYPE_MP4)
> +                    continue;
> +                av_strlcpy(codec_str, os->codec_str, sizeof(codec_str));
> +                get_hls_playlist_name(playlist_file,
> sizeof(playlist_file), NULL, i);
> +                ff_hls_write_stream_info(st, c->m3u8_out, stream_bitrate,
> +                                        playlist_file, NULL,
> +                                        codec_str, NULL, NULL);
> +            }
> +        }
> +
>          dashenc_io_close(s, &c->m3u8_out, temp_filename);
>          if (use_rename)
>              if ((ret = ff_rename(temp_filename, filename_hls, s)) < 0)
> --
> 2.31.1
>
>
Przemysław Sobala May 31, 2021, 12:24 p.m. UTC | #2
Could any maintainer take a look at that?
--
Best regards
Przemysław Sobala
Jeyapal, Karthick June 1, 2021, 6:36 a.m. UTC | #3
>On 5/31/21, 6:00 PM, "Przemysław Sobala" <przemyslaw.sobala@gmail.com> wrote:
>
>Could any maintainer take a look at that?
Pushed with minor indentation changes.

Thanks,
Karthick
>--
>Best regards
>Przemysław Sobala
diff mbox series

Patch

diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
index 07f191e2a2..c5da02840b 100644
--- a/libavformat/dashenc.c
+++ b/libavformat/dashenc.c
@@ -1256,10 +1256,6 @@  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 ||
@@ -1282,6 +1278,13 @@  static int write_manifest(AVFormatContext *s, int final)
 
         ff_hls_write_playlist_version(c->m3u8_out, 7);
 
+        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];
@@ -1336,6 +1339,34 @@  static int write_manifest(AVFormatContext *s, int final)
                                         playlist_file, agroup,
                                         codec_str_ptr, NULL, NULL);
             }
+
+        } else {
+            // treat audio streams as separate renditions
+
+            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];
+                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_AUDIO)
+                    continue;
+                if (os->segment_type != SEGMENT_TYPE_MP4)
+                    continue;
+                av_strlcpy(codec_str, os->codec_str, sizeof(codec_str));
+                get_hls_playlist_name(playlist_file, sizeof(playlist_file), NULL, i);
+                ff_hls_write_stream_info(st, c->m3u8_out, stream_bitrate,
+                                        playlist_file, NULL,
+                                        codec_str, NULL, NULL);
+            }
+        }
+
         dashenc_io_close(s, &c->m3u8_out, temp_filename);
         if (use_rename)
             if ((ret = ff_rename(temp_filename, filename_hls, s)) < 0)