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:
parent
5d9abea64c
commit
1413dc37eb
@ -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 */
|
/* TODO: use the options argument */
|
||||||
static GstSDPMessage *
|
static GstSDPMessage *
|
||||||
_create_answer_task (GstWebRTCBin * webrtc, const GstStructure * options,
|
_create_answer_task (GstWebRTCBin * webrtc, const GstStructure * options,
|
||||||
@ -4592,9 +4582,6 @@ _create_answer_task (GstWebRTCBin * webrtc, const GstStructure * options,
|
|||||||
GstWebRTCRTPTransceiver *rtp_trans = NULL;
|
GstWebRTCRTPTransceiver *rtp_trans = NULL;
|
||||||
WebRTCTransceiver *trans = NULL;
|
WebRTCTransceiver *trans = NULL;
|
||||||
GstWebRTCRTPTransceiverDirection offer_dir, answer_dir;
|
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");
|
gst_sdp_media_set_proto (media, "UDP/TLS/RTP/SAVPF");
|
||||||
offer_caps = _rtp_caps_from_media (offer_media);
|
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 GstStructure *s = gst_caps_get_structure (answer_caps, l);
|
||||||
const gchar *enc_name = gst_structure_get_string (s, "encoding-name");
|
const gchar *enc_name = gst_structure_get_string (s, "encoding-name");
|
||||||
gchar *tmp = g_ascii_strdown (enc_name, -1);
|
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)) {
|
if (g_strv_contains (disallowed_payloads, tmp)) {
|
||||||
g_free (tmp);
|
g_free (tmp);
|
||||||
continue;
|
continue;
|
||||||
@ -4705,19 +4696,18 @@ _create_answer_task (GstWebRTCBin * webrtc, const GstStructure * options,
|
|||||||
gst_clear_caps (&offer_caps);
|
gst_clear_caps (&offer_caps);
|
||||||
goto rejected;
|
goto rejected;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
_get_rtx_target_pt_and_ssrc_from_caps (answer_caps, &target_pt,
|
gst_structure_get_int (s, "payload", &target_pt);
|
||||||
&target_ssrc);
|
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_fec (media, trans, offer_caps, &target_pt);
|
_media_add_rtx (media, trans, offer_caps, target_pt, target_ssrc);
|
||||||
if (trans->do_nack) {
|
if (target_pt != original_target_pt)
|
||||||
_media_add_rtx (media, trans, offer_caps, target_pt, target_ssrc);
|
_media_add_rtx (media, trans, offer_caps, original_target_pt,
|
||||||
if (target_pt != original_target_pt)
|
target_ssrc);
|
||||||
_media_add_rtx (media, trans, offer_caps, original_target_pt,
|
}
|
||||||
target_ssrc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (answer_dir != GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY)
|
if (answer_dir != GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user