diff --git a/ChangeLog b/ChangeLog index 8b60e539ca..3af9142248 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2007-02-28 Wim Taymans + + * gst-libs/gst/audio/gstaudioclock.c: (gst_audio_clock_init), + (gst_audio_clock_new): + Fix clock name. + + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_init), (gst_base_audio_sink_query): + * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_init), + (gst_base_audio_src_query), (gst_base_audio_src_get_offset), + (gst_base_audio_src_create): + Improve latency query code. + Use proper clock names. + 2007-02-28 Thomas Vander Stichele * tests/check/generic/states.c: (GST_START_TEST): diff --git a/gst-libs/gst/audio/gstaudioclock.c b/gst-libs/gst/audio/gstaudioclock.c index 5b7c79b24d..a13b8405b6 100644 --- a/gst-libs/gst/audio/gstaudioclock.c +++ b/gst-libs/gst/audio/gstaudioclock.c @@ -93,8 +93,6 @@ gst_audio_clock_class_init (GstAudioClockClass * klass) static void gst_audio_clock_init (GstAudioClock * clock) { - gst_object_set_name (GST_OBJECT (clock), "GstAudioClock"); - clock->last_time = 0; GST_OBJECT_FLAG_SET (clock, GST_CLOCK_FLAG_CAN_SET_MASTER); } @@ -116,7 +114,7 @@ gst_audio_clock_new (gchar * name, GstAudioClockGetTimeFunc func, gpointer user_data) { GstAudioClock *aclock = - GST_AUDIO_CLOCK (g_object_new (GST_TYPE_AUDIO_CLOCK, NULL)); + GST_AUDIO_CLOCK (g_object_new (GST_TYPE_AUDIO_CLOCK, "name", name, NULL)); aclock->func = func; aclock->user_data = user_data; diff --git a/gst-libs/gst/audio/gstbaseaudiosink.c b/gst-libs/gst/audio/gstbaseaudiosink.c index 99316ccc0d..9fcc6a04b5 100644 --- a/gst-libs/gst/audio/gstbaseaudiosink.c +++ b/gst-libs/gst/audio/gstbaseaudiosink.c @@ -174,7 +174,7 @@ gst_base_audio_sink_init (GstBaseAudioSink * baseaudiosink, baseaudiosink->latency_time = DEFAULT_LATENCY_TIME; baseaudiosink->provide_clock = DEFAULT_PROVIDE_CLOCK; - baseaudiosink->provided_clock = gst_audio_clock_new ("clock", + baseaudiosink->provided_clock = gst_audio_clock_new ("GstAudioSinkClock", (GstAudioClockGetTimeFunc) gst_base_audio_sink_get_time, baseaudiosink); GST_BASE_SINK (baseaudiosink)->can_activate_push = TRUE; @@ -257,6 +257,13 @@ gst_base_audio_sink_query (GstElement * element, GstQuery * query) GST_DEBUG_OBJECT (basesink, "latency query"); + if (!basesink->ringbuffer || !basesink->ringbuffer->spec.rate) { + GST_DEBUG_OBJECT (basesink, + "we are not yet negotiated, can't report latency yet"); + res = FALSE; + goto done; + } + /* ask parent first, it will do an upstream query for us. */ if ((res = gst_base_sink_query_latency (GST_BASE_SINK_CAST (basesink), &live, @@ -264,16 +271,19 @@ gst_base_audio_sink_query (GstElement * element, GstQuery * query) GstClockTime min_latency, max_latency; /* we and upstream are both live, adjust the min_latency */ - if (live && us_live && basesink->ringbuffer - && basesink->ringbuffer->spec.rate) { + if (live && us_live) { GstRingBufferSpec *spec; spec = &basesink->ringbuffer->spec; - max_latency = - spec->segtotal * spec->segsize * GST_SECOND / (spec->rate * - spec->bytes_per_sample); - min_latency = MAX (max_latency, min_l); + min_latency = + gst_util_uint64_scale_int (spec->segtotal * spec->segsize, + GST_SECOND, spec->rate * spec->bytes_per_sample); + /* we cannot go lower than the buffer size */ + min_latency = MAX (min_latency, min_l); + /* the max latency is the max of the peer, we can delay an infinite + * amount of time. */ + max_latency = max_l; GST_DEBUG_OBJECT (basesink, "peer min %" GST_TIME_FORMAT ", our min latency: %" @@ -294,6 +304,7 @@ gst_base_audio_sink_query (GstElement * element, GstQuery * query) break; } +done: return res; } diff --git a/gst-libs/gst/audio/gstbaseaudiosrc.c b/gst-libs/gst/audio/gstbaseaudiosrc.c index fa0c720fab..a798e36f96 100644 --- a/gst-libs/gst/audio/gstbaseaudiosrc.c +++ b/gst-libs/gst/audio/gstbaseaudiosrc.c @@ -152,7 +152,7 @@ gst_base_audio_src_init (GstBaseAudioSrc * baseaudiosrc, * value based on negotiated format. */ GST_BASE_SRC (baseaudiosrc)->blocksize = 0; - baseaudiosrc->clock = gst_audio_clock_new ("clock", + baseaudiosrc->clock = gst_audio_clock_new ("GstAudioSrcClock", (GstAudioClockGetTimeFunc) gst_base_audio_src_get_time, baseaudiosrc); /* we are always a live source */ @@ -419,9 +419,11 @@ gst_base_audio_src_query (GstBaseSrc * bsrc, GstQuery * query) spec = &src->ringbuffer->spec; + /* we have at least 1 segment of latency */ min_latency = gst_util_uint64_scale_int (spec->segsize, GST_SECOND, spec->rate * spec->bytes_per_sample); + /* we cannot delay more than the buffersize else we lose data */ max_latency = gst_util_uint64_scale_int (spec->segtotal * spec->segsize, GST_SECOND, spec->rate * spec->bytes_per_sample); @@ -493,11 +495,14 @@ gst_base_audio_src_get_offset (GstBaseAudioSrc * src) segdone = g_atomic_int_get (&src->ringbuffer->segdone) - src->ringbuffer->segbase; + GST_DEBUG_OBJECT (src, "reading from %d, we are at %d", readseg, segdone); + /* see how far away it is from the read segment, normally segdone (where new * data is written in the ringbuffer) is bigger than readseg (where we are * reading). */ diff = segdone - readseg; if (diff >= segtotal) { + GST_DEBUG_OBJECT (src, "dropped, align to segment %d", segdone); /* sample would be dropped, position to next playable position */ sample = (segdone - segtotal + 1) * sps; } @@ -574,6 +579,8 @@ gst_base_audio_src_create (GstBaseSrc * bsrc, guint64 offset, guint length, GST_WARNING_OBJECT (src, "create DISCONT of %" G_GUINT64_FORMAT " samples at sample %" G_GUINT64_FORMAT, sample - src->next_sample, sample); + GST_ELEMENT_WARNING (src, CORE, CLOCK, (NULL), + ("dropped %" G_GUINT64_FORMAT " samples", sample - src->next_sample)); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); }