I am trying to catch the “PAUSE” method from an rtspsrc element using the ‘before-send’ event to prevent the message making it through to my rtsp-server. There are 7 separate piplines streaming from the server.
The event appears to be captured but dereferencing the RTSPMessage returns what looks like empty or uninitialised data.
Am I doing this correctly or is there a way to retrieve this information without doing unsafe Rust?
// Connect to the before-send signal from rtspsrc
/*
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.
REF: https://gstreamer.freedesktop.org/documentation/rtsp/rtspsrc.html?gi-language=c
*/
source.connect("before-send", false, move |values| {
error!("Signal received: {:?}", values);
let source = values[0]
.get::<gst::Element>()
.expect("Failed to get source");
let message_ptr = values[1]
.get::<RTSPMessage>()
.expect("Failed to get Message")
.as_ptr();
unsafe {
let message = *message_ptr;
debug!("RTSP Message: {:?}", message);
}
Some(true.into())
});
Console output:
2025-08-07T05:05:28.579879Z DEBUG Signal received: [(GstRTSPSrc) (GstRTSPSrc) source, (GstRTSPMessage) ((GstRTSPMessage*) 000000AEC16FF8B0)]
2025-08-07T05:05:28.579886Z DEBUG Signal received: [(GstRTSPSrc) (GstRTSPSrc) source, (GstRTSPMessage) ((GstRTSPMessage*) 000000AEC17FF590)]
2025-08-07T05:05:28.579887Z DEBUG Signal received: [(GstRTSPSrc) (GstRTSPSrc) source, (GstRTSPMessage) ((GstRTSPMessage*) 000000AEC0AFF610)]
2025-08-07T05:05:28.579886Z DEBUG Signal received: [(GstRTSPSrc) (GstRTSPSrc) source, (GstRTSPMessage) ((GstRTSPMessage*) 000000AEC0BFF8E0)]
2025-08-07T05:05:28.580861Z DEBUG RTSP Message: GstRTSPMessage @ 0xaec0bfec00 { type_: 0, type_data: GstRTSPMessage_type_data @ 0xaec0bfec08 { request: GstRTSPMessage_type_data_request @ 0xaec0bfec08 { method: 0, uri: 0x0, version: 0 }, response: GstRTSPMessage_type_data_response @ 0xaec0bfec08 { code: 0, reason: 0x0, version: 0 }, data: GstRTSPMessage_type_data_data @ 0xaec0bfec08 { channel: 0 } } }
2025-08-07T05:05:28.580286Z DEBUG RTSP Message: GstRTSPMessage @ 0xaec16febd0 { type_: 0, type_data: GstRTSPMessage_type_data @ 0xaec16febd8 { request: GstRTSPMessage_type_data_request @ 0xaec16febd8 { method: 0, uri: 0x0, version: 0 }, response: GstRTSPMessage_type_data_response @ 0xaec16febd8 { code: 0, reason: 0x0, version: 0 }, data: GstRTSPMessage_type_data_data @ 0xaec16febd8 { channel: 0 } } }
2025-08-07T05:05:28.580543Z DEBUG RTSP Message: GstRTSPMessage @ 0xaec17fe8b0 { type_: 0, type_data: GstRTSPMessage_type_data @ 0xaec17fe8b8 { request: GstRTSPMessage_type_data_request @ 0xaec17fe8b8 { method: 0, uri: 0x0, version: 0 }, response: GstRTSPMessage_type_data_response @ 0xaec17fe8b8 { code: 0, reason: 0x0, version: 0 }, data: GstRTSPMessage_type_data_data @ 0xaec17fe8b8 { channel: 0 } } }
2025-08-07T05:05:28.580687Z DEBUG RTSP Message: GstRTSPMessage @ 0xaec0afe930 { type_: 0, type_data: GstRTSPMessage_type_data @ 0xaec0afe938 { request: GstRTSPMessage_type_data_request @ 0xaec0afe938 { method: 0, uri: 0x0, version: 0 }, response: GstRTSPMessage_type_data_response @ 0xaec0afe938 { code: 0, reason: 0x0, version: 0 }, data: GstRTSPMessage_type_data_data @ 0xaec0afe938 { channel: 0 } } }
2025-08-07T05:05:28.579924Z DEBUG Signal received: [(GstRTSPSrc) (GstRTSPSrc) source, (GstRTSPMessage) ((GstRTSPMessage*) 000000AEC15FF230)]
2025-08-07T05:05:28.583062Z DEBUG RTSP Message: GstRTSPMessage @ 0xaec15fe550 { type_: 0, type_data: GstRTSPMessage_type_data @ 0xaec15fe558 { request: GstRTSPMessage_type_data_request @ 0xaec15fe558 { method: 0, uri: 0x0, version: 0 }, response: GstRTSPMessage_type_data_response @ 0xaec15fe558 { code: 0, reason: 0x0, version: 0 }, data: GstRTSPMessage_type_data_data @ 0xaec15fe558 { channel: 0 } } }