diff --git a/src/bwe.rs b/src/bwe.rs index 90d856aa..e2ba6bba 100644 --- a/src/bwe.rs +++ b/src/bwe.rs @@ -82,4 +82,16 @@ impl<'a> Bwe<'a> { pub fn set_desired_bitrate(&mut self, desired_bitrate: Bitrate) { self.0.session.set_bwe_desired_bitrate(desired_bitrate); } + + /// Reset the BWE with a new init_bitrate + /// + /// # Example + /// + /// This method is useful when you initially start with only an audio stream. In this case, the BWE will report a very low estimated bitrate. + /// Later, when you start a video stream, the estimated bitrate will be affected by the previous low bitrate, resulting in a very low estimated bitrate, which can cause poor video stream quality. + /// To avoid this, you need to warm up the video stream for a while then calling reset with a provided init_bitrate. + /// + pub fn reset(&mut self, init_bitrate: Bitrate) { + self.0.session.reset_bwe(init_bitrate); + } } diff --git a/src/session.rs b/src/session.rs index 91ac400f..ce13b2ea 100644 --- a/src/session.rs +++ b/src/session.rs @@ -796,6 +796,12 @@ impl Session { } } + pub fn reset_bwe(&mut self, init_bitrate: Bitrate) { + if let Some(bwe) = self.bwe.as_mut() { + bwe.reset(init_bitrate); + } + } + pub fn line_count(&self) -> usize { self.medias.len() + if self.app.is_some() { 1 } else { 0 } } @@ -898,6 +904,10 @@ impl Bwe { self.bwe.handle_timeout(now); } + pub fn reset(&mut self, init_bitrate: Bitrate) { + self.bwe = SendSideBandwithEstimator::new(init_bitrate); + } + pub fn update<'t>( &mut self, records: impl Iterator,