summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeungha Yang <seungha@centricular.com>2021-05-27 16:20:09 +0900
committerTim-Philipp Müller <tim@centricular.com>2021-06-01 10:37:30 +0100
commitf008cb00f73ebca04c531b2dc2607b9f601ec885 (patch)
tree6624e26870e4351d2f7741e88135aa5b3f27dff2
parent50aff43979944934252075facc8251db9bbef20d (diff)
downloadgstreamer-plugins-base-f008cb00f73ebca04c531b2dc2607b9f601ec885.tar.gz
audiobasesrc: Fix divide by zero assertion
GstAudioRingBufferSpec can be cleared from other thread, then rate value will be zero Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1183>
-rw-r--r--gst-libs/gst/audio/gstaudiobasesrc.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/gst-libs/gst/audio/gstaudiobasesrc.c b/gst-libs/gst/audio/gstaudiobasesrc.c
index 9bfee07df..3480ee7b8 100644
--- a/gst-libs/gst/audio/gstaudiobasesrc.c
+++ b/gst-libs/gst/audio/gstaudiobasesrc.c
@@ -305,21 +305,26 @@ gst_audio_base_src_get_time (GstClock * clock, GstAudioBaseSrc * src)
guint64 raw, samples;
guint delay;
GstClockTime result;
+ GstAudioRingBuffer *ringbuffer;
+ gint rate;
+
+ ringbuffer = src->ringbuffer;
+ if (!ringbuffer)
+ return GST_CLOCK_TIME_NONE;
- if (G_UNLIKELY (src->ringbuffer == NULL
- || src->ringbuffer->spec.info.rate == 0))
+ rate = ringbuffer->spec.info.rate;
+ if (rate == 0)
return GST_CLOCK_TIME_NONE;
- raw = samples = gst_audio_ring_buffer_samples_done (src->ringbuffer);
+ raw = samples = gst_audio_ring_buffer_samples_done (ringbuffer);
/* the number of samples not yet processed, this is still queued in the
* device (not yet read for capture). */
- delay = gst_audio_ring_buffer_delay (src->ringbuffer);
+ delay = gst_audio_ring_buffer_delay (ringbuffer);
samples += delay;
- result = gst_util_uint64_scale_int (samples, GST_SECOND,
- src->ringbuffer->spec.info.rate);
+ result = gst_util_uint64_scale_int (samples, GST_SECOND, rate);
GST_DEBUG_OBJECT (src,
"processed samples: raw %" G_GUINT64_FORMAT ", delay %u, real %"