summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-04-23 01:17:28 +0200
committerwm4 <wm4@nowhere>2014-04-23 01:58:12 +0200
commit8a74638dc743007f6d5d6bb3a672167fce353480 (patch)
treeebfe93c575a3d801cb21cd565da29e6f1d5bd41f /video
parentc7ab0019a388ceabda38e0d7ba5eb289f30e24af (diff)
downloadmpv-8a74638dc743007f6d5d6bb3a672167fce353480.tar.bz2
mpv-8a74638dc743007f6d5d6bb3a672167fce353480.tar.xz
video: add a "hwdec" property to enable or disable hw decoding at runtime
Diffstat (limited to 'video')
-rw-r--r--video/decode/lavc.h1
-rw-r--r--video/decode/vd.h1
-rw-r--r--video/decode/vd_lavc.c9
3 files changed, 11 insertions, 0 deletions
diff --git a/video/decode/lavc.h b/video/decode/lavc.h
index 16d3251725..d67292c4fd 100644
--- a/video/decode/lavc.h
+++ b/video/decode/lavc.h
@@ -26,6 +26,7 @@ typedef struct lavc_ctx {
AVCodecContext *avctx;
AVFrame *pic;
struct vd_lavc_hwdec *hwdec;
+ int selected_hwdec;
enum AVPixelFormat pix_fmt;
int best_csp;
enum AVDiscard skip_frame;
diff --git a/video/decode/vd.h b/video/decode/vd.h
index 35c2739aa8..28ace3cc04 100644
--- a/video/decode/vd.h
+++ b/video/decode/vd.h
@@ -45,6 +45,7 @@ enum vd_ctrl {
VDCTRL_RESET = 1, // reset decode state after seeking
VDCTRL_QUERY_UNSEEN_FRAMES, // current decoder lag
VDCTRL_FORCE_HWDEC_FALLBACK, // force software decoding fallback
+ VDCTRL_GET_HWDEC,
};
#endif /* MPLAYER_VD_H */
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c
index 4935913d73..57b391a6a2 100644
--- a/video/decode/vd_lavc.c
+++ b/video/decode/vd_lavc.c
@@ -225,6 +225,8 @@ static int init(struct dec_video *vd, const char *decoder)
ctx->log = vd->log;
ctx->opts = vd->opts;
+ ctx->selected_hwdec = vd->opts->hwdec_api;
+
if (bstr_endswith0(bstr0(decoder), "_vdpau")) {
MP_WARN(vd, "VDPAU decoder '%s' was requested. "
"This way of enabling hardware\ndecoding is not supported "
@@ -646,6 +648,13 @@ static int control(struct dec_video *vd, int cmd, void *arg)
delay += avctx->thread_count - 1;
*(int *)arg = delay;
return CONTROL_TRUE;
+ case VDCTRL_GET_HWDEC: {
+ int hwdec = ctx->selected_hwdec;
+ if (!ctx->software_fallback_decoder)
+ hwdec = 0;
+ *(int *)arg = hwdec;
+ return CONTROL_TRUE;
+ }
case VDCTRL_FORCE_HWDEC_FALLBACK:
return force_fallback(vd);
}