retina/fuzz/fuzz_targets/depacketize_h264.rs

61 lines
2.0 KiB
Rust
Raw Normal View History

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 libfuzzer_sys::fuzz_target;
use std::num::NonZeroU32;
fuzz_target!(|data: &[u8]| {
let mut data = data;
2021-06-08 05:12:45 +04:00
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;
let conn_ctx = retina::ConnectionContext::dummy();
let stream_ctx = retina::StreamContext::dummy();
let pkt_ctx = retina::PacketContext::dummy();
loop {
let (hdr, rest) = match data.split_first() {
Some(r) => r,
None => return,
};
2021-06-08 05:12:45 +04:00
let ts_change = (hdr & 0b001) != 0;
let mark = (hdr & 0b010) != 0;
let loss = (hdr & 0b100) != 0;
let len = usize::from(hdr >> 3);
if rest.len() < len {
2021-06-08 05:12:45 +04:00
return;
}
let (payload, rest) = rest.split_at(len);
data = rest;
2021-06-08 05:12:45 +04:00
if loss {
sequence_number = sequence_number.wrapping_add(1);
}
if ts_change {
timestamp = timestamp.try_add(1).unwrap();
}
let pkt = retina::rtp::ReceivedPacketBuilder {
ctx: pkt_ctx,
2021-06-08 05:12:45 +04:00
stream_id: 0,
timestamp,
ssrc: 0,
2021-06-08 05:12:45 +04:00
sequence_number,
loss: u16::from(loss),
payload_type: 96,
2021-06-08 05:12:45 +04:00
mark,
}
.build(payload.iter().copied())
.unwrap();
//println!("pkt: {:#?}", pkt);
2021-06-08 05:12:45 +04:00
if depacketizer.push(pkt).is_err() {
return;
}
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);
}
});