summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-02-02 22:43:05 +0100
committerwm4 <wm4@nowhere>2015-02-02 22:43:13 +0100
commit2a9534871d51965b4b6b6fb688397096df963c89 (patch)
treea5a95ffd0c1903d57b2966d1ce046b2dfd640f64
parentc07e046bfa5a736ddf6c185b48cd1c6929840186 (diff)
downloadmpv-2a9534871d51965b4b6b6fb688397096df963c89.tar.bz2
mpv-2a9534871d51965b4b6b6fb688397096df963c89.tar.xz
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).
-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,