options: deprecate codec family selection in --vd/--ad

Useless now, so get rid of it. Also affects some user-visible display
things (like reported codec in use).
This commit is contained in:
wm4 2016-12-23 18:12:29 +01:00
parent c560f6ff0a
commit 9d21f2503f
6 changed files with 45 additions and 37 deletions

View File

@ -45,6 +45,7 @@ Interface changes
- remove --fs-black-out-screens option for macOS
- change how spdif codecs are selected. You can't enable spdif passthrough
with --ad anymore. This was deprecated; use --audio-spdif instead.
- deprecate the "family" selection with --ad/--vd
--- mpv 0.22.0 ---
- the "audio-device-list" property now sets empty device description to the
device name as a fallback

View File

@ -555,7 +555,7 @@ Video
Specify the video output backend to be used. See `VIDEO OUTPUT DRIVERS`_ for
details and descriptions of available drivers.
``--vd=<[+|-]family1:(*|decoder1),[+|-]family2:(*|decoder2),...[-]>``
``--vd=<...>``
Specify a priority list of video decoders to be used, according to their
family and name. See ``--ad`` for further details. Both of these options
use the same syntax and semantics; the only difference is that they
@ -1134,12 +1134,14 @@ Audio
``--ad=<[+|-]family1:(*|decoder1),[+|-]family2:(*|decoder2),...[-]>``
Specify a priority list of audio decoders to be used, according to their
family and decoder name. Entries like ``family:*`` prioritize all decoders
of the given family. When determining which decoder to use, the first
decoder that matches the audio format is selected. If that is unavailable,
the next decoder is used. Finally, it tries all other decoders that are not
decoder name. When determining which decoder to use, the first decoder that
matches the audio format is selected. If that is unavailable, the next
decoder is used. Finally, it tries all other decoders that are not
explicitly selected or rejected by the option.
Specifying family names is deprecated. Entries like ``family:*`` prioritize
all decoders of the given family.
``-`` at the end of the list suppresses fallback on other available
decoders not on the ``--ad`` list. ``+`` in front of an entry forces the
decoder. Both of these should not normally be used, because they break
@ -1149,12 +1151,13 @@ Audio
.. admonition:: Examples
``--ad=lavc:mp3float``
``--ad=mp3float``
Prefer the FFmpeg/Libav ``mp3float`` decoder over all other MP3
decoders.
``--ad=spdif:ac3,lavc:*``
Always prefer spdif AC3 over FFmpeg/Libav over anything else.
``--ad=lavc:mp3float``
Prefer the FFmpeg/Libav ``mp3float`` decoder over all other MP3
decoders. (Using deprecated family syntax.)
``--ad=help``
List all available decoders.

View File

