mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-09-27 14:30:27 +00:00
webrtcsink: Fix the way we handle max-bitrate
Computation of actual max bitrate was broken and in the end it is simpler to keep the value set by the user and take into account the fec only when required.
This commit is contained in:
parent
e0ad7e4c16
commit
2dc42ba0db
1 changed files with 19 additions and 21 deletions
|
@ -257,7 +257,7 @@ impl Default for Settings {
|
||||||
cc_info: CCInfo {
|
cc_info: CCInfo {
|
||||||
heuristic: WebRTCSinkCongestionControl::GoogleCongestionControl,
|
heuristic: WebRTCSinkCongestionControl::GoogleCongestionControl,
|
||||||
min_bitrate: DEFAULT_MIN_BITRATE,
|
min_bitrate: DEFAULT_MIN_BITRATE,
|
||||||
max_bitrate: (DEFAULT_MAX_BITRATE as f64 * 1.5) as u32,
|
max_bitrate: DEFAULT_MAX_BITRATE as u32,
|
||||||
start_bitrate: DEFAULT_START_BITRATE,
|
start_bitrate: DEFAULT_START_BITRATE,
|
||||||
},
|
},
|
||||||
do_fec: DEFAULT_DO_FEC,
|
do_fec: DEFAULT_DO_FEC,
|
||||||
|
@ -937,7 +937,7 @@ impl Consumer {
|
||||||
WebRTCSinkCongestionControl::Disabled => {
|
WebRTCSinkCongestionControl::Disabled => {
|
||||||
// If congestion control is disabled, we simply use the highest
|
// If congestion control is disabled, we simply use the highest
|
||||||
// known "safe" value for the bitrate.
|
// known "safe" value for the bitrate.
|
||||||
enc.set_bitrate(element, (self.cc_info.max_bitrate as f64 / 1.5) as i32);
|
enc.set_bitrate(element, self.cc_info.max_bitrate as i32);
|
||||||
enc.transceiver.set_property("fec-percentage", 50u32);
|
enc.transceiver.set_property("fec-percentage", 50u32);
|
||||||
}
|
}
|
||||||
WebRTCSinkCongestionControl::Homegrown => {
|
WebRTCSinkCongestionControl::Homegrown => {
|
||||||
|
@ -1348,13 +1348,13 @@ impl WebRTCSink {
|
||||||
|
|
||||||
match settings.cc_info.heuristic {
|
match settings.cc_info.heuristic {
|
||||||
WebRTCSinkCongestionControl::GoogleCongestionControl => {
|
WebRTCSinkCongestionControl::GoogleCongestionControl => {
|
||||||
let cc_info = settings.cc_info;
|
|
||||||
webrtcbin.connect_closure(
|
webrtcbin.connect_closure(
|
||||||
"request-aux-sender",
|
"request-aux-sender",
|
||||||
false,
|
false,
|
||||||
glib::closure!(@watch element, @strong peer_id
|
glib::closure!(@watch element, @strong peer_id
|
||||||
=> move |_webrtcbin: gst::Element, _transport: gst::Object| {
|
=> move |_webrtcbin: gst::Element, _transport: gst::Object| {
|
||||||
|
|
||||||
|
let settings = element.imp().settings.lock().unwrap();
|
||||||
let cc = match gst::ElementFactory::make("rtpgccbwe", None) {
|
let cc = match gst::ElementFactory::make("rtpgccbwe", None) {
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
glib::g_warning!("webrtcsink",
|
glib::g_warning!("webrtcsink",
|
||||||
|
@ -1364,10 +1364,11 @@ impl WebRTCSink {
|
||||||
return None;
|
return None;
|
||||||
},
|
},
|
||||||
Ok(e) => {
|
Ok(e) => {
|
||||||
|
let max_bitrate = (settings.cc_info.max_bitrate as f64 * if settings.do_fec { 1.5 } else { 1.}) as u32;
|
||||||
e.set_properties(&[
|
e.set_properties(&[
|
||||||
("min-bitrate", &cc_info.min_bitrate),
|
("min-bitrate", &settings.cc_info.min_bitrate),
|
||||||
("estimated-bitrate", &cc_info.start_bitrate),
|
("estimated-bitrate", &settings.cc_info.start_bitrate),
|
||||||
("max-bitrate", &cc_info.max_bitrate),
|
("max-bitrate", &max_bitrate),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// TODO: Bind properties with @element's
|
// TODO: Bind properties with @element's
|
||||||
|
@ -1527,11 +1528,16 @@ impl WebRTCSink {
|
||||||
webrtcbin.clone(),
|
webrtcbin.clone(),
|
||||||
peer_id.clone(),
|
peer_id.clone(),
|
||||||
match settings.cc_info.heuristic {
|
match settings.cc_info.heuristic {
|
||||||
WebRTCSinkCongestionControl::Homegrown => Some(CongestionController::new(
|
WebRTCSinkCongestionControl::Homegrown => {
|
||||||
&peer_id,
|
let max_bitrate = (settings.cc_info.max_bitrate as f64
|
||||||
settings.cc_info.min_bitrate,
|
* if settings.do_fec { 1.5 } else { 1. })
|
||||||
settings.cc_info.max_bitrate,
|
as u32;
|
||||||
)),
|
Some(CongestionController::new(
|
||||||
|
&peer_id,
|
||||||
|
settings.cc_info.min_bitrate,
|
||||||
|
max_bitrate,
|
||||||
|
))
|
||||||
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
},
|
},
|
||||||
settings.cc_info,
|
settings.cc_info,
|
||||||
|
@ -2377,13 +2383,7 @@ impl ObjectImpl for WebRTCSink {
|
||||||
}
|
}
|
||||||
"max-bitrate" => {
|
"max-bitrate" => {
|
||||||
let mut settings = self.settings.lock().unwrap();
|
let mut settings = self.settings.lock().unwrap();
|
||||||
settings.cc_info.max_bitrate = (value.get::<u32>().expect("type checked upstream")
|
settings.cc_info.max_bitrate = value.get::<u32>().expect("type checked upstream");
|
||||||
as f32
|
|
||||||
* if settings.do_fec {
|
|
||||||
settings.cc_info.max_bitrate as f32 * 1.5
|
|
||||||
} else {
|
|
||||||
1.
|
|
||||||
}) as u32;
|
|
||||||
}
|
}
|
||||||
"start-bitrate" => {
|
"start-bitrate" => {
|
||||||
let mut settings = self.settings.lock().unwrap();
|
let mut settings = self.settings.lock().unwrap();
|
||||||
|
@ -2440,9 +2440,7 @@ impl ObjectImpl for WebRTCSink {
|
||||||
}
|
}
|
||||||
"max-bitrate" => {
|
"max-bitrate" => {
|
||||||
let settings = self.settings.lock().unwrap();
|
let settings = self.settings.lock().unwrap();
|
||||||
((settings.cc_info.max_bitrate as f32 / if settings.do_fec { 1.5 } else { 1. })
|
settings.cc_info.max_bitrate.to_value()
|
||||||
as u32)
|
|
||||||
.to_value()
|
|
||||||
}
|
}
|
||||||
"start-bitrate" => {
|
"start-bitrate" => {
|
||||||
let settings = self.settings.lock().unwrap();
|
let settings = self.settings.lock().unwrap();
|
||||||
|
|
Loading…
Reference in a new issue