From: <wt...@fr...> - 2005-11-23 13:09:10
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Wed Nov 23 2005 05:09:06 PST Log message: * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_class_init), (gst_base_audio_sink_set_clock), (gst_base_audio_sink_render), (gst_base_audio_sink_change_state): Fix for calibration API change. Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2141&r2=1.2142 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.35&r2=1.36 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2141 retrieving revision 1.2142 diff -u -d -r1.2141 -r1.2142 --- ChangeLog 23 Nov 2005 12:40:04 -0000 1.2141 +++ ChangeLog 23 Nov 2005 13:08:54 -0000 1.2142 @@ -1,3 +1,10 @@ +2005-11-23 Wim Taymans <wi...@fl...> + + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_class_init), (gst_base_audio_sink_set_clock), + (gst_base_audio_sink_render), (gst_base_audio_sink_change_state): + Fix for calibration API change. 2005-11-23 msmith,,, <set EMAIL_ADDRESS environment variable> * gst-libs/gst/audio/multichannel.c: Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- gstbaseaudiosink.c 22 Nov 2005 18:54:56 -0000 1.35 +++ gstbaseaudiosink.c 23 Nov 2005 13:08:54 -0000 1.36 @@ -420,6 +420,8 @@ guint samples; gint bps; gdouble crate; + GstClockTime crate_num; + GstClockTime crate_denom; GstClockTime cinternal, cexternal; sink = GST_BASE_AUDIO_SINK (bsink); @@ -463,10 +465,7 @@ goto out_of_segment; gst_clock_get_calibration (sink->provided_clock, &cinternal, &cexternal, - &crate); - GST_DEBUG_OBJECT (sink, - "internal %" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT ", rate %g", - cinternal, cexternal, crate); + &crate_num, &crate_denom); /* bring buffer timestamp to stream time */ render_time = render_diff; @@ -504,6 +503,11 @@ } no_sync: + crate = ((gdouble) crate_num) / crate_denom; + GST_DEBUG_OBJECT (sink, + "internal %" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT ", rate %g", + cinternal, cexternal, crate); /* clip length based on rate */ samples = MIN (samples, samples / (crate * ABS (bsink->segment.rate))); @@ -594,17 +598,18 @@ /* FIXME, this is not yet accurate enough for smooth playback */ if (gst_clock_get_master (sink->provided_clock)) { GstClockTime time; - gdouble rate; + GstClockTime rate_num, rate_denom; time = gst_clock_get_internal_time (sink->provided_clock); GST_DEBUG_OBJECT (sink, "time: %" GST_TIME_FORMAT, GST_TIME_ARGS (time)); - gst_clock_get_calibration (sink->provided_clock, NULL, NULL, &rate); + gst_clock_get_calibration (sink->provided_clock, NULL, NULL, &rate_num, + &rate_denom); /* Does not work yet. */ gst_clock_set_calibration (sink->provided_clock, - time, element->base_time, rate); + time, element->base_time, rate_num, rate_denom); } break; } |
From: <wt...@fr...> - 2005-11-23 13:30:12
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Wed Nov 23 2005 05:30:02 PST Log message: * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_read): If we are reading too slowly, jump forward in the ringbuffer instead of blocking. Modified files: . : ChangeLog gst-libs/gst/audio: gstringbuffer.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2143&r2=1.2144 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.c.diff?r1=1.26&r2=1.27 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2143 retrieving revision 1.2144 diff -u -d -r1.2143 -r1.2144 --- ChangeLog 23 Nov 2005 13:25:53 -0000 1.2143 +++ ChangeLog 23 Nov 2005 13:29:50 -0000 1.2144 @@ -1,3 +1,9 @@ +2005-11-23 Wim Taymans <wi...@fl...> + + * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_read): + If we are reading too slowly, jump forward in the ringbuffer + instead of blocking. 2005-11-23 Jan Schmidt <th...@ma...> * ext/libvisual/visual.c: (gst_visual_src_setcaps), (get_buffer), Index: gstringbuffer.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- gstringbuffer.c 21 Nov 2005 16:35:24 -0000 1.26 +++ gstringbuffer.c 23 Nov 2005 13:29:50 -0000 1.27 @@ -1183,6 +1183,12 @@ if (diff > 0 && diff < segtotal) break; + /* flush if diff has grown bigger than ringbuffer */ + if (diff >= segtotal) { + gst_ring_buffer_clear_all (buf); + buf->segdone = readseg; + } /* else we need to wait for the segment to become readable. */ if (!wait_segment (buf)) goto not_started; |
From: <wt...@fr...> - 2005-11-28 15:54:15
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Mon Nov 28 2005 07:54:07 PST Log message: * gst-libs/gst/audio/TODO: Updated TODO * gst-libs/gst/audio/gstaudiosink.c: (gst_audioringbuffer_open_device), (gst_audioringbuffer_close_device), (gst_audioringbuffer_acquire), (gst_audioringbuffer_release): Small cleanups. * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_class_init), (gst_base_audio_sink_render), (gst_base_audio_sink_change_state): Slave to the master clock when going to PLAYING and unslave when going to PAUSED. * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_open_device), (gst_ring_buffer_close_device), (gst_ring_buffer_acquire), (gst_ring_buffer_release), (gst_ring_buffer_samples_done), (gst_ring_buffer_set_sample), (gst_ring_buffer_clear_all), (wait_segment), (gst_ring_buffer_commit), (gst_ring_buffer_read), (gst_ring_buffer_advance): * gst-libs/gst/audio/gstringbuffer.h: Add some docs and cleanups. Modified files: . : ChangeLog gst-libs/gst/audio: TODO gstaudiosink.c gstbaseaudiosink.c gstringbuffer.c gstringbuffer.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2164&r2=1.2165 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/TODO.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstaudiosink.c.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.36&r2=1.37 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.c.diff?r1=1.27&r2=1.28 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.h.diff?r1=1.13&r2=1.14 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2164 retrieving revision 1.2165 diff -u -d -r1.2164 -r1.2165 --- ChangeLog 28 Nov 2005 14:32:48 -0000 1.2164 +++ ChangeLog 28 Nov 2005 15:53:54 -0000 1.2165 @@ -1,3 +1,30 @@ +2005-11-28 Wim Taymans <wi...@fl...> + + * gst-libs/gst/audio/TODO: + Updated TODO + * gst-libs/gst/audio/gstaudiosink.c: + (gst_audioringbuffer_open_device), + (gst_audioringbuffer_close_device), (gst_audioringbuffer_acquire), + (gst_audioringbuffer_release): + Small cleanups. + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_class_init), (gst_base_audio_sink_render), + (gst_base_audio_sink_change_state): + Slave to the master clock when going to PLAYING and unslave when + going to PAUSED. + * gst-libs/gst/audio/gstringbuffer.c: + (gst_ring_buffer_open_device), (gst_ring_buffer_close_device), + (gst_ring_buffer_acquire), (gst_ring_buffer_release), + (gst_ring_buffer_samples_done), (gst_ring_buffer_set_sample), + (gst_ring_buffer_clear_all), (wait_segment), + (gst_ring_buffer_commit), (gst_ring_buffer_read), + (gst_ring_buffer_advance): + * gst-libs/gst/audio/gstringbuffer.h: + Add some docs and cleanups. 2005-11-28 Julien MOUTTE <ju...@mo...> * sys/xvimage/xvimagesink.c: Index: TODO RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/TODO,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- TODO 20 Jul 2005 09:08:05 -0000 1.3 +++ TODO 28 Nov 2005 15:53:55 -0000 1.4 @@ -8,3 +8,8 @@ - implement seek/query/convert - implement getrange scheduling - on EOS, only post EOS when the complete ringbuffer has been played. + - more accurate clipping of samples outside of the segment + - simple resampling + - more accurate master/slave calibration handling + - faster audio cutoff when going to PAUSED + - resubmit samples from ringbuffer when doing PAUSED->PLAYING again Index: gstaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstaudiosink.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gstaudiosink.c 21 Nov 2005 16:35:24 -0000 1.16 +++ gstaudiosink.c 28 Nov 2005 15:53:55 -0000 1.17 @@ -264,6 +264,7 @@ could_not_open: { + GST_DEBUG ("could not open device"); return FALSE; } } @@ -282,12 +283,13 @@ result = csink->close (sink); if (!result) - goto could_not_open; + goto could_not_close; return result; -could_not_open: +could_not_close: + GST_DEBUG ("could not close device"); @@ -307,7 +309,7 @@ result = csink->prepare (sink, spec); + goto could_not_prepare; /* allocate one more segment as we need some headroom */ spec->segtotal++; @@ -325,8 +327,9 @@ +could_not_prepare: + GST_DEBUG ("could not prepare device"); @@ -360,7 +363,16 @@ if (csink->unprepare) result = csink->unprepare (sink); + if (!result) + goto could_not_unprepare; +could_not_unprepare: + { + GST_DEBUG ("could not unprepare device"); + return FALSE; + } static gboolean Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -d -r1.36 -r1.37 --- gstbaseaudiosink.c 23 Nov 2005 13:08:54 -0000 1.36 +++ gstbaseaudiosink.c 28 Nov 2005 15:53:55 -0000 1.37 @@ -68,8 +68,6 @@ element, GstStateChange transition); static GstClock *gst_base_audio_sink_provide_clock (GstElement * elem); -static gboolean gst_base_audio_sink_set_clock (GstElement * elem, - GstClock * clock); static GstClockTime gst_base_audio_sink_get_time (GstClock * clock, GstBaseAudioSink * sink); static void gst_base_audio_sink_callback (GstRingBuffer * rbuf, guint8 * data, @@ -127,8 +125,6 @@ GST_DEBUG_FUNCPTR (gst_base_audio_sink_change_state); gstelement_class->provide_clock = GST_DEBUG_FUNCPTR (gst_base_audio_sink_provide_clock); - gstelement_class->set_clock = - GST_DEBUG_FUNCPTR (gst_base_audio_sink_set_clock); gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_base_audio_sink_event); gstbasesink_class->preroll = GST_DEBUG_FUNCPTR (gst_base_audio_sink_preroll); @@ -184,25 +180,6 @@ return clock; -static gboolean -gst_base_audio_sink_set_clock (GstElement * elem, GstClock * clock) -{ - GstBaseAudioSink *sink; - gboolean ret; - - sink = GST_BASE_AUDIO_SINK (elem); - GST_OBJECT_LOCK (sink); - if (clock != sink->provided_clock) { - ret = gst_clock_set_master (sink->provided_clock, clock); - } else { - ret = gst_clock_set_master (sink->provided_clock, NULL); - } - GST_OBJECT_UNLOCK (sink); - return ret; -} static GstClockTime gst_base_audio_sink_get_time (GstClock * clock, GstBaseAudioSink * sink) { @@ -593,10 +570,13 @@ break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: { + GstClock *clock; + GST_OBJECT_LOCK (sink); + clock = GST_ELEMENT_CLOCK (sink); /* if we are slaved to a clock, we need to set the initial * calibration */ - /* FIXME, this is not yet accurate enough for smooth playback */ - if (gst_clock_get_master (sink->provided_clock)) { + if (clock != sink->provided_clock) { GstClockTime time; GstClockTime rate_num, rate_denom; @@ -605,12 +585,15 @@ GST_DEBUG_OBJECT (sink, "time: %" GST_TIME_FORMAT, GST_TIME_ARGS (time)); + gst_clock_set_master (sink->provided_clock, clock); + /* FIXME, this is not yet accurate enough for smooth playback */ gst_clock_get_calibration (sink->provided_clock, NULL, NULL, &rate_num, &rate_denom); /* Does not work yet. */ gst_clock_set_calibration (sink->provided_clock, time, element->base_time, rate_num, rate_denom); } + GST_OBJECT_UNLOCK (sink); } case GST_STATE_CHANGE_PAUSED_TO_READY: @@ -625,6 +608,8 @@ switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: gst_ring_buffer_pause (sink->ringbuffer); + /* slop slaving ourselves to the master, if any */ + gst_clock_set_master (sink->provided_clock, NULL); gst_ring_buffer_release (sink->ringbuffer); Index: gstringbuffer.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.c,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- gstringbuffer.c 23 Nov 2005 13:29:50 -0000 1.27 +++ gstringbuffer.c 28 Nov 2005 15:53:55 -0000 1.28 @@ -18,6 +18,15 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ +/** + * SECTION:gstringbuffer + * @short_description: Base class for audio ringbuffer implementations + * + * This object is the base class for audio ringbuffers used by the base + * audio source and sink classes. + * Last reviewed on 2005-11-24 (0.9.6) + */ #include <string.h> @@ -183,6 +192,12 @@ return ((int (*)[2][2]) linear_formats)[depth][!!unsignd][!!big_endian]; + * gst_ring_buffer_debug_spec_caps: + * @spec: the spec to debug + * Print debug info about the parsed caps in @spec to the debug log. void gst_ring_buffer_debug_spec_caps (GstRingBufferSpec * spec) @@ -198,6 +213,12 @@ GST_DEBUG ("parsed caps: sample bytes: %d", spec->bytes_per_sample); + * gst_ring_buffer_debug_spec_buff: + * Print debug info about the buffer sized in @spec to the debug log. gst_ring_buffer_debug_spec_buff (GstRingBufferSpec * spec) @@ -213,6 +234,15 @@ spec->segsize * spec->segtotal / spec->bytes_per_sample); + * gst_ring_buffer_parse_caps: + * @spec: a spec + * @caps: a #GstCaps + * Parse @caps into @spec. + * Returns: TRUE if the caps could be parsed. gboolean gst_ring_buffer_parse_caps (GstRingBufferSpec * spec, GstCaps * caps) @@ -355,11 +385,9 @@ GST_DEBUG_OBJECT (buf, "opening device"); GST_OBJECT_LOCK (buf); - if (buf->open) { - g_warning ("Device for ring buffer %p already open, fix your code", buf); - res = TRUE; - goto done; + if (buf->open) + goto was_opened; buf->open = TRUE; /* if this fails, something is wrong in this file */ @@ -369,17 +397,30 @@ if (rclass->open_device) res = rclass->open_device (buf); - if (!res) { - buf->open = FALSE; - GST_DEBUG_OBJECT (buf, "failed opening device"); - GST_DEBUG_OBJECT (buf, "opened device"); + if (!res) + goto open_failed; + GST_DEBUG_OBJECT (buf, "opened device"); done: GST_OBJECT_UNLOCK (buf); return res; + /* ERRORS */ +was_opened: + GST_DEBUG_OBJECT (buf, "Device for ring buffer already open"); + g_warning ("Device for ring buffer %p already open, fix your code", buf); + res = TRUE; + goto done; +open_failed: + buf->open = FALSE; + GST_DEBUG_OBJECT (buf, "failed opening device"); /** @@ -404,17 +445,11 @@ GST_DEBUG_OBJECT (buf, "closing device"); - if (!buf->open) { - g_warning ("Device for ring buffer %p already closed, fix your code", buf); + if (!buf->open) + goto was_closed; - if (buf->acquired) { - g_critical ("Resources for ring buffer %p still acquired", buf); - res = FALSE; + if (buf->acquired) + goto was_acquired; buf->open = FALSE; @@ -422,17 +457,37 @@ if (rclass->close_device) res = rclass->close_device (buf); - buf->open = TRUE; - GST_DEBUG_OBJECT (buf, "error closing device"); - GST_DEBUG_OBJECT (buf, "closed device"); + goto close_error; + GST_DEBUG_OBJECT (buf, "closed device"); +was_closed: + GST_DEBUG_OBJECT (buf, "Device for ring buffer already closed"); + g_warning ("Device for ring buffer %p already closed, fix your code", buf); +was_acquired: + GST_DEBUG_OBJECT (buf, "Resources for ring buffer still acquired"); + g_critical ("Resources for ring buffer %p still acquired", buf); + res = FALSE; +close_error: + buf->open = TRUE; + GST_DEBUG_OBJECT (buf, "error closing device"); @@ -480,56 +535,78 @@ gboolean res = FALSE; GstRingBufferClass *rclass; + gint i, j; + gint segsize, bps; g_return_val_if_fail (buf != NULL, FALSE); GST_DEBUG_OBJECT (buf, "acquiring device"); - g_critical ("Device for %p not opened", buf); - GST_DEBUG_OBJECT (buf, "device was acquired"); + goto not_opened; buf->acquired = TRUE; rclass = GST_RING_BUFFER_GET_CLASS (buf); if (rclass->acquire) res = rclass->acquire (buf, spec); - buf->acquired = FALSE; - GST_DEBUG_OBJECT (buf, "failed to acquire device"); - if (buf->spec.bytes_per_sample != 0) { - gint i, j; + goto acquire_failed; - buf->samples_per_seg = buf->spec.segsize / buf->spec.bytes_per_sample; + if ((bps = buf->spec.bytes_per_sample) == 0) + goto invalid_bps; - /* create an empty segment */ - g_free (buf->empty_seg); - buf->empty_seg = g_malloc (buf->spec.segsize); - for (i = 0, j = 0; i < buf->spec.segsize; i++) { - buf->empty_seg[i] = buf->spec.silence_sample[j]; - j = (j + 1) % buf->spec.bytes_per_sample; - } - GST_DEBUG_OBJECT (buf, "acquired device"); - } else { - g_warning - ("invalid bytes_per_sample from acquire ringbuffer, fix the element"); - buf->acquired = FALSE; - res = FALSE; - } + segsize = buf->spec.segsize; + buf->samples_per_seg = segsize / bps; + /* create an empty segment */ + g_free (buf->empty_seg); + buf->empty_seg = g_malloc (segsize); + for (i = 0, j = 0; i < segsize; i++) { + buf->empty_seg[i] = buf->spec.silence_sample[j]; + j = (j + 1) % bps; + GST_DEBUG_OBJECT (buf, "acquired device"); +not_opened: + GST_DEBUG_OBJECT (buf, "device not opened"); + g_critical ("Device for %p not opened", buf); + GST_DEBUG_OBJECT (buf, "device was acquired"); +acquire_failed: + buf->acquired = FALSE; + GST_DEBUG_OBJECT (buf, "failed to acquire device"); +invalid_bps: + g_warning + ("invalid bytes_per_sample from acquire ringbuffer, fix the element"); @@ -555,11 +632,9 @@ gst_ring_buffer_stop (buf); - if (!buf->acquired) { - GST_DEBUG_OBJECT (buf, "device was released"); + if (!buf->acquired) + goto was_released; buf->acquired = FALSE; @@ -572,19 +647,31 @@ /* signal any waiters */ GST_RING_BUFFER_SIGNAL (buf); - buf->acquired = TRUE; - GST_DEBUG_OBJECT (buf, "failed to release device"); - g_free (buf->empty_seg); - buf->empty_seg = NULL; - GST_DEBUG_OBJECT (buf, "released device"); + goto release_failed; + buf->empty_seg = NULL; + GST_DEBUG_OBJECT (buf, "released device"); +was_released: + GST_DEBUG_OBJECT (buf, "device was released"); +release_failed: + buf->acquired = TRUE; + GST_DEBUG_OBJECT (buf, "failed to release device"); @@ -891,8 +978,8 @@ if (samples >= delay) samples -= delay; - GST_DEBUG ("processed samples: raw %llu, delay %u, real %llu", raw, delay, - samples); + GST_DEBUG_OBJECT (buf, "processed samples: raw %llu, delay %u, real %llu", + raw, delay, samples); return samples; @@ -929,7 +1016,8 @@ gst_ring_buffer_clear_all (buf); - GST_DEBUG ("set sample to %llu, segbase %d", sample, buf->segbase); + GST_DEBUG_OBJECT (buf, "set sample to %llu, segbase %d", sample, + buf->segbase); @@ -951,7 +1039,7 @@ if (buf->spec.segtotal <= 0) return; - GST_DEBUG ("clear all segments"); + GST_DEBUG_OBJECT (buf, "clear all segments"); for (i = 0; i < buf->spec.segtotal; i++) { gst_ring_buffer_clear (buf, i); @@ -964,7 +1052,7 @@ /* buffer must be started now or we deadlock since nobody is reading */ if (g_atomic_int_get (&buf->state) != GST_RING_BUFFER_STATE_STARTED) { - GST_DEBUG ("start!"); + GST_DEBUG_OBJECT (buf, "start!"); gst_ring_buffer_start (buf); @@ -974,7 +1062,7 @@ goto flushing; if (g_atomic_int_compare_and_exchange (&buf->waiting, 0, 1)) { - GST_DEBUG ("waiting.."); + GST_DEBUG_OBJECT (buf, "waiting.."); if (g_atomic_int_get (&buf->state) != GST_RING_BUFFER_STATE_STARTED) goto not_started; @@ -993,13 +1081,13 @@ not_started: GST_OBJECT_UNLOCK (buf); - GST_DEBUG ("stopped processing"); + GST_DEBUG_OBJECT (buf, "stopped processing"); flushing: - GST_DEBUG ("flushing"); + GST_DEBUG_OBJECT (buf, "flushing"); @@ -1016,7 +1104,7 @@ * the ringbuffer. * * @len not needs to be a multiple of the segment size of the ringbuffer - * although it is recommended. + * although it is recommended for optimal performance. * Returns: The number of samples written to the ringbuffer or -1 on * error. @@ -1086,7 +1174,7 @@ writeseg = writeseg % segtotal; sampleslen = MIN (sps - sampleoff, len); - GST_DEBUG ("write @%p seg %d, off %d, len %d", + GST_DEBUG_OBJECT (buf, "write @%p seg %d, off %d, len %d", dest + writeseg * segsize, writeseg, sampleoff, sampleslen); memcpy (dest + (writeseg * segsize) + (sampleoff * bps), data, @@ -1103,7 +1191,7 @@ /* ERRORS */ return -1; @@ -1198,7 +1286,7 @@ readseg = readseg % segtotal; - GST_DEBUG ("read @%p seg %d, off %d, len %d", + GST_DEBUG_OBJECT (buf, "read @%p seg %d, off %d, len %d", dest + readseg * segsize, readseg, sampleoff, sampleslen); memcpy (data, dest + (readseg * segsize) + (sampleoff * bps), @@ -1215,7 +1303,7 @@ @@ -1293,7 +1381,7 @@ * waiting for the signal */ if (g_atomic_int_compare_and_exchange (&buf->waiting, 1, 0)) { GST_OBJECT_LOCK (buf); - GST_DEBUG ("signal waiter"); + GST_DEBUG_OBJECT (buf, "signal waiter"); GST_RING_BUFFER_SIGNAL (buf); Index: gstringbuffer.h RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gstringbuffer.h 21 Nov 2005 16:35:24 -0000 1.13 +++ gstringbuffer.h 28 Nov 2005 15:53:55 -0000 1.14 @@ -41,12 +41,29 @@ /* called to fill data with len bytes of samples */ typedef void (*GstRingBufferCallback) (GstRingBuffer *rbuf, guint8* data, guint len, gpointer user_data); + * GstRingBufferState: + * @GST_RING_BUFFER_STATE_STOPPED: The ringbuffer is stopped + * @GST_RING_BUFFER_STATE_PAUSED: The ringbuffer is paused + * @GST_RING_BUFFER_STATE_STARTED: The ringbuffer is started + * The state of the ringbuffer. typedef enum { GST_RING_BUFFER_STATE_STOPPED, GST_RING_BUFFER_STATE_PAUSED, GST_RING_BUFFER_STATE_STARTED, } GstRingBufferState; + * GstRingBufferSegState: + * @GST_SEGSTATE_INVALID: The content of the segment is invalid + * @GST_SEGSTATE_EMPTY: The segment is empty + * @GST_SEGSTATE_FILLED: The segment contains valid data + * @GST_SEGSTATE_PARTIAL: The segment partially contains valid data + * The state of a segment in the ringbuffer. GST_SEGSTATE_INVALID, GST_SEGSTATE_EMPTY, @@ -54,6 +71,18 @@ GST_SEGSTATE_PARTIAL, } GstRingBufferSegState; + * GstBufferFormatType: + * @GST_BUFTYPE_LINEAR: samples in linear PCM + * @GST_BUFTYPE_FLOAT: samples in float + * @GST_BUFTYPE_MU_LAW: samples in mulaw + * @GST_BUFTYPE_A_LAW: samples in alaw + * @GST_BUFTYPE_IMA_ADPCM: samples in ima adpcm + * @GST_BUFTYPE_MPEG: samples in mpeg audio format + * @GST_BUFTYPE_GSM: samples in gsm format + * The format of the samples in the ringbuffer. typedef enum GST_BUFTYPE_LINEAR, @@ -116,8 +145,29 @@ } GstBufferFormat; + * GstRingBufferSpec: + * @caps: The caps that generated the Spec. + * @type: the sample type + * @format: the sample format + * @sign: the sample sign + * @bigend: the endianness of the samples + * @width: the width of the samples + * @depth: th depth of the samples + * @rate: the samplerate + * @channels: the number of channels + * @latency_time: the latency in time units + * @buffer_time: the total buffer size in time units + * @segsize: the size of one segment in bytes + * @segtotal: the total number of segments + * @bytes_per_sample: number of bytes in one sample + * @silence_sample: bytes representing one sample of silence + * The structure containing the format specification of the ringbuffer. struct _GstRingBufferSpec + /*< public >*/ /* in */ GstCaps *caps; /* the caps of the buffer */ @@ -215,8 +265,8 @@ gpointer user_data); gboolean gst_ring_buffer_parse_caps (GstRingBufferSpec *spec, GstCaps *caps); -void gst_ring_buffer_debug_spec_caps (GstRingBufferSpec *spec); -void gst_ring_buffer_debug_spec_buff (GstRingBufferSpec *spec); +void gst_ring_buffer_debug_spec_caps (GstRingBufferSpec *spec); +void gst_ring_buffer_debug_spec_buff (GstRingBufferSpec *spec); /* device state */ gboolean gst_ring_buffer_open_device (GstRingBuffer *buf); |
From: <wt...@fr...> - 2006-01-25 09:29:34
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Wed Jan 25 2006 01:27:13 PST Log message: * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_setcaps), (gst_base_audio_sink_event), (gst_base_audio_sink_preroll), (gst_base_audio_sink_render): Improve debugging. Post error when caps cannot be parsed. Resync on discontinuity in the stream. Clip samples to segment boundaries. return WRONG_STATE sooner when we are flushing. * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_init), (gst_base_audio_src_get_time), (gst_base_audio_src_create): Make audiosrc operate in TIME. Set TIMESTAMP and DURATION on buffers. Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosink.c gstbaseaudiosrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2291&r2=1.2292 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.41&r2=1.42 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosrc.c.diff?r1=1.18&r2=1.19 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2291 retrieving revision 1.2292 diff -u -d -r1.2291 -r1.2292 --- ChangeLog 24 Jan 2006 21:55:20 -0000 1.2291 +++ ChangeLog 25 Jan 2006 09:27:01 -0000 1.2292 @@ -1,3 +1,19 @@ +2006-01-25 Wim Taymans <wi...@fl...> + + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_setcaps), (gst_base_audio_sink_event), + (gst_base_audio_sink_preroll), (gst_base_audio_sink_render): + Improve debugging. + Post error when caps cannot be parsed. + Resync on discontinuity in the stream. + Clip samples to segment boundaries. + return WRONG_STATE sooner when we are flushing. + * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_init), + (gst_base_audio_src_get_time), (gst_base_audio_src_create): + Make audiosrc operate in TIME. + Set TIMESTAMP and DURATION on buffers. 2006-01-24 Tim-Philipp Müller <tim at centricular dot net> * tests/examples/seek/seek.c: (main): Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.41 retrieving revision 1.42 diff -u -d -r1.41 -r1.42 --- gstbaseaudiosink.c 17 Jan 2006 11:43:49 -0000 1.41 +++ gstbaseaudiosink.c 25 Jan 2006 09:27:01 -0000 1.42 @@ -262,12 +262,12 @@ spec = &sink->ringbuffer->spec; - GST_DEBUG ("release old ringbuffer"); + GST_DEBUG_OBJECT (sink, "release old ringbuffer"); /* release old ringbuffer */ gst_ring_buffer_release (sink->ringbuffer); - GST_DEBUG ("parse caps"); + GST_DEBUG_OBJECT (sink, "parse caps"); spec->buffer_time = sink->buffer_time; spec->latency_time = sink->latency_time; @@ -278,7 +278,7 @@ gst_ring_buffer_debug_spec_buff (spec); - GST_DEBUG ("acquire new ringbuffer"); + GST_DEBUG_OBJECT (sink, "acquire new ringbuffer"); if (!gst_ring_buffer_acquire (sink->ringbuffer, spec)) goto acquire_error; @@ -297,12 +297,14 @@ /* ERRORS */ parse_error: { - GST_DEBUG ("could not parse caps"); + GST_DEBUG_OBJECT (sink, "could not parse caps"); + GST_ELEMENT_ERROR (sink, STREAM, FORMAT, + ("cannot parse audio format."), ("cannot parse audio format.")); return FALSE; } acquire_error: - GST_DEBUG ("could not acquire ringbuffer"); + GST_DEBUG_OBJECT (sink, "could not acquire ringbuffer"); } @@ -332,7 +334,9 @@ gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE); break; case GST_EVENT_EOS: + /* need to start playback when we reach EOS */ gst_ring_buffer_start (sink->ringbuffer); + /* now wait till we played everything */ default: @@ -355,7 +359,7 @@ wrong_state: - GST_DEBUG ("ringbuffer in wrong state"); + GST_DEBUG_OBJECT (sink, "ringbuffer in wrong state"); GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, ("sink not negotiated."), ("sink not negotiated.")); return GST_FLOW_NOT_NEGOTIATED; @@ -396,11 +400,10 @@ gst_base_audio_sink_render (GstBaseSink * bsink, GstBuffer * buf) { guint64 render_offset, in_offset; - GstClockTime time, render_time, duration; - GstClockTimeDiff render_diff; + GstClockTime time, stop, render_time, duration; GstBaseAudioSink *sink; GstRingBuffer *ringbuf; - gint64 diff; + gint64 diff, ctime, cstop; guint8 *data; guint size; guint samples; @@ -412,6 +415,11 @@ sink = GST_BASE_AUDIO_SINK (bsink); + if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)) { + /* always resync after a discont */ + sink->next_sample = -1; + } ringbuf = sink->ringbuffer; /* can't do anything when we don't have the device */ @@ -431,80 +439,109 @@ duration = GST_BUFFER_DURATION (buf); data = GST_BUFFER_DATA (buf); - GST_DEBUG ("time %" GST_TIME_FORMAT ", offset %llu, start %" GST_TIME_FORMAT, + GST_DEBUG_OBJECT (sink, + "time %" GST_TIME_FORMAT ", offset %llu, start %" GST_TIME_FORMAT, GST_TIME_ARGS (time), in_offset, GST_TIME_ARGS (bsink->segment.start)); /* if not valid timestamp or we don't need to sync, try to play * sample ASAP */ if (!GST_CLOCK_TIME_IS_VALID (time) || !bsink->sync) { render_offset = gst_base_audio_sink_get_offset (sink); - GST_DEBUG ("Buffer of size %u has no time. Using render_offset=%" - G_GUINT64_FORMAT, GST_BUFFER_SIZE (buf), render_offset); + stop = -1; + GST_DEBUG_OBJECT (sink, + "Buffer of size %u has no time. Using render_offset=%" G_GUINT64_FORMAT, + GST_BUFFER_SIZE (buf), render_offset); goto no_sync; - render_diff = time - bsink->segment.start; - /* samples should be rendered based on their timestamp. All samples - * arriving before the segment.start are to be thrown away */ - /* FIXME, for now we drop the sample completely, we should - * in fact clip the sample. Same for the segment.stop, actually. */ - if (render_diff < 0) + * arriving before the segment.start or after segment.stop are to be + * thrown away. All samples should also be clipped to the segment + * boundaries */ + stop = + time + gst_util_uint64_scale_int (samples, GST_SECOND, + ringbuf->spec.rate); + if (!gst_segment_clip (&bsink->segment, GST_FORMAT_TIME, time, stop, &ctime, + &cstop)) goto out_of_segment; + /* see if some clipping happened */ + diff = ctime - time; + if (diff > 0) { + diff = gst_util_uint64_scale_int (diff, ringbuf->spec.rate, GST_SECOND); + GST_DEBUG_OBJECT (sink, "clipping start to %" GST_TIME_FORMAT " %" + G_GUINT64_FORMAT " samples", GST_TIME_ARGS (ctime), diff); + samples -= diff; + data += samples * bps; + time = ctime; + diff = stop - cstop; + GST_DEBUG_OBJECT (sink, "clipping stop to %" GST_TIME_FORMAT " %" + G_GUINT64_FORMAT " samples", GST_TIME_ARGS (cstop), diff); + stop = cstop; gst_clock_get_calibration (sink->provided_clock, &cinternal, &cexternal, &crate_num, &crate_denom); - /* bring buffer timestamp to stream time */ - render_time = render_diff; - /* adjust for rate */ - render_time /= ABS (bsink->segment.rate); - /* adjust for accumulated segments */ - render_time += bsink->segment.accum; + /* bring buffer timestamp to running time */ + render_time = + gst_segment_to_running_time (&bsink->segment, GST_FORMAT_TIME, time); /* add base time to get absolute clock time */ render_time += (gst_element_get_base_time (GST_ELEMENT_CAST (bsink)) - cexternal) + cinternal; /* and bring the time to the offset in the buffer */ - render_offset = render_time * ringbuf->spec.rate / GST_SECOND; + render_offset = + gst_util_uint64_scale_int (render_time, ringbuf->spec.rate, GST_SECOND); + GST_DEBUG_OBJECT (sink, "render time %" GST_TIME_FORMAT + ", render offset %llu, samples %lu", + GST_TIME_ARGS (render_time), render_offset, samples); /* roundoff errors in timestamp conversion */ - if (sink->next_sample != -1) + if (sink->next_sample != -1) { diff = ABS ((gint64) render_offset - (gint64) sink->next_sample); - else - diff = ringbuf->spec.rate; - GST_DEBUG ("render time %" GST_TIME_FORMAT - ", render offset %llu, diff %lld, samples %lu", - GST_TIME_ARGS (render_time), render_offset, diff, samples); - /* we tollerate a 10th of a second diff before we start resyncing. This - * should be enough to compensate for various rounding errors in the timestamp - * and sample offset position. */ - if (diff < ringbuf->spec.rate / DIFF_TOLERANCE) { - GST_DEBUG ("align with prev sample, %" G_GINT64_FORMAT " < %lu", diff, - ringbuf->spec.rate / DIFF_TOLERANCE); - /* just align with previous sample then */ - render_offset = sink->next_sample; + /* we tollerate a 10th of a second diff before we start resyncing. This + * should be enough to compensate for various rounding errors in the timestamp + * and sample offset position. */ + if (diff < ringbuf->spec.rate / DIFF_TOLERANCE) { + GST_DEBUG_OBJECT (sink, + "align with prev sample, %" G_GINT64_FORMAT " < %lu", diff, + ringbuf->spec.rate / DIFF_TOLERANCE); + /* just align with previous sample then */ + render_offset = sink->next_sample; + } else { + "resync after discont with previous sample of diff: %lu", diff); + } } else { - GST_DEBUG ("resync"); + GST_DEBUG_OBJECT (sink, "resync after discont"); crate = ((gdouble) crate_num) / crate_denom; GST_DEBUG_OBJECT (sink, "internal %" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT ", rate %g", cinternal, cexternal, crate); no_sync: /* clip length based on rate */ - samples = MIN (samples, samples / (crate * ABS (bsink->segment.rate))); + samples = MIN (samples, samples / (crate * bsink->segment.abs_rate)); /* the next sample should be current sample and its length */ sink->next_sample = render_offset + samples; - gst_ring_buffer_commit (ringbuf, render_offset, data, samples); + samples = gst_ring_buffer_commit (ringbuf, render_offset, data, samples); + if (samples == -1) + goto stopping; - if (GST_CLOCK_TIME_IS_VALID (time) && time + duration >= bsink->segment.stop) { - GST_DEBUG ("start playback because we are at the end of segment"); + if (GST_CLOCK_TIME_IS_VALID (stop) && stop >= bsink->segment.stop) { + "start playback because we are at the end of segment"); gst_ring_buffer_start (ringbuf); @@ -512,26 +549,32 @@ out_of_segment: - GST_DEBUG ("dropping sample out of segment time %" GST_TIME_FORMAT - ", start %" GST_TIME_FORMAT, - GST_TIME_ARGS (time), GST_TIME_ARGS (bsink->segment.start)); + "dropping sample out of segment time %" GST_TIME_FORMAT ", start %" + GST_TIME_FORMAT, GST_TIME_ARGS (time), + GST_TIME_ARGS (bsink->segment.start)); return GST_FLOW_OK; - GST_DEBUG ("ringbuffer not negotiated"); + GST_DEBUG_OBJECT (sink, "ringbuffer not negotiated"); wrong_size: - GST_DEBUG ("wrong size"); + GST_DEBUG_OBJECT (sink, "wrong size"); ("sink received buffer of wrong size."), ("sink received buffer of wrong size.")); return GST_FLOW_ERROR; +stopping: + { + GST_DEBUG_OBJECT (sink, "ringbuffer is stopping"); + return GST_FLOW_WRONG_STATE; GstRingBuffer * Index: gstbaseaudiosrc.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosrc.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gstbaseaudiosrc.c 20 Dec 2005 12:24:29 -0000 1.18 +++ gstbaseaudiosrc.c 25 Jan 2006 09:27:01 -0000 1.19 @@ -138,6 +138,8 @@ gst_pad_set_fixatecaps_function (GST_BASE_SRC_PAD (baseaudiosrc), gst_base_audio_src_fixate); + gst_base_src_set_format (GST_BASE_SRC (baseaudiosrc), GST_FORMAT_TIME); static GstClock * @@ -161,7 +163,8 @@ samples = gst_ring_buffer_samples_done (src->ringbuffer); - result = samples * GST_SECOND / src->ringbuffer->spec.rate; + result = gst_util_uint64_scale_int (samples, GST_SECOND, + src->ringbuffer->spec.rate); return result; @@ -319,11 +322,14 @@ guint len, samples; guint res; guint64 sample; + GstRingBuffer *ringbuffer; - if (!gst_ring_buffer_is_acquired (src->ringbuffer)) + ringbuffer = src->ringbuffer; + if (!gst_ring_buffer_is_acquired (ringbuffer)) goto wrong_state; - buf = gst_buffer_new_and_alloc (src->ringbuffer->spec.segsize); + buf = gst_buffer_new_and_alloc (ringbuffer->spec.segsize); len = GST_BUFFER_SIZE (buf); @@ -334,13 +340,17 @@ sample = 0; - samples = len / src->ringbuffer->spec.bytes_per_sample; + samples = len / ringbuffer->spec.bytes_per_sample; - res = gst_ring_buffer_read (src->ringbuffer, sample, data, samples); + res = gst_ring_buffer_read (ringbuffer, sample, data, samples); if (res == -1) goto stopped; + GST_BUFFER_TIMESTAMP (buf) = gst_util_uint64_scale_int (sample, + GST_SECOND, ringbuffer->spec.rate); src->next_sample = sample + samples; + GST_BUFFER_DURATION (buf) = gst_util_uint64_scale_int (src->next_sample, + GST_SECOND, ringbuffer->spec.rate) - GST_BUFFER_TIMESTAMP (buf); gst_buffer_set_caps (buf, GST_PAD_CAPS (GST_BASE_SRC_PAD (psrc))); |
From: <wt...@fr...> - 2006-01-25 10:53:10
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Wed Jan 25 2006 02:50:44 PST Log message: * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_render), (gst_base_audio_sink_change_state): Undo previous commit, it breaks resume after pause. Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2292&r2=1.2293 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.42&r2=1.43 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2292 retrieving revision 1.2293 diff -u -d -r1.2292 -r1.2293 --- ChangeLog 25 Jan 2006 09:27:01 -0000 1.2292 +++ ChangeLog 25 Jan 2006 10:50:32 -0000 1.2293 @@ -1,6 +1,13 @@ 2006-01-25 Wim Taymans <wi...@fl...> * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_render), (gst_base_audio_sink_change_state): + Undo previous commit that returned WRONG_STATE sooner, it breaks + resume after pause. + +2006-01-25 Wim Taymans <wi...@fl...> + * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_setcaps), (gst_base_audio_sink_event), (gst_base_audio_sink_preroll), (gst_base_audio_sink_render): Improve debugging. Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- gstbaseaudiosink.c 25 Jan 2006 09:27:01 -0000 1.42 +++ gstbaseaudiosink.c 25 Jan 2006 10:50:32 -0000 1.43 @@ -536,8 +536,6 @@ sink->next_sample = render_offset + samples; samples = gst_ring_buffer_commit (ringbuf, render_offset, data, samples); - if (samples == -1) - goto stopping; if (GST_CLOCK_TIME_IS_VALID (stop) && stop >= bsink->segment.stop) { GST_DEBUG_OBJECT (sink, @@ -570,11 +568,6 @@ ("sink received buffer of wrong size.")); return GST_FLOW_ERROR; } -stopping: - { - GST_DEBUG_OBJECT (sink, "ringbuffer is stopping"); - return GST_FLOW_WRONG_STATE; - } } GstRingBuffer * @@ -625,6 +618,7 @@ { GstClock *clock; + /* FIXME, only start slaving when we really start the ringbuffer */ GST_OBJECT_LOCK (sink); clock = GST_ELEMENT_CLOCK (sink); /* if we are slaved to a clock, we need to set the initial |
From: <wt...@fr...> - 2006-01-30 16:22:20
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Mon Jan 30 2006 08:19:45 PST Log message: * gst-libs/gst/audio/gstaudiosink.c: (gst_audioringbuffer_class_init), (gst_audioringbuffer_release), (gst_audioringbuffer_pause): Implement pause that does not wait for completion. * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_render), (gst_base_audio_sink_change_state): Don't drop buffers when going to PAUSED but perform preroll on remaining samples now that core base class supports this. * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_release), (gst_ring_buffer_pause_unlocked), (gst_ring_buffer_stop), (gst_ring_buffer_commit): Pause should not signal waiters. Implement return value of _commit correctly. Modified files: . : ChangeLog gst-libs/gst/audio: gstaudiosink.c gstbaseaudiosink.c gstringbuffer.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2312&r2=1.2313 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstaudiosink.c.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.44&r2=1.45 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.c.diff?r1=1.32&r2=1.33 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2312 retrieving revision 1.2313 diff -u -d -r1.2312 -r1.2313 --- ChangeLog 30 Jan 2006 15:01:28 -0000 1.2312 +++ ChangeLog 30 Jan 2006 16:19:32 -0000 1.2313 @@ -1,3 +1,21 @@ +2006-01-30 Wim Taymans <wi...@fl...> + + * gst-libs/gst/audio/gstaudiosink.c: + (gst_audioringbuffer_class_init), (gst_audioringbuffer_release), + (gst_audioringbuffer_pause): + Implement pause that does not wait for completion. + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_render), (gst_base_audio_sink_change_state): + Don't drop buffers when going to PAUSED but perform preroll on + remaining samples now that core base class supports this. + * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_release), + (gst_ring_buffer_pause_unlocked), (gst_ring_buffer_stop), + (gst_ring_buffer_commit): + Pause should not signal waiters. + Implement return value of _commit correctly. 2006-01-30 Andy Wingo <wi...@po...> * tests/check/Makefile.am (check_vorbis): Add pipelines/vorbisenc. Index: gstaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstaudiosink.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gstaudiosink.c 6 Dec 2005 19:42:00 -0000 1.18 +++ gstaudiosink.c 30 Jan 2006 16:19:33 -0000 1.19 @@ -77,6 +77,7 @@ GstRingBufferSpec * spec); static gboolean gst_audioringbuffer_release (GstRingBuffer * buf); static gboolean gst_audioringbuffer_start (GstRingBuffer * buf); +static gboolean gst_audioringbuffer_pause (GstRingBuffer * buf); static gboolean gst_audioringbuffer_stop (GstRingBuffer * buf); static guint gst_audioringbuffer_delay (GstRingBuffer * buf); @@ -132,7 +133,7 @@ gstringbuffer_class->release = GST_DEBUG_FUNCPTR (gst_audioringbuffer_release); gstringbuffer_class->start = GST_DEBUG_FUNCPTR (gst_audioringbuffer_start); - gstringbuffer_class->pause = GST_DEBUG_FUNCPTR (gst_audioringbuffer_stop); + gstringbuffer_class->pause = GST_DEBUG_FUNCPTR (gst_audioringbuffer_pause); gstringbuffer_class->resume = GST_DEBUG_FUNCPTR (gst_audioringbuffer_start); gstringbuffer_class->stop = GST_DEBUG_FUNCPTR (gst_audioringbuffer_stop); @@ -348,6 +349,7 @@ abuf = GST_AUDIORING_BUFFER (buf); abuf->running = FALSE; + GST_DEBUG ("signal wait"); GST_AUDIORING_BUFFER_SIGNAL (buf); GST_OBJECT_UNLOCK (buf); @@ -389,6 +391,25 @@ } static gboolean +gst_audioringbuffer_pause (GstRingBuffer * buf) +{ + GstAudioSink *sink; + GstAudioSinkClass *csink; + sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf)); + csink = GST_AUDIO_SINK_GET_CLASS (sink); + /* unblock any pending writes to the audio device */ + if (csink->reset) { + GST_DEBUG ("reset..."); + csink->reset (sink); + GST_DEBUG ("reset done"); + } + return TRUE; +} +static gboolean gst_audioringbuffer_stop (GstRingBuffer * buf) { GstAudioSink *sink; Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- gstbaseaudiosink.c 29 Jan 2006 19:13:39 -0000 1.44 +++ gstbaseaudiosink.c 30 Jan 2006 16:19:33 -0000 1.45 @@ -406,7 +406,7 @@ gint64 diff, ctime, cstop; guint8 *data; guint size; - guint samples; + guint samples, written; gint bps; gdouble crate = 1.0; GstClockTime crate_num; @@ -458,6 +458,8 @@ * arriving before the segment.start or after segment.stop are to be * thrown away. All samples should also be clipped to the segment * boundaries */ + /* let's calc stop based on the number of samples in the buffer instead + * of trusting the DURATION */ stop = time + gst_util_uint64_scale_int (samples, GST_SECOND, ringbuf->spec.rate); @@ -536,7 +538,27 @@ /* the next sample should be current sample and its length */ sink->next_sample = render_offset + samples; - samples = gst_ring_buffer_commit (ringbuf, render_offset, data, samples); + do { + written = gst_ring_buffer_commit (ringbuf, render_offset, data, samples); + GST_DEBUG_OBJECT (sink, "wrote %u of %u", written, samples); + /* if we wrote all, we're done */ + if (written == samples) + break; + /* else something interrupted us */ + GST_DEBUG_OBJECT (sink, "wait for preroll..."); + bsink->have_preroll = TRUE; + GST_PAD_PREROLL_WAIT (bsink->sinkpad); + bsink->have_preroll = FALSE; + GST_DEBUG_OBJECT (sink, "preroll done"); + if (G_UNLIKELY (bsink->flushing)) + goto stopping; + GST_DEBUG_OBJECT (sink, "continue after preroll"); + render_offset += written; + samples -= written; + data += written * bps; + } while (TRUE); if (GST_CLOCK_TIME_IS_VALID (stop) && stop >= bsink->segment.stop) { GST_DEBUG_OBJECT (sink, @@ -569,6 +591,11 @@ ("sink received buffer of wrong size.")); return GST_FLOW_ERROR; } +stopping: + { + GST_DEBUG_OBJECT (sink, "ringbuffer is stopping"); + return GST_FLOW_WRONG_STATE; GstRingBuffer * @@ -644,6 +671,9 @@ GST_OBJECT_UNLOCK (sink); break; } + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + gst_ring_buffer_pause (sink->ringbuffer); case GST_STATE_CHANGE_PAUSED_TO_READY: gst_ring_buffer_set_flushing (sink->ringbuffer, TRUE); @@ -655,7 +685,6 @@ switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: - gst_ring_buffer_pause (sink->ringbuffer); /* slop slaving ourselves to the master, if any */ gst_clock_set_master (sink->provided_clock, NULL); Index: gstringbuffer.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- gstringbuffer.c 28 Jan 2006 18:19:18 -0000 1.32 +++ gstringbuffer.c 30 Jan 2006 16:19:33 -0000 1.33 @@ -654,6 +654,7 @@ res = rclass->release (buf); /* signal any waiters */ + GST_DEBUG_OBJECT (buf, "signal waiter"); GST_RING_BUFFER_SIGNAL (buf); if (!res) @@ -820,9 +821,6 @@ goto done; - /* signal any waiters */ - GST_RING_BUFFER_SIGNAL (buf); - rclass = GST_RING_BUFFER_GET_CLASS (buf); if (rclass->pause) res = rclass->pause (buf); @@ -906,6 +904,7 @@ @@ -1127,6 +1126,7 @@ gint segdone; gint segsize, segtotal, bps, sps; guint8 *dest; + guint to_write; g_return_val_if_fail (buf != NULL, -1); g_return_val_if_fail (buf->data != NULL, -1); @@ -1138,8 +1138,9 @@ bps = buf->spec.bytes_per_sample; sps = buf->samples_per_seg; + to_write = len; /* write out all samples */ - while (len > 0) { + while (to_write > 0) { gint sampleslen; gint writeseg, sampleoff; @@ -1158,14 +1159,14 @@ diff = writeseg - segdone; GST_DEBUG - ("pointer at %d, sample %llu, write to %d-%d, len %d, diff %d, segtotal %d, segsize %d", - segdone, sample, writeseg, sampleoff, len, diff, segtotal, sps); + ("pointer at %d, sample %llu, write to %d-%d, to_write %d, diff %d, segtotal %d, segsize %d", + segdone, sample, writeseg, sampleoff, to_write, diff, segtotal, sps); /* segment too far ahead, we need to drop */ if (diff < 0) { /* we need to drop one segment at a time, pretend we wrote a * segment. */ - sampleslen = MIN (sps, len); + sampleslen = MIN (sps, to_write); goto next; } @@ -1181,27 +1182,27 @@ /* we can write now */ writeseg = writeseg % segtotal; - sampleslen = MIN (sps - sampleoff, len); + sampleslen = MIN (sps - sampleoff, to_write); - GST_DEBUG_OBJECT (buf, "write @%p seg %d, off %d, len %d", + GST_DEBUG_OBJECT (buf, "write @%p seg %d, off %d, sampleslen %d", dest + writeseg * segsize, writeseg, sampleoff, sampleslen); memcpy (dest + (writeseg * segsize) + (sampleoff * bps), data, (sampleslen * bps)); next: - len -= sampleslen; + to_write -= sampleslen; sample += sampleslen; data += sampleslen * bps; - return len; + return len - to_write; /* ERRORS */ not_started: { GST_DEBUG_OBJECT (buf, "stopped processing"); - return -1; + return len - to_write; |
From: <wt...@fr...> - 2006-02-02 12:17:34
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Thu Feb 02 2006 04:14:47 PST Log message: * gst-libs/gst/audio/TODO: Updated. * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_drain), (gst_base_audio_sink_event): On EOS, wait till the last sample is played before posting EOS. Modified files: . : ChangeLog gst-libs/gst/audio: TODO gstbaseaudiosink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2331&r2=1.2332 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/TODO.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.45&r2=1.46 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2331 retrieving revision 1.2332 diff -u -d -r1.2331 -r1.2332 --- ChangeLog 2 Feb 2006 00:04:37 -0000 1.2331 +++ ChangeLog 2 Feb 2006 12:14:34 -0000 1.2332 @@ -1,3 +1,12 @@ +2006-02-02 Wim Taymans <wi...@fl...> + + * gst-libs/gst/audio/TODO: + Updated. + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_drain), (gst_base_audio_sink_event): + On EOS, wait till the last sample is played before posting EOS. 2006-02-01 Philippe Kalaf <burger at speedy dot org> * gst-libs/gst/rtp/gstbasertpdepayload.c: Index: TODO RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/TODO,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- TODO 28 Nov 2005 15:53:55 -0000 1.4 +++ TODO 2 Feb 2006 12:14:35 -0000 1.5 @@ -7,8 +7,6 @@ is parsed correctly. - implement seek/query/convert - implement getrange scheduling - - on EOS, only post EOS when the complete ringbuffer has been played. - - more accurate clipping of samples outside of the segment - simple resampling - more accurate master/slave calibration handling - faster audio cutoff when going to PAUSED Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.45 retrieving revision 1.46 diff -u -d -r1.45 -r1.46 --- gstbaseaudiosink.c 30 Jan 2006 16:19:33 -0000 1.45 +++ gstbaseaudiosink.c 2 Feb 2006 12:14:35 -0000 1.46 @@ -320,6 +320,38 @@ } static gboolean +gst_base_audio_sink_drain (GstBaseAudioSink * sink) +{ + if (!sink->ringbuffer) + return TRUE; + if (!sink->ringbuffer->spec.rate) + if (sink->next_sample != -1) { + GstClockTime time; + GstClock *clock; + time = + gst_util_uint64_scale_int (sink->next_sample, GST_SECOND, + sink->ringbuffer->spec.rate); + GST_OBJECT_LOCK (sink); + if ((clock = GST_ELEMENT_CLOCK (sink)) != NULL) { + GstClockID id = gst_clock_new_single_shot_id (clock, time); + GST_OBJECT_UNLOCK (sink); + GST_DEBUG_OBJECT (sink, "waiting for last sample to play"); + gst_clock_id_wait (id, NULL); + sink->next_sample = -1; + } else { + } + } + return TRUE; +} +static gboolean gst_base_audio_sink_event (GstBaseSink * bsink, GstEvent * event) { GstBaseAudioSink *sink = GST_BASE_AUDIO_SINK (bsink); @@ -337,6 +369,7 @@ /* need to start playback when we reach EOS */ gst_ring_buffer_start (sink->ringbuffer); /* now wait till we played everything */ + gst_base_audio_sink_drain (sink); break; default: |
From: <wt...@fr...> - 2006-02-02 18:16:23
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Thu Feb 02 2006 10:13:38 PST Log message: * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_provide_clock), (gst_base_audio_sink_set_property), (gst_base_audio_sink_get_property), (gst_base_audio_sink_render): Don't try to provide a clock when we are not negotiated since we might not be able to make it run. Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2333&r2=1.2334 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.46&r2=1.47 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2333 retrieving revision 1.2334 diff -u -d -r1.2333 -r1.2334 --- ChangeLog 2 Feb 2006 17:51:48 -0000 1.2333 +++ ChangeLog 2 Feb 2006 18:13:25 -0000 1.2334 @@ -1,3 +1,12 @@ +2006-02-02 Wim Taymans <wi...@fl...> + + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_provide_clock), + (gst_base_audio_sink_set_property), + (gst_base_audio_sink_get_property), (gst_base_audio_sink_render): + Don't try to provide a clock when we are not negotiated since + we might not be able to make it run. 2006-02-02 Tim-Philipp Müller <tim at centricular dot net> * gst/playback/gstdecodebin.c: (try_to_link_1): Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.46 retrieving revision 1.47 diff -u -d -r1.46 -r1.47 --- gstbaseaudiosink.c 2 Feb 2006 12:14:35 -0000 1.46 +++ gstbaseaudiosink.c 2 Feb 2006 18:13:26 -0000 1.47 @@ -181,12 +181,29 @@ sink = GST_BASE_AUDIO_SINK (elem); + if (!gst_ring_buffer_is_acquired (sink->ringbuffer)) + goto wrong_state; + GST_OBJECT_LOCK (sink); if (sink->provide_clock) - clock = GST_CLOCK_CAST (gst_object_ref (sink->provided_clock)); - else - clock = NULL; + goto clock_disabled; + clock = GST_CLOCK_CAST (gst_object_ref (sink->provided_clock)); + GST_OBJECT_UNLOCK (sink); return clock; +wrong_state: + { + GST_DEBUG_OBJECT (sink, "ringbuffer not acquired"); + return NULL; + } +clock_disabled: + GST_DEBUG_OBJECT (sink, "clock provide disabled"); + GST_OBJECT_UNLOCK (sink); } static GstClockTime @@ -222,7 +239,9 @@ 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); default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -246,7 +265,9 @@ g_value_set_int64 (value, sink->latency_time); g_value_set_boolean (value, sink->provide_clock); @@ -543,7 +564,7 @@ /* we tollerate a 10th of a second diff before we start resyncing. This * should be enough to compensate for various rounding errors in the timestamp - * and sample offset position. */ + * and sample offset position. We always resync if we got a discont anyway. */ if (diff < ringbuf->spec.rate / DIFF_TOLERANCE) { GST_DEBUG_OBJECT (sink, "align with prev sample, %" G_GINT64_FORMAT " < %lu", diff, |
From: <wt...@fr...> - 2006-02-02 18:21:26
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Thu Feb 02 2006 10:18:43 PST Log message: * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_provide_clock): Ugh.. getting late I guess... Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2334&r2=1.2335 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.47&r2=1.48 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2334 retrieving revision 1.2335 diff -u -d -r1.2334 -r1.2335 --- ChangeLog 2 Feb 2006 18:13:25 -0000 1.2334 +++ ChangeLog 2 Feb 2006 18:18:31 -0000 1.2335 @@ -1,6 +1,12 @@ 2006-02-02 Wim Taymans <wi...@fl...> * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_provide_clock): + Ugh.. getting late I guess... + +2006-02-02 Wim Taymans <wi...@fl...> + * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_provide_clock), (gst_base_audio_sink_set_property), (gst_base_audio_sink_get_property), (gst_base_audio_sink_render): Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.47 retrieving revision 1.48 diff -u -d -r1.47 -r1.48 --- gstbaseaudiosink.c 2 Feb 2006 18:13:26 -0000 1.47 +++ gstbaseaudiosink.c 2 Feb 2006 18:18:31 -0000 1.48 @@ -185,7 +185,7 @@ goto wrong_state; GST_OBJECT_LOCK (sink); - if (sink->provide_clock) + if (!sink->provide_clock) goto clock_disabled; clock = GST_CLOCK_CAST (gst_object_ref (sink->provided_clock)); |
From: <wt...@fr...> - 2006-02-12 14:58:33
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Sun Feb 12 2006 06:55:07 PST Log message: * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_get_time), (gst_base_audio_sink_setcaps), (gst_base_audio_sink_drain), (gst_base_audio_sink_preroll), (gst_base_audio_sink_render), (gst_base_audio_sink_change_state): Use scale functions when possible. Fix error messages. Free clockid when after waiting for EOS. Use G_(UN_)LIKLY when it makes sense. Fix sample clipping bug found by Arwed v. Merkatz fixes #330789. Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2375&r2=1.2376 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.48&r2=1.49 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2375 retrieving revision 1.2376 diff -u -d -r1.2375 -r1.2376 --- ChangeLog 12 Feb 2006 14:26:54 -0000 1.2375 +++ ChangeLog 12 Feb 2006 14:54:55 -0000 1.2376 @@ -1,3 +1,15 @@ +2006-02-12 Wim Taymans <wi...@fl...> + + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_get_time), (gst_base_audio_sink_setcaps), + (gst_base_audio_sink_drain), (gst_base_audio_sink_preroll), + (gst_base_audio_sink_render), (gst_base_audio_sink_change_state): + Use scale functions when possible. + Fix error messages. + Free clockid when after waiting for EOS. + Use G_(UN_)LIKLY when it makes sense. + Fix sample clipping bug found by Arwed v. Merkatz fixes #330789. 2006-02-12 Edward Hervey <ed...@fl...> * gst/playback/gstplaybasebin.c: (prepare_output): Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- gstbaseaudiosink.c 2 Feb 2006 18:18:31 -0000 1.48 +++ gstbaseaudiosink.c 12 Feb 2006 14:54:55 -0000 1.49 @@ -218,7 +218,8 @@ /* our processed samples are always increasing */ samples = gst_ring_buffer_samples_done (sink->ringbuffer); - result = samples * GST_SECOND / sink->ringbuffer->spec.rate; + result = gst_util_uint64_scale_int (samples, GST_SECOND, + sink->ringbuffer->spec.rate); return result; } @@ -320,7 +321,7 @@ { GST_DEBUG_OBJECT (sink, "could not parse caps"); GST_ELEMENT_ERROR (sink, STREAM, FORMAT, - ("cannot parse audio format."), ("cannot parse audio format.")); + (NULL), ("cannot parse audio format.")); return FALSE; } acquire_error: @@ -340,6 +341,9 @@ *end = GST_CLOCK_TIME_NONE; +/* FIXME, this waits for the drain to happen but it cannot be + * canceled. + */ static gboolean gst_base_audio_sink_drain (GstBaseAudioSink * sink) { @@ -364,6 +368,8 @@ GST_DEBUG_OBJECT (sink, "waiting for last sample to play"); gst_clock_id_wait (id, NULL); + gst_clock_id_unref (id); sink->next_sample = -1; } else { GST_OBJECT_UNLOCK (sink); @@ -414,8 +420,7 @@ wrong_state: GST_DEBUG_OBJECT (sink, "ringbuffer in wrong state"); - GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, - ("sink not negotiated."), ("sink not negotiated.")); + GST_ELEMENT_ERROR (sink, STREAM, FORMAT, (NULL), ("sink not negotiated.")); return GST_FLOW_NOT_NEGOTIATED; @@ -469,7 +474,7 @@ sink = GST_BASE_AUDIO_SINK (bsink); - if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)) { + if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT))) { /* always resync after a discont */ sink->next_sample = -1; @@ -477,13 +482,13 @@ ringbuf = sink->ringbuffer; /* can't do anything when we don't have the device */ - if (!gst_ring_buffer_is_acquired (ringbuf)) + if (G_UNLIKELY (!gst_ring_buffer_is_acquired (ringbuf))) goto wrong_state; bps = ringbuf->spec.bytes_per_sample; size = GST_BUFFER_SIZE (buf); - if (size % bps != 0) + if (G_UNLIKELY (size % bps) != 0) goto wrong_size; samples = size / bps; @@ -524,15 +529,17 @@ /* see if some clipping happened */ diff = ctime - time; if (diff > 0) { + /* bring clipped time to samples */ diff = gst_util_uint64_scale_int (diff, ringbuf->spec.rate, GST_SECOND); GST_DEBUG_OBJECT (sink, "clipping start to %" GST_TIME_FORMAT " %" G_GUINT64_FORMAT " samples", GST_TIME_ARGS (ctime), diff); samples -= diff; - data += samples * bps; + data += diff * bps; time = ctime; diff = stop - cstop; GST_DEBUG_OBJECT (sink, "clipping stop to %" GST_TIME_FORMAT " %" G_GUINT64_FORMAT " samples", GST_TIME_ARGS (cstop), diff); @@ -559,7 +566,7 @@ GST_TIME_ARGS (render_time), render_offset, samples); /* roundoff errors in timestamp conversion */ - if (sink->next_sample != -1) { + if (G_LIKELY (sink->next_sample != -1)) { diff = ABS ((gint64) render_offset - (gint64) sink->next_sample); /* we tollerate a 10th of a second diff before we start resyncing. This @@ -622,6 +629,7 @@ return GST_FLOW_OK; + /* SPECIAL cases */ out_of_segment: GST_DEBUG_OBJECT (sink, @@ -630,19 +638,18 @@ GST_TIME_ARGS (bsink->segment.start)); return GST_FLOW_OK; + /* ERRORS */ GST_DEBUG_OBJECT (sink, "ringbuffer not negotiated"); wrong_size: GST_DEBUG_OBJECT (sink, "wrong size"); - ("sink received buffer of wrong size."), - ("sink received buffer of wrong size.")); + GST_ELEMENT_ERROR (sink, STREAM, WRONG_TYPE, + (NULL), ("sink received buffer of wrong size.")); return GST_FLOW_ERROR; stopping: @@ -690,7 +697,7 @@ gst_base_audio_sink_callback, sink); } if (!gst_ring_buffer_open_device (sink->ringbuffer)) - return GST_STATE_CHANGE_FAILURE; + goto open_failed; sink->next_sample = 0; break; case GST_STATE_CHANGE_READY_TO_PAUSED: @@ -699,20 +706,25 @@ case GST_STATE_CHANGE_PAUSED_TO_PLAYING: { GstClock *clock; + GstClockTime time, base; - /* FIXME, only start slaving when we really start the ringbuffer */ GST_OBJECT_LOCK (sink); clock = GST_ELEMENT_CLOCK (sink); + if (clock == NULL) + goto no_clock; + /* FIXME, only start slaving when we really start the ringbuffer */ /* if we are slaved to a clock, we need to set the initial * calibration */ if (clock != sink->provided_clock) { - GstClockTime time; GstClockTime rate_num, rate_denom; + base = element->base_time; time = gst_clock_get_internal_time (sink->provided_clock); - GST_DEBUG_OBJECT (sink, "time: %" GST_TIME_FORMAT, - GST_TIME_ARGS (time)); + GST_DEBUG_OBJECT (sink, + "time: %" GST_TIME_FORMAT " base: %" GST_TIME_FORMAT, + GST_TIME_ARGS (time), GST_TIME_ARGS (base)); gst_clock_set_master (sink->provided_clock, clock); /* FIXME, this is not yet accurate enough for smooth playback */ @@ -722,6 +734,7 @@ gst_clock_set_calibration (sink->provided_clock, time, element->base_time, rate_num, rate_denom); + no_clock: } @@ -754,4 +767,10 @@ return ret; +open_failed: + { + GST_DEBUG_OBJECT (sink, "open failed"); + return GST_STATE_CHANGE_FAILURE; + } |
From: <wt...@fr...> - 2006-02-13 18:52:29
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Mon Feb 13 2006 10:49:14 PST Log message: * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_get_time), (gst_base_audio_sink_preroll), (gst_base_audio_sink_render), (gst_base_audio_sink_change_state): Always sync on first sample we receive when starting. Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2378&r2=1.2379 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.49&r2=1.50 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2378 retrieving revision 1.2379 diff -u -d -r1.2378 -r1.2379 --- ChangeLog 13 Feb 2006 15:59:48 -0000 1.2378 +++ ChangeLog 13 Feb 2006 18:49:01 -0000 1.2379 @@ -1,5 +1,12 @@ 2006-02-13 Wim Taymans <wi...@fl...> + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_get_time), (gst_base_audio_sink_preroll), + (gst_base_audio_sink_render), (gst_base_audio_sink_change_state): + Always sync on first sample we receive when starting. + +2006-02-13 Wim Taymans <wi...@fl...> * gst/playback/gstplaybin.c: (gen_vis_element): Update vis bin docs. Move queue after tee so we don't queue video buffers but Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.49 retrieving revision 1.50 diff -u -d -r1.49 -r1.50 --- gstbaseaudiosink.c 12 Feb 2006 14:54:55 -0000 1.49 +++ gstbaseaudiosink.c 13 Feb 2006 18:49:02 -0000 1.50 @@ -698,10 +698,10 @@ } if (!gst_ring_buffer_open_device (sink->ringbuffer)) goto open_failed; - sink->next_sample = 0; break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE); + sink->next_sample = -1; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: { |
From: <wt...@fr...> - 2006-02-14 13:49:14
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Tue Feb 14 2006 05:45:47 PST Log message: * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_pause_unlocked), (gst_ring_buffer_delay), (gst_ring_buffer_samples_done), (wait_segment), (gst_ring_buffer_commit), (gst_ring_buffer_clear): Add some compiler G_(UN_)LIKELY help. SIGNAL the ringbuffer waiters when going to PAUSED as well to make sure they can exit their functions. Should fix #330748 Modified files: . : ChangeLog gst-libs/gst/audio: gstringbuffer.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2380&r2=1.2381 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.c.diff?r1=1.35&r2=1.36 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2380 retrieving revision 1.2381 diff -u -d -r1.2380 -r1.2381 --- ChangeLog 13 Feb 2006 20:49:06 -0000 1.2380 +++ ChangeLog 14 Feb 2006 13:45:35 -0000 1.2381 @@ -1,3 +1,13 @@ +2006-02-14 Wim Taymans <wi...@fl...> + + * gst-libs/gst/audio/gstringbuffer.c: + (gst_ring_buffer_pause_unlocked), (gst_ring_buffer_delay), + (gst_ring_buffer_samples_done), (wait_segment), + (gst_ring_buffer_commit), (gst_ring_buffer_clear): + Add some compiler G_(UN_)LIKELY help. + SIGNAL the ringbuffer waiters when going to PAUSED as well to + make sure they can exit their functions. Should fix #330748 2006-02-13 Thomas Vander Stichele <thomas at apestaart dot org> * Makefile.am: Index: gstringbuffer.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- gstringbuffer.c 9 Feb 2006 11:46:03 -0000 1.35 +++ gstringbuffer.c 14 Feb 2006 13:45:35 -0000 1.36 @@ -814,12 +814,12 @@ res = g_atomic_int_compare_and_exchange (&buf->state, GST_RING_BUFFER_STATE_STARTED, GST_RING_BUFFER_STATE_PAUSED); - if (!res) { - /* was not started */ - res = TRUE; - GST_DEBUG_OBJECT (buf, "was not started"); - goto done; - } + if (!res) + goto not_started; + /* signal any waiters */ + GST_DEBUG_OBJECT (buf, "signal waiter"); + GST_RING_BUFFER_SIGNAL (buf); rclass = GST_RING_BUFFER_GET_CLASS (buf); if (rclass->pause) @@ -832,8 +832,14 @@ GST_DEBUG_OBJECT (buf, "paused"); } -done: return res; +not_started: + { + /* was not started */ + GST_DEBUG_OBJECT (buf, "was not started"); + return TRUE; + } } /** @@ -944,11 +950,11 @@ g_return_val_if_fail (buf != NULL, 0); - if (!gst_ring_buffer_is_acquired (buf)) + if (G_UNLIKELY (!gst_ring_buffer_is_acquired (buf))) return 0; - if (rclass->delay) + if (G_LIKELY (rclass->delay)) res = rclass->delay (buf); @@ -983,7 +989,7 @@ samples = ((guint64) segdone) * buf->samples_per_seg; raw = samples; - if (samples >= delay) + if (G_UNLIKELY (samples >= delay)) samples -= delay; GST_DEBUG_OBJECT (buf, "processed samples: raw %llu, delay %u, real %llu", @@ -1059,26 +1065,30 @@ wait_segment (GstRingBuffer * buf) { /* buffer must be started now or we deadlock since nobody is reading */ - if (g_atomic_int_get (&buf->state) != GST_RING_BUFFER_STATE_STARTED) { + if (G_UNLIKELY (g_atomic_int_get (&buf->state) != + GST_RING_BUFFER_STATE_STARTED)) { GST_DEBUG_OBJECT (buf, "start!"); gst_ring_buffer_start (buf); /* take lock first, then update our waiting flag */ GST_OBJECT_LOCK (buf); - if (buf->abidata.ABI.flushing) + if (G_UNLIKELY (buf->abidata.ABI.flushing)) goto flushing; + GST_RING_BUFFER_STATE_STARTED)) if (g_atomic_int_compare_and_exchange (&buf->waiting, 0, 1)) { GST_DEBUG_OBJECT (buf, "waiting.."); - if (g_atomic_int_get (&buf->state) != GST_RING_BUFFER_STATE_STARTED) - goto not_started; - GST_RING_BUFFER_WAIT (buf); - if (buf->abidata.ABI.flushing) + if (G_UNLIKELY (buf->abidata.ABI.flushing)) goto flushing; + if (G_UNLIKELY (g_atomic_int_get (&buf->state) != + GST_RING_BUFFER_STATE_STARTED)) goto not_started; GST_OBJECT_UNLOCK (buf); @@ -1088,14 +1098,16 @@ /* ERROR */ not_started: { - GST_OBJECT_UNLOCK (buf); + g_atomic_int_compare_and_exchange (&buf->waiting, 1, 0); GST_DEBUG_OBJECT (buf, "stopped processing"); + GST_OBJECT_UNLOCK (buf); return FALSE; flushing: GST_DEBUG_OBJECT (buf, "flushing"); @@ -1163,7 +1175,7 @@ segdone, sample, writeseg, sampleoff, to_write, diff, segtotal, sps); /* segment too far ahead, we need to drop */ - if (diff < 0) { + if (G_UNLIKELY (diff < 0)) { /* we need to drop one segment at a time, pretend we wrote a * segment. */ sampleslen = MIN (sps, to_write); @@ -1176,7 +1188,7 @@ break; /* else we need to wait for the segment to become writable. */ - if (!wait_segment (buf)) + if (G_UNLIKELY (!wait_segment (buf))) goto not_started; } @@ -1419,8 +1431,10 @@ g_return_if_fail (buf->empty_seg != NULL); + segment %= buf->spec.segtotal; data = GST_BUFFER_DATA (buf->data); - data += (segment % buf->spec.segtotal) * buf->spec.segsize; + data += segment * buf->spec.segsize; GST_LOG ("clear segment %d @%p", segment, data); |
From: <wt...@fr...> - 2006-02-17 10:19:26
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Fri Feb 17 2006 02:16:04 PST Log message: * gst-libs/gst/audio/TODO: Update TODO * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_get_offset): When trying to play samples ASAP and we don't have a previous sample, try to play at position 0 instead of an invalid position. Modified files: . : ChangeLog gst-libs/gst/audio: TODO gstbaseaudiosink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2391&r2=1.2392 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/TODO.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.50&r2=1.51 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2391 retrieving revision 1.2392 diff -u -d -r1.2391 -r1.2392 --- ChangeLog 17 Feb 2006 09:24:56 -0000 1.2391 +++ ChangeLog 17 Feb 2006 10:15:51 -0000 1.2392 @@ -1,5 +1,16 @@ 2006-02-17 Wim Taymans <wi...@fl...> + * gst-libs/gst/audio/TODO: + Update TODO + + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_get_offset): + When trying to play samples ASAP and we don't have a + previous sample, try to play at position 0 instead of + an invalid position. +2006-02-17 Wim Taymans <wi...@fl...> * ext/alsa/gstalsasink.c: (gst_alsasink_open), (gst_alsasink_reset): Also release lock when we get an error in _reset(); Index: TODO RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/TODO,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- TODO 2 Feb 2006 12:14:35 -0000 1.5 +++ TODO 17 Feb 2006 10:15:52 -0000 1.6 @@ -11,3 +11,5 @@ - more accurate master/slave calibration handling - faster audio cutoff when going to PAUSED - resubmit samples from ringbuffer when doing PAUSED->PLAYING again + - the ringbuffer should have a state where it is filling up the + buffer before going to playing. Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.50 retrieving revision 1.51 diff -u -d -r1.50 -r1.51 --- gstbaseaudiosink.c 13 Feb 2006 18:49:02 -0000 1.50 +++ gstbaseaudiosink.c 17 Feb 2006 10:15:52 -0000 1.51 @@ -434,6 +434,9 @@ /* assume we can append to the previous sample */ sample = sink->next_sample; + /* no previous sample, try to insert at position 0 */ + if (sample == -1) + sample = 0; sps = sink->ringbuffer->samples_per_seg; |
From: <wt...@fr...> - 2006-02-17 14:10:57
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Fri Feb 17 2006 06:07:14 PST Log message: * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_get_type), (gst_ring_buffer_open_device), (gst_ring_buffer_close_device), (gst_ring_buffer_device_is_open), (gst_ring_buffer_acquire), (gst_ring_buffer_release), (gst_ring_buffer_set_flushing), (gst_ring_buffer_start), (gst_ring_buffer_pause_unlocked), (gst_ring_buffer_pause), (gst_ring_buffer_stop), (gst_ring_buffer_delay), (gst_ring_buffer_samples_done), (gst_ring_buffer_set_sample), (gst_ring_buffer_clear_all), (gst_ring_buffer_commit), (gst_ring_buffer_prepare_read), (gst_ring_buffer_clear): Small cleanups. Added some G_LIKELY. Modified files: . : ChangeLog gst-libs/gst/audio: gstringbuffer.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2392&r2=1.2393 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.c.diff?r1=1.36&r2=1.37 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2392 retrieving revision 1.2393 diff -u -d -r1.2392 -r1.2393 --- ChangeLog 17 Feb 2006 10:15:51 -0000 1.2392 +++ ChangeLog 17 Feb 2006 14:07:01 -0000 1.2393 @@ -1,5 +1,20 @@ 2006-02-17 Wim Taymans <wi...@fl...> + * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_get_type), + (gst_ring_buffer_open_device), (gst_ring_buffer_close_device), + (gst_ring_buffer_device_is_open), (gst_ring_buffer_acquire), + (gst_ring_buffer_release), (gst_ring_buffer_set_flushing), + (gst_ring_buffer_start), (gst_ring_buffer_pause_unlocked), + (gst_ring_buffer_pause), (gst_ring_buffer_stop), + (gst_ring_buffer_delay), (gst_ring_buffer_samples_done), + (gst_ring_buffer_set_sample), (gst_ring_buffer_clear_all), + (gst_ring_buffer_commit), (gst_ring_buffer_prepare_read), + (gst_ring_buffer_clear): + Small cleanups. + Added some G_LIKELY. + +2006-02-17 Wim Taymans <wi...@fl...> * gst-libs/gst/audio/TODO: Update TODO Index: gstringbuffer.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -d -r1.36 -r1.37 --- gstringbuffer.c 14 Feb 2006 13:45:35 -0000 1.36 +++ gstringbuffer.c 17 Feb 2006 14:07:01 -0000 1.37 @@ -50,7 +50,7 @@ { static GType ringbuffer_type = 0; - if (!ringbuffer_type) { + if (G_UNLIKELY (!ringbuffer_type)) { static const GTypeInfo ringbuffer_info = { sizeof (GstRingBufferClass), NULL, @@ -394,7 +394,7 @@ GST_DEBUG_OBJECT (buf, "opening device"); GST_OBJECT_LOCK (buf); - if (buf->open) + if (G_UNLIKELY (buf->open)) goto was_opened; buf->open = TRUE; @@ -403,10 +403,10 @@ g_assert (!buf->acquired); rclass = GST_RING_BUFFER_GET_CLASS (buf); - if (rclass->open_device) + if (G_LIKELY (rclass->open_device)) res = rclass->open_device (buf); - if (!res) + if (G_UNLIKELY (!res)) goto open_failed; GST_DEBUG_OBJECT (buf, "opened device"); @@ -454,19 +454,19 @@ GST_DEBUG_OBJECT (buf, "closing device"); - if (!buf->open) + if (G_UNLIKELY (!buf->open)) goto was_closed; - if (buf->acquired) + if (G_UNLIKELY (buf->acquired)) goto was_acquired; buf->open = FALSE; - if (rclass->close_device) + if (G_LIKELY (rclass->close_device)) res = rclass->close_device (buf); goto close_error; GST_DEBUG_OBJECT (buf, "closed device"); @@ -517,9 +517,7 @@ g_return_val_if_fail (GST_IS_RING_BUFFER (buf), FALSE); - res = buf->open; GST_OBJECT_UNLOCK (buf); return res; @@ -552,22 +550,22 @@ GST_DEBUG_OBJECT (buf, "acquiring device"); goto not_opened; buf->acquired = TRUE; - if (rclass->acquire) + if (G_LIKELY (rclass->acquire)) res = rclass->acquire (buf, spec); goto acquire_failed; - if ((bps = buf->spec.bytes_per_sample) == 0) + if (G_UNLIKELY ((bps = buf->spec.bytes_per_sample) == 0)) goto invalid_bps; segsize = buf->spec.segsize; @@ -641,7 +639,7 @@ gst_ring_buffer_stop (buf); - if (!buf->acquired) + if (G_UNLIKELY (!buf->acquired)) goto was_released; buf->acquired = FALSE; @@ -650,14 +648,14 @@ g_assert (buf->open == TRUE); - if (rclass->release) + if (G_LIKELY (rclass->release)) res = rclass->release (buf); /* signal any waiters */ GST_DEBUG_OBJECT (buf, "signal waiter"); GST_RING_BUFFER_SIGNAL (buf); goto release_failed; g_free (buf->empty_seg); @@ -726,11 +724,9 @@ if (flushing) { gst_ring_buffer_pause_unlocked (buf); } } /** * gst_ring_buffer_start: * @buf: the #GstRingBuffer to start @@ -753,7 +749,7 @@ GST_DEBUG_OBJECT (buf, "starting ringbuffer"); - if (buf->abidata.ABI.flushing) + if (G_UNLIKELY (buf->abidata.ABI.flushing)) goto flushing; /* if stopped, set to started */ @@ -776,14 +772,14 @@ if (resume) { - if (rclass->resume) + if (G_LIKELY (rclass->resume)) res = rclass->resume (buf); } else { - if (rclass->start) + if (G_LIKELY (rclass->start)) res = rclass->start (buf); - if (!res) { + if (G_UNLIKELY (!res)) { buf->state = GST_RING_BUFFER_STATE_PAUSED; GST_DEBUG_OBJECT (buf, "failed to start"); @@ -822,10 +818,10 @@ - if (rclass->pause) + if (G_LIKELY (rclass->pause)) res = rclass->pause (buf); buf->state = GST_RING_BUFFER_STATE_STARTED; GST_DEBUG_OBJECT (buf, "failed to pause"); @@ -860,11 +856,10 @@ g_return_val_if_fail (buf != NULL, FALSE); res = gst_ring_buffer_pause_unlocked (buf); @@ -914,10 +909,10 @@ - if (rclass->stop) + if (G_LIKELY (rclass->stop)) res = rclass->stop (buf); GST_DEBUG_OBJECT (buf, "failed to stop"); @@ -946,17 +941,21 @@ gst_ring_buffer_delay (GstRingBuffer * buf) GstRingBufferClass *rclass; - guint res = 0; + guint res; g_return_val_if_fail (buf != NULL, 0); + res = 0; + /* buffer must be acquired */ if (G_UNLIKELY (!gst_ring_buffer_is_acquired (buf))) - return 0; + goto done; if (G_LIKELY (rclass->delay)) res = rclass->delay (buf); +done: @@ -986,10 +985,9 @@ /* and the number of samples not yet processed */ delay = gst_ring_buffer_delay (buf); - samples = ((guint64) segdone) * buf->samples_per_seg; - raw = samples; + raw = samples = ((guint64) segdone) * buf->samples_per_seg; - if (G_UNLIKELY (samples >= delay)) + if (G_LIKELY (samples >= delay)) samples -= delay; GST_DEBUG_OBJECT (buf, "processed samples: raw %llu, delay %u, real %llu", @@ -1020,7 +1018,7 @@ if (sample == -1) sample = 0; - if (buf->samples_per_seg == 0) + if (G_UNLIKELY (buf->samples_per_seg == 0)) return; /* FIXME, we assume the ringbuffer can restart at a random @@ -1050,7 +1048,7 @@ g_return_if_fail (buf != NULL); /* not fatal, we just are not negotiated yet */ - if (buf->spec.segtotal <= 0) + if (G_UNLIKELY (buf->spec.segtotal <= 0)) GST_DEBUG_OBJECT (buf, "clear all segments"); @@ -1174,7 +1172,7 @@ ("pointer at %d, sample %llu, write to %d-%d, to_write %d, diff %d, segtotal %d, segsize %d", segdone, sample, writeseg, sampleoff, to_write, diff, segtotal, sps); - /* segment too far ahead, we need to drop */ + /* segment too far ahead, we need to drop, hopefully UNLIKELY */ if (G_UNLIKELY (diff < 0)) { /* we need to drop one segment at a time, pretend we wrote a * segment. */ @@ -1188,7 +1186,7 @@ break; /* else we need to wait for the segment to become writable. */ - if (G_UNLIKELY (!wait_segment (buf))) + if (!wait_segment (buf)) goto not_started; } @@ -1370,7 +1368,8 @@ *len = buf->spec.segsize; *readptr = data + *segment * *len; - /* callback to fill the memory with data */ + /* callback to fill the memory with data, for pull based + * scheduling. */ if (buf->callback) buf->callback (buf, *readptr, *len, buf->cb_data); @@ -1425,8 +1424,9 @@ guint8 *data; - /* no data means it's allready cleared */ - if (buf->data == NULL) + /* no data means it's already cleared */ + if (G_UNLIKELY (buf->data == NULL)) g_return_if_fail (buf->empty_seg != NULL); |
From: <wt...@ke...> - 2006-02-28 11:06:38
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Tue Feb 28 2006 11:06:36 UTC Log message: * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_provide_clock): Don't try to provide a clock in the NULL state. Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2425&r2=1.2426 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.51&r2=1.52 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2425 retrieving revision 1.2426 diff -u -d -r1.2425 -r1.2426 --- ChangeLog 28 Feb 2006 11:04:47 -0000 1.2425 +++ ChangeLog 28 Feb 2006 11:06:24 -0000 1.2426 @@ -1,5 +1,11 @@ 2006-02-28 Wim Taymans <wi...@fl...> + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_provide_clock): + Don't try to provide a clock in the NULL state. + +2006-02-28 Wim Taymans <wi...@fl...> * ext/ogg/gstoggdemux.c: (gst_ogg_demux_receive_event), (gst_ogg_pad_event), (gst_ogg_pad_internal_chain), (gst_ogg_demux_chain_peer), (gst_ogg_pad_submit_packet), Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.51 retrieving revision 1.52 diff -u -d -r1.51 -r1.52 --- gstbaseaudiosink.c 17 Feb 2006 10:15:52 -0000 1.51 +++ gstbaseaudiosink.c 28 Feb 2006 11:06:24 -0000 1.52 @@ -181,6 +181,10 @@ sink = GST_BASE_AUDIO_SINK (elem); + /* we have no ringbuffer (must be NULL state */ + if (sink->ringbuffer == NULL) + goto wrong_state; if (!gst_ring_buffer_is_acquired (sink->ringbuffer)) goto wrong_state; |
From: <wt...@ke...> - 2006-03-17 17:48:51
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Fri Mar 17 2006 17:48:45 UTC Log message: * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_change_state): * gst-libs/gst/audio/gstringbuffer.c: (wait_segment), (gst_ring_buffer_may_start): * gst-libs/gst/audio/gstringbuffer.h: Only start playback if we are playing. should fix #330748. Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosink.c gstringbuffer.c gstringbuffer.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2494&r2=1.2495 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.52&r2=1.53 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.c.diff?r1=1.38&r2=1.39 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.h.diff?r1=1.18&r2=1.19 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2494 retrieving revision 1.2495 diff -u -d -r1.2494 -r1.2495 --- ChangeLog 17 Mar 2006 13:11:45 -0000 1.2494 +++ ChangeLog 17 Mar 2006 17:48:33 -0000 1.2495 @@ -1,3 +1,13 @@ +2006-03-17 Wim Taymans <wi...@fl...> + + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_change_state): + * gst-libs/gst/audio/gstringbuffer.c: (wait_segment), + (gst_ring_buffer_may_start): + * gst-libs/gst/audio/gstringbuffer.h: + Only start playback if we are playing. + should fix #330748. 2006-03-17 Jan Schmidt <th...@ma...> * ext/alsa/gstalsasink.c: (gst_alsasink_getcaps): Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.52 retrieving revision 1.53 diff -u -d -r1.52 -r1.53 --- gstbaseaudiosink.c 28 Feb 2006 11:06:24 -0000 1.52 +++ gstbaseaudiosink.c 17 Mar 2006 17:48:33 -0000 1.53 @@ -707,14 +707,17 @@ goto open_failed; break; case GST_STATE_CHANGE_READY_TO_PAUSED: - gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE); sink->next_sample = -1; + gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE); + gst_ring_buffer_may_start (sink->ringbuffer, FALSE); case GST_STATE_CHANGE_PAUSED_TO_PLAYING: { GstClock *clock; GstClockTime time, base; + gst_ring_buffer_may_start (sink->ringbuffer, TRUE); GST_OBJECT_LOCK (sink); clock = GST_ELEMENT_CLOCK (sink); if (clock == NULL) @@ -746,6 +749,8 @@ } case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + /* ringbuffer cannot start anymore */ gst_ring_buffer_pause (sink->ringbuffer); case GST_STATE_CHANGE_PAUSED_TO_READY: Index: gstringbuffer.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.c,v retrieving revision 1.38 retrieving revision 1.39 diff -u -d -r1.38 -r1.39 --- gstringbuffer.c 2 Mar 2006 16:47:33 -0000 1.38 +++ gstringbuffer.c 17 Mar 2006 17:48:33 -0000 1.39 @@ -1077,6 +1077,10 @@ /* buffer must be started now or we deadlock since nobody is reading */ if (G_UNLIKELY (g_atomic_int_get (&buf->state) != GST_RING_BUFFER_STATE_STARTED)) { + /* see if we are allowed to start it */ + if (G_UNLIKELY (g_atomic_int_get (&buf->abidata.ABI.may_start) == FALSE)) + goto no_start; GST_DEBUG_OBJECT (buf, "start!"); gst_ring_buffer_start (buf); } @@ -1120,6 +1124,11 @@ GST_OBJECT_UNLOCK (buf); return FALSE; +no_start: + { + GST_DEBUG_OBJECT (buf, "not allowed to start"); + return FALSE; + } } /** @@ -1455,3 +1464,22 @@ memcpy (data, buf->empty_seg, buf->spec.segsize); +/** + * gst_ring_buffer_may_start: + * @buf: the #GstRingBuffer + * @allowed: the new value + * + * Tell the ringbuffer that it is allowed to start playback when + * the ringbuffer is filled with samples. + * Since: 0.10.6 + * MT safe. + */ +void +gst_ring_buffer_may_start (GstRingBuffer * buf, gboolean allowed) +{ + GST_LOG_OBJECT (buf, "may start: %d", allowed); + gst_atomic_int_set (&buf->abidata.ABI.may_start, allowed); +} Index: gstringbuffer.h RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.h,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gstringbuffer.h 2 Mar 2006 16:47:33 -0000 1.18 +++ gstringbuffer.h 17 Mar 2006 17:48:33 -0000 1.19 @@ -243,6 +243,8 @@ union { struct { gboolean flushing; + /* ATOMIC */ + gint may_start; } ABI; /* adding + 0 to mark ABI change to be undone later */ gpointer _gst_reserved[GST_PADDING + 0]; @@ -335,6 +337,9 @@ void gst_ring_buffer_clear (GstRingBuffer *buf, gint segment); void gst_ring_buffer_advance (GstRingBuffer *buf, guint advance); +void gst_ring_buffer_may_start (GstRingBuffer *buf, gboolean allowed); G_END_DECLS #endif /* __GST_RING_BUFFER_H__ */ |
From: <wt...@ke...> - 2006-03-22 12:33:23
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Wed Mar 22 2006 12:33:21 UTC Log message: * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_dispose): Since we _parent the ringbuffer, we also need to _unparent instead of a plain _unref. Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2500&r2=1.2501 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.53&r2=1.54 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2500 retrieving revision 1.2501 diff -u -d -r1.2500 -r1.2501 --- ChangeLog 22 Mar 2006 12:28:36 -0000 1.2500 +++ ChangeLog 22 Mar 2006 12:33:09 -0000 1.2501 @@ -1,5 +1,12 @@ 2006-03-22 Wim Taymans <wi...@fl...> + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_dispose): + Since we _parent the ringbuffer, we also need to + _unparent instead of a plain _unref. + +2006-03-22 Wim Taymans <wi...@fl...> * tests/examples/seek/seek.c: (end_scrub), (do_seek), (seek_cb), (stop_seek), (scrub_toggle_cb), (main): Add scrub checkbox. Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.53 retrieving revision 1.54 diff -u -d -r1.53 -r1.54 --- gstbaseaudiosink.c 17 Mar 2006 17:48:33 -0000 1.53 +++ gstbaseaudiosink.c 22 Mar 2006 12:33:09 -0000 1.54 @@ -166,9 +166,10 @@ gst_object_unref (sink->provided_clock); sink->provided_clock = NULL; - if (sink->ringbuffer) - gst_object_unref (sink->ringbuffer); - sink->ringbuffer = NULL; + if (sink->ringbuffer) { + gst_object_unparent (GST_OBJECT_CAST (sink->ringbuffer)); + sink->ringbuffer = NULL; + } G_OBJECT_CLASS (parent_class)->dispose (object); } |
From: <wt...@ke...> - 2006-03-23 16:30:12
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Thu Mar 23 2006 16:30:10 UTC Log message: * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_get_time), (gst_base_audio_src_create), (gst_base_audio_src_change_state): unparent instead of unref the ringbuffer. Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2506&r2=1.2507 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosrc.c.diff?r1=1.19&r2=1.20 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2506 retrieving revision 1.2507 diff -u -d -r1.2506 -r1.2507 --- ChangeLog 23 Mar 2006 16:24:23 -0000 1.2506 +++ ChangeLog 23 Mar 2006 16:29:58 -0000 1.2507 @@ -1,5 +1,12 @@ 2006-03-23 Wim Taymans <wi...@fl...> + * gst-libs/gst/audio/gstbaseaudiosrc.c: + (gst_base_audio_src_get_time), (gst_base_audio_src_create), + (gst_base_audio_src_change_state): + unparent instead of unref the ringbuffer. + +2006-03-23 Wim Taymans <wi...@fl...> * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_class_init), (gst_base_audio_sink_async_play), (gst_base_audio_sink_do_play), (gst_base_audio_sink_change_state): Index: gstbaseaudiosrc.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosrc.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- gstbaseaudiosrc.c 25 Jan 2006 09:27:01 -0000 1.19 +++ gstbaseaudiosrc.c 23 Mar 2006 16:29:58 -0000 1.20 @@ -435,7 +435,7 @@ break; case GST_STATE_CHANGE_READY_TO_NULL: gst_ring_buffer_close_device (src->ringbuffer); - gst_object_unref (src->ringbuffer); + gst_object_unparent (GST_OBJECT_CAST (src->ringbuffer)); src->ringbuffer = NULL; default: |
From: <wt...@ke...> - 2006-03-23 16:58:16
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Thu Mar 23 2006 16:58:15 UTC Log message: * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_get_time), (gst_base_audio_src_create), (gst_base_audio_src_change_state): Fix audio sources, forgot to make the ringbuffer startable... Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2507&r2=1.2508 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosrc.c.diff?r1=1.20&r2=1.21 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2507 retrieving revision 1.2508 diff -u -d -r1.2507 -r1.2508 --- ChangeLog 23 Mar 2006 16:29:58 -0000 1.2507 +++ ChangeLog 23 Mar 2006 16:58:03 -0000 1.2508 @@ -3,6 +3,14 @@ * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_get_time), (gst_base_audio_src_create), (gst_base_audio_src_change_state): + Fix audio sources, forgot to make the ringbuffer + startable... + +2006-03-23 Wim Taymans <wi...@fl...> + * gst-libs/gst/audio/gstbaseaudiosrc.c: + (gst_base_audio_src_get_time), (gst_base_audio_src_create), + (gst_base_audio_src_change_state): unparent instead of unref the ringbuffer. 2006-03-23 Wim Taymans <wi...@fl...> Index: gstbaseaudiosrc.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosrc.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- gstbaseaudiosrc.c 23 Mar 2006 16:29:58 -0000 1.20 +++ gstbaseaudiosrc.c 23 Mar 2006 16:58:03 -0000 1.21 @@ -417,6 +417,7 @@ gst_ring_buffer_set_flushing (src->ringbuffer, FALSE); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + gst_ring_buffer_may_start (src->ringbuffer, TRUE); default: @@ -426,6 +427,7 @@ switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + gst_ring_buffer_may_start (src->ringbuffer, FALSE); gst_ring_buffer_pause (src->ringbuffer); case GST_STATE_CHANGE_PAUSED_TO_READY: |
From: <wt...@ke...> - 2006-04-10 17:06:06
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Mon Apr 10 2006 17:05:58 UTC Log message: * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_event): Starting the ringbuffer when we did not acquire it can cause a deadlock, is pointless and causes nasty things for subclasses. Fixes gst-launch audiotestsrc num-buffers=0 ! alsasink. Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2546&r2=1.2547 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.55&r2=1.56 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2546 retrieving revision 1.2547 diff -u -d -r1.2546 -r1.2547 --- ChangeLog 10 Apr 2006 15:17:24 -0000 1.2546 +++ ChangeLog 10 Apr 2006 17:05:46 -0000 1.2547 @@ -1,5 +1,14 @@ 2006-04-10 Wim Taymans <wi...@fl...> + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_event): + Starting the ringbuffer when we did not acquire it can cause + a deadlock, is pointless and causes nasty things for + subclasses. + Fixes gst-launch audiotestsrc num-buffers=0 ! alsasink. + +2006-04-10 Wim Taymans <wi...@fl...> * ext/ogg/gstoggdemux.c: (gst_ogg_pad_src_query), (gst_ogg_demux_receive_event), (gst_ogg_pad_event), (gst_ogg_demux_chain_peer), (gst_ogg_pad_submit_packet), Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.55 retrieving revision 1.56 diff -u -d -r1.55 -r1.56 --- gstbaseaudiosink.c 23 Mar 2006 16:24:23 -0000 1.55 +++ gstbaseaudiosink.c 10 Apr 2006 17:05:46 -0000 1.56 @@ -402,8 +402,10 @@ gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE); break; case GST_EVENT_EOS: - /* need to start playback when we reach EOS */ - gst_ring_buffer_start (sink->ringbuffer); + /* need to start playback when we reach EOS, but only when + * we have successfully negotiated a format. */ + if (gst_ring_buffer_is_acquired (sink->ringbuffer)) + gst_ring_buffer_start (sink->ringbuffer); /* now wait till we played everything */ gst_base_audio_sink_drain (sink); |
From: <wt...@ke...> - 2006-04-28 14:38:00
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Fri Apr 28 2006 14:37:58 UTC Log message: * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_init), (gst_base_audio_src_get_time), (gst_base_audio_src_create): GstBaseAudioSrc must be live or it does not work. * gst-libs/gst/audio/gstaudiosrc.c: (gst_audio_src_init): Don't set live to TRUE as this is the default in the parentclass. Modified files: . : ChangeLog gst-libs/gst/audio: gstaudiosrc.c gstbaseaudiosrc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2574&r2=1.2575 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstaudiosrc.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosrc.c.diff?r1=1.21&r2=1.22 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2574 retrieving revision 1.2575 diff -u -d -r1.2574 -r1.2575 --- ChangeLog 28 Apr 2006 14:33:45 -0000 1.2574 +++ ChangeLog 28 Apr 2006 14:37:46 -0000 1.2575 @@ -1,5 +1,14 @@ 2006-04-28 Wim Taymans <wi...@fl...> + * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_init), + (gst_base_audio_src_get_time), (gst_base_audio_src_create): + GstBaseAudioSrc must be live or it does not work. + + * gst-libs/gst/audio/gstaudiosrc.c: (gst_audio_src_init): + Don't set live to TRUE as this is the default in the parentclass. +2006-04-28 Wim Taymans <wi...@fl...> * gst/videoscale/gstvideoscale.c: (gst_video_scale_transform_caps), (gst_video_scale_fixate_caps), (gst_video_scale_src_event): Videoscale doesn't pass on pixel-aspect ratio. Handle all Index: gstaudiosrc.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstaudiosrc.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstaudiosrc.c 8 Apr 2006 21:02:50 -0000 1.8 +++ gstaudiosrc.c 28 Apr 2006 14:37:46 -0000 1.9 @@ -465,7 +465,6 @@ static void gst_audio_src_init (GstAudioSrc * audiosrc, GstAudioSrcClass * g_class) { - gst_base_src_set_live (GST_BASE_SRC (audiosrc), TRUE); } static GstRingBuffer * Index: gstbaseaudiosrc.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosrc.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- gstbaseaudiosrc.c 23 Mar 2006 16:58:03 -0000 1.21 +++ gstbaseaudiosrc.c 28 Apr 2006 14:37:46 -0000 1.22 @@ -139,6 +139,7 @@ gst_pad_set_fixatecaps_function (GST_BASE_SRC_PAD (baseaudiosrc), gst_base_audio_src_fixate); + gst_base_src_set_live (GST_BASE_SRC (baseaudiosrc), TRUE); gst_base_src_set_format (GST_BASE_SRC (baseaudiosrc), GST_FORMAT_TIME); |
From: <wt...@ke...> - 2006-04-28 14:48:27
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Fri Apr 28 2006 14:48:23 UTC Log message: * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_set_callback), (gst_ring_buffer_acquire), (gst_ring_buffer_release), (gst_ring_buffer_is_acquired), (gst_ring_buffer_set_flushing), (gst_ring_buffer_start), (gst_ring_buffer_pause), (gst_ring_buffer_stop), (gst_ring_buffer_delay), (gst_ring_buffer_samples_done), (gst_ring_buffer_set_sample), (gst_ring_buffer_clear_all), (gst_ring_buffer_commit), (gst_ring_buffer_read), (gst_ring_buffer_prepare_read), (gst_ring_buffer_advance), (gst_ring_buffer_clear), (gst_ring_buffer_may_start): Check arguments passed to public functions instead of crashing. Modified files: . : ChangeLog gst-libs/gst/audio: gstringbuffer.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2575&r2=1.2576 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.c.diff?r1=1.40&r2=1.41 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2575 retrieving revision 1.2576 diff -u -d -r1.2575 -r1.2576 --- ChangeLog 28 Apr 2006 14:37:46 -0000 1.2575 +++ ChangeLog 28 Apr 2006 14:48:10 -0000 1.2576 @@ -1,5 +1,20 @@ 2006-04-28 Wim Taymans <wi...@fl...> + * gst-libs/gst/audio/gstringbuffer.c: + (gst_ring_buffer_set_callback), (gst_ring_buffer_acquire), + (gst_ring_buffer_release), (gst_ring_buffer_is_acquired), + (gst_ring_buffer_set_flushing), (gst_ring_buffer_start), + (gst_ring_buffer_pause), (gst_ring_buffer_stop), + (gst_ring_buffer_delay), (gst_ring_buffer_samples_done), + (gst_ring_buffer_set_sample), (gst_ring_buffer_clear_all), + (gst_ring_buffer_commit), (gst_ring_buffer_read), + (gst_ring_buffer_prepare_read), (gst_ring_buffer_advance), + (gst_ring_buffer_clear), (gst_ring_buffer_may_start): + Check arguments passed to public functions instead of + crashing. + +2006-04-28 Wim Taymans <wi...@fl...> * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_init), (gst_base_audio_src_get_time), (gst_base_audio_src_create): GstBaseAudioSrc must be live or it does not work. Index: gstringbuffer.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstringbuffer.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -d -r1.40 -r1.41 --- gstringbuffer.c 8 Apr 2006 21:02:50 -0000 1.40 +++ gstringbuffer.c 28 Apr 2006 14:48:11 -0000 1.41 @@ -374,7 +374,7 @@ gst_ring_buffer_set_callback (GstRingBuffer * buf, GstRingBufferCallback cb, gpointer user_data) { - g_return_if_fail (buf != NULL); + g_return_if_fail (GST_IS_RING_BUFFER (buf)); GST_OBJECT_LOCK (buf); buf->callback = cb; @@ -557,7 +557,7 @@ gint i, j; gint segsize, bps; - g_return_val_if_fail (buf != NULL, FALSE); + g_return_val_if_fail (GST_IS_RING_BUFFER (buf), FALSE); GST_DEBUG_OBJECT (buf, "acquiring device"); @@ -644,7 +644,7 @@ gboolean res = FALSE; GstRingBufferClass *rclass; GST_DEBUG_OBJECT (buf, "releasing device"); @@ -709,7 +709,7 @@ gboolean res; res = buf->acquired; @@ -729,6 +729,8 @@ void gst_ring_buffer_set_flushing (GstRingBuffer * buf, gboolean flushing) buf->abidata.ABI.flushing = flushing; @@ -756,7 +758,7 @@ gboolean resume = FALSE; GST_DEBUG_OBJECT (buf, "starting ringbuffer"); @@ -865,7 +867,7 @@ if (G_UNLIKELY (buf->abidata.ABI.flushing)) @@ -899,7 +901,7 @@ GST_DEBUG_OBJECT (buf, "stopping"); @@ -955,7 +957,7 @@ guint res; - g_return_val_if_fail (buf != NULL, 0); + g_return_val_if_fail (GST_IS_RING_BUFFER (buf), 0); res = 0; @@ -989,7 +991,7 @@ guint64 raw, samples; guint delay; /* get the amount of segments we processed */ segdone = g_atomic_int_get (&buf->segdone); @@ -1025,7 +1027,7 @@ gst_ring_buffer_set_sample (GstRingBuffer * buf, guint64 sample) if (sample == -1) sample = 0; @@ -1057,7 +1059,7 @@ gint i; /* not fatal, we just are not negotiated yet */ if (G_UNLIKELY (buf->spec.segtotal <= 0)) @@ -1159,7 +1161,7 @@ guint8 *dest; guint to_write; - g_return_val_if_fail (buf != NULL, -1); + g_return_val_if_fail (GST_IS_RING_BUFFER (buf), -1); g_return_val_if_fail (buf->data != NULL, -1); g_return_val_if_fail (data != NULL, -1); @@ -1265,7 +1267,7 @@ gint segsize, segtotal, bps, sps; @@ -1370,7 +1372,7 @@ guint8 *data; gint segdone; /* buffer must be started */ if (g_atomic_int_get (&buf->state) != GST_RING_BUFFER_STATE_STARTED) @@ -1414,7 +1416,7 @@ gst_ring_buffer_advance (GstRingBuffer * buf, guint advance) /* update counter */ g_atomic_int_add (&buf->segdone, advance); @@ -1445,7 +1447,7 @@ /* no data means it's already cleared */ if (G_UNLIKELY (buf->data == NULL)) @@ -1480,6 +1482,8 @@ gst_ring_buffer_may_start (GstRingBuffer * buf, gboolean allowed) GST_LOG_OBJECT (buf, "may start: %d", allowed); gst_atomic_int_set (&buf->abidata.ABI.may_start, allowed); } |
From: <wt...@ke...> - 2006-04-28 15:08:23
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: wtay Date: Fri Apr 28 2006 15:08:21 UTC Log message: * gst-libs/gst/audio/gstbaseaudiosink.c: (gst_base_audio_sink_drain), (gst_base_audio_sink_event), (gst_base_audio_sink_render), (gst_base_audio_sink_change_state): patch to make timestamp checking more tollerant to rounding errors given that real discontinuities are to be marked on buffers. Fixes some asf files and #338778. Also avoid some crashers when we receive an event in the NULL state. Modified files: . : ChangeLog gst-libs/gst/audio: gstbaseaudiosink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2578&r2=1.2579 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c.diff?r1=1.56&r2=1.57 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2578 retrieving revision 1.2579 diff -u -d -r1.2578 -r1.2579 --- ChangeLog 28 Apr 2006 15:01:58 -0000 1.2578 +++ ChangeLog 28 Apr 2006 15:08:09 -0000 1.2579 @@ -1,3 +1,14 @@ +2006-04-28 Wim Taymans <wi...@fl...> + + * gst-libs/gst/audio/gstbaseaudiosink.c: + (gst_base_audio_sink_drain), (gst_base_audio_sink_event), + (gst_base_audio_sink_render), (gst_base_audio_sink_change_state): + patch to make timestamp checking more tollerant to rounding + errors given that real discontinuities are to be marked on + buffers. Fixes some asf files and #338778. + Also avoid some crashers when we receive an event in the + NULL state. 2006-04-28 Michael Smith <ms...@fl...> * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_class_init), Index: gstbaseaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/audio/gstbaseaudiosink.c,v retrieving revision 1.56 retrieving revision 1.57 diff -u -d -r1.56 -r1.57 --- gstbaseaudiosink.c 10 Apr 2006 17:05:46 -0000 1.56 +++ gstbaseaudiosink.c 28 Apr 2006 15:08:09 -0000 1.57 @@ -34,10 +34,14 @@ LAST_SIGNAL }; -/* we tollerate a 10th of a second diff before we start resyncing. This +/* we tollerate half a second diff before we start resyncing. This * should be enough to compensate for various rounding errors in the timestamp - * and sample offset position. */ -#define DIFF_TOLERANCE 10 + * and sample offset position. + * This is an emergency resync fallback since buffers marked as DISCONT will + * always lock to the correct timestamp immediatly and buffers not marked as + * DISCONT are contiguous bu definition. + */ +#define DIFF_TOLERANCE 2 #define DEFAULT_BUFFER_TIME 200 * GST_USECOND #define DEFAULT_LATENCY_TIME 10 * GST_USECOND @@ -361,6 +365,12 @@ if (!sink->ringbuffer->spec.rate) return TRUE; + /* need to start playback before we can drain, but only when + * we have successfully negotiated a format and thus aqcuired the + * ringbuffer. */ + if (gst_ring_buffer_is_acquired (sink->ringbuffer)) + gst_ring_buffer_start (sink->ringbuffer); if (sink->next_sample != -1) { GstClockTime time; GstClock *clock; @@ -394,18 +404,16 @@ switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_START: - gst_ring_buffer_set_flushing (sink->ringbuffer, TRUE); + if (sink->ringbuffer) + gst_ring_buffer_set_flushing (sink->ringbuffer, TRUE); break; case GST_EVENT_FLUSH_STOP: /* always resync on sample after a flush */ sink->next_sample = -1; - gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE); + gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE); case GST_EVENT_EOS: - /* need to start playback when we reach EOS, but only when - * we have successfully negotiated a format. */ - if (gst_ring_buffer_is_acquired (sink->ringbuffer)) - gst_ring_buffer_start (sink->ringbuffer); /* now wait till we played everything */ gst_base_audio_sink_drain (sink); @@ -583,9 +591,10 @@ if (G_LIKELY (sink->next_sample != -1)) { diff = ABS ((gint64) render_offset - (gint64) sink->next_sample); - /* we tollerate a 10th of a second diff before we start resyncing. This + /* we tollerate half a second diff before we start resyncing. This * should be enough to compensate for various rounding errors in the timestamp - * and sample offset position. We always resync if we got a discont anyway. */ + * and sample offset position. We always resync if we got a discont anyway and + * non-discont should be aligned by definition. */ if (diff < ringbuf->spec.rate / DIFF_TOLERANCE) { GST_DEBUG_OBJECT (sink, "align with prev sample, %" G_GINT64_FORMAT " < %lu", diff, @@ -593,7 +602,9 @@ /* just align with previous sample then */ render_offset = sink->next_sample; } else { - GST_DEBUG_OBJECT (sink, + /* timestamps drifted apart from previous samples too much, we need to + * resync. */ + GST_WARNING_OBJECT (sink, "resync after discont with previous sample of diff: %lu", diff); } } else { @@ -787,6 +798,8 @@ GST_OBJECT_UNLOCK (sink); case GST_STATE_CHANGE_PAUSED_TO_READY: + /* make sure we unblock before calling the parent state change + * so it can grab the STREAM_LOCK */ gst_ring_buffer_set_flushing (sink->ringbuffer, TRUE); default: @@ -813,8 +826,10 @@ return ret; + /* ERRORS */ open_failed: { + /* subclass must post a meaningfull error message */ GST_DEBUG_OBJECT (sink, "open failed"); return GST_STATE_CHANGE_FAILURE; } |