[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