From 157a65b15e058296ebe8f19e81448358a3ac0f48 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 21 Nov 2007 13:04:17 +0000 Subject: [PATCH] Expose methods for some object properties so that subclasses can more easily configure them. Original commit message from CVS: * docs/libs/gst-plugins-base-libs-sections.txt: * gst-libs/gst/audio/gstbaseaudiosink.c: (slave_method_get_type), (gst_base_audio_sink_set_provide_clock), (gst_base_audio_sink_get_provide_clock), (gst_base_audio_sink_set_slave_method), (gst_base_audio_sink_get_slave_method), (gst_base_audio_sink_set_property), (gst_base_audio_sink_get_property), (gst_base_audio_sink_drain), (gst_base_audio_sink_none_slaving), (gst_base_audio_sink_handle_slaving): * gst-libs/gst/audio/gstbaseaudiosink.h: Expose methods for some object properties so that subclasses can more easily configure them. Added slave method none, that completely disables slaving to the internal clock. API: gst_base_audio_sink_set_provide_clock() API: gst_base_audio_sink_get_provide_clock() API: gst_base_audio_sink_set_slave_method() API: gst_base_audio_sink_get_slave_method() * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_set_provide_clock), (gst_base_audio_src_get_provide_clock), (gst_base_audio_src_set_property), (gst_base_audio_src_get_property), (gst_base_audio_src_create): * gst-libs/gst/audio/gstbaseaudiosrc.h: Expose methods for some object properties so that subclasses can more easily configure them. API: gst_base_audio_src_set_provide_clock() API: gst_base_audio_src_get_provide_clock() --- ChangeLog | 33 +++++ docs/libs/gst-plugins-base-libs-sections.txt | 6 + gst-libs/gst/audio/gstbaseaudiosink.c | 130 +++++++++++++++++-- gst-libs/gst/audio/gstbaseaudiosink.h | 10 ++ gst-libs/gst/audio/gstbaseaudiosrc.c | 54 +++++++- gst-libs/gst/audio/gstbaseaudiosrc.h | 3 + 6 files changed, 222 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6d16d78812..baa586de08 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,36 @@ +2007-11-21 Wim Taymans + + * docs/libs/gst-plugins-base-libs-sections.txt: + * gst-libs/gst/audio/gstbaseaudiosink.c: (slave_method_get_type), + (gst_base_audio_sink_set_provide_clock), + (gst_base_audio_sink_get_provide_clock), + (gst_base_audio_sink_set_slave_method), + (gst_base_audio_sink_get_slave_method), + (gst_base_audio_sink_set_property), + (gst_base_audio_sink_get_property), (gst_base_audio_sink_drain), + (gst_base_audio_sink_none_slaving), + (gst_base_audio_sink_handle_slaving): + * gst-libs/gst/audio/gstbaseaudiosink.h: + Expose methods for some object properties so that subclasses can more + easily configure them. + Added slave method none, that completely disables slaving to the + internal clock. + API: gst_base_audio_sink_set_provide_clock() + API: gst_base_audio_sink_get_provide_clock() + API: gst_base_audio_sink_set_slave_method() + API: gst_base_audio_sink_get_slave_method() + + * gst-libs/gst/audio/gstbaseaudiosrc.c: + (gst_base_audio_src_set_provide_clock), + (gst_base_audio_src_get_provide_clock), + (gst_base_audio_src_set_property), + (gst_base_audio_src_get_property), (gst_base_audio_src_create): + * gst-libs/gst/audio/gstbaseaudiosrc.h: + Expose methods for some object properties so that subclasses can more + easily configure them. + API: gst_base_audio_src_set_provide_clock() + API: gst_base_audio_src_get_provide_clock() + 2007-11-20 Wim Taymans Patch by: Joe Peterson diff --git a/docs/libs/gst-plugins-base-libs-sections.txt b/docs/libs/gst-plugins-base-libs-sections.txt index 0ef3e43baf..d4d9b1e3c1 100644 --- a/docs/libs/gst-plugins-base-libs-sections.txt +++ b/docs/libs/gst-plugins-base-libs-sections.txt @@ -98,6 +98,10 @@ GstBaseAudioSinkSlaveMethod GST_BASE_AUDIO_SINK_CLOCK GST_BASE_AUDIO_SINK_PAD gst_base_audio_sink_create_ringbuffer +gst_base_audio_sink_set_provide_clock +gst_base_audio_sink_get_provide_clock +gst_base_audio_sink_set_slave_method +gst_base_audio_sink_get_slave_method GST_BASE_AUDIO_SINK GST_IS_BASE_AUDIO_SINK @@ -118,6 +122,8 @@ GstBaseAudioSrcClass GST_BASE_AUDIO_SRC_CLOCK GST_BASE_AUDIO_SRC_PAD gst_base_audio_src_create_ringbuffer +gst_base_audio_src_set_provide_clock +gst_base_audio_src_get_provide_clock GST_BASE_AUDIO_SRC GST_IS_BASE_AUDIO_SRC diff --git a/gst-libs/gst/audio/gstbaseaudiosink.c b/gst-libs/gst/audio/gstbaseaudiosink.c index 413b7d2212..98a63e834f 100644 --- a/gst-libs/gst/audio/gstbaseaudiosink.c +++ b/gst-libs/gst/audio/gstbaseaudiosink.c @@ -94,6 +94,7 @@ slave_method_get_type (void) static const GEnumValue slave_method[] = { {GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE, "Resampling slaving", "resample"}, {GST_BASE_AUDIO_SINK_SLAVE_SKEW, "Skew slaving", "skew"}, + {GST_BASE_AUDIO_SINK_SLAVE_NONE, "No slaving", "none"}, {0, NULL, NULL}, }; @@ -395,6 +396,97 @@ gst_base_audio_sink_get_time (GstClock * clock, GstBaseAudioSink * sink) return result; } +/** + * gst_base_audio_sink_set_provide_clock: + * @sink: a #GstBaseAudioSink + * @provide: new state + * + * Controls whether @sink will provide a clock or not. If @provide is %TRUE, + * gst_element_provide_clock() will return a clock that reflects the datarate + * of @sink. If @provide is %FALSE, gst_element_provide_clock() will return NULL. + * + * Since: 0.10.16 + */ +void +gst_base_audio_sink_set_provide_clock (GstBaseAudioSink * sink, + gboolean provide) +{ + g_return_if_fail (GST_IS_BASE_AUDIO_SINK (sink)); + + GST_OBJECT_LOCK (sink); + sink->provide_clock = provide; + GST_OBJECT_UNLOCK (sink); +} + +/** + * gst_base_audio_sink_get_provide_clock: + * @sink: a #GstBaseAudioSink + * + * Queries whether @sink will provide a clock or not. See also + * gst_base_audio_sink_set_provide_clock. + * + * Returns: %TRUE if @sink will provide a clock. + * + * Since: 0.10.16 + */ +gboolean +gst_base_audio_sink_get_provide_clock (GstBaseAudioSink * sink) +{ + gboolean result; + + g_return_val_if_fail (GST_IS_BASE_AUDIO_SINK (sink), FALSE); + + GST_OBJECT_LOCK (sink); + result = sink->provide_clock; + GST_OBJECT_UNLOCK (sink); + + return result; +} + +/** + * gst_base_audio_sink_set_slave_method: + * @sink: a #GstBaseAudioSink + * @method: the new slave method + * + * Controls how clock slaving will be performed in @sink. + * + * Since: 0.10.16 + */ +void +gst_base_audio_sink_set_slave_method (GstBaseAudioSink * sink, + GstBaseAudioSinkSlaveMethod method) +{ + g_return_if_fail (GST_IS_BASE_AUDIO_SINK (sink)); + + GST_OBJECT_LOCK (sink); + sink->priv->slave_method = method; + GST_OBJECT_UNLOCK (sink); +} + +/** + * gst_base_audio_sink_get_slave_method: + * @sink: a #GstBaseAudioSink + * + * Get the current slave method used by @sink. + * + * Returns: The current slave method used by @sink. + * + * Since: 0.10.16 + */ +GstBaseAudioSinkSlaveMethod +gst_base_audio_sink_get_slave_method (GstBaseAudioSink * sink) +{ + GstBaseAudioSinkSlaveMethod result; + + g_return_val_if_fail (GST_IS_BASE_AUDIO_SINK (sink), -1); + + GST_OBJECT_LOCK (sink); + result = sink->priv->slave_method; + GST_OBJECT_UNLOCK (sink); + + return result; +} + static void gst_base_audio_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) @@ -411,12 +503,10 @@ gst_base_audio_sink_set_property (GObject * object, guint prop_id, sink->latency_time = g_value_get_int64 (value); break; case PROP_PROVIDE_CLOCK: - GST_OBJECT_LOCK (sink); - sink->provide_clock = g_value_get_boolean (value); - GST_OBJECT_UNLOCK (sink); + gst_base_audio_sink_set_provide_clock (sink, g_value_get_boolean (value)); break; case PROP_SLAVE_METHOD: - sink->priv->slave_method = g_value_get_enum (value); + gst_base_audio_sink_set_slave_method (sink, g_value_get_enum (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -440,12 +530,10 @@ gst_base_audio_sink_get_property (GObject * object, guint prop_id, g_value_set_int64 (value, sink->latency_time); break; case PROP_PROVIDE_CLOCK: - GST_OBJECT_LOCK (sink); - g_value_set_boolean (value, sink->provide_clock); - GST_OBJECT_UNLOCK (sink); + g_value_set_boolean (value, gst_base_audio_sink_get_provide_clock (sink)); break; case PROP_SLAVE_METHOD: - g_value_set_enum (value, sink->priv->slave_method); + g_value_set_enum (value, gst_base_audio_sink_get_slave_method (sink)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -842,6 +930,28 @@ gst_base_audio_sink_skew_slaving (GstBaseAudioSink * sink, *srender_stop = render_stop; } +/* apply the clock offset but do no slaving otherwise */ +static void +gst_base_audio_sink_none_slaving (GstBaseAudioSink * sink, + GstClockTime render_start, GstClockTime render_stop, + GstClockTime * srender_start, GstClockTime * srender_stop) +{ + GstClockTime cinternal, cexternal, crate_num, crate_denom; + + /* get calibration parameters to compensate for offsets */ + gst_clock_get_calibration (sink->provided_clock, &cinternal, &cexternal, + &crate_num, &crate_denom); + + /* convert, ignoring speed */ + render_start = clock_convert_external (render_start, cinternal, cexternal, + crate_num, crate_denom, sink->priv->us_latency); + render_stop = clock_convert_external (render_stop, cinternal, cexternal, + crate_num, crate_denom, sink->priv->us_latency); + + *srender_start = render_start; + *srender_stop = render_stop; +} + /* converts render_start and render_stop to their slaved values */ static void gst_base_audio_sink_handle_slaving (GstBaseAudioSink * sink, @@ -857,6 +967,10 @@ gst_base_audio_sink_handle_slaving (GstBaseAudioSink * sink, gst_base_audio_sink_skew_slaving (sink, render_start, render_stop, srender_start, srender_stop); break; + case GST_BASE_AUDIO_SINK_SLAVE_NONE: + gst_base_audio_sink_none_slaving (sink, render_start, render_stop, + srender_start, srender_stop); + break; default: g_warning ("unknown slaving method %d", sink->priv->slave_method); break; diff --git a/gst-libs/gst/audio/gstbaseaudiosink.h b/gst-libs/gst/audio/gstbaseaudiosink.h index 492322b546..b14c47820e 100644 --- a/gst-libs/gst/audio/gstbaseaudiosink.h +++ b/gst-libs/gst/audio/gstbaseaudiosink.h @@ -83,6 +83,7 @@ G_BEGIN_DECLS * @GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE: Resample to match the master clock * @GST_BASE_AUDIO_SINK_SLAVE_SKEW: Adjust playout pointer when master clock * drifts too much. + * @GST_BASE_AUDIO_SINK_SLAVE_NONE: No adjustment is done. * * Different possible clock slaving algorithms */ @@ -90,6 +91,7 @@ typedef enum { GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE, GST_BASE_AUDIO_SINK_SLAVE_SKEW, + GST_BASE_AUDIO_SINK_SLAVE_NONE } GstBaseAudioSinkSlaveMethod; typedef struct _GstBaseAudioSink GstBaseAudioSink; @@ -147,6 +149,14 @@ GType gst_base_audio_sink_get_type(void); GstRingBuffer *gst_base_audio_sink_create_ringbuffer (GstBaseAudioSink *sink); +void gst_base_audio_sink_set_provide_clock (GstBaseAudioSink *sink, gboolean provide); +gboolean gst_base_audio_sink_get_provide_clock (GstBaseAudioSink *sink); + +void gst_base_audio_sink_set_slave_method (GstBaseAudioSink *sink, + GstBaseAudioSinkSlaveMethod method); +GstBaseAudioSinkSlaveMethod + gst_base_audio_sink_get_slave_method (GstBaseAudioSink *sink); + G_END_DECLS #endif /* __GST_BASE_AUDIO_SINK_H__ */ diff --git a/gst-libs/gst/audio/gstbaseaudiosrc.c b/gst-libs/gst/audio/gstbaseaudiosrc.c index 7f1ae61329..16aef20908 100644 --- a/gst-libs/gst/audio/gstbaseaudiosrc.c +++ b/gst-libs/gst/audio/gstbaseaudiosrc.c @@ -288,6 +288,52 @@ gst_base_audio_src_check_get_range (GstBaseSrc * bsrc) return TRUE; } +/** + * gst_base_audio_src_set_provide_clock: + * @src: a #GstBaseAudioSrc + * @provide: new state + * + * Controls whether @src will provide a clock or not. If @provide is %TRUE, + * gst_element_provide_clock() will return a clock that reflects the datarate + * of @src. If @provide is %FALSE, gst_element_provide_clock() will return NULL. + * + * Since: 0.10.16 + */ +void +gst_base_audio_src_set_provide_clock (GstBaseAudioSrc * src, gboolean provide) +{ + g_return_if_fail (GST_IS_BASE_AUDIO_SRC (src)); + + GST_OBJECT_LOCK (src); + src->priv->provide_clock = provide; + GST_OBJECT_UNLOCK (src); +} + +/** + * gst_base_audio_src_get_provide_clock: + * @src: a #GstBaseAudioSrc + * + * Queries whether @src will provide a clock or not. See also + * gst_base_audio_src_set_provide_clock. + * + * Returns: %TRUE if @src will provide a clock. + * + * Since: 0.10.16 + */ +gboolean +gst_base_audio_src_get_provide_clock (GstBaseAudioSrc * src) +{ + gboolean result; + + g_return_val_if_fail (GST_IS_BASE_AUDIO_SRC (src), FALSE); + + GST_OBJECT_LOCK (src); + result = src->priv->provide_clock; + GST_OBJECT_UNLOCK (src); + + return result; +} + static void gst_base_audio_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) @@ -304,9 +350,7 @@ gst_base_audio_src_set_property (GObject * object, guint prop_id, src->latency_time = g_value_get_int64 (value); break; case PROP_PROVIDE_CLOCK: - GST_OBJECT_LOCK (src); - src->priv->provide_clock = g_value_get_boolean (value); - GST_OBJECT_UNLOCK (src); + gst_base_audio_src_set_provide_clock (src, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -330,9 +374,7 @@ gst_base_audio_src_get_property (GObject * object, guint prop_id, g_value_set_int64 (value, src->latency_time); break; case PROP_PROVIDE_CLOCK: - GST_OBJECT_LOCK (src); - g_value_set_boolean (value, src->priv->provide_clock); - GST_OBJECT_UNLOCK (src); + g_value_set_boolean (value, gst_base_audio_src_get_provide_clock (src)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); diff --git a/gst-libs/gst/audio/gstbaseaudiosrc.h b/gst-libs/gst/audio/gstbaseaudiosrc.h index 505c4358ce..a616dab2b9 100644 --- a/gst-libs/gst/audio/gstbaseaudiosrc.h +++ b/gst-libs/gst/audio/gstbaseaudiosrc.h @@ -109,6 +109,9 @@ GType gst_base_audio_src_get_type(void); GstRingBuffer *gst_base_audio_src_create_ringbuffer (GstBaseAudioSrc *src); +void gst_base_audio_src_set_provide_clock (GstBaseAudioSrc *src, gboolean provide); +gboolean gst_base_audio_src_get_provide_clock (GstBaseAudioSrc *src); + G_END_DECLS #endif /* __GST_BASE_AUDIO_SRC_H__ */