From: gb Date: Fri, 26 Mar 2010 11:30:54 +0000 (+0000) Subject: Add "synchronous" mode. X-Git-Tag: 0.1.2~39 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8ea56134da261c6087f6d7f9873258da3fa8f5e1;p=platform%2Fupstream%2Fgstreamer-vaapi.git Add "synchronous" mode. --- diff --git a/gst-libs/gst/vaapi/gstvaapidisplay_x11.c b/gst-libs/gst/vaapi/gstvaapidisplay_x11.c index 30f7152..9f4349e 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplay_x11.c +++ b/gst-libs/gst/vaapi/gstvaapidisplay_x11.c @@ -40,15 +40,17 @@ G_DEFINE_TYPE(GstVaapiDisplayX11, GstVaapiDisplayX11Private)) struct _GstVaapiDisplayX11Private { - gboolean create_display; gchar *display_name; Display *x11_display; int x11_screen; + guint create_display : 1; + guint synchronous : 1; }; enum { PROP_0, + PROP_SYNCHRONOUS, PROP_DISPLAY_NAME, PROP_X11_DISPLAY }; @@ -73,6 +75,18 @@ set_display_name(GstVaapiDisplayX11 *display, const gchar *display_name) } static void +set_synchronous(GstVaapiDisplayX11 *display, gboolean synchronous) +{ + GstVaapiDisplayX11Private * const priv = display->priv; + + if (priv->synchronous != synchronous) { + priv->synchronous = synchronous; + if (priv->x11_display) + XSynchronize(priv->x11_display, synchronous); + } +} + +static void gst_vaapi_display_x11_set_property( GObject *object, guint prop_id, @@ -83,6 +97,9 @@ gst_vaapi_display_x11_set_property( GstVaapiDisplayX11 * const display = GST_VAAPI_DISPLAY_X11(object); switch (prop_id) { + case PROP_SYNCHRONOUS: + set_synchronous(display, g_value_get_boolean(value)); + break; case PROP_DISPLAY_NAME: set_display_name(display, g_value_get_string(value)); break; @@ -106,6 +123,9 @@ gst_vaapi_display_x11_get_property( GstVaapiDisplayX11 * const display = GST_VAAPI_DISPLAY_X11(object); switch (prop_id) { + case PROP_SYNCHRONOUS: + g_value_set_boolean(value, display->priv->synchronous); + break; case PROP_DISPLAY_NAME: g_value_set_string(value, display->priv->display_name); break; @@ -147,6 +167,9 @@ gst_vaapi_display_x11_open_display(GstVaapiDisplay *display) if (!priv->x11_display) return FALSE; + if (priv->synchronous) + XSynchronize(priv->x11_display, True); + priv->x11_screen = DefaultScreen(priv->x11_display); return TRUE; } @@ -235,6 +258,21 @@ gst_vaapi_display_x11_class_init(GstVaapiDisplayX11Class *klass) dpy_class->get_size_mm = gst_vaapi_display_x11_get_size_mm; /** + * GstVaapiDisplayX11:synchronous: + * + * When enabled, runs the X display in synchronous mode. Note that + * this is used only for debugging. + */ + g_object_class_install_property + (object_class, + PROP_SYNCHRONOUS, + g_param_spec_boolean("synchronous", + "Synchronous mode", + "Toggles X display synchronous mode", + FALSE, + G_PARAM_READWRITE)); + + /** * GstVaapiDisplayX11:x11-display: * * The X11 #Display that was created by gst_vaapi_display_x11_new() diff --git a/sys/vaapisink/gstvaapisink.c b/sys/vaapisink/gstvaapisink.c index 3103045..2282189 100644 --- a/sys/vaapisink/gstvaapisink.c +++ b/sys/vaapisink/gstvaapisink.c @@ -74,7 +74,8 @@ enum { PROP_0, PROP_DISPLAY, - PROP_FULLSCREEN + PROP_FULLSCREEN, + PROP_SYNCHRONOUS }; static GstVaapiDisplay * @@ -120,6 +121,7 @@ gst_vaapisink_ensure_display(GstVaapiSink *sink) sink->display = gst_vaapi_display_x11_new(sink->display_name); if (!sink->display || !gst_vaapi_display_get_display(sink->display)) return FALSE; + g_object_set(sink, "synchronous", sink->synchronous, NULL); } return sink->display != NULL; } @@ -291,6 +293,9 @@ gst_vaapisink_set_property( case PROP_FULLSCREEN: sink->fullscreen = g_value_get_boolean(value); break; + case PROP_SYNCHRONOUS: + sink->synchronous = g_value_get_boolean(value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -314,6 +319,9 @@ gst_vaapisink_get_property( case PROP_FULLSCREEN: g_value_set_boolean(value, sink->fullscreen); break; + case PROP_SYNCHRONOUS: + g_value_set_boolean(value, sink->synchronous); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -364,6 +372,21 @@ static void gst_vaapisink_class_init(GstVaapiSinkClass *klass) "Requests window in fullscreen state", FALSE, G_PARAM_READWRITE)); + + /** + * GstVaapiSink:synchronous: + * + * When enabled, runs the X display in synchronous mode. Note that + * this is used only for debugging. + */ + g_object_class_install_property + (object_class, + PROP_SYNCHRONOUS, + g_param_spec_boolean("synchronous", + "Synchronous mode", + "Toggles X display synchronous mode", + FALSE, + G_PARAM_READWRITE)); } static void gst_vaapisink_init(GstVaapiSink *sink, GstVaapiSinkClass *klass) @@ -371,6 +394,7 @@ static void gst_vaapisink_init(GstVaapiSink *sink, GstVaapiSinkClass *klass) sink->display_name = NULL; sink->display = NULL; sink->fullscreen = FALSE; + sink->synchronous = FALSE; } GstVaapiDisplay * diff --git a/sys/vaapisink/gstvaapisink.h b/sys/vaapisink/gstvaapisink.h index f4a3e08..12b74ca 100644 --- a/sys/vaapisink/gstvaapisink.h +++ b/sys/vaapisink/gstvaapisink.h @@ -64,6 +64,7 @@ struct _GstVaapiSink { GstVaapiWindow *window; GstVaapiRectangle window_rect; guint fullscreen : 1; + guint synchronous : 1; }; struct _GstVaapiSinkClass {