From e6390d6e5f88a00243e8d1c61bbd9b1d58ede03e Mon Sep 17 00:00:00 2001 From: Gwenole Beauchesne Date: Fri, 11 Jan 2013 11:53:05 +0100 Subject: [PATCH] overlay: detect render-rect changes. Don't re-upload VA subpicture if only the render rectangle changed. Rather deassociate the subpicture and re-associate it with the new render rectangle. --- gst-libs/gst/vaapi/gstvaapicontext.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/gst-libs/gst/vaapi/gstvaapicontext.c b/gst-libs/gst/vaapi/gstvaapicontext.c index 737c4aca1f..5967738f5b 100644 --- a/gst-libs/gst/vaapi/gstvaapicontext.c +++ b/gst-libs/gst/vaapi/gstvaapicontext.c @@ -269,12 +269,40 @@ overlay_rectangle_changed_pixels(GstVaapiOverlayRectangle *overlay, return GST_BUFFER_DATA(overlay->rect_buffer) != GST_BUFFER_DATA(buffer); } +static gboolean +overlay_rectangle_update_render_rect(GstVaapiOverlayRectangle *overlay, + GstVideoOverlayRectangle *rect) +{ + GstVaapiRectangle * const render_rect = &overlay->render_rect; + guint width, height; + gint x, y; + + gst_video_overlay_rectangle_get_render_rectangle(rect, + &x, &y, &width, &height); + + if (x == render_rect->x && + y == render_rect->y && + width == render_rect->width && + height == render_rect->height) + return TRUE; + + overlay_rectangle_deassociate(overlay); + + render_rect->x = x; + render_rect->y = y; + render_rect->width = width; + render_rect->height = height; + return overlay_rectangle_associate(overlay); +} + static gboolean overlay_rectangle_update(GstVaapiOverlayRectangle *overlay, GstVideoOverlayRectangle *rect) { if (overlay_rectangle_changed_pixels(overlay, rect)) return FALSE; + if (!overlay_rectangle_update_render_rect(overlay, rect)) + return FALSE; gst_video_overlay_rectangle_replace(&overlay->rect, rect); return TRUE; }