@ -91,7 +91,7 @@ static struct mp_decoder_list *audio_select_decoders(struct dec_audio *d_audio)
struct mp_decoder_list *list = audio_decoder_list();
struct mp_decoder_list *new =
mp_select_decoders(list, codec, opts->audio_decoders);
mp_select_decoders(d_audio->log, list, codec, opts->audio_decoders);
if (d_audio->try_spdif && codec) {
struct mp_decoder_list *spdif =
select_spdif_codec(codec, opts->audio_spdif);
@ -129,21 +129,18 @@ int audio_init_best_codec(struct dec_audio *d_audio)
const struct ad_functions *driver = find_driver(sel->family);
if (!driver)
continue;
MP_VERBOSE(d_audio, "Opening audio decoder %s:%s\n",
sel->family, sel->decoder);
MP_VERBOSE(d_audio, "Opening audio decoder %s\n", sel->decoder);
d_audio->ad_driver = driver;
if (init_audio_codec(d_audio, sel->decoder)) {
decoder = sel;
break;
}
MP_WARN(d_audio, "Audio decoder init failed for "
"%s:%s\n", sel->family, sel->decoder);
MP_WARN(d_audio, "Audio decoder init failed for %s\n", sel->decoder);
}
if (d_audio->ad_driver) {
d_audio->decoder_desc =
talloc_asprintf(d_audio, "%s [%s:%s]", decoder->desc, decoder->family,
decoder->decoder);
talloc_asprintf(d_audio, "%s (%s)", decoder->decoder, decoder->desc);
MP_VERBOSE(d_audio, "Selected audio codec: %s\n", d_audio->decoder_desc);
} else {
MP_ERR(d_audio, "Failed to initialize an audio decoder for codec '%s'.\n",

View File

@ -45,9 +45,10 @@ static struct mp_decoder_entry *find_decoder(struct mp_decoder_list *list,
{
for (int n = 0; n < list->num_entries; n++) {
struct mp_decoder_entry *cur = &list->entries[n];
if (bstr_equals0(decoder, cur->decoder) &&
bstr_equals0(family, cur->family))
return cur;
if (bstr_equals0(decoder, cur->decoder)) {
if (bstr_equals0(family, "*") || bstr_equals0(family, cur->family))
return cur;
}
}
return NULL;
}
@ -70,13 +71,14 @@ static void add_new(struct mp_decoder_list *to, struct mp_decoder_entry *entry,
// The selection string corresponds to --vd/--ad directly, and has the
// following syntax:
// selection = [<entry> ("," <entry>)*]
// entry = <family> ":" <decoder> // prefer decoder
// entry = [<family> ":"] <decoder> // prefer decoder
// entry = <family> ":*" // prefer all decoders
// entry = "+" <family> ":" <decoder> // force a decoder
// entry = "-" <family> ":" <decoder> // exclude a decoder
// entry = "+" [<family> ":"] <decoder> // force a decoder
// entry = "-" [<family> ":"] <decoder> // exclude a decoder
// entry = "-" // don't add fallback decoders
// Forcing a decoder means it's added even if the codec mismatches.
struct mp_decoder_list *mp_select_decoders(struct mp_decoder_list *all,
struct mp_decoder_list *mp_select_decoders(struct mp_log *log,
struct mp_decoder_list *all,
const char *codec,
const char *selection)
{
@ -97,9 +99,12 @@ struct mp_decoder_list *mp_select_decoders(struct mp_decoder_list *all,
bool exclude = !force && bstr_eatstart0(&entry, "-");
struct mp_decoder_list *dest = exclude ? remove : list;
bstr family, decoder;
if (!bstr_split_tok(entry, ":", &family, &decoder)) {
family = entry;
decoder = bstr0("*");
if (bstr_split_tok(entry, ":", &family, &decoder)) {
mp_warn(log, "Codec family selection is deprecated. "
"Pass the codec name directly.\n");
} else {
family = bstr0("*");
decoder = entry;
}
if (bstr_equals0(decoder, "*")) {
for (int n = 0; n < all->num_entries; n++) {
@ -142,7 +147,7 @@ void mp_print_decoders(struct mp_log *log, int msgl, const char *header,
mp_msg(log, msgl, "%s\n", header);
for (int n = 0; n < list->num_entries; n++) {
struct mp_decoder_entry *entry = &list->entries[n];
mp_msg(log, msgl, " %s:%s", entry->family, entry->decoder);
mp_msg(log, msgl, " %s", entry->decoder);
if (strcmp(entry->decoder, entry->codec) != 0)
mp_msg(log, msgl, " (%s)", entry->codec);
mp_msg(log, msgl, " - %s\n", entry->desc);

View File

@ -18,6 +18,8 @@
#ifndef MP_CODECS_H
#define MP_CODECS_H
struct mp_log;
struct mp_decoder_entry {
const char *family; // decoder module (e.g. ad_lavc => "lavc")
const char *codec; // name of the codec (e.g. "mp3")
@ -33,7 +35,8 @@ struct mp_decoder_list {
void mp_add_decoder(struct mp_decoder_list *list, const char *family,
const char *codec, const char *decoder, const char *desc);
struct mp_decoder_list *mp_select_decoders(struct mp_decoder_list *all,
struct mp_decoder_list *mp_select_decoders(struct mp_log *log,
struct mp_decoder_list *all,
const char *codec,
const char *selection);

View File

@ -116,11 +116,12 @@ struct mp_decoder_list *video_decoder_list(void)
return list;
}
static struct mp_decoder_list *mp_select_video_decoders(const char *codec,
static struct mp_decoder_list *mp_select_video_decoders(struct mp_log *log,
const char *codec,
char *selection)
{
struct mp_decoder_list *list = video_decoder_list();
struct mp_decoder_list *new = mp_select_decoders(list, codec, selection);
struct mp_decoder_list *new = mp_select_decoders(log, list, codec, selection);
talloc_free(list);
return new;
}
@ -143,8 +144,9 @@ bool video_init_best_codec(struct dec_video *d_video)
d_video->has_broken_packet_pts = -10; // needs 10 packets to reach decision
struct mp_decoder_entry *decoder = NULL;
struct mp_decoder_list *list =
mp_select_video_decoders(d_video->codec->codec, opts->video_decoders);
struct mp_decoder_list *list = mp_select_video_decoders(d_video->log,
d_video->codec->codec,
opts->video_decoders);
mp_print_decoders(d_video->log, MSGL_V, "Codec list:", list);
@ -153,22 +155,19 @@ bool video_init_best_codec(struct dec_video *d_video)
const struct vd_functions *driver = find_driver(sel->family);
if (!driver)
continue;
MP_VERBOSE(d_video, "Opening video decoder %s:%s\n",
sel->family, sel->decoder);
MP_VERBOSE(d_video, "Opening video decoder %s\n", sel->decoder);
d_video->vd_driver = driver;
if (init_video_codec(d_video, sel->decoder)) {
decoder = sel;
break;
}
d_video->vd_driver = NULL;
MP_WARN(d_video, "Video decoder init failed for "
"%s:%s\n", sel->family, sel->decoder);
MP_WARN(d_video, "Video decoder init failed for %s\n", sel->decoder);
}
if (d_video->vd_driver) {
d_video->decoder_desc =
talloc_asprintf(d_video, "%s [%s:%s]", decoder->desc, decoder->family,
decoder->decoder);
talloc_asprintf(d_video, "%s (%s)", decoder->decoder, decoder->desc);
MP_VERBOSE(d_video, "Selected video codec: %s\n", d_video->decoder_desc);
} else {
MP_ERR(d_video, "Failed to initialize a video decoder for codec '%s'.\n",