Signed-off-by: Marth64 <mart...@proxyid.net> --- libavformat/matroskaenc.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-)
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 60c896e964..37e384d2bb 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1896,9 +1896,33 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, if ((tag = av_dict_get(st->metadata, "title", NULL, 0))) put_ebml_string(pb, MATROSKA_ID_TRACKNAME, tag->value); - tag = av_dict_get(st->metadata, "language", NULL, 0); - put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, - tag && tag->value[0] ? tag->value : "und"); + + tag = av_dict_get(st->metadata, "language_bcp47", NULL, 0); + if (tag) { + char *bcp47_parsed_language; + char **bcp47_parsed_subtags; + int bcp47_parsed_nb_subtags; + + ret = ff_bcp47_parse(tag->value, &bcp47_parsed_language, &bcp47_parsed_subtags, + &bcp47_parsed_nb_subtags); + if (ret < 0 && ret != AVERROR_INVALIDDATA) { + return ret; + } else if (!ret) { + put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, bcp47_parsed_language); + + if (bcp47_parsed_subtags) { + put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGEBCP47, tag->value); + + for (int i = 0; i < bcp47_parsed_nb_subtags; i++) + av_free(bcp47_parsed_subtags[i]); + av_freep(&bcp47_parsed_subtags); + } + } + } else { + tag = av_dict_get(st->metadata, "language", NULL, 0); + put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, + tag && tag->value[0] ? tag->value : "und"); + } // The default value for TRACKFLAGDEFAULT is 1, so add element // if we need to clear it. @@ -2229,6 +2253,8 @@ static int mkv_check_tag_name(const char *name, uint32_t elementid) av_strcasecmp(name, "duration") && (elementid != MATROSKA_ID_TAGTARGETS_TRACKUID || av_strcasecmp(name, "language")) && + (elementid != MATROSKA_ID_TAGTARGETS_TRACKUID || + av_strcasecmp(name, "language_bcp47")) && (elementid != MATROSKA_ID_TAGTARGETS_ATTACHUID || (av_strcasecmp(name, "filename") && av_strcasecmp(name, "mimetype"))); -- 2.34.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".