Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2023-10-23 21:46:45 +0300
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2023-10-24 14:13:35 +0300
commit1f5e9a9335e5604316fab4ac1f060ef95a3d533d (patch)
treee7fe8bd017acf0180f53e56a665a603679970328 /net
parentb1894a0acb890355e3dc4043b21205af68eae356 (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.rs20
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