Skip to content

Commit

Permalink
xvimagesink: Allow changing render-rectangle through property
Browse files Browse the repository at this point in the history
This also enables setting the render rectangle before the window
is provided or created.

https://bugzilla.gnome.org/show_bug.cgi?id=792798
  • Loading branch information
ndufresne committed Jan 29, 2018
1 parent c70dd75 commit e368b31
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
25 changes: 22 additions & 3 deletions sys/xvimage/xvimagesink.c
Expand Up @@ -185,7 +185,8 @@ enum
PROP_COLORKEY,
PROP_DRAW_BORDERS,
PROP_WINDOW_WIDTH,
PROP_WINDOW_HEIGHT
PROP_WINDOW_HEIGHT,
PROP_LAST
};

/* ============================================================= */
Expand Down Expand Up @@ -792,6 +793,13 @@ gst_xv_image_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
GST_VIDEO_SINK_HEIGHT (xvimagesink));
}

if (xvimagesink->pending_render_rect) {
xvimagesink->pending_render_rect = FALSE;
gst_xwindow_set_render_rectangle (xvimagesink->xwindow,
xvimagesink->render_rect.x, xvimagesink->render_rect.y,
xvimagesink->render_rect.w, xvimagesink->render_rect.h);
}

xvimagesink->info = info;

/* After a resize, we want to redraw the borders in case the new frame size
Expand Down Expand Up @@ -1271,9 +1279,16 @@ gst_xv_image_sink_set_render_rectangle (GstVideoOverlay * overlay, gint x,
GstXvImageSink *xvimagesink = GST_XV_IMAGE_SINK (overlay);

g_mutex_lock (&xvimagesink->flow_lock);
if (G_LIKELY (xvimagesink->xwindow))
if (G_LIKELY (xvimagesink->xwindow)) {
gst_xwindow_set_render_rectangle (xvimagesink->xwindow, x, y, width,
height);
} else {
xvimagesink->render_rect.x = x;
xvimagesink->render_rect.y = y;
xvimagesink->render_rect.w = width;
xvimagesink->render_rect.h = height;
xvimagesink->pending_render_rect = TRUE;
}
g_mutex_unlock (&xvimagesink->flow_lock);
}

Expand Down Expand Up @@ -1623,7 +1638,8 @@ gst_xv_image_sink_set_property (GObject * object, guint prop_id,
xvimagesink->draw_borders = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
if (!gst_video_overlay_set_property (object, PROP_LAST, prop_id, value))
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
Expand Down Expand Up @@ -1933,6 +1949,9 @@ gst_xv_image_sink_class_init (GstXvImageSinkClass * klass)
g_param_spec_string ("device-name", "Adaptor name",
"The name of the video adaptor", NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));

gst_video_overlay_install_properties (gobject_class, PROP_LAST);

/**
* GstXvImageSink:handle-expose
*
Expand Down
4 changes: 4 additions & 0 deletions sys/xvimage/xvimagesink.h
Expand Up @@ -120,6 +120,10 @@ struct _GstXvImageSink

/* stream metadata */
gchar *media_title;

/* saved render rectangle until we have a window */
gboolean pending_render_rect;
GstVideoRectangle render_rect;
};

struct _GstXvImageSinkClass
Expand Down

0 comments on commit e368b31

Please sign in to comment.