diff --git a/video/filter/vf_vavpp.c b/video/filter/vf_vavpp.c index a4a14e0dda..d50242190a 100644 --- a/video/filter/vf_vavpp.c +++ b/video/filter/vf_vavpp.c @@ -160,9 +160,12 @@ static struct mp_image *render(struct vf_instance *vf, struct mp_image *in, if (!p->pipe.filters || in_id == VA_INVALID_ID) return NULL; - struct mp_image *img = mp_image_pool_get(p->pool, IMGFMT_VAAPI, in->w, in->h); + int r_w, r_h; + va_surface_get_uncropped_size(in, &r_w, &r_h); + struct mp_image *img = mp_image_pool_get(p->pool, IMGFMT_VAAPI, r_w, r_h); if (!img) return NULL; + mp_image_set_size(img, in->w, in->h); bool need_end_picture = false; bool success = false; diff --git a/video/vaapi.c b/video/vaapi.c index 9bc5953ad0..7a8210be6a 100644 --- a/video/vaapi.c +++ b/video/vaapi.c @@ -210,6 +210,15 @@ int va_surface_rt_format(struct mp_image *mpi) return surface ? surface->rt_format : 0; } +// Return the real size of the underlying surface. (HW decoding might allocate +// padded surfaces for example.) +void va_surface_get_uncropped_size(struct mp_image *mpi, int *out_w, int *out_h) +{ + struct va_surface *s = va_surface_in_mp_image(mpi); + *out_w = s ? s->w : 0; + *out_h = s ? s->h : 0; +} + static void release_va_surface(void *arg) { struct va_surface *surface = arg; diff --git a/video/vaapi.h b/video/vaapi.h index 7ed61669f5..c9692f61e1 100644 --- a/video/vaapi.h +++ b/video/vaapi.h @@ -69,6 +69,8 @@ VAImageFormat * va_image_format_from_imgfmt(struct mp_vaapi_ctx *ctx, i bool va_image_map(struct mp_vaapi_ctx *ctx, VAImage *image, struct mp_image *mpi); bool va_image_unmap(struct mp_vaapi_ctx *ctx, VAImage *image); +void va_surface_get_uncropped_size(struct mp_image *mpi, int *out_w, int *out_h); + void va_pool_set_allocator(struct mp_image_pool *pool, struct mp_vaapi_ctx *ctx, int rt_format);