mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-07 19:22:15 +00:00
srtp: Implement SRTCP demultiplexing
Separate multiplexed RTP and RTCP if they arrive on the rtp_sink pad.
This commit is contained in:
parent
898966a44c
commit
8c76d7c77e
1 changed files with 22 additions and 12 deletions
|
@ -511,26 +511,34 @@ init_session_stream (GstSrtpDec * filter, guint32 ssrc,
|
||||||
*/
|
*/
|
||||||
static GstSrtpDecSsrcStream *
|
static GstSrtpDecSsrcStream *
|
||||||
validate_buffer (GstSrtpDec * filter, GstBuffer * buf, guint32 * ssrc,
|
validate_buffer (GstSrtpDec * filter, GstBuffer * buf, guint32 * ssrc,
|
||||||
gboolean is_rtcp)
|
gboolean * is_rtcp)
|
||||||
{
|
{
|
||||||
GstSrtpDecSsrcStream *stream = NULL;
|
GstSrtpDecSsrcStream *stream = NULL;
|
||||||
|
|
||||||
if (!is_rtcp) {
|
if (!(*is_rtcp)) {
|
||||||
GstRTPBuffer rtpbuf = GST_RTP_BUFFER_INIT;
|
GstRTPBuffer rtpbuf = GST_RTP_BUFFER_INIT;
|
||||||
|
|
||||||
if (!gst_rtp_buffer_map (buf, GST_MAP_READ, &rtpbuf)) {
|
if (gst_rtp_buffer_map (buf, GST_MAP_READ, &rtpbuf)) {
|
||||||
GST_WARNING_OBJECT (filter, "Invalid SRTP packet");
|
if (gst_rtp_buffer_get_payload_type (&rtpbuf) < 64
|
||||||
return NULL;
|
|| gst_rtp_buffer_get_payload_type (&rtpbuf) > 80) {
|
||||||
|
*ssrc = gst_rtp_buffer_get_ssrc (&rtpbuf);
|
||||||
|
|
||||||
|
gst_rtp_buffer_unmap (&rtpbuf);
|
||||||
|
goto have_ssrc;
|
||||||
|
}
|
||||||
|
gst_rtp_buffer_unmap (&rtpbuf);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
*ssrc = gst_rtp_buffer_get_ssrc (&rtpbuf);
|
if (rtcp_buffer_get_ssrc (buf, ssrc)) {
|
||||||
|
*is_rtcp = TRUE;
|
||||||
gst_rtp_buffer_unmap (&rtpbuf);
|
} else {
|
||||||
} else if (!rtcp_buffer_get_ssrc (buf, ssrc)) {
|
|
||||||
GST_WARNING_OBJECT (filter, "No SSRC found in buffer");
|
GST_WARNING_OBJECT (filter, "No SSRC found in buffer");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
have_ssrc:
|
||||||
|
|
||||||
stream = find_stream_by_ssrc (filter, *ssrc);
|
stream = find_stream_by_ssrc (filter, *ssrc);
|
||||||
|
|
||||||
if (stream)
|
if (stream)
|
||||||
|
@ -851,7 +859,7 @@ gst_srtp_dec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf,
|
||||||
|
|
||||||
/* Check if this stream exists, if not create a new stream */
|
/* Check if this stream exists, if not create a new stream */
|
||||||
|
|
||||||
if (!(stream = validate_buffer (filter, buf, &ssrc, is_rtcp))) {
|
if (!(stream = validate_buffer (filter, buf, &ssrc, &is_rtcp))) {
|
||||||
GST_OBJECT_UNLOCK (filter);
|
GST_OBJECT_UNLOCK (filter);
|
||||||
GST_WARNING_OBJECT (filter, "Invalid buffer, dropping");
|
GST_WARNING_OBJECT (filter, "Invalid buffer, dropping");
|
||||||
goto drop_buffer;
|
goto drop_buffer;
|
||||||
|
@ -931,10 +939,12 @@ unprotect:
|
||||||
|
|
||||||
push_out:
|
push_out:
|
||||||
/* Push buffer to source pad */
|
/* Push buffer to source pad */
|
||||||
otherpad = (GstPad *) gst_pad_get_element_private (pad);
|
if (is_rtcp)
|
||||||
|
otherpad = filter->rtcp_srcpad;
|
||||||
|
else
|
||||||
|
otherpad = filter->rtp_srcpad;
|
||||||
ret = gst_pad_push (otherpad, buf);
|
ret = gst_pad_push (otherpad, buf);
|
||||||
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
drop_buffer:
|
drop_buffer:
|
||||||
|
|
Loading…
Reference in a new issue