mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-11 19:06:33 +00:00
3eb78e5280
A race condition can occur in `srtpdec` during the READY -> NULL transition: an RTCP buffer can make its way to `gst_srtp_dec_chain` while the element is partially stopped, resulting in the following critical warning: > Got data flow before segment event The problematic sequence is the following: 1. An RTCP buffer is being handled by the chain function for the `rtcp_sinkpad`. Since, this is the first buffer, we try pushing the sticky events to `rtcp_srcpad`. 2. At the same moment, the element is being transitioned from PAUSED to READY. 3. While checking and pushing the sticky events for `rtcp_srcpad`, we reach the Segment event. For this, we try to get it from the "otherpad", in this case `rtp_srcpad`. In the problematic case, `rtp_srcpad` has already been deactivated so its sticky events have been cleared. We won't be pushing any Segment event to `rtcp_srcpad`. 4. We return to the chain function for `rtcp_sinkpad` and try pushing the buffer to `rtcp_srcpad` for which deactivation hasn't started yet, hence the "Got data flow before segment event". This commit: - Adds a boolean return value to `gst_srtp_dec_push_early_events`: in case the Segment event can't be retrieved, `gst_srtp_dec_chain` can return an error instead of calling `gst_pad_push`. - Replaces the obsolete `gst_pad_set_caps` with `gst_pad_push_event`. The additional preconditions checked by previous function are guaranteed here since we push a fixed Caps which was built in the same function. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4860> |
||
---|---|---|
.. | ||
gstsrtp.c | ||
gstsrtp.h | ||
gstsrtpdec.c | ||
gstsrtpdec.h | ||
gstsrtpelement.c | ||
gstsrtpelements.h | ||
gstsrtpenc.c | ||
gstsrtpenc.h | ||
gstsrtpenums.h | ||
gstsrtpplugin.c | ||
meson.build |