2021-06-08 08:35:08 +04:00
|
|
|
// Copyright (C) 2021 Scott Lamb <slamb@slamb.org>
|
|
|
|
// SPDX-License-Identifier: MIT OR Apache-2.0
|
|
|
|
|
2021-06-08 05:12:45 +04:00
|
|
|
#![no_main]
|
|
|
|
use bytes::{Buf, Bytes};
|
|
|
|
use libfuzzer_sys::fuzz_target;
|
|
|
|
use std::num::NonZeroU32;
|
|
|
|
|
|
|
|
fuzz_target!(|data: &[u8]| {
|
|
|
|
let mut data = Bytes::copy_from_slice(data);
|
|
|
|
let mut depacketizer = retina::codec::Depacketizer::new(
|
|
|
|
"video", "h264", 90_000, None, Some("packetization-mode=1;profile-level-id=64001E;sprop-parameter-sets=Z2QAHqwsaoLA9puCgIKgAAADACAAAAMD0IAA,aO4xshsA")).unwrap();
|
|
|
|
let mut timestamp = retina::Timestamp::new(0, NonZeroU32::new(90_000).unwrap(), 0).unwrap();
|
|
|
|
let mut sequence_number: u16 = 0;
|
2021-08-20 00:16:16 +04:00
|
|
|
let conn_ctx = retina::ConnectionContext::dummy();
|
2022-04-27 00:02:10 +04:00
|
|
|
let stream_ctx = retina::StreamContextRef::dummy();
|
2021-08-28 03:30:55 +04:00
|
|
|
let pkt_ctx = retina::PacketContext::dummy();
|
2021-06-08 05:12:45 +04:00
|
|
|
while data.has_remaining() {
|
|
|
|
let hdr = data.get_u8();
|
|
|
|
let ts_change = (hdr & 0b001) != 0;
|
|
|
|
let mark = (hdr & 0b010) != 0;
|
|
|
|
let loss = (hdr & 0b100) != 0;
|
|
|
|
let len = usize::from(hdr >> 3);
|
|
|
|
if len > data.remaining() {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if loss {
|
|
|
|
sequence_number = sequence_number.wrapping_add(1);
|
|
|
|
}
|
|
|
|
if ts_change {
|
|
|
|
timestamp = timestamp.try_add(1).unwrap();
|
|
|
|
}
|
|
|
|
let pkt = retina::client::rtp::Packet {
|
2021-08-28 03:30:55 +04:00
|
|
|
ctx: pkt_ctx,
|
2021-06-08 05:12:45 +04:00
|
|
|
stream_id: 0,
|
|
|
|
timestamp,
|
2021-08-20 00:16:16 +04:00
|
|
|
ssrc: 0,
|
2021-06-08 05:12:45 +04:00
|
|
|
sequence_number,
|
|
|
|
loss: u16::from(loss),
|
|
|
|
mark,
|
2022-02-01 02:06:01 +04:00
|
|
|
payload: data.split_off(len),
|
2021-06-08 05:12:45 +04:00
|
|
|
};
|
2021-06-08 08:30:18 +04:00
|
|
|
//println!("pkt: {:#?}", pkt);
|
2021-06-08 05:12:45 +04:00
|
|
|
if depacketizer.push(pkt).is_err() {
|
|
|
|
return;
|
|
|
|
}
|
2022-04-27 00:02:10 +04:00
|
|
|
while let Some(item) = depacketizer.pull(&conn_ctx, stream_ctx).transpose() {
|
2021-06-08 05:12:45 +04:00
|
|
|
if item.is_err() {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sequence_number = sequence_number.wrapping_add(1);
|
|
|
|
}
|
|
|
|
});
|