#define DEFAULT_GENERATE_DOT true
#define DEFAULT_DOT_PATH "/tmp"
#define DEFAULT_JITTERBUFFER_LATENCY 200 /* ms */
+#define DEFAULT_USE_ULPFEC_RED true
+#define DEFAULT_FEC_PERCENTAGE 100 /* FEC overhead percentage for the whole stream */
/* categories */
#define INI_CATEGORY_GENERAL "general"
#define INI_ITEM_GST_EXCLUDED_ELEMENTS "gstreamer excluded elements"
#define INI_ITEM_STUN_SERVER "stun server"
#define INI_ITEM_RTP_JITTERBUFFER_LATENCY "rtp jitterbuffer latency"
+#define INI_ITEM_USE_ULPFEC_RED "use ulpfec red"
+#define INI_ITEM_FEC_PERCENTAGE "fec percentage"
/* items for media source */
#define INI_ITEM_SOURCE_ELEMENT "source element"
__ini_read_list(ini->dict, INI_CATEGORY_GENERAL, INI_ITEM_GST_EXCLUDED_ELEMENTS, &ini->general.gst_excluded_elements);
ini->general.stun_server = __ini_get_string(ini->dict, INI_CATEGORY_GENERAL, INI_ITEM_STUN_SERVER, NULL);
ini->general.jitterbuffer_latency = __ini_get_int(ini->dict, INI_CATEGORY_GENERAL, INI_ITEM_RTP_JITTERBUFFER_LATENCY, DEFAULT_JITTERBUFFER_LATENCY);
+ ini->general.use_ulpfec_red = __ini_get_boolean(webrtc->ini.dict, INI_CATEGORY_GENERAL, INI_ITEM_USE_ULPFEC_RED, DEFAULT_USE_ULPFEC_RED);
+ ini->general.fec_percentage = __ini_get_int(webrtc->ini.dict, INI_CATEGORY_GENERAL, INI_ITEM_FEC_PERCENTAGE, DEFAULT_FEC_PERCENTAGE);
/* default setting for a media source */
__apply_media_source_setting(ini, &ini->media_source, INI_CATEGORY_MEDIA_SOURCE);
return WEBRTC_ERROR_NONE;
}
+static void __webrtcbin_transceiver_set_ulpfec_red(webrtc_s *webrtc, GstWebRTCRTPTransceiver *transceiver)
+{
+ GstElement *rtpbin;
+
+ RET_IF(webrtc == NULL, "webrtc is NULL");
+ RET_IF(transceiver == NULL, "transceiver is NULL");
+
+ if (!webrtc->ini.general.use_ulpfec_red) {
+ LOG_DEBUG("skip setting ULPFEC/RED");
+ return;
+ }
+
+ g_object_set(transceiver, "fec-type", GST_WEBRTC_FEC_TYPE_ULP_RED,
+ "fec-percentage", webrtc->ini.general.fec_percentage, NULL);
+ LOG_DEBUG("set ULPFEC/RED, fec-percentage: %d", webrtc->ini.general.fec_percentage);
+
+ if (!(rtpbin = gst_bin_get_by_name(GST_BIN(webrtc->gst.webrtcbin), "rtpbin"))) {
+ LOG_ERROR("failed to get rtpbin");
+ return;
+ }
+ LOG_INFO("Set do-lost, ULPFEC recovers a lost packet when do-lost event occurs");
+ g_object_set(G_OBJECT(rtpbin), "do-lost", true, NULL);
+ gst_object_unref(rtpbin);
+}
+
static void __webrtcbin_pad_added_cb(GstElement *webrtcbin, GstPad *new_pad, gpointer user_data)
{
int ret = WEBRTC_ERROR_NONE;
source->mlines[i] = transceiver->mline;
LOG_DEBUG("source[%s, id:%u, mline:%d for %s]",
(gchar*)key, source->id, source->mlines[i], i == MLINES_IDX_AUDIO ? "AUDIO" : "VIDEO");
+ if (i == MLINES_IDX_VIDEO)
+ __webrtcbin_transceiver_set_ulpfec_red(webrtc, transceiver);
}
}
}
g_object_get(webrtc->gst.webrtcbin, "signaling-state", &signaling_state, NULL);
return (signaling_state == GST_WEBRTC_SIGNALING_STATE_HAVE_REMOTE_OFFER);
-}
\ No newline at end of file
+}