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