return WEBRTC_ERROR_NONE;
}
-static void __webrtcbin_transceiver_set_ulpfec_red(webrtc_s *webrtc, int source_type, GstWebRTCRTPTransceiver *transceiver)
+static void __webrtcbin_transceiver_set_ulpfec_red(webrtc_s *webrtc, unsigned int fec_percentage, GstWebRTCRTPTransceiver *transceiver)
{
- ini_item_media_source_s *ini_source;
GstElement *rtpbin;
RET_IF(webrtc == NULL, "webrtc is NULL");
RET_IF(transceiver == NULL, "transceiver is NULL");
- ini_source = _ini_get_source_by_type(&webrtc->ini, source_type);
- if (ini_source == NULL)
- ini_source = &(webrtc->ini.media_source);
-
- if (!ini_source->use_ulpfec_red)
+ if (!(rtpbin = gst_bin_get_by_name(GST_BIN(webrtc->gst.webrtcbin), "rtpbin"))) {
+ LOG_ERROR("failed to get rtpbin");
return;
+ }
g_object_set(transceiver,
"fec-type", GST_WEBRTC_FEC_TYPE_ULP_RED,
- "fec-percentage", ini_source->fec_percentage,
+ "fec-percentage", fec_percentage,
NULL);
- LOG_INFO("set ULPFEC/RED[percentage: %d] to transceiver[%p]", ini_source->fec_percentage, transceiver);
-
- if (!(rtpbin = gst_bin_get_by_name(GST_BIN(webrtc->gst.webrtcbin), "rtpbin"))) {
- LOG_ERROR("failed to get rtpbin");
- return;
- }
+ LOG_INFO("set ULPFEC/RED[percentage:%u] to transceiver[%p]", fec_percentage, transceiver);
g_object_set(G_OBJECT(rtpbin), "do-lost", TRUE, NULL);
GHashTableIter iter;
gpointer key, value;
webrtc_gst_slot_s *source;
+ ini_item_media_source_s *ini_source;
int i;
RET_IF(webrtcbin == NULL, "webrtcbin is NULL");
LOG_INFO("new transceiver[%p, mline:%u, mid:%s, direction:%d], user_data[%p]",
transceiver, transceiver->mline, transceiver->mid, transceiver->direction, user_data);
+ if (g_hash_table_size(webrtc->gst.source_slots) == 0) {
+ /* In this case, it might be an answerer without setting any media source.
+ * Check the default FEC value of media source, apply it if needed. */
+ if (!(ini_source = &(webrtc->ini.media_source)))
+ return;
+ if (!ini_source->use_ulpfec_red)
+ return;
+
+ __webrtcbin_transceiver_set_ulpfec_red(webrtc, ini_source->fec_percentage, transceiver);
+ return;
+ }
+
g_hash_table_iter_init(&iter, webrtc->gst.source_slots);
while (g_hash_table_iter_next(&iter, &key, &value)) {
source = (webrtc_gst_slot_s*)value;
LOG_DEBUG("source[%s, id:%u, mline:%d for %s]",
(gchar*)key, source->id, source->av[i].mline, i == AV_IDX_AUDIO ? "AUDIO" : "VIDEO");
- __webrtcbin_transceiver_set_ulpfec_red(webrtc, source->type, transceiver);
+ ini_source = _ini_get_source_by_type(&webrtc->ini, source->type);
+ if (ini_source == NULL)
+ ini_source = &(webrtc->ini.media_source);
+ if (!ini_source->use_ulpfec_red)
+ return;
+
+ __webrtcbin_transceiver_set_ulpfec_red(webrtc, ini_source->fec_percentage, transceiver);
+ return;
}
}
}