Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
e99cddb6 by Steve Lhomme at 2026-02-08T04:14:18+00:00
demux: mkv: use "eng" as the default language.

For each track the language element needs to be present of the default value is 
"eng" [^1].

[^1]: https://www.rfc-editor.org/rfc/rfc9559#section-5.1.4.1.19

- - - - -
686d636a by Steve Lhomme at 2026-02-08T04:14:18+00:00
demux: mkv: handle the IETF language with more priority than the old language 
element

See [^1].

[^1]: https://www.rfc-editor.org/rfc/rfc9559#language-codes

- - - - -
ec79f5fc by Steve Lhomme at 2026-02-08T04:14:18+00:00
demux: mkv: check the language string is a valid ISO639 one

Even the IETF base languages is using ISO639.

- - - - -
37e0097a by Steve Lhomme at 2026-02-08T04:14:18+00:00
demux: mkv: only set the video.pose if the track won't be discarded

- - - - -


2 changed files:

- modules/demux/mkv/matroska_segment_parse.cpp
- modules/demux/mkv/mkv.cpp


Changes:

=====================================
modules/demux/mkv/matroska_segment_parse.cpp
=====================================
@@ -39,6 +39,7 @@ extern "C" {
 
 #include "vlc_colors.h"
 
+#include <vlc_iso_lang.h>
 #include <vlc_codecs.h>
 #include <stdexcept>
 #include <limits>
@@ -249,6 +250,8 @@ void matroska_segment_c::ParseTrackEntry( const 
KaxTrackEntry *m )
       demux_t            * p_demuxer;
       bool&                bSupported;
       int                  level;
+      std::string          lang;
+      bool                 lang_is_ietf;
       struct {
         unsigned int i_crop_right;
         unsigned int i_crop_left;
@@ -269,7 +272,7 @@ void matroska_segment_c::ParseTrackEntry( const 
KaxTrackEntry *m )
       } pose;
 
     } metadata_payload = {
-      this, p_track, &sys.demuxer, bSupported, 3, { }, { }
+      this, p_track, &sys.demuxer, bSupported, 3, "eng", false, { }, { }
     };
 
     MKV_SWITCH_CREATE( EbmlTypeDispatcher, MetaDataHandlers, MetaDataCapture )
@@ -367,12 +370,25 @@ void matroska_segment_c::ParseTrackEntry( const 
KaxTrackEntry *m )
         }
         E_CASE( KaxTrackLanguage, lang )
         {
-            free( vars.tk->fmt.psz_language );
             const std::string slang ( lang );
             size_t pos = slang.find_first_of( '-' );
-            vars.tk->fmt.psz_language = pos != std::string::npos ? strndup( 
slang.c_str (), pos ) : strdup( slang.c_str() );
-            debug( vars, "Track Language=`%s'", vars.tk->fmt.psz_language ? 
vars.tk->fmt.psz_language : "(null)" );
+            const std::string l = std::string::npos ? slang.substr(0, pos) : 
slang;
+            debug( vars, "Track Language=`%s'", !l.empty() ? l.c_str() : 
"(null)" );
+            if (!vars.lang_is_ietf)
+            {
+                vars.lang = l;
+            }
         }
+#if LIBMATROSKA_VERSION >= 0x010406
+        E_CASE( KaxLanguageIETF, lang )
+        {
+            vars.lang_is_ietf = true;
+            const std::string slang ( lang );
+            size_t pos = slang.find_first_of( '-' );
+            vars.lang = pos != std::string::npos ? slang.substr(0, pos) : 
slang;
+            debug( vars, "IETF Track Language=`%s'", !vars.lang.empty() ? 
vars.lang.c_str() : "(null)" );
+        }
+#endif
         E_CASE( KaxCodecID, codecid )
         {
             vars.tk->codec = std::string( codecid );
@@ -1074,11 +1090,6 @@ void matroska_segment_c::ParseTrackEntry( const 
KaxTrackEntry *m )
 
     MetaDataHandlers::Dispatcher().iterate ( m->begin(), m->end(), 
&metadata_payload );
 
-    vlc_viewpoint_from_euler( &p_track->fmt.video.pose,
-                              metadata_payload.pose.yaw,
-                              metadata_payload.pose.pitch,
-                              metadata_payload.pose.roll);
-
     if( p_track->i_number == 0 )
     {
         msg_Warn( &sys.demuxer, "Missing KaxTrackNumber, discarding track!" );
@@ -1088,6 +1099,16 @@ void matroska_segment_c::ParseTrackEntry( const 
KaxTrackEntry *m )
 
     if ( bSupported )
     {
+        auto *iso_lang = vlc_find_iso639(metadata_payload.lang.c_str(), false);
+        if (iso_lang != nullptr)
+            msg_Dbg( &sys.demuxer, "Unknown language %s!", 
metadata_payload.lang.c_str() );
+        p_track->fmt.psz_language = strdup(metadata_payload.lang.c_str());
+
+        vlc_viewpoint_from_euler( &p_track->fmt.video.pose,
+                                  metadata_payload.pose.yaw,
+                                  metadata_payload.pose.pitch,
+                                  metadata_payload.pose.roll);
+
 #ifdef HAVE_ZLIB
         if( p_track->i_compression_type == MATROSKA_COMPRESSION_ZLIB &&
             p_track->i_encoding_scope & MATROSKA_ENCODING_SCOPE_PRIVATE &&


=====================================
modules/demux/mkv/mkv.cpp
=====================================
@@ -957,7 +957,7 @@ mkv_track_t::mkv_track_t(enum es_format_category_e es_cat) :
             /* fall through */
         case VIDEO_ES:
         case SPU_ES:
-            fmt.psz_language = strdup("English");
+            fmt.psz_language = strdup("eng");
             break;
         default:
             // no language needed



View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/52762d9d070b83272f442424534881b7b93db695...37e0097a477413b32de017cba96013bf2467bda7

-- 
View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/52762d9d070b83272f442424534881b7b93db695...37e0097a477413b32de017cba96013bf2467bda7
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance
_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to