summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--video/filter/vf_vavpp.c5
-rw-r--r--video/vaapi.c9
-rw-r--r--video/vaapi.h2
3 files changed, 15 insertions, 1 deletions
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);