-
Notifications
You must be signed in to change notification settings - Fork 12
/
bench.rs
94 lines (89 loc) · 3.7 KB
/
bench.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#[macro_use]
extern crate criterion;
#[macro_use]
extern crate mpeg2ts_reader;
use criterion::{Criterion, Throughput};
use mpeg2ts_reader::demultiplex;
use mpeg2ts_reader::pes;
use mpeg2ts_reader::psi;
use std::fs::File;
use std::io::Read;
packet_filter_switch! {
NullFilterSwitch<NullDemuxContext> {
Pat: demultiplex::PatPacketFilter<NullDemuxContext>,
Pmt: demultiplex::PmtPacketFilter<NullDemuxContext>,
Null: demultiplex::NullPacketFilter<NullDemuxContext>,
NullPes: pes::PesPacketFilter<NullDemuxContext,NullElementaryStreamConsumer>,
}
}
demux_context!(NullDemuxContext, NullFilterSwitch);
impl NullDemuxContext {
fn do_construct(&mut self, req: demultiplex::FilterRequest<'_, '_>) -> NullFilterSwitch {
match req {
demultiplex::FilterRequest::ByPid(psi::pat::PAT_PID) => {
NullFilterSwitch::Pat(demultiplex::PatPacketFilter::default())
}
demultiplex::FilterRequest::ByPid(_) => {
NullFilterSwitch::Null(demultiplex::NullPacketFilter::default())
}
demultiplex::FilterRequest::ByStream {
pmt, stream_info, ..
} => NullElementaryStreamConsumer::construct(pmt, stream_info),
demultiplex::FilterRequest::Pmt {
pid,
program_number,
} => NullFilterSwitch::Pmt(demultiplex::PmtPacketFilter::new(pid, program_number)),
demultiplex::FilterRequest::Nit { .. } => {
NullFilterSwitch::Null(demultiplex::NullPacketFilter::default())
}
}
}
}
pub struct NullElementaryStreamConsumer {}
impl NullElementaryStreamConsumer {
fn construct(
_pmt_sect: &psi::pmt::PmtSection,
stream_info: &psi::pmt::StreamInfo,
) -> NullFilterSwitch {
println!("stream info: {:?}", stream_info);
let filter = pes::PesPacketFilter::new(NullElementaryStreamConsumer {});
NullFilterSwitch::NullPes(filter)
}
}
impl<Ctx> pes::ElementaryStreamConsumer<Ctx> for NullElementaryStreamConsumer {
fn start_stream(&mut self, _ctx: &mut Ctx) {}
fn begin_packet(&mut self, _ctx: &mut Ctx, header: pes::PesHeader) {
if let pes::PesContents::Parsed(Some(content)) = header.contents() {
match content.pts_dts() {
Ok(pes::PtsDts::PtsOnly(Ok(ts))) => {
criterion::black_box(ts);
}
Ok(pes::PtsDts::Both { pts: Ok(ts), .. }) => {
criterion::black_box(ts);
}
_ => (),
};
}
}
fn continue_packet(&mut self, _ctx: &mut Ctx, _data: &[u8]) {}
fn end_packet(&mut self, _ctx: &mut Ctx) {}
fn continuity_error(&mut self, _ctx: &mut Ctx) {}
}
fn mpeg2ts_reader(c: &mut Criterion) {
let mut f = File::open("resources/testsrc.ts")
.expect("Test file missing. To create, run: mkdir -p resources && ffmpeg -f lavfi -i testsrc=duration=20:size=640x360:rate=30,noise=alls=20:allf=t+u -f lavfi -i sine=duration=20:frequency=1:beep_factor=480:sample_rate=48000 -c:v libx264 -b:v 20M -map 0:v -c:a aac -b:a 128k -map 1:a -vf format=yuv420p -f mpegts resources/testsrc.ts");
let l = f.metadata().unwrap().len() as usize;
let size = l.min(188 * 200_000);
let mut buf = vec![0; size];
f.read(&mut buf[..]).unwrap();
let mut ctx = NullDemuxContext::new();
let mut demux = demultiplex::Demultiplex::new(&mut ctx);
let mut group = c.benchmark_group("parse");
group.throughput(Throughput::Bytes(size as _));
group.bench_function("parse", move |b| {
b.iter(|| demux.push(&mut ctx, &buf[..]));
});
group.finish();
}
criterion_group!(benches, mpeg2ts_reader);
criterion_main!(benches);