diff options
-rw-r--r-- | DOCS/man/input.rst | 11 | ||||
-rw-r--r-- | player/command.c | 33 | ||||
-rw-r--r-- | video/decode/lavc.h | 12 | ||||
-rw-r--r-- | video/hwdec.h | 13 | ||||
-rw-r--r-- | video/out/gl_hwdec_vda.c | 1 | ||||
-rw-r--r-- | video/out/vo_opengl_cb.c | 2 | ||||
-rw-r--r-- | video/vaapi.c | 1 | ||||
-rw-r--r-- | video/vdpau.c | 1 |
8 files changed, 59 insertions, 15 deletions
diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst index 747892b668..7d8ac297f4 100644 --- a/DOCS/man/input.rst +++ b/DOCS/man/input.rst @@ -1119,6 +1119,17 @@ Property list Note that you don't know the success of the operation immediately after writing this property. It happens with a delay as video is reinitialized. +``detected-hwdec`` + Return the current hardware decoder that was detected and opened. Returns + the same values as ``hwdec``. + + This is known only once the VO has opened (and possibly later). With some + VOs (like ``opengl``), this is never known in advance, but only when the + decoder attempted to create the hw decoder successfully. Also, hw decoders + with ``-copy`` suffix are returned only while hw decoding is active (and + unset afterwards). All this reflects how detecting hw decoders are + detected and used internally in mpv. + ``panscan`` (RW) See ``--panscan``. diff --git a/player/command.c b/player/command.c index 67313a502c..e886dd4360 100644 --- a/player/command.c +++ b/player/command.c @@ -2014,6 +2014,35 @@ static int mp_property_hwdec(void *ctx, struct m_property *prop, return mp_property_generic_option(mpctx, prop, action, arg); } +static int mp_property_detected_hwdec(void *ctx, struct m_property *prop, + int action, void *arg) +{ + MPContext *mpctx = ctx; + struct dec_video *vd = mpctx->d_video; + if (!vd || !vd->hwdec_info) + return M_PROPERTY_UNAVAILABLE; + + switch (action) { + case M_PROPERTY_GET_TYPE: { + // Abuse another hwdec option to resolve the value names + struct m_property dummy = {.name = "hwdec"}; + return mp_property_generic_option(mpctx, &dummy, action, arg); + } + case M_PROPERTY_GET: { + int d = vd->hwdec_info->hwctx ? vd->hwdec_info->hwctx->type : HWDEC_NONE; + if (d) { + *(int *)arg = d; + } else { + // Maybe one of the "-copy" ones. These are "detected" every time + // the decoder is opened, so we don't know much about them otherwise. + return mp_property_hwdec(ctx, prop, action, arg); + } + return M_PROPERTY_OK; + } + } + return M_PROPERTY_NOT_IMPLEMENTED; +} + #define VF_DEINTERLACE_LABEL "deinterlace" static bool probe_deint_filter(struct MPContext *mpctx, const char *filt) @@ -3389,6 +3418,7 @@ static const struct m_property mp_properties[] = { {"vid", mp_property_video}, {"program", mp_property_program}, {"hwdec", mp_property_hwdec}, + {"detected-hwdec", mp_property_detected_hwdec}, {"estimated-frame-count", mp_property_frame_count}, {"estimated-frame-number", mp_property_frame_number}, @@ -3482,7 +3512,8 @@ static const char *const *const mp_event_property_change[] = { "estimated-vf-fps"), E(MPV_EVENT_VIDEO_RECONFIG, "video-out-params", "video-params", "video-format", "video-codec", "video-bitrate", "dwidth", "dheight", - "width", "height", "fps", "aspect", "vo-configured", "current-vo"), + "width", "height", "fps", "aspect", "vo-configured", "current-vo", + "detected-hwdec"), E(MPV_EVENT_AUDIO_RECONFIG, "audio-format", "audio-codec", "audio-bitrate", "samplerate", "channels", "audio", "volume", "mute", "balance", "volume-restore-data", "current-ao"), diff --git a/video/decode/lavc.h b/video/decode/lavc.h index c14fc47abe..85cf49abab 100644 --- a/video/decode/lavc.h +++ b/video/decode/lavc.h @@ -9,18 +9,6 @@ #include "video/mp_image.h" #include "video/hwdec.h" -// keep in sync with --hwdec option -enum hwdec_type { - HWDEC_AUTO = -1, - HWDEC_NONE = 0, - HWDEC_VDPAU = 1, - HWDEC_VDA = 2, - HWDEC_CRYSTALHD = 3, - HWDEC_VAAPI = 4, - HWDEC_VAAPI_COPY = 5, - HWDEC_DXVA2_COPY = 6, -}; - typedef struct lavc_ctx { struct mp_log *log; struct MPOpts *opts; diff --git a/video/hwdec.h b/video/hwdec.h index a7d2cf8c4b..0574e5c562 100644 --- a/video/hwdec.h +++ b/video/hwdec.h @@ -3,7 +3,20 @@ struct mp_image_pool; +// keep in sync with --hwdec option +enum hwdec_type { + HWDEC_AUTO = -1, + HWDEC_NONE = 0, + HWDEC_VDPAU = 1, + HWDEC_VDA = 2, + HWDEC_VAAPI = 4, + HWDEC_VAAPI_COPY = 5, + HWDEC_DXVA2_COPY = 6, +}; + struct mp_hwdec_ctx { + enum hwdec_type type; + void *priv; // for free use by hwdec implementation // API-specific, not needed by all backends. diff --git a/video/out/gl_hwdec_vda.c b/video/out/gl_hwdec_vda.c index bc18983d3d..181674f641 100644 --- a/video/out/gl_hwdec_vda.c +++ b/video/out/gl_hwdec_vda.c @@ -89,6 +89,7 @@ static int create(struct gl_hwdec *hw) return -1; hw->hwctx = &p->hwctx; + hw->hwctx->type = HWDEC_VDA; hw->hwctx->download_image = download_image; GL *gl = hw->gl; diff --git a/video/out/vo_opengl_cb.c b/video/out/vo_opengl_cb.c index cee0bc1d46..7334d31add 100644 --- a/video/out/vo_opengl_cb.c +++ b/video/out/vo_opengl_cb.c @@ -27,8 +27,6 @@ #include "gl_video.h" #include "gl_hwdec.h" -#include "video/decode/lavc.h" // HWDEC_* values - #include "libmpv/opengl_cb.h" /* diff --git a/video/vaapi.c b/video/vaapi.c index 54d75e775a..8b95dde85d 100644 --- a/video/vaapi.c +++ b/video/vaapi.c @@ -130,6 +130,7 @@ struct mp_vaapi_ctx *va_initialize(VADisplay *display, struct mp_log *plog) .log = talloc_steal(res, log), .display = display, .hwctx = { + .type = HWDEC_VAAPI, .priv = res, .vaapi_ctx = res, .download_image = ctx_download_image, diff --git a/video/vdpau.c b/video/vdpau.c index e1daf327af..b55152b146 100644 --- a/video/vdpau.c +++ b/video/vdpau.c @@ -371,6 +371,7 @@ struct mp_vdpau_ctx *mp_vdpau_create_device_x11(struct mp_log *log, Display *x11 .x11 = x11, .preemption_counter = 1, .hwctx = { + .type = HWDEC_VDPAU, .priv = ctx, .vdpau_ctx = ctx, .download_image = download_image, |