[Bug 795442] New: audiobasesrc: Skew slave method only skew in one direction
GStreamer (GNOME Bugzilla)
bugzilla at gnome.org
Sat Apr 21 19:29:46 UTC 2018
https://bugzilla.gnome.org/show_bug.cgi?id=795442
Bug ID: 795442
Summary: audiobasesrc: Skew slave method only skew in one
direction
Classification: Platform
Product: GStreamer
Version: unspecified
OS: Linux
Status: NEW
Severity: normal
Priority: Normal
Component: gst-plugins-base
Assignee: gstreamer-bugs at lists.freedesktop.org
Reporter: nicolas at ndufresne.ca
QA Contact: gstreamer-bugs at lists.freedesktop.org
GNOME version: ---
GstAudioBaseSrc implements a property called slave-method. The default for this
is "skew". Similarly to audiobasesink, I believe this is supposed to skew uppon
clock drift, regardless of the direction of the drift. Unlike audiobasesink,
there is no drift-tolerance configuration.
There is multiple issues in this code, but the main issues right now is that it
only handle drift in one situation, if downstream clock is faster.
The situation I came across, is that when downstream clock is slower, it will
never skew, unless ring buffer becomes full. But as soon as you have a queue
downstream (I do, because I have a tee), it will never reach that situation.
Instead, the latency will start growing, and when all the queues are full, the
skew code will never manage to recover, because it does not delay the clock, so
when this state is reached, all the audio goes wrong forever.
On the other end, when the downstream clock is faster, it will skew when the
ringbuffer reaches segtotal in term of skew duration (nearest value the driver
/ library have picked around buffer-time property value). This value can be
quite big, in fact, on the TI Sitara I get a buffer-time that is 16 time the
size of the latency time (20ms), so 320ms. So if downstream clock is faster, it
takes several minutes before the skew situation is reached and audio buffer
stops being late downstream. But at least it does skew, and does change the
output of the associate audioclock. Though, the implementation is racy, as we
now have two thread calling ring_buffer_advance at the same time. As a side,
the next buffer is often not the one we just capture, but whatever was left
there last time we used the segment. This skew method need to be reworked,
hence why I think this second detail should be considered.
It's clear in my case that a skew with a tolerance of 320ms and more is not
acceptable (I'm using this in a VoIP application).
--
You are receiving this mail because:
You are the QA Contact for the bug.
You are the assignee for the bug.
More information about the gstreamer-bugs
mailing list