player: strictly never autoselect tracks from --external-files

Before this commit, some autoselection of tracks coming from files
loaded with --external-files was still done. This commit removes all of
it, and the only way to select a track is via the explicit stream
selection options like --vid/--sid/--aid.

I think this was always the original intention. The change could in
theory still unintentionally surprise some users, so add a changelog
entry.

This does not affect --audio-file/--sub-file, even if these contain
mismatching track types. E.g. if audio files passed to --audio-file
contain subtitles, these should still be selected. Past feature requests
indicate that users want this.
This commit is contained in:
wm4 2018-01-06 17:49:37 +01:00 committed by Kevin Mitchell
parent cf8855cd2e
commit 34cf655ddd
4 changed files with 9 additions and 1 deletions

View File

@ -22,6 +22,8 @@ Interface changes
--- mpv 0.29.0 --- --- mpv 0.29.0 ---
- drop deprecated --videotoolbox-format, --ff-aid, --ff-vid, --ff-sid, - drop deprecated --videotoolbox-format, --ff-aid, --ff-vid, --ff-sid,
--ad-spdif-dtshd, --softvol options --ad-spdif-dtshd, --softvol options
- fix --external-files: strictly never select any tracks from them, unless
explicitly selected (this may or may not be expected)
--- mpv 0.28.0 --- --- mpv 0.28.0 ---
- rename --hwdec=mediacodec option to mediacodec-copy, to reflect - rename --hwdec=mediacodec option to mediacodec-copy, to reflect
conventions followed by other hardware video decoding APIs conventions followed by other hardware video decoding APIs

View File

@ -5376,7 +5376,8 @@ Miscellaneous
Unlike ``--sub-files`` and ``--audio-files``, this includes all tracks, and Unlike ``--sub-files`` and ``--audio-files``, this includes all tracks, and
does not cause default stream selection over the "proper" file. This makes does not cause default stream selection over the "proper" file. This makes
it slightly less intrusive. it slightly less intrusive. (In mpv 0.28.0 and before, this was not quite
strictly enforced.)
This is a list option. See `List Options`_ for details. This is a list option. See `List Options`_ for details.

View File

@ -141,6 +141,7 @@ struct track {
// If this track is from an external file (e.g. subtitle file). // If this track is from an external file (e.g. subtitle file).
bool is_external; bool is_external;
bool no_default; // pretend it's not external for auto-selection bool no_default; // pretend it's not external for auto-selection
bool no_auto_select;
char *external_filename; char *external_filename;
bool auto_loaded; bool auto_loaded;

View File

@ -310,6 +310,7 @@ static int match_lang(char **langs, char *lang)
* Sort tracks based on the following criteria, and pick the first: * Sort tracks based on the following criteria, and pick the first:
* 0a) track matches ff-index (always wins) * 0a) track matches ff-index (always wins)
* 0b) track matches tid (almost always wins) * 0b) track matches tid (almost always wins)
* 0c) track is not from --external-file
* 1) track is external (no_default cancels this) * 1) track is external (no_default cancels this)
* 1b) track was passed explicitly (is not an auto-loaded subtitle) * 1b) track was passed explicitly (is not an auto-loaded subtitle)
* 2) earlier match in lang list * 2) earlier match in lang list
@ -371,6 +372,8 @@ struct track *select_default_track(struct MPContext *mpctx, int order,
continue; continue;
if (track->user_tid == tid) if (track->user_tid == tid)
return track; return track;
if (track->no_auto_select)
continue;
if (!pick || compare_track(track, pick, langs, mpctx->opts)) if (!pick || compare_track(track, pick, langs, mpctx->opts))
pick = track; pick = track;
} }
@ -624,6 +627,7 @@ struct track *mp_add_external_file(struct MPContext *mpctx, char *filename,
t->title = talloc_strdup(t, mp_basename(disp_filename)); t->title = talloc_strdup(t, mp_basename(disp_filename));
t->external_filename = talloc_strdup(t, filename); t->external_filename = talloc_strdup(t, filename);
t->no_default = sh->type != filter; t->no_default = sh->type != filter;
t->no_auto_select = filter == STREAM_TYPE_COUNT;
if (!first && (filter == STREAM_TYPE_COUNT || sh->type == filter)) if (!first && (filter == STREAM_TYPE_COUNT || sh->type == filter))
first = t; first = t;
} }