summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-06-04 22:29:21 +0200
committerwm4 <wm4@nowhere>2015-06-04 22:29:26 +0200
commitaf58bfb62b4ce20aac525ca8a1d5f93c7f114fa6 (patch)
treee717a88ca860a01f9473ab99c807906aae0e85ef
parentc06cd1b99399260a272537e1b1c5991919c26382 (diff)
downloadmpv-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.
-rw-r--r--video/out/vo_vdpau.c19
-rw-r--r--video/vdpau_functions.inc2
2 files changed, 21 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;
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)