... I just noticed the langEntry var name. Here's an update. Sorry... Even after checking the guidelines twice, apparently I still miss things.
I'll try to do better next time. I really expect this to be the last update. (at the very least concerning coding style issues) Sorry, Philippe Op ma 19 nov. 2018 om 21:21 schreef Philippe Symons < philippe.sym...@gmail.com>: > Hello everyone, > > I've updated the patch based on the feedback from Moritz. Thanks, btw! I > apologize if I wasted your time with this. > > I've updated the patch based on your feedback. I hope I got it right this > time. > > Looking forward to your feedback, > > Best regards, > > Philippe Symons > > Op za 17 nov. 2018 om 11:20 schreef Moritz Barsnick <barsn...@gmx.net>: > >> On Thu, Nov 15, 2018 at 00:29:00 +0100, Philippe Symons wrote: >> > Here is the new version of the patch in which the comments on the curly >> > braces have been resolved as well. >> >> Style-wise, there are other issues. (I'm not judging technically here.) >> >> > Subject: [PATCH] [HLS] Add LANGUAGE attribute to #EXT-X-MEDIA tag for >> > audio-only variant streams. >> >> The project prefers: >> avformat/hls,dash: add LANGUAGE attribute to #EXT-X-MEDIA tag for >> audio-only variant streams >> >> (i.e. source hierarchy, no trailing dot, ...) >> >> > set_http_options(s, &options, hls); >> > - >> > ret = hlsenc_io_open(s, &hls->m3u8_out, hls->master_m3u8_url, >> &options); >> >> Don't add extra lines, please. >> >> > for (i = 0; i < hls->nb_varstreams; i++) { >> > + AVFormatContext* var_context; >> > + char* language = NULL; >> >> Please read >> https://www.ffmpeg.org/developer.html#Coding-Rules-1 >> >> abouts brackets and indentation, and look at other code sections.. >> Furthermore, the "pointer specifier" (or whatever that's called) sticks >> to the variable, not the type, in ffmpeg declarations: >> >> char *language = NULL; >> >> Same in other places. >> >> > + if(var_context && var_context->nb_streams > 0) { >> >> Bracket / whitspace style: "if (var_context [...]" >> >> > + if(langEntry) { >> Same here: if (langEntry) >> And in other places. >> >> > + language = langEntry->value; >> > + } >> >> Some developers prefer you to drop the curly brackets around one-liner >> blocks. >> >> No review of the technical implications, sorry. >> >> Cheers, >> Moritz >> _______________________________________________ >> ffmpeg-devel mailing list >> ffmpeg-devel@ffmpeg.org >> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> >
From 1efe99216f48ae5afb98c3d98f57c19494f0fa20 Mon Sep 17 00:00:00 2001 From: Philippe Symons <philippe.symons@gmail.com> Date: Mon, 19 Nov 2018 21:32:36 +0100 Subject: [PATCH] avformat/hls,dash: add LANGUAGE attribute to #EXT-X-MEDIA tag for audio-only variant streams Signed-off-by: Philippe Symons <philippe.symons@gmail.com> --- libavformat/dashenc.c | 2 +- libavformat/hlsenc.c | 20 +++++++++++++++++++- libavformat/hlsplaylist.c | 6 +++++- libavformat/hlsplaylist.h | 2 +- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index d151921175..eca7525bf0 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -898,7 +898,7 @@ static int write_manifest(AVFormatContext *s, int final) if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO) continue; get_hls_playlist_name(playlist_file, sizeof(playlist_file), NULL, i); - ff_hls_write_audio_rendition(c->m3u8_out, (char *)audio_group, + ff_hls_write_audio_rendition(c->m3u8_out, (char *)audio_group, NULL, playlist_file, i, is_default); max_audio_bitrate = FFMAX(st->codecpar->bit_rate + os->muxer_overhead, max_audio_bitrate); diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index 24b678efe0..58c6d3ae34 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -1228,12 +1228,30 @@ static int create_master_playlist(AVFormatContext *s, /* For audio only variant streams add #EXT-X-MEDIA tag with attributes*/ for (i = 0; i < hls->nb_varstreams; i++) { + AVFormatContext *var_context; + char *language = NULL; + vs = &(hls->var_streams[i]); + var_context = vs->avf; if (vs->has_video || vs->has_subtitle || !vs->agroup) continue; m3u8_name_size = strlen(vs->m3u8_name) + 1; + + /* + * Try to obtain the language code of the audio stream. + * -if available- it will be used to write the LANGUAGE + * attribute in the #EXT-X-MEDIA tag + */ + if (var_context && var_context->nb_streams > 0) { + AVDictionary *meta_dict = vs->streams[0]->metadata; + AVDictionaryEntry *lang_entry = av_dict_get(meta_dict, "language", NULL, 0); + + if (lang_entry) + language = lang_entry->value; + } + m3u8_rel_name = av_malloc(m3u8_name_size); if (!m3u8_rel_name) { ret = AVERROR(ENOMEM); @@ -1247,7 +1265,7 @@ static int create_master_playlist(AVFormatContext *s, goto fail; } - ff_hls_write_audio_rendition(hls->m3u8_out, vs->agroup, m3u8_rel_name, 0, 1); + ff_hls_write_audio_rendition(hls->m3u8_out, vs->agroup, language, m3u8_rel_name, 0, 1); av_freep(&m3u8_rel_name); } diff --git a/libavformat/hlsplaylist.c b/libavformat/hlsplaylist.c index efcbff0009..55e05b4c73 100644 --- a/libavformat/hlsplaylist.c +++ b/libavformat/hlsplaylist.c @@ -35,12 +35,16 @@ void ff_hls_write_playlist_version(AVIOContext *out, int version) { avio_printf(out, "#EXT-X-VERSION:%d\n", version); } -void ff_hls_write_audio_rendition(AVIOContext *out, char *agroup, +void ff_hls_write_audio_rendition(AVIOContext *out, char *agroup, char *language, char *filename, int name_id, int is_default) { if (!out || !agroup || !filename) return; avio_printf(out, "#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"group_%s\"", agroup); + + if (language) + avio_printf(out, ",LANGUAGE=\"%s\"", language); + avio_printf(out, ",NAME=\"audio_%d\",DEFAULT=%s,URI=\"%s\"\n", name_id, is_default ? "YES" : "NO", filename); } diff --git a/libavformat/hlsplaylist.h b/libavformat/hlsplaylist.h index 5054b01c8f..360ca0ae53 100644 --- a/libavformat/hlsplaylist.h +++ b/libavformat/hlsplaylist.h @@ -37,7 +37,7 @@ typedef enum { } PlaylistType; void ff_hls_write_playlist_version(AVIOContext *out, int version); -void ff_hls_write_audio_rendition(AVIOContext *out, char *agroup, +void ff_hls_write_audio_rendition(AVIOContext *out, char *agroup, char *language, char *filename, int name_id, int is_default); void ff_hls_write_stream_info(AVStream *st, AVIOContext *out, int bandwidth, char *filename, char *agroup, -- 2.17.1
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel