summaryrefslogtreecommitdiffstats
path: root/player/command.c
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 /player/command.c
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).
Diffstat (limited to 'player/command.c')
-rw-r--r--player/command.c33
1 files changed, 32 insertions, 1 deletions
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"),