From af58bfb62b4ce20aac525ca8a1d5f93c7f114fa6 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 4 Jun 2015 22:29:21 +0200 Subject: 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. --- video/out/vo_vdpau.c | 19 +++++++++++++++++++ video/vdpau_functions.inc | 2 ++ 2 files changed, 21 insertions(+) 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; diff --git a/video/vdpau_functions.inc b/video/vdpau_functions.inc index 001a0e9906..a89fe4acd6 100644 --- a/video/vdpau_functions.inc +++ b/video/vdpau_functions.inc @@ -45,3 +45,5 @@ VDP_FUNCTION(VdpVideoSurfaceDestroy, VDP_FUNC_ID_VIDEO_SURFACE_DESTROY, video_su VDP_FUNCTION(VdpVideoSurfacePutBitsYCbCr, VDP_FUNC_ID_VIDEO_SURFACE_PUT_BITS_Y_CB_CR, video_surface_put_bits_y_cb_cr) VDP_FUNCTION(VdpVideoSurfaceGetBitsYCbCr, VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_CB_CR, video_surface_get_bits_y_cb_cr) VDP_FUNCTION(VdpVideoSurfaceGetParameters, VDP_FUNC_ID_VIDEO_SURFACE_GET_PARAMETERS, video_surface_get_parameters) +VDP_FUNCTION(VdpVideoSurfaceQueryCapabilities, VDP_FUNC_ID_VIDEO_SURFACE_QUERY_CAPABILITIES, video_surface_query_capabilities) +VDP_FUNCTION(VdpOutputSurfaceQueryCapabilities, VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_CAPABILITIES, output_surface_query_capabilities) -- cgit v1.2.3