diff options
author | wm4 <wm4@nowhere> | 2014-05-28 01:37:53 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-05-28 02:08:45 +0200 |
commit | d99f30d7266aeaa13504bce181c4410b41e9cb46 (patch) | |
tree | 91261366e7606e53cfc508bfac85ddeb9ab3f9a1 /video/decode | |
parent | 8dfd93c6fbaa2af1f0f996072f0db52bd83ee28d (diff) | |
download | mpv-d99f30d7266aeaa13504bce181c4410b41e9cb46.tar.bz2 mpv-d99f30d7266aeaa13504bce181c4410b41e9cb46.tar.xz |
video: warn if an emulated hwdec API is used
mpv supports two hardware decoding APIs on Linux: vdpau and vaapi. Each
of these has emulation wrappers. The wrappers are usually slower and
have fewer features than their native opposites. In particular the libva
vdpau driver is practically unmaintained.
Check the vendor string and print a warning if emulation is detected.
Checking vendor strings is a very stupid thing to do, but I find the
thought of people using an emulated API for no reason worse.
Also, make --hwdec=auto never use an API that is detected as emulated.
This doesn't work quite right yet, because once one API is loaded,
vo_opengl doesn't unload it, so no hardware decoding will be used if the
first probed API (usually vdpau) is rejected. But good enough.
Diffstat (limited to 'video/decode')
-rw-r--r-- | video/decode/lavc.h | 1 | ||||
-rw-r--r-- | video/decode/vaapi.c | 5 | ||||
-rw-r--r-- | video/decode/vd_lavc.c | 13 | ||||
-rw-r--r-- | video/decode/vdpau.c | 2 |
4 files changed, 17 insertions, 4 deletions
diff --git a/video/decode/lavc.h b/video/decode/lavc.h index d67292c4fd..14dc6dda4e 100644 --- a/video/decode/lavc.h +++ b/video/decode/lavc.h @@ -65,6 +65,7 @@ struct vd_lavc_hwdec { enum { HWDEC_ERR_NO_CTX = -2, HWDEC_ERR_NO_CODEC = -3, + HWDEC_ERR_EMULATED = -4, // probing successful, but emulated API detected }; struct hwdec_profile_entry { diff --git a/video/decode/vaapi.c b/video/decode/vaapi.c index d9267936d0..2b951fd1bb 100644 --- a/video/decode/vaapi.c +++ b/video/decode/vaapi.c @@ -409,6 +409,8 @@ static int probe(struct vd_lavc_hwdec *hwdec, struct mp_hwdec_info *info, return HWDEC_ERR_NO_CTX; if (!hwdec_check_codec_support(decoder, profiles)) return HWDEC_ERR_NO_CODEC; + if (va_guess_if_emulated(info->vaapi_ctx)) + return HWDEC_ERR_EMULATED; return 0; } @@ -418,9 +420,12 @@ static int probe_copy(struct vd_lavc_hwdec *hwdec, struct mp_hwdec_info *info, struct priv dummy = {mp_null_log}; if (!create_va_dummy_ctx(&dummy)) return HWDEC_ERR_NO_CTX; + bool emulated = va_guess_if_emulated(dummy.ctx); destroy_va_dummy_ctx(&dummy); if (!hwdec_check_codec_support(decoder, profiles)) return HWDEC_ERR_NO_CODEC; + if (emulated) + return HWDEC_ERR_EMULATED; return 0; } diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c index 2593e50285..9ef49c25e1 100644 --- a/video/decode/vd_lavc.c +++ b/video/decode/vd_lavc.c @@ -200,19 +200,24 @@ static struct vd_lavc_hwdec *probe_hwdec(struct dec_video *vd, bool autoprobe, { struct vd_lavc_hwdec *hwdec = find_hwcodec(api); if (!hwdec) { - MP_VERBOSE(vd, "Requested hardware decoder not " - "compiled.\n"); + MP_VERBOSE(vd, "Requested hardware decoder not compiled.\n"); return NULL; } int r = hwdec_probe(hwdec, &vd->hwdec_info, decoder); + if (r == HWDEC_ERR_EMULATED) { + if (autoprobe) + return NULL; + // User requested this explicitly. + MP_WARN(vd, "Using emulated hardware decoding API.\n"); + r = 0; + } if (r >= 0) { return hwdec; } else if (r == HWDEC_ERR_NO_CODEC) { MP_VERBOSE(vd, "Hardware decoder '%s' not found in " "libavcodec.\n", decoder); } else if (r == HWDEC_ERR_NO_CTX && !autoprobe) { - MP_WARN(vd, "VO does not support requested " - "hardware decoder.\n"); + MP_WARN(vd, "VO does not support requested hardware decoder.\n"); } return NULL; } diff --git a/video/decode/vdpau.c b/video/decode/vdpau.c index 4cd1eee531..44850dfaec 100644 --- a/video/decode/vdpau.c +++ b/video/decode/vdpau.c @@ -175,6 +175,8 @@ static int probe(struct vd_lavc_hwdec *hwdec, struct mp_hwdec_info *info, return HWDEC_ERR_NO_CTX; if (!hwdec_check_codec_support(decoder, profiles)) return HWDEC_ERR_NO_CODEC; + if (mp_vdpau_guess_if_emulated(info->vdpau_ctx)) + return HWDEC_ERR_EMULATED; return 0; } |