summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/input.rst11
-rw-r--r--player/command.c33
-rw-r--r--video/decode/lavc.h12
-rw-r--r--video/hwdec.h13
-rw-r--r--video/out/gl_hwdec_vda.c1
-rw-r--r--video/out/vo_opengl_cb.c2
-rw-r--r--video/vaapi.c1
-rw-r--r--video/vdpau.c1
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,