Skip to content

Commit

Permalink
vo_vdpau: directly get surface size from surface for screenshots
Browse files Browse the repository at this point in the history
The previous code was not wrong, but I'd claim this makes the code more
robust. If a situation could happen in which the passed surface size is
incorrect, we could have passed a too small image, and
VdpOutputSurfaceGetBitsNative could have randomly overwritten memory.
  • Loading branch information
wm4 committed Jun 5, 2015
1 parent 650469d commit e0f0f6f
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 6 deletions.
17 changes: 11 additions & 6 deletions video/out/vo_vdpau.c
Original file line number Diff line number Diff line change
Expand Up @@ -834,16 +834,23 @@ static void draw_image(struct vo *vo, struct mp_image *mpi)
// warning: the size and pixel format of surface must match that of the
// surfaces in vc->output_surfaces
static struct mp_image *read_output_surface(struct vo *vo,
VdpOutputSurface surface,
int width, int height)
VdpOutputSurface surface)
{
struct vdpctx *vc = vo->priv;
VdpStatus vdp_st;
struct vdp_functions *vdp = vc->vdp;
if (!vo->params)
return NULL;

struct mp_image *image = mp_image_alloc(IMGFMT_BGR0, width, height);
VdpRGBAFormat fmt;
uint32_t w, h;
vdp_st = vdp->output_surface_get_parameters(surface, &fmt, &w, &h);
if (vdp_st != VDP_STATUS_OK)
return NULL;

assert(fmt == OUTPUT_RGBA_FORMAT);

struct mp_image *image = mp_image_alloc(IMGFMT_BGR0, w, h);
if (!image)
return NULL;

Expand All @@ -865,9 +872,7 @@ static struct mp_image *get_window_screenshot(struct vo *vo)
struct vdpctx *vc = vo->priv;
int last_surface = WRAP_ADD(vc->surface_num, -1, vc->num_output_surfaces);
VdpOutputSurface screen = vc->output_surfaces[last_surface];
struct mp_image *image = read_output_surface(vo, screen,
vc->output_surface_w,
vc->output_surface_h);
struct mp_image *image = read_output_surface(vo, screen);
mp_image_set_size(image, vo->dwidth, vo->dheight);
return image;
}
Expand Down
1 change: 1 addition & 0 deletions video/vdpau_functions.inc
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,4 @@ VDP_FUNCTION(VdpVideoSurfaceGetBitsYCbCr, VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_C
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)
VDP_FUNCTION(VdpOutputSurfaceGetParameters, VDP_FUNC_ID_OUTPUT_SURFACE_GET_PARAMETERS, output_surface_get_parameters)

0 comments on commit e0f0f6f

Please sign in to comment.