From 5ad59ce725670d225871301696976844a5ec3487 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Thu, 27 May 2021 16:20:09 +0900 Subject: [PATCH] audiobasesrc: Fix divide by zero assertion GstAudioRingBufferSpec can be cleared from other thread, then rate value will be zero Part-of: --- gst-libs/gst/audio/gstaudiobasesrc.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/gst-libs/gst/audio/gstaudiobasesrc.c b/gst-libs/gst/audio/gstaudiobasesrc.c index 3df095ec96..a384e8eb34 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; - if (G_UNLIKELY (src->ringbuffer == NULL - || src->ringbuffer->spec.info.rate == 0)) + ringbuffer = src->ringbuffer; + if (!ringbuffer) return GST_CLOCK_TIME_NONE; - raw = samples = gst_audio_ring_buffer_samples_done (src->ringbuffer); + rate = ringbuffer->spec.info.rate; + if (rate == 0) + return GST_CLOCK_TIME_NONE; + + 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 %"