diff options
author | wm4 <wm4@nowhere> | 2015-06-04 22:29:21 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-06-04 22:29:26 +0200 |
commit | af58bfb62b4ce20aac525ca8a1d5f93c7f114fa6 (patch) | |
tree | e717a88ca860a01f9473ab99c807906aae0e85ef /video/out/vo_vdpau.c | |
parent | c06cd1b99399260a272537e1b1c5991919c26382 (diff) | |
download | mpv-af58bfb62b4ce20aac525ca8a1d5f93c7f114fa6.tar.bz2 mpv-af58bfb62b4ce20aac525ca8a1d5f93c7f114fa6.tar.xz |
vo_vdpau: check maximum video size
Check the maximum size of video surfaces, and refuse initialization if
the video is too large for them.
Maybe we could do something more sophisticated, like inserting a
software scaler. On the other hand, this would have a very questionable
benefit, as it would be guaranteed to be too slow.
Diffstat (limited to 'video/out/vo_vdpau.c')
-rw-r--r-- | video/out/vo_vdpau.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/video/out/vo_vdpau.c b/video/out/vo_vdpau.c index ecac6af208..f7a1be3a60 100644 --- a/video/out/vo_vdpau.c +++ b/video/out/vo_vdpau.c @@ -412,10 +412,29 @@ static bool status_ok(struct vo *vo) static int reconfig(struct vo *vo, struct mp_image_params *params, int flags) { struct vdpctx *vc = vo->priv; + struct vdp_functions *vdp = vc->vdp; + VdpStatus vdp_st; if (!check_preemption(vo)) return -1; + VdpChromaType chroma_type = VDP_CHROMA_TYPE_420; + mp_vdpau_get_format(params->imgfmt, &chroma_type, NULL); + + VdpBool ok; + uint32_t max_w, max_h; + vdp_st = vdp->video_surface_query_capabilities(vc->vdp_device, chroma_type, + &ok, &max_w, &max_h); + CHECK_VDP_ERROR(vo, "Error when calling vdp_video_surface_query_capabilities"); + + if (!ok) + return -1; + if (params->w > max_w || params->h > max_h) { + if (ok) + MP_ERR(vo, "Video too large for vdpau.\n"); + return -1; + } + vc->image_format = params->imgfmt; vc->vid_width = params->w; vc->vid_height = params->h; |