webrtcbin: Add RTX/FEC for each relevant payload type

When sending an answer with multiple codecs, we need to add the RTX and FEC
payload for each codec

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9031>
This commit is contained in:
Olivier Crête 2025-07-02 18:39:20 +02:00 committed by GStreamer Marge Bot
parent 5d9abea64c
commit 1413dc37eb

View File

@ -4403,16 +4403,6 @@ _update_transceiver_kind_from_caps (GstWebRTCRTPTransceiver * trans,
}
}
static void
_get_rtx_target_pt_and_ssrc_from_caps (GstCaps * answer_caps, gint * target_pt,
guint * target_ssrc)
{
const GstStructure *s = gst_caps_get_structure (answer_caps, 0);
gst_structure_get_int (s, "payload", target_pt);
gst_structure_get_uint (s, "ssrc", target_ssrc);
}
/* TODO: use the options argument */
static GstSDPMessage *
_create_answer_task (GstWebRTCBin * webrtc, const GstStructure * options,
@ -4592,9 +4582,6 @@ _create_answer_task (GstWebRTCBin * webrtc, const GstStructure * options,
GstWebRTCRTPTransceiver *rtp_trans = NULL;
WebRTCTransceiver *trans = NULL;
GstWebRTCRTPTransceiverDirection offer_dir, answer_dir;
gint target_pt = -1;
gint original_target_pt = -1;
guint target_ssrc = 0;
gst_sdp_media_set_proto (media, "UDP/TLS/RTP/SAVPF");
offer_caps = _rtp_caps_from_media (offer_media);
@ -4693,6 +4680,10 @@ _create_answer_task (GstWebRTCBin * webrtc, const GstStructure * options,
const GstStructure *s = gst_caps_get_structure (answer_caps, l);
const gchar *enc_name = gst_structure_get_string (s, "encoding-name");
gchar *tmp = g_ascii_strdown (enc_name, -1);
gint target_pt = -1;
gint original_target_pt = -1;
guint target_ssrc = 0;
if (g_strv_contains (disallowed_payloads, tmp)) {
g_free (tmp);
continue;
@ -4705,19 +4696,18 @@ _create_answer_task (GstWebRTCBin * webrtc, const GstStructure * options,
gst_clear_caps (&offer_caps);
goto rejected;
}
}
_get_rtx_target_pt_and_ssrc_from_caps (answer_caps, &target_pt,
&target_ssrc);
gst_structure_get_int (s, "payload", &target_pt);
gst_structure_get_uint (s, "ssrc", &target_ssrc);
original_target_pt = target_pt;
original_target_pt = target_pt;
_media_add_fec (media, trans, offer_caps, &target_pt);
if (trans->do_nack) {
_media_add_rtx (media, trans, offer_caps, target_pt, target_ssrc);
if (target_pt != original_target_pt)
_media_add_rtx (media, trans, offer_caps, original_target_pt,
target_ssrc);
_media_add_fec (media, trans, offer_caps, &target_pt);
if (trans->do_nack) {
_media_add_rtx (media, trans, offer_caps, target_pt, target_ssrc);
if (target_pt != original_target_pt)
_media_add_rtx (media, trans, offer_caps, original_target_pt,
target_ssrc);
}
}
if (answer_dir != GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY)