rtp: Change RtpBasePay2::ssrc_collision from AtomicU64 to Option<u32>

Rust targets without support for `AtomicU64` is still
somewhat common. Running

    git grep -i 'max_atomic_width: Some(32)' | wc -l

in the Rust compiler repo currently counts to 34 targets.

Change the `RtpBasePay2::ssrc_collision` from `AtomicU64` to
`Mutex<Option<u32>>`. This way we keep support for these
targets.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1562>
This commit is contained in:
Martin Nordholts 2024-05-07 15:54:16 +02:00 committed by GStreamer Marge Bot
parent 7d75e263f8
commit a719cbfcc6

View file

@ -18,10 +18,7 @@ use std::{
collections::{BTreeMap, VecDeque}, collections::{BTreeMap, VecDeque},
num::Wrapping, num::Wrapping,
ops::{Bound, RangeBounds}, ops::{Bound, RangeBounds},
sync::{ sync::Mutex,
atomic::{self, AtomicU64},
Mutex,
},
}; };
use super::PacketToBufferRelation; use super::PacketToBufferRelation;
@ -184,10 +181,9 @@ pub struct RtpBasePay2 {
settings: Mutex<Settings>, settings: Mutex<Settings>,
stats: Mutex<Option<Stats>>, stats: Mutex<Option<Stats>>,
/// If set to a different value than `u64::MAX` then there /// If Some then there was an SSRC collision and we should switch to the
/// was an SSRC collision and we should switch to the provided /// provided SSRC here.
/// SSRC here. ssrc_collision: Mutex<Option<u32>>,
ssrc_collision: AtomicU64,
/// Currently configured header extensions /// Currently configured header extensions
extensions: Mutex<BTreeMap<u8, gst_rtp::RTPHeaderExtension>>, extensions: Mutex<BTreeMap<u8, gst_rtp::RTPHeaderExtension>>,
} }
@ -841,6 +837,13 @@ impl RtpBasePay2 {
pub(super) fn src_pad(&self) -> &gst::Pad { pub(super) fn src_pad(&self) -> &gst::Pad {
&self.src_pad &self.src_pad
} }
/// Helper so we don't manually have to set ssrc_collision to None if there
/// is Some collision to handle.
fn take_ssrc_collision(&self) -> Option<u32> {
let mut ssrc_collision = self.ssrc_collision.lock().unwrap();
ssrc_collision.take()
}
} }
/// Default virtual method implementations. /// Default virtual method implementations.
@ -1196,8 +1199,10 @@ impl RtpBasePay2 {
} }
}; };
self.ssrc_collision {
.store(new_ssrc as u64, atomic::Ordering::SeqCst); let mut ssrc_collision = self.ssrc_collision.lock().unwrap();
*ssrc_collision = Some(new_ssrc);
}
} }
fn src_event_default(&self, event: gst::Event) -> Result<gst::FlowSuccess, gst::FlowError> { fn src_event_default(&self, event: gst::Event) -> Result<gst::FlowSuccess, gst::FlowError> {
@ -1450,9 +1455,8 @@ impl RtpBasePay2 {
} }
} }
let ssrc_collision = self.ssrc_collision.load(atomic::Ordering::SeqCst); if let Some(ssrc_collision) = self.take_ssrc_collision() {
if ssrc_collision != u64::MAX { let new_ssrc = ssrc_collision;
let new_ssrc = ssrc_collision as u32;
let stream = state.stream.as_mut().unwrap(); let stream = state.stream.as_mut().unwrap();
gst::debug!( gst::debug!(
CAT, CAT,
@ -1462,8 +1466,6 @@ impl RtpBasePay2 {
new_ssrc, new_ssrc,
); );
stream.ssrc = new_ssrc; stream.ssrc = new_ssrc;
self.ssrc_collision
.store(u64::MAX, atomic::Ordering::SeqCst);
if let Some(ref src_caps) = state.negotiated_src_caps { if let Some(ref src_caps) = state.negotiated_src_caps {
let mut src_caps = src_caps.copy(); let mut src_caps = src_caps.copy();
@ -1733,7 +1735,7 @@ impl ObjectSubclass for RtpBasePay2 {
state: AtomicRefCell::default(), state: AtomicRefCell::default(),
settings: Mutex::default(), settings: Mutex::default(),
stats: Mutex::default(), stats: Mutex::default(),
ssrc_collision: AtomicU64::new(u64::MAX), ssrc_collision: Mutex::new(None),
extensions: Mutex::default(), extensions: Mutex::default(),
} }
} }