[FFmpeg-devel] [PATCH v2 5/6] avformat/matroskaenc: add support for writing LanguageBCP47 element
Marth64
marth64 at proxyid.net
Wed Nov 27 08:09:26 EET 2024
Signed-off-by: Marth64 <marth64 at 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
More information about the ffmpeg-devel
mailing list