diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2023-10-23 21:46:45 +0300 |
---|---|---|
committer | GStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2023-10-24 14:13:35 +0300 |
commit | 1f5e9a9335e5604316fab4ac1f060ef95a3d533d (patch) | |
tree | e7fe8bd017acf0180f53e56a665a603679970328 /net | |
parent | b1894a0acb890355e3dc4043b21205af68eae356 (diff) |
rtpav1depay: Skip unexpected leading fragments
If a packet is starting with a leading fragment but we do not expect to
receive one, then skip over it to the next OBU.
Not doing so would cause parsing of the middle of an OBU, which would
most likely fail and cause unnecessary warning messages about a
corrupted stream.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1367>
Diffstat (limited to 'net')
-rw-r--r-- | net/rtp/src/av1/depay/imp.rs | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/net/rtp/src/av1/depay/imp.rs b/net/rtp/src/av1/depay/imp.rs index f9fe838f3..b7c8b0f11 100644 --- a/net/rtp/src/av1/depay/imp.rs +++ b/net/rtp/src/av1/depay/imp.rs @@ -33,6 +33,8 @@ struct State { marked_packet: bool, /// if the next output buffer needs the DISCONT flag set needs_discont: bool, + /// if we saw a valid OBU since the last reset + found_valid_obu: bool, /// holds data for a fragment obu_fragment: Option<(UnsizedObu, Vec<u8>)>, } @@ -43,6 +45,7 @@ impl Default for State { last_timestamp: None, marked_packet: false, needs_discont: true, + found_valid_obu: false, obu_fragment: None, } } @@ -291,6 +294,21 @@ impl RTPAv1Depay { let (element_size, is_last_obu) = self.find_element_info(rtp, &mut reader, &aggr_header, idx)?; + if idx == 0 && aggr_header.leading_fragment { + if state.found_valid_obu { + gst::error!( + CAT, + imp: self, + "invalid packet: unexpected leading OBU fragment" + ); + } + reader + .seek(SeekFrom::Current(element_size as i64)) + .map_err(err_flow!(self, buf_read))?; + idx += 1; + continue; + } + let header_pos = reader.position(); let mut bitreader = BitReader::endian(&mut reader, ENDIANNESS); let obu = UnsizedObu::parse(&mut bitreader).map_err(err_flow!(self, obu_read))?; @@ -299,6 +317,8 @@ impl RTPAv1Depay { .seek(SeekFrom::Start(header_pos)) .map_err(err_flow!(self, buf_read))?; + state.found_valid_obu = true; + // ignore these OBU types if matches!(obu.obu_type, ObuType::TemporalDelimiter | ObuType::TileList) { reader |