summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-09-27 17:44:21 +0200
committerwm4 <wm4@nowhere>2013-09-27 18:00:03 +0200
commit0901fc8e0ea4b6c0337add563d1763f0db238023 (patch)
tree3e4e4b8f172081902afcf72d87ae444e8d17057b /video
parent4d2f354da651a3c1fd9776ed5829f57961a46c10 (diff)
downloadmpv-0901fc8e0ea4b6c0337add563d1763f0db238023.tar.bz2
mpv-0901fc8e0ea4b6c0337add563d1763f0db238023.tar.xz
vaapi: check image format in va_surface_upload()
Just for robustness. Also print a warning in vo_vaapi if this happens.
Diffstat (limited to 'video')
-rw-r--r--video/out/vo_vaapi.c6
-rw-r--r--video/vaapi.c7
-rw-r--r--video/vaapi.h2
3 files changed, 9 insertions, 6 deletions
diff --git a/video/out/vo_vaapi.c b/video/out/vo_vaapi.c
index 4f79bbbd1f..6973882176 100644
--- a/video/out/vo_vaapi.c
+++ b/video/out/vo_vaapi.c
@@ -249,10 +249,10 @@ static void draw_image(struct vo *vo, struct mp_image *mpi)
if (!IMGFMT_IS_VAAPI(mpi->imgfmt)) {
struct mp_image *wrapper = p->swdec_surfaces[p->output_surface];
struct va_surface *surface = va_surface_in_mp_image(wrapper);
- if (!surface)
- return;
- if (!va_surface_upload(surface, mpi))
+ if (!surface || !va_surface_upload(surface, mpi)) {
+ MP_WARN(vo, "Could not upload surface.\n");
return;
+ }
mp_image_copy_attributes(wrapper, mpi);
mpi = wrapper;
}
diff --git a/video/vaapi.c b/video/vaapi.c
index b18b9135cd..b7c6013e79 100644
--- a/video/vaapi.c
+++ b/video/vaapi.c
@@ -453,16 +453,19 @@ bool va_image_unmap(VADisplay display, VAImage *image)
return check_va_status(status, "vaUnmapBuffer()");
}
-bool va_surface_upload(struct va_surface *surface, const struct mp_image *mpi)
+bool va_surface_upload(struct va_surface *surface, struct mp_image *mpi)
{
va_surface_priv_t *p = surface->p;
if (p->image.image_id == VA_INVALID_ID)
return false;
+ if (va_fourcc_to_imgfmt(p->image.format.fourcc) != mpi->imgfmt)
+ return false;
+
struct mp_image img;
if (!va_image_map(p->display, &p->image, &img))
return false;
- mp_image_copy(&img, (struct mp_image*)mpi);
+ mp_image_copy(&img, mpi);
va_image_unmap(p->display, &p->image);
if (!p->is_derived) {
diff --git a/video/vaapi.h b/video/vaapi.h
index 8e09193fd9..2dbf03a208 100644
--- a/video/vaapi.h
+++ b/video/vaapi.h
@@ -118,7 +118,7 @@ struct va_surface * va_surface_in_mp_image(struct mp_image *mpi);
struct mp_image * va_surface_wrap(struct va_surface *surface); // takes ownership
VASurfaceID va_surface_id(const struct va_surface *surface);
VASurfaceID va_surface_id_in_mp_image(const struct mp_image *mpi);
-bool va_surface_upload(struct va_surface *surface, const struct mp_image *mpi);
+bool va_surface_upload(struct va_surface *surface, struct mp_image *mpi);
struct mp_image * va_surface_download(struct va_surface *surface,
const struct va_image_formats *formats,
struct mp_image_pool *pool);