From 9d21f2503f28a7be0e493ab18a4acbaae02c3d0a Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 23 Dec 2016 18:12:29 +0100 Subject: 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). --- DOCS/interface-changes.rst | 1 + DOCS/man/options.rst | 19 +++++++++++-------- audio/decode/dec_audio.c | 11 ++++------- common/codecs.c | 27 ++++++++++++++++----------- common/codecs.h | 5 ++++- video/decode/dec_video.c | 19 +++++++++---------- 6 files changed, 45 insertions(+), 37 deletions(-) diff --git a/DOCS/interface-changes.rst b/DOCS/interface-changes.rst index d2c8536fd4..9f61a13e59 100644 --- a/DOCS/interface-changes.rst +++ b/DOCS/interface-changes.rst @@ -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 diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index bc33edc13d..f1101f27f8 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -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. diff --git a/audio/decode/dec_audio.c b/audio/decode/dec_audio.c index c98d42f556..9f28302bd5 100644 --- a/audio/decode/dec_audio.c +++ b/audio/decode/dec_audio.c @@ -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", diff --git a/common/codecs.c b/common/codecs.c index 463811066c..7a0afe466e 100644 --- a/common/codecs.c +++ b/common/codecs.c @@ -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 = ":" // prefer decoder +// entry = [ ":"] // prefer decoder // entry = ":*" // prefer all decoders -// entry = "+" ":" // force a decoder -// entry = "-" ":" // exclude a decoder +// entry = "+" [ ":"] // force a decoder +// entry = "-" [ ":"] // 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); diff --git a/common/codecs.h b/common/codecs.h index 3e9408eaad..bed5c46905 100644 --- a/common/codecs.h +++ b/common/codecs.h @@ -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); diff --git a/video/decode/dec_video.c b/video/decode/dec_video.c index dea5b594c7..d9dbf0f326 100644 --- a/video/decode/dec_video.c +++ b/video/decode/dec_video.c @@ -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", -- cgit v1.2.3