mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-05-10 04:12:40 +00:00
webrtcsrc: add do-retransmission property
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1509>
This commit is contained in:
parent
6556d31ab8
commit
c5e7e76e4d
|
@ -7960,6 +7960,18 @@
|
||||||
"type": "GstValueArray",
|
"type": "GstValueArray",
|
||||||
"writable": true
|
"writable": true
|
||||||
},
|
},
|
||||||
|
"do-retransmission": {
|
||||||
|
"blurb": "Send retransmission events upstream when a packet is late",
|
||||||
|
"conditionally-available": false,
|
||||||
|
"construct": false,
|
||||||
|
"construct-only": false,
|
||||||
|
"controllable": false,
|
||||||
|
"default": "true",
|
||||||
|
"mutable": "ready",
|
||||||
|
"readable": true,
|
||||||
|
"type": "gboolean",
|
||||||
|
"writable": true
|
||||||
|
},
|
||||||
"enable-data-channel-navigation": {
|
"enable-data-channel-navigation": {
|
||||||
"blurb": "Enable navigation events through a dedicated WebRTCDataChannel",
|
"blurb": "Enable navigation events through a dedicated WebRTCDataChannel",
|
||||||
"conditionally-available": false,
|
"conditionally-available": false,
|
||||||
|
|
|
@ -22,6 +22,7 @@ use url::Url;
|
||||||
|
|
||||||
const DEFAULT_STUN_SERVER: Option<&str> = Some("stun://stun.l.google.com:19302");
|
const DEFAULT_STUN_SERVER: Option<&str> = Some("stun://stun.l.google.com:19302");
|
||||||
const DEFAULT_ENABLE_DATA_CHANNEL_NAVIGATION: bool = false;
|
const DEFAULT_ENABLE_DATA_CHANNEL_NAVIGATION: bool = false;
|
||||||
|
const DEFAULT_DO_RETRANSMISSION: bool = true;
|
||||||
|
|
||||||
static CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
|
static CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
|
||||||
gst::DebugCategory::new(
|
gst::DebugCategory::new(
|
||||||
|
@ -39,6 +40,7 @@ struct Settings {
|
||||||
video_codecs: Vec<Codec>,
|
video_codecs: Vec<Codec>,
|
||||||
audio_codecs: Vec<Codec>,
|
audio_codecs: Vec<Codec>,
|
||||||
enable_data_channel_navigation: bool,
|
enable_data_channel_navigation: bool,
|
||||||
|
do_retransmission: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
@ -113,7 +115,13 @@ impl ObjectImpl for BaseWebRTCSrc {
|
||||||
.default_value(DEFAULT_ENABLE_DATA_CHANNEL_NAVIGATION)
|
.default_value(DEFAULT_ENABLE_DATA_CHANNEL_NAVIGATION)
|
||||||
.mutable_ready()
|
.mutable_ready()
|
||||||
.build(),
|
.build(),
|
||||||
]
|
glib::ParamSpecBoolean::builder("do-retransmission")
|
||||||
|
.nick("Enable retransmission")
|
||||||
|
.blurb("Send retransmission events upstream when a packet is late")
|
||||||
|
.default_value(DEFAULT_DO_RETRANSMISSION)
|
||||||
|
.mutable_ready()
|
||||||
|
.build(),
|
||||||
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
PROPS.as_ref()
|
PROPS.as_ref()
|
||||||
|
@ -171,6 +179,10 @@ impl ObjectImpl for BaseWebRTCSrc {
|
||||||
let mut settings = self.settings.lock().unwrap();
|
let mut settings = self.settings.lock().unwrap();
|
||||||
settings.enable_data_channel_navigation = value.get::<bool>().unwrap();
|
settings.enable_data_channel_navigation = value.get::<bool>().unwrap();
|
||||||
}
|
}
|
||||||
|
"do-retransmission" => {
|
||||||
|
let mut settings = self.settings.lock().unwrap();
|
||||||
|
settings.do_retransmission = value.get::<bool>().unwrap();
|
||||||
|
}
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -203,6 +215,7 @@ impl ObjectImpl for BaseWebRTCSrc {
|
||||||
let settings = self.settings.lock().unwrap();
|
let settings = self.settings.lock().unwrap();
|
||||||
settings.enable_data_channel_navigation.to_value()
|
settings.enable_data_channel_navigation.to_value()
|
||||||
}
|
}
|
||||||
|
"do-retransmission" => self.settings.lock().unwrap().do_retransmission.to_value(),
|
||||||
name => panic!("{} getter not implemented", name),
|
name => panic!("{} getter not implemented", name),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -270,6 +283,7 @@ impl Default for Settings {
|
||||||
.filter(|codec| codec.has_decoder())
|
.filter(|codec| codec.has_decoder())
|
||||||
.collect(),
|
.collect(),
|
||||||
enable_data_channel_navigation: DEFAULT_ENABLE_DATA_CHANNEL_NAVIGATION,
|
enable_data_channel_navigation: DEFAULT_ENABLE_DATA_CHANNEL_NAVIGATION,
|
||||||
|
do_retransmission: DEFAULT_DO_RETRANSMISSION,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -765,14 +779,17 @@ impl BaseWebRTCSrc {
|
||||||
let direction = gst_webrtc::WebRTCRTPTransceiverDirection::Recvonly;
|
let direction = gst_webrtc::WebRTCRTPTransceiverDirection::Recvonly;
|
||||||
let webrtcbin = self.webrtcbin();
|
let webrtcbin = self.webrtcbin();
|
||||||
for (i, media) in sdp.medias().enumerate() {
|
for (i, media) in sdp.medias().enumerate() {
|
||||||
let codec_names = {
|
let (codec_names, do_retransmission) = {
|
||||||
let settings = self.settings.lock().unwrap();
|
let settings = self.settings.lock().unwrap();
|
||||||
settings
|
(
|
||||||
.video_codecs
|
settings
|
||||||
.iter()
|
.video_codecs
|
||||||
.chain(settings.audio_codecs.iter())
|
.iter()
|
||||||
.map(|codec| codec.name.clone())
|
.chain(settings.audio_codecs.iter())
|
||||||
.collect::<HashSet<String>>()
|
.map(|codec| codec.name.clone())
|
||||||
|
.collect::<HashSet<String>>(),
|
||||||
|
settings.do_retransmission,
|
||||||
|
)
|
||||||
};
|
};
|
||||||
let caps = media
|
let caps = media
|
||||||
.formats()
|
.formats()
|
||||||
|
@ -833,7 +850,7 @@ impl BaseWebRTCSrc {
|
||||||
&[&direction, &caps],
|
&[&direction, &caps],
|
||||||
);
|
);
|
||||||
|
|
||||||
transceiver.set_property("do_nack", true);
|
transceiver.set_property("do-nack", do_retransmission);
|
||||||
transceiver.set_property("fec-type", gst_webrtc::WebRTCFECType::UlpRed);
|
transceiver.set_property("fec-type", gst_webrtc::WebRTCFECType::UlpRed);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue