Browse Source

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
mmdevice-clean/8
Steve Lhomme 2 months ago
parent
commit
686d636a9e
  1. 25
      modules/demux/mkv/matroska_segment_parse.cpp

25
modules/demux/mkv/matroska_segment_parse.cpp

@ -249,6 +249,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 +271,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 +369,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 );
@ -1088,6 +1103,8 @@ void matroska_segment_c::ParseTrackEntry( const KaxTrackEntry *m )
if ( bSupported )
{
p_track->fmt.psz_language = strdup(metadata_payload.lang.c_str());
#ifdef HAVE_ZLIB
if( p_track->i_compression_type == MATROSKA_COMPRESSION_ZLIB &&
p_track->i_encoding_scope & MATROSKA_ENCODING_SCOPE_PRIVATE &&

Loading…
Cancel
Save