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 |
Context | Check | Description |
---|---|---|
andriy/configure | warning | Failed to apply patch |
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 > >
Could any maintainer take a look at that? -- Best regards Przemysław Sobala
>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 --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)