pitch element breaks lip sync in Chrome

Nicolas Dufresne nicolas at ndufresne.ca
Thu Sep 6 18:20:11 UTC 2018

Sorry for top posting, but this seems like a good bug report to me. Can
you paste this on a bug in bugs.gnome.org please ?

Le jeudi 06 septembre 2018 à 19:11 +0200, Juan Navarro a écrit :
> Hi,
> It seems that the 'pitch' filter (in the soundtouch plugin, 
> gst-plugins-bad) introduces some kind of wrong timestamp, clock skew, 
> bad sequence, a combination of those, or maybe something different (but 
> probably related).
> I'm seeing an accumulative delay in Chrome between video and audio in a 
> WebRTC call (_not_ using the new GStreamer's WebRTC element, yet) where 
> the source is sending a video+audio stream, and the audio is filtered 
> with the pitch element. Chrome is unable to perform the lip sync 
> successfully, and for some reason deduces that somehow the audio is 
> lagging behind the video (which is actually not), so it delays the video 
> indefinitely until the delay gets to Chrome's maximum, 10 seconds.
> The net effect of this issue is practically the same as what happened in 
> this Chrome bug: 
> https://bugs.chromium.org/p/webrtc/issues/detail?id=5456 (just check the 
> screenshots)
> with 'googCurrentDelayMs' and 'goodMinPlayoutDelayMs' growing linearly. 
> At that time it happened to be Chrome wrongly using the webcam's 
> timestamp, which had a different clock rate than the system's timestamp.
> But, in this case I don't think it's a Chrome bug; I have verified that 
> this is caused by the GStreamer's 'pitch' filter, by sourcing this 
> simple test pipeline to my custom WebRTC source element:
> ... -> (raw audio)
>    -> audioconvert -> audioresample -> pitch ->
>    -> audioconvert -> audioresample -> WebRTC
> (Probably most, if not all of those audioconvert/audioresample elements 
> are not needed, I added them just to fall on the safe side)
> This generates the mentioned delay in the video presentation handled by 
> Chrome.
> However nothing of this happens if the 'pitch' element is removed and 
> any other is used, e.g. an 'scaletempo' element:
> ... -> (raw audio)
>    -> audioconvert -> audioresample -> scaletempo ->
>    -> audioconvert -> audioresample -> WebRTC
> This produces a normal lip sync result in Chrome. Delay (latency) stays 
> at around 100, 150 ms.
> I've been reading google's WebRTC code, wanting to know exactly what is 
> the name of the value that is to blame:
> https://cs.chromium.org/chromium/src/third_party/webrtc/video/stream_synchronization.cc
> but finding out what is the correct function chain is difficult, and I'm 
> still not sure of exactly *what* is making Chrome confused and wrongly 
> assuming that the audio is behind the video, when it's not.
> I have cherry-picked and applied all commits that touched the file 
> './ext/soundtouch/gstpitch.cc' into a custom built version of 
> gst-plugins-bad, but the issue persists so it's not a matter of trying 
> the latest code (after a lot of time without changes, the pitch filter 
> received some patches in June so I wanted to test if those helped...)
> Only idea I have is that the pitch element is missing some sequence 
> number handling, or something about the pipeline's clock rate... but I'm 
> out of ideas.
> Please help :)
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 195 bytes
Desc: This is a digitally signed message part
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20180906/29623529/attachment.sig>

More information about the gstreamer-devel mailing list