From 2a9534871d51965b4b6b6fb688397096df963c89 Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 2 Feb 2015 22:43:05 +0100 Subject: command: add property returning detected hwdec API This is somewhat imperfect, because detection of hw decoding APIs is mostly done on demand, and often avoided if not necessary. (For example, we know very well that there are no hw decoders for certain codecs.) This also requires every hwdec backend to identify itself (see hwdec.h changes). --- DOCS/man/input.rst | 11 +++++++++++ player/command.c | 33 ++++++++++++++++++++++++++++++++- video/decode/lavc.h | 12 ------------ video/hwdec.h | 13 +++++++++++++ video/out/gl_hwdec_vda.c | 1 + video/out/vo_opengl_cb.c | 2 -- video/vaapi.c | 1 + 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, -- cgit v1.2.3