diff --git a/docs/libs/gstreamer-libs-sections.txt b/docs/libs/gstreamer-libs-sections.txt index 44ee842c4e..7f29ecbe97 100644 --- a/docs/libs/gstreamer-libs-sections.txt +++ b/docs/libs/gstreamer-libs-sections.txt @@ -279,6 +279,8 @@ gst_base_sink_set_ts_offset gst_base_sink_get_ts_offset gst_base_sink_set_render_delay gst_base_sink_get_render_delay +gst_base_sink_set_last_buffer_enabled +gst_base_sink_is_last_buffer_enabled gst_base_sink_get_last_buffer gst_base_sink_set_blocksize gst_base_sink_get_blocksize diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index 5eb1301f66..13e49441c6 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -985,6 +985,55 @@ out: GST_OBJECT_UNLOCK (sink); } +/** + * gst_base_sink_set_last_buffer_enabled: + * @sink: the sink + * @enabled: the new enable-last-buffer value. + * + * Configures @sink to store the last received buffer in the last-buffer + * property. + * + * Since: 0.10.30 + */ +void +gst_base_sink_set_last_buffer_enabled (GstBaseSink * sink, gboolean enabled) +{ + g_return_if_fail (GST_IS_BASE_SINK (sink)); + + GST_OBJECT_LOCK (sink); + if (enabled != sink->priv->enable_last_buffer) { + sink->priv->enable_last_buffer = enabled; + if (!enabled) + gst_base_sink_set_last_buffer_unlocked (sink, NULL); + } + GST_OBJECT_UNLOCK (sink); +} + +/** + * gst_base_sink_is_last_buffer_enabled: + * @sink: the sink + * + * Checks if @sink is currently configured to store the last received buffer in + * the last-buffer property. + * + * Returns: TRUE if the sink is configured to store the last received buffer. + * + * Since: 0.10.30 + */ +gboolean +gst_base_sink_is_last_buffer_enabled (GstBaseSink * sink) +{ + gboolean res; + + g_return_val_if_fail (GST_IS_BASE_SINK (sink), FALSE); + + GST_OBJECT_LOCK (sink); + res = sink->priv->enable_last_buffer; + GST_OBJECT_UNLOCK (sink); + + return res; +} + /** * gst_base_sink_get_latency: * @sink: the sink @@ -1254,19 +1303,8 @@ gst_base_sink_set_property (GObject * object, guint prop_id, gst_base_sink_set_render_delay (sink, g_value_get_uint64 (value)); break; case PROP_ENABLE_LAST_BUFFER: - { - gboolean enable; - enable = g_value_get_boolean (value); - - GST_OBJECT_LOCK (sink); - if (enable != sink->priv->enable_last_buffer) { - sink->priv->enable_last_buffer = enable; - if (!enable) - gst_base_sink_set_last_buffer_unlocked (sink, NULL); - } - GST_OBJECT_UNLOCK (sink); + gst_base_sink_set_last_buffer_enabled (sink, g_value_get_boolean (value)); break; - } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1304,7 +1342,7 @@ gst_base_sink_get_property (GObject * object, guint prop_id, GValue * value, gst_value_take_buffer (value, gst_base_sink_get_last_buffer (sink)); break; case PROP_ENABLE_LAST_BUFFER: - g_value_set_boolean (value, sink->priv->enable_last_buffer); + g_value_set_boolean (value, gst_base_sink_is_last_buffer_enabled (sink)); break; case PROP_BLOCKSIZE: g_value_set_uint (value, gst_base_sink_get_blocksize (sink)); diff --git a/libs/gst/base/gstbasesink.h b/libs/gst/base/gstbasesink.h index f503753979..1ce7b2221d 100644 --- a/libs/gst/base/gstbasesink.h +++ b/libs/gst/base/gstbasesink.h @@ -218,6 +218,8 @@ GstClockTimeDiff gst_base_sink_get_ts_offset (GstBaseSink *sink); /* last buffer */ GstBuffer * gst_base_sink_get_last_buffer (GstBaseSink *sink); +void gst_base_sink_set_last_buffer_enabled (GstBaseSink *sink, gboolean enable); +gboolean gst_base_sink_is_last_buffer_enabled (GstBaseSink *sink); /* latency */ gboolean gst_base_sink_query_latency (GstBaseSink *sink, gboolean *live, gboolean *upstream_live, diff --git a/tests/check/libs/basesink.c b/tests/check/libs/basesink.c index 9fbd46c65d..f2a2fce747 100644 --- a/tests/check/libs/basesink.c +++ b/tests/check/libs/basesink.c @@ -53,12 +53,16 @@ GST_START_TEST (basesink_last_buffer_enabled) gst_message_unref (msg); /* last-buffer should be != NULL */ + fail_unless (gst_base_sink_is_last_buffer_enabled (GST_BASE_SINK (sink)) + == TRUE); g_object_get (sink, "last-buffer", &last_buffer, NULL); fail_unless (last_buffer != NULL); gst_buffer_unref (last_buffer); /* set enable-last-buffer to FALSE now, this should set last-buffer to NULL */ g_object_set (sink, "enable-last-buffer", FALSE, NULL); + fail_unless (gst_base_sink_is_last_buffer_enabled (GST_BASE_SINK (sink)) + == FALSE); g_object_get (sink, "last-buffer", &last_buffer, NULL); fail_unless (last_buffer == NULL); @@ -91,7 +95,7 @@ GST_START_TEST (basesink_last_buffer_disabled) /* set enable-last-buffer to FALSE */ g_object_set (src, "num-buffers", 1, NULL); - g_object_set (sink, "enable-last-buffer", FALSE, NULL); + gst_base_sink_set_last_buffer_enabled (GST_BASE_SINK (sink), FALSE); gst_element_set_state (pipeline, GST_STATE_PLAYING); msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1); fail_unless (msg != NULL); diff --git a/win32/common/libgstbase.def b/win32/common/libgstbase.def index 0fc3cd3dde..c23b4bb866 100644 --- a/win32/common/libgstbase.def +++ b/win32/common/libgstbase.def @@ -23,10 +23,12 @@ EXPORTS gst_base_sink_get_ts_offset gst_base_sink_get_type gst_base_sink_is_async_enabled + gst_base_sink_is_last_buffer_enabled gst_base_sink_is_qos_enabled gst_base_sink_query_latency gst_base_sink_set_async_enabled gst_base_sink_set_blocksize + gst_base_sink_set_last_buffer_enabled gst_base_sink_set_max_lateness gst_base_sink_set_qos_enabled gst_base_sink_set_render_delay