From ac295960b8486f104a6aa800d8d31ca2eeba99a0 Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 16 Oct 2017 14:37:28 +0200 Subject: [PATCH] video: make it possible to always override hardware decoding format Mostly an obscure option for testing. But --videotoolbox-format can be deprecated, as it becomes redundant. We rely on the libavutil hwcontext implementation to reject invalid pixfmts, or not to blow up if they are incompatible. --- DOCS/interface-changes.rst | 2 ++ DOCS/man/options.rst | 13 +++++++++++++ options/options.c | 4 +++- options/options.h | 1 + video/decode/vd_lavc.c | 2 ++ 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/DOCS/interface-changes.rst b/DOCS/interface-changes.rst index af9a4a184c..608248f88f 100644 --- a/DOCS/interface-changes.rst +++ b/DOCS/interface-changes.rst @@ -43,6 +43,8 @@ Interface changes - the --msg-level option now affects --log-file - drop "audio-out-detected-device" property - this was unavailable on all audio output drivers for quite a while (coreaudio used to provide it) + - deprecate --videotoolbox-format (use --hwdec-image-format, which affects + most other hwaccels) --- mpv 0.27.0 --- - drop previously deprecated --field-dominance option - drop previously deprecated "osd" command diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index ee57681218..f17a6042eb 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -835,6 +835,16 @@ Video The old alias ``--hwdec-preload`` has different behavior if the option value is ``no``. +``--hwdec-image-format=`` + Set the internal pixel format used by hardware decoding via ``--hwdec`` + (default ``no``). The special value ``no`` selects an implementation + specific standard format. Most decoder implementations support only one + format, and will fail to initialize if the format is not supported. + + Some implementations might support multiple formats. In particular, + videotoolbox is known to require ``uyvy422`` for good performance on some + older hardware. + ``--videotoolbox-format=`` Set the internal pixel format used by ``--hwdec=videotoolbox`` on OSX. The choice of the format can influence performance considerably. On the other @@ -845,6 +855,9 @@ Video Since mpv 0.25.0, ``no`` is an accepted value, which lets the decoder pick the format on newer FFmpeg versions (will use ``nv12`` on older versions). + Deprecated. Use ``--hwdec-image-format`` if you really need this. If both + are specified, ``--hwdec-image-format`` wins. + ``--panscan=<0.0-1.0>`` Enables pan-and-scan functionality (cropping the sides of e.g. a 16:9 video to make it fit a 4:3 display without black bands). The range diff --git a/options/options.c b/options/options.c index e0f7e2b7e8..2f26402526 100644 --- a/options/options.c +++ b/options/options.c @@ -443,8 +443,10 @@ const m_option_t mp_opts[] = { OPT_CHOICE_C("hwdec", hwdec_api, 0, mp_hwdec_names), OPT_STRING("hwdec-codecs", hwdec_codecs, 0), #if HAVE_VIDEOTOOLBOX_HWACCEL - OPT_IMAGEFORMAT("videotoolbox-format", videotoolbox_format, 0, .min = -1), + OPT_IMAGEFORMAT("videotoolbox-format", videotoolbox_format, 0, .min = -1, + .deprecation_message = "use --hwdec-image-format instead"), #endif + OPT_IMAGEFORMAT("hwdec-image-format", hwdec_image_format, 0, .min = -1), // -1 means auto aspect (prefer container size until aspect change) // 0 means square pixels diff --git a/options/options.h b/options/options.h index 3bb2a0a311..e56ed7d619 100644 --- a/options/options.h +++ b/options/options.h @@ -292,6 +292,7 @@ typedef struct MPOpts { int hwdec_api; char *hwdec_codecs; int videotoolbox_format; + int hwdec_image_format; int w32_priority; diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c index fe0de0e43f..f036a630b5 100644 --- a/video/decode/vd_lavc.c +++ b/video/decode/vd_lavc.c @@ -807,6 +807,8 @@ static int init_generic_hwaccel(struct dec_video *vd) if (hwdec->image_format == IMGFMT_VIDEOTOOLBOX) av_sw_format = imgfmt2pixfmt(vd->opts->videotoolbox_format); + if (vd->opts->hwdec_image_format) + av_sw_format = imgfmt2pixfmt(vd->opts->hwdec_image_format); if (av_sw_format == AV_PIX_FMT_NONE) { MP_VERBOSE(ctx, "Unsupported hw decoding format: %s\n",