diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst index fa366758d8..224c737933 100644 --- a/DOCS/man/input.rst +++ b/DOCS/man/input.rst @@ -725,6 +725,14 @@ Track Manipulation Marks the track as default. + + + Marks the track as being in the original language. + + + + Marks the track as containing commentary. + (only for ``video-add``) Marks the track as an attached picture, same as ``albumart`` argument diff --git a/TOOLS/matroska.py b/TOOLS/matroska.py index a347280a8c..2724c06bae 100755 --- a/TOOLS/matroska.py +++ b/TOOLS/matroska.py @@ -90,6 +90,8 @@ elements_matroska = ( "FlagForced, 55aa, uint", "FlagHearingImpaired, 55ab, uint", "FlagVisualImpaired, 55ac, uint", + "FlagOriginal, 55ae, uint", + "FlagCommentary, 55af, uint", "FlagLacing, 9c, uint", "MinCache, 6de7, uint", "MaxCache, 6df8, uint", diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c index 7013dbd7dc..426c9e5083 100644 --- a/demux/demux_lavf.c +++ b/demux/demux_lavf.c @@ -837,6 +837,10 @@ static void handle_new_stream(demuxer_t *demuxer, int i) sh->visual_impaired_track = true; if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED) sh->hearing_impaired_track = true; + if (st->disposition & AV_DISPOSITION_ORIGINAL) + sh->original_track = true; + if (st->disposition & AV_DISPOSITION_COMMENT) + sh->commentary_track = true; if (st->disposition & AV_DISPOSITION_STILL_IMAGE) sh->still_image = true; if (priv->format_hack.use_stream_ids) @@ -848,6 +852,10 @@ static void handle_new_stream(demuxer_t *demuxer, int i) sh->title = talloc_asprintf(sh, "visual impaired"); if (!sh->title && st->disposition & AV_DISPOSITION_HEARING_IMPAIRED) sh->title = talloc_asprintf(sh, "hearing impaired"); + if (!sh->title && st->disposition & AV_DISPOSITION_ORIGINAL) + sh->title = talloc_asprintf(sh, "original"); + if (!sh->title && st->disposition & AV_DISPOSITION_COMMENT) + sh->title = talloc_asprintf(sh, "commentary"); AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0); if (lang && lang->value && strcmp(lang->value, "und") != 0) sh->lang = talloc_strdup(sh, lang->value); diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 501d20e977..e9c0ddbdfb 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -131,6 +131,8 @@ typedef struct mkv_track { int forced_track; int visual_impaired_track; int hearing_impaired_track; + int original_track; + int commentary_track; unsigned char *private_data; unsigned int private_size; @@ -964,6 +966,16 @@ static void parse_trackentry(struct demuxer *demuxer, MP_DBG(demuxer, "| + Hearing-Impaired flag: %d\n", track->hearing_impaired_track); } + if (entry->n_flag_original) { + track->original_track = entry->flag_original; + MP_DBG(demuxer, "| + Original flag: %d\n", track->original_track); + } + + if (entry->n_flag_commentary) { + track->commentary_track = entry->flag_commentary; + MP_DBG(demuxer, "| + Commentary flag: %d\n", track->commentary_track); + } + if (entry->n_default_duration) { track->default_duration = entry->default_duration / 1e9; if (entry->default_duration == 0) { @@ -1552,6 +1564,8 @@ static void init_track(demuxer_t *demuxer, mkv_track_t *track, sh->forced_track = track->forced_track; sh->visual_impaired_track = track->visual_impaired_track; sh->hearing_impaired_track = track->hearing_impaired_track; + sh->original_track = track->original_track; + sh->commentary_track = track->commentary_track; } static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track); diff --git a/demux/stheader.h b/demux/stheader.h index 42046a496b..7e9a0900f2 100644 --- a/demux/stheader.h +++ b/demux/stheader.h @@ -49,6 +49,8 @@ struct sh_stream { bool dependent_track; // container dependent track flag bool visual_impaired_track; // container flag bool hearing_impaired_track;// container flag + bool original_track; // container flag + bool commentary_track; // container flag bool image; // video stream is an image bool still_image; // video consists of multiple sparse still images int hls_bitrate; diff --git a/player/command.c b/player/command.c index 5e09ac3d78..b73d863230 100644 --- a/player/command.c +++ b/player/command.c @@ -2054,6 +2054,8 @@ static int get_track_entry(int item, int action, void *arg, void *ctx) {"dependent", SUB_PROP_BOOL(track->dependent_track)}, {"visual-impaired", SUB_PROP_BOOL(track->visual_impaired_track)}, {"hearing-impaired", SUB_PROP_BOOL(track->hearing_impaired_track)}, + {"original", SUB_PROP_BOOL(track->original_track)}, + {"commentary", SUB_PROP_BOOL(track->commentary_track)}, {"external", SUB_PROP_BOOL(track->is_external)}, {"selected", SUB_PROP_BOOL(track->selected)}, {"main-selection", SUB_PROP_INT(order), .unavailable = order < 0}, diff --git a/player/core.h b/player/core.h index ac937e41ce..51107ac3df 100644 --- a/player/core.h +++ b/player/core.h @@ -120,6 +120,7 @@ struct track { char *title; bool default_track, forced_track, dependent_track; bool visual_impaired_track, hearing_impaired_track; + bool original_track, commentary_track; bool forced_select; // if the track was selected because it is forced bool image; bool attached_picture; diff --git a/player/loadfile.c b/player/loadfile.c index 694e336ae3..2dac2c0019 100644 --- a/player/loadfile.c +++ b/player/loadfile.c @@ -431,6 +431,8 @@ static struct track *add_stream_track(struct MPContext *mpctx, .dependent_track = stream->dependent_track, .visual_impaired_track = stream->visual_impaired_track, .hearing_impaired_track = stream->hearing_impaired_track, + .original_track = stream->original_track, + .commentary_track = stream->commentary_track, .image = stream->image, .attached_picture = stream->attached_picture != NULL, .lang = stream->lang, diff --git a/player/lua/select.lua b/player/lua/select.lua index 03ff7546f3..c0c1825330 100644 --- a/player/lua/select.lua +++ b/player/lua/select.lua @@ -112,7 +112,7 @@ local function format_flags(track) for _, flag in ipairs({ "default", "forced", "dependent", "visual-impaired", "hearing-impaired", - "image", "external" + "original", "commentary", "image", "external" }) do if track[flag] then flags = flags .. flag .. " " diff --git a/player/lua/stats.lua b/player/lua/stats.lua index dcb78501cb..175f8d3cdc 100644 --- a/player/lua/stats.lua +++ b/player/lua/stats.lua @@ -1248,7 +1248,8 @@ local function add_track(c, t, i) append(c, t["external-filename"], {prefix="File:"}) append(c, "", {prefix="Flags:"}) local flags = {"default", "forced", "dependent", "visual-impaired", - "hearing-impaired", "image", "albumart", "external"} + "hearing-impaired", "original", "commentary", "image", + "albumart", "external"} local any = false for _, flag in ipairs(flags) do if t[flag] then diff --git a/player/misc.c b/player/misc.c index a600c4fa29..d6548882bb 100644 --- a/player/misc.c +++ b/player/misc.c @@ -416,6 +416,10 @@ char *mp_format_track_metadata(void *ctx, struct track *t, bool add_lang) ADD_FLAG(ctx, dst, "visual-impaired", first); if (t->hearing_impaired_track) ADD_FLAG(ctx, dst, "hearing-impaired", first); + if (t->original_track) + ADD_FLAG(ctx, dst, "original", first); + if (t->commentary_track) + ADD_FLAG(ctx, dst, "commentary", first); if (t->is_external) ADD_FLAG(ctx, dst, "external", first); if (!first)