Skip to content

gst-libav: Fix synchronization issues and errors created by the forwarding of segment events by demuxer.

In order to play nicely with ffmpeg, demuxers in gst-libav have to make buffers available to ffmpeg while taking the blocking I/O model in ffmpeg into account, which results in buffers not being sent downstream until ffmpeg has processed them in its separate thread.

In constrast, many gstreamer events are simply forwarded downstream. Currently GST_EVENT_SEGMENT events are forwarded downstream without any processing, which can potentially result in:

  • GST_EVENT_SEGMENT events being out of sync with buffers
  • GST_EVENT_SEGMENT events going out that are incorrect because they apply to data seen by the demuxer, but not necessarily seen by downstream elements

I came across this bug when I was attempting to enable G723.1 demuxing/decoding using the G723.1 demuxer and decoder provided by ffmpeg. I wrote tests to verify support for the functionality, and found that, in push mode, GST_EVENT_SEGMENT events pushed to the demuxer by the upstream filesrc element would be forwarded to the decoder without modification, resulting in an internal data streaming error. With this patch, tests work in both push and pull mode.

This patch solves the problem by disabling the forwarding of GST_EVENT_SEGMENT events downstream (an initial GST_EVENT_SEGMENT event is still pushed downstream by the demuxer). It's possible there's a better way to do this, but, having looked at how a few different gstreamer demuxers deal with GST_EVENT_SEGMENT events, it seems like the processing is somewhat specific to the demuxer implementation, whereas gst-libav has one general way of handling the situation for any ffmpeg demuxer. Perhaps there's a better way to solve this using the ffmpeg API to take advantage of specific demuxer details. IDK.

Merge request reports