mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 18:21:04 +00:00
rtspsrc: Fix accumulation of before-send signal return values
Since glib 2.62, the accumulated return values in RUN_CLEANUP override the accumulated return values in RUN_FIRST. Since: 1. We have a default handler that always returns TRUE, and 2. User handlers are only run in RUN_FIRST, and 3. Our accumulator just takes the latest return value We were discarding the return value from the user handler and always sending messages even if the user handler said not to. See https://gitlab.gnome.org/GNOME/glib/-/issues/2352 for more details. This signal does not need RUN_CLEANUP or RUN_FIRST, so just change it to RUN_LAST so that it's emitted exactly once and accumulated once. With this fix, this signal can now be used to intercept PAUSE when going to GST_STATE_NULL so that the server does a TEARDOWN (if necessary) and not a PAUSE, which will confuse other RTSP clients when playing shared media. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/909>
This commit is contained in:
parent
55edd59f48
commit
73fb107a85
1 changed files with 9 additions and 1 deletions
|
@ -85,6 +85,14 @@
|
|||
* ]| Establish a connection to an RTSP server and send the raw RTP packets to a
|
||||
* fakesink.
|
||||
*
|
||||
* NOTE: rtspsrc will send a PAUSE command to the server if you set the
|
||||
* element to the PAUSED state, and will send a PLAY command if you set it to
|
||||
* the PLAYING state.
|
||||
*
|
||||
* Unfortunately, going to the NULL state involves going through PAUSED, so
|
||||
* rtspsrc does not know the difference and will send a PAUSE when you wanted
|
||||
* a TEARDOWN. The workaround is to hook into the `before-send` signal and
|
||||
* return FALSE in this case.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
|
@ -1126,7 +1134,7 @@ gst_rtspsrc_class_init (GstRTSPSrcClass * klass)
|
|||
*/
|
||||
gst_rtspsrc_signals[SIGNAL_BEFORE_SEND] =
|
||||
g_signal_new_class_handler ("before-send", G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_CLEANUP,
|
||||
G_SIGNAL_RUN_LAST,
|
||||
(GCallback) default_before_send, before_send_accum, NULL, NULL,
|
||||
G_TYPE_BOOLEAN, 1, GST_TYPE_RTSP_MESSAGE | G_SIGNAL_TYPE_STATIC_SCOPE);
|
||||
|
||||
|
|
Loading…
Reference in a new issue