rtp: av1: Drop padding OBUs too like Chrome does

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1624>
This commit is contained in:
Sebastian Dröge 2024-06-17 13:10:52 +03:00
parent b4b56eb282
commit bbe38b9599
4 changed files with 30 additions and 16 deletions

View file

@ -553,7 +553,10 @@ impl RTPAv1Depay {
first = false;
// ignore these OBU types
if matches!(obu.obu_type, ObuType::TemporalDelimiter | ObuType::TileList) {
if matches!(
obu.obu_type,
ObuType::TemporalDelimiter | ObuType::TileList | ObuType::Padding
) {
gst::trace!(CAT, imp: self, "Dropping {:?} of size {element_size}", obu.obu_type);
reader
.seek(SeekFrom::Current(element_size as i64))

View file

@ -35,7 +35,7 @@ fn test_depayloader() {
), ( // 2 OBUs, last is fragmented
vec![
0b0110_0000,
0b0000_0110, 0b0111_1000, 1, 2, 3, 4, 5,
0b0000_0110, 0b0011_0000, 1, 2, 3, 4, 5,
0b0011_0000, 1, 2, 3,
],
gst::ClockTime::from_seconds(1),
@ -68,7 +68,7 @@ fn test_depayloader() {
),
(
gst::ClockTime::from_seconds(1),
vec![0b0001_0010, 0, 0b0111_1010, 0b0000_0101, 1, 2, 3, 4, 5],
vec![0b0001_0010, 0, 0b0011_0010, 0b0000_0101, 1, 2, 3, 4, 5],
),
(
gst::ClockTime::from_seconds(1),

View file

@ -127,9 +127,9 @@ impl RTPAv1Pay {
// tile lists and temporal delimiters should not be transmitted,
// see section 5 of the RTP AV1 spec
match obu.obu_type {
// completely ignore tile lists
ObuType::TileList => {
gst::log!(CAT, imp: self, "ignoring tile list OBU");
// completely ignore tile lists and padding
ObuType::TileList | ObuType::Padding => {
gst::log!(CAT, imp: self, "ignoring {:?} OBU", obu.obu_type);
reader
.seek(SeekFrom::Current(
(obu.header_len + obu.leb_size + obu.size) as i64,
@ -656,7 +656,7 @@ mod tests {
obus: VecDeque::from(vec![
ObuData {
info: SizedObu {
obu_type: ObuType::Padding,
obu_type: ObuType::Frame,
size: 3,
..base_obu
},
@ -715,6 +715,14 @@ mod tests {
},
..ObuData::default()
},
ObuData {
info: SizedObu {
obu_type: ObuType::SequenceHeader,
size: 0,
..base_obu
},
..ObuData::default()
},
ObuData {
info: SizedObu {
obu_type: ObuType::Frame,
@ -726,7 +734,7 @@ mod tests {
},
ObuData {
info: SizedObu {
obu_type: ObuType::Padding,
obu_type: ObuType::Frame,
size: 6,
..base_obu
},
@ -803,8 +811,8 @@ mod tests {
),
(
Some(PacketOBUData {
obu_count: 4,
payload_size: 34,
obu_count: 5,
payload_size: 36,
last_obu_fragment_size: None,
omit_last_size_field: false,
ends_temporal_unit: true,
@ -849,7 +857,8 @@ mod tests {
state
.obus
.iter()
.filter(|o| o.info.obu_type != ObuType::TemporalDelimiter)
.filter(|o| o.info.obu_type != ObuType::TemporalDelimiter
&& o.info.obu_type != ObuType::Padding)
.cloned()
.collect::<Vec<_>>(),
results[idx].1.obus.iter().cloned().collect::<Vec<_>>()

View file

@ -26,15 +26,16 @@ fn test_payloader() {
let test_buffers: [(u64, Vec<u8>); 3] = [
(
0,
vec![ // this should result in exactly 25 bytes for the RTP payload
vec![ // this should result in exactly 27 bytes for the RTP payload
0b0001_0010, 0,
0b0000_1010, 0,
0b0011_0010, 0b0000_1100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
0b0011_0010, 0b0000_1001, 1, 2, 3, 4, 5, 6, 7, 8, 9,
],
), (
0,
vec![ // these all have to go in separate packets since their IDs mismatch
0b0111_1010, 0b0000_0100, 1, 2, 3, 4,
0b0011_0010, 0b0000_0100, 1, 2, 3, 4,
0b0011_0110, 0b0010_1000, 0b0000_0101, 1, 2, 3, 4, 5,
0b0011_0110, 0b0100_1000, 0b0000_0001, 1,
],
@ -53,7 +54,8 @@ fn test_payloader() {
false, // marker bit
0, // relative RTP timestamp
vec![ // payload bytes
0b0010_1000,
0b0011_1000,
0b0000_0001, 0b0000_1000,
0b0000_1101, 0b0011_0000, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
0b0011_0000, 1, 2, 3, 4, 5, 6, 7, 8, 9,
],
@ -62,7 +64,7 @@ fn test_payloader() {
0,
vec![
0b0001_0000,
0b0111_1000, 1, 2, 3, 4,
0b0011_0000, 1, 2, 3, 4,
]
), (
false,
@ -95,7 +97,7 @@ fn test_payloader() {
let pay = h.element().unwrap();
pay.set_property(
"mtu",
25u32 + rtp_types::RtpPacket::MIN_RTP_PACKET_LEN as u32,
27u32 + rtp_types::RtpPacket::MIN_RTP_PACKET_LEN as u32,
);
}
h.play();