@@ -154,10 +154,13 @@ void parse_ebml(FILE *file)
154
154
default :
155
155
if (code_len == MATROSKA_MAX_ID_LENGTH )
156
156
{
157
- mprint (MATROSKA_ERROR "Unknown element 0x%x at position " LLD ", skipping EBML block \n" , code ,
157
+ mprint (MATROSKA_WARNING "Unknown element 0x%x at position " LLD ", skipping this element \n" , code ,
158
158
get_current_byte (file ) - MATROSKA_MAX_ID_LENGTH );
159
- set_bytes (file , pos + len );
160
- return ;
159
+ // Skip just the unknown element, not the entire block
160
+ read_vint_block_skip (file );
161
+ // Reset code and code_len to start fresh with next element
162
+ code = 0 ;
163
+ code_len = 0 ;
161
164
}
162
165
break ;
163
166
}
@@ -232,10 +235,13 @@ void parse_segment_info(FILE *file)
232
235
default :
233
236
if (code_len == MATROSKA_MAX_ID_LENGTH )
234
237
{
235
- mprint (MATROSKA_ERROR "Unknown element 0x%x at position " LLD ", skipping segment info block \n" , code ,
238
+ mprint (MATROSKA_WARNING "Unknown element 0x%x at position " LLD ", skipping this element \n" , code ,
236
239
get_current_byte (file ) - MATROSKA_MAX_ID_LENGTH );
237
- set_bytes (file , pos + len );
238
- return ;
240
+ // Skip just the unknown element, not the entire block
241
+ read_vint_block_skip (file );
242
+ // Reset code and code_len to start fresh with next element
243
+ code = 0 ;
244
+ code_len = 0 ;
239
245
}
240
246
break ;
241
247
}
@@ -489,10 +495,13 @@ void parse_segment_cluster_block_group(struct matroska_ctx *mkv_ctx, ULLONG clus
489
495
default :
490
496
if (code_len == MATROSKA_MAX_ID_LENGTH )
491
497
{
492
- mprint (MATROSKA_ERROR "Unknown element 0x%x at position " LLD ", skipping segment cluster block group \n" , code ,
498
+ mprint (MATROSKA_WARNING "Unknown element 0x%x at position " LLD ", skipping this element \n" , code ,
493
499
get_current_byte (file ) - MATROSKA_MAX_ID_LENGTH );
494
- set_bytes (file , pos + len );
495
- return ;
500
+ // Skip just the unknown element, not the entire block
501
+ read_vint_block_skip (file );
502
+ // Reset code and code_len to start fresh with next element
503
+ code = 0 ;
504
+ code_len = 0 ;
496
505
}
497
506
break ;
498
507
}
@@ -597,10 +606,13 @@ void parse_segment_cluster(struct matroska_ctx *mkv_ctx)
597
606
default :
598
607
if (code_len == MATROSKA_MAX_ID_LENGTH )
599
608
{
600
- mprint (MATROSKA_ERROR "Unknown element 0x%x at position " LLD ", skipping segment cluster block \n" , code ,
609
+ mprint (MATROSKA_WARNING "Unknown element 0x%x at position " LLD ", skipping this element \n" , code ,
601
610
get_current_byte (file ) - MATROSKA_MAX_ID_LENGTH );
602
- set_bytes (file , pos + len );
603
- return ;
611
+ // Skip just the unknown element, not the entire block
612
+ read_vint_block_skip (file );
613
+ // Reset code and code_len to start fresh with next element
614
+ code = 0 ;
615
+ code_len = 0 ;
604
616
}
605
617
break ;
606
618
}
@@ -728,6 +740,7 @@ void parse_segment_track_entry(struct matroska_ctx *mkv_ctx)
728
740
enum matroska_track_entry_type track_type = MATROSKA_TRACK_TYPE_VIDEO ;
729
741
char * lang = strdup ("eng" );
730
742
char * header = NULL ;
743
+ char * lang_ietf = NULL ;
731
744
char * codec_id_string = NULL ;
732
745
enum matroska_track_subtitle_codec_id codec_id = MATROSKA_TRACK_SUBTITLE_CODEC_ID_UTF8 ;
733
746
@@ -863,6 +876,31 @@ void parse_segment_track_entry(struct matroska_ctx *mkv_ctx)
863
876
case MATROSKA_SEGMENT_TRACK_TRICK_MASTER_TRACK_SEGMENT_UID :
864
877
read_vint_block_skip (file );
865
878
MATROSKA_SWITCH_BREAK (code , code_len );
879
+ case MATROSKA_SEGMENT_TRACK_LANGUAGE_IETF :
880
+ lang_ietf = read_vint_block_string (file );
881
+ mprint (" Language IETF: %s\n" , lang_ietf );
882
+ // We'll store this for later use rather than freeing it immediately
883
+ if (track_type == MATROSKA_TRACK_TYPE_SUBTITLE )
884
+ {
885
+ // Don't free lang_ietf here, store in track
886
+ if (lang != NULL )
887
+ {
888
+ // If we previously allocated lang, free it as we'll prefer IETF
889
+ free (lang );
890
+ lang = NULL ;
891
+ }
892
+ // Default to "eng" if we somehow don't have a language yet
893
+ if (lang == NULL )
894
+ {
895
+ lang = strdup ("eng" );
896
+ }
897
+ }
898
+ else
899
+ {
900
+ free (lang_ietf ); // Free if not a subtitle track
901
+ lang_ietf = NULL ;
902
+ }
903
+ MATROSKA_SWITCH_BREAK (code , code_len );
866
904
867
905
/* Misc ids */
868
906
case MATROSKA_VOID :
@@ -874,10 +912,13 @@ void parse_segment_track_entry(struct matroska_ctx *mkv_ctx)
874
912
default :
875
913
if (code_len == MATROSKA_MAX_ID_LENGTH )
876
914
{
877
- mprint (MATROSKA_ERROR "Unknown element 0x%x at position " LLD ", skipping segment track entry block \n" , code ,
915
+ mprint (MATROSKA_WARNING "Unknown element 0x%x at position " LLD ", skipping this element \n" , code ,
878
916
get_current_byte (file ) - MATROSKA_MAX_ID_LENGTH );
879
- set_bytes (file , pos + len );
880
- return ;
917
+ // Skip just the unknown element, not the entire block
918
+ read_vint_block_skip (file );
919
+ // Reset code and code_len to start fresh with next element
920
+ code = 0 ;
921
+ code_len = 0 ;
881
922
}
882
923
break ;
883
924
}
@@ -888,6 +929,7 @@ void parse_segment_track_entry(struct matroska_ctx *mkv_ctx)
888
929
struct matroska_sub_track * sub_track = malloc (sizeof (struct matroska_sub_track ));
889
930
sub_track -> header = header ;
890
931
sub_track -> lang = lang ;
932
+ sub_track -> lang_ietf = lang_ietf ;
891
933
sub_track -> track_number = track_number ;
892
934
sub_track -> lang_index = 0 ;
893
935
sub_track -> codec_id = codec_id ;
@@ -904,6 +946,8 @@ void parse_segment_track_entry(struct matroska_ctx *mkv_ctx)
904
946
else
905
947
{
906
948
free (lang );
949
+ if (lang_ietf )
950
+ free (lang_ietf );
907
951
if (codec_id_string )
908
952
free (codec_id_string );
909
953
}
@@ -997,10 +1041,13 @@ void parse_segment_tracks(struct matroska_ctx *mkv_ctx)
997
1041
default :
998
1042
if (code_len == MATROSKA_MAX_ID_LENGTH )
999
1043
{
1000
- mprint (MATROSKA_ERROR "Unknown element 0x%x at position " LLD ", skipping segment tracks block \n" , code ,
1044
+ mprint (MATROSKA_WARNING "Unknown element 0x%x at position " LLD ", skipping this element \n" , code ,
1001
1045
get_current_byte (file ) - MATROSKA_MAX_ID_LENGTH );
1002
- set_bytes (file , pos + len );
1003
- return ;
1046
+ // Skip just the unknown element, not the entire block
1047
+ read_vint_block_skip (file );
1048
+ // Reset code and code_len to start fresh with next element
1049
+ code = 0 ;
1050
+ code_len = 0 ;
1004
1051
}
1005
1052
break ;
1006
1053
}
@@ -1058,10 +1105,13 @@ void parse_segment(struct matroska_ctx *mkv_ctx)
1058
1105
default :
1059
1106
if (code_len == MATROSKA_MAX_ID_LENGTH )
1060
1107
{
1061
- mprint (MATROSKA_ERROR "Unknown element 0x%x at position " LLD ", skipping segment block \n" , code ,
1108
+ mprint (MATROSKA_WARNING "Unknown element 0x%x at position " LLD ", skipping this element \n" , code ,
1062
1109
get_current_byte (file ) - MATROSKA_MAX_ID_LENGTH );
1063
- set_bytes (file , pos + len );
1064
- return ;
1110
+ // Skip just the unknown element, not the entire block
1111
+ read_vint_block_skip (file );
1112
+ // Reset code and code_len to start fresh with next element
1113
+ code = 0 ;
1114
+ code_len = 0 ;
1065
1115
}
1066
1116
break ;
1067
1117
}
@@ -1071,11 +1121,15 @@ void parse_segment(struct matroska_ctx *mkv_ctx)
1071
1121
char * generate_filename_from_track (struct matroska_ctx * mkv_ctx , struct matroska_sub_track * track )
1072
1122
{
1073
1123
char * buf = malloc (sizeof (char ) * 200 );
1124
+ // Use lang_ietf if available, otherwise fall back to lang
1125
+ const char * lang_to_use = track -> lang_ietf ? track -> lang_ietf : track -> lang ;
1126
+
1074
1127
if (track -> lang_index == 0 )
1075
- sprintf (buf , "%s_%s.%s" , get_basename (mkv_ctx -> filename ), track -> lang , matroska_track_text_subtitle_id_extensions [track -> codec_id ]);
1076
- else
1077
- sprintf (buf , "%s_%s_" LLD ".%s" , get_basename (mkv_ctx -> filename ), track -> lang , track -> lang_index ,
1128
+ sprintf (buf , "%s_%s.%s" , get_basename (mkv_ctx -> filename ), lang_to_use ,
1078
1129
matroska_track_text_subtitle_id_extensions [track -> codec_id ]);
1130
+ else
1131
+ sprintf (buf , "%s_%s_" LLD ".%s" , get_basename (mkv_ctx -> filename ), lang_to_use ,
1132
+ track -> lang_index , matroska_track_text_subtitle_id_extensions [track -> codec_id ]);
1079
1133
return buf ;
1080
1134
}
1081
1135
@@ -1263,6 +1317,8 @@ void free_sub_track(struct matroska_sub_track *track)
1263
1317
free (track -> header );
1264
1318
if (track -> lang != NULL )
1265
1319
free (track -> lang );
1320
+ if (track -> lang_ietf != NULL )
1321
+ free (track -> lang_ietf );
1266
1322
if (track -> codec_id_string != NULL )
1267
1323
free (track -> codec_id_string );
1268
1324
for (int i = 0 ; i < track -> sentence_count ; i ++ )
@@ -1281,7 +1337,12 @@ void matroska_save_all(struct matroska_ctx *mkv_ctx, char *lang)
1281
1337
{
1282
1338
if (lang )
1283
1339
{
1284
- if ((match = strstr (lang , mkv_ctx -> sub_tracks [i ]-> lang )) != NULL )
1340
+ // Try to match against IETF tag first if available
1341
+ if (mkv_ctx -> sub_tracks [i ]-> lang_ietf &&
1342
+ (match = strstr (lang , mkv_ctx -> sub_tracks [i ]-> lang_ietf )) != NULL )
1343
+ save_sub_track (mkv_ctx , mkv_ctx -> sub_tracks [i ]);
1344
+ // Fall back to 3-letter code
1345
+ else if ((match = strstr (lang , mkv_ctx -> sub_tracks [i ]-> lang )) != NULL )
1285
1346
save_sub_track (mkv_ctx , mkv_ctx -> sub_tracks [i ]);
1286
1347
}
1287
1348
else
@@ -1337,9 +1398,13 @@ void matroska_parse(struct matroska_ctx *mkv_ctx)
1337
1398
default :
1338
1399
if (code_len == MATROSKA_MAX_ID_LENGTH )
1339
1400
{
1340
- mprint (MATROSKA_ERROR "Unknown element 0x%x at position " LLD ", skipping file parsing \n" , code ,
1401
+ mprint (MATROSKA_WARNING "Unknown element 0x%x at position " LLD ", skipping this element \n" , code ,
1341
1402
get_current_byte (file ) - MATROSKA_MAX_ID_LENGTH );
1342
- return ;
1403
+ // Skip just the unknown element, not the entire block
1404
+ read_vint_block_skip (file );
1405
+ // Reset code and code_len to start fresh with next element
1406
+ code = 0 ;
1407
+ code_len = 0 ;
1343
1408
}
1344
1409
break ;
1345
1410
}
0 commit comments