use broadcast_common::Parse;
use dvb_subtitle::{
AnySegment, DataIdentifier, EndOfPesMarker, ObjectDataPayload, PesDataField, SyncByte,
};
fn main() {
let bytes = [
DataIdentifier, 0x00, SyncByte,
0x14,
0x00,
0x01,
0x00,
0x05,
0x30,
0x02,
0xCF,
0x01,
0x1F,
SyncByte,
0x10,
0x00,
0x01,
0x00,
0x08,
0x05, 0x04, 0x01,
0x00, 0x00,
0x64,
0x00,
0x32, SyncByte,
0x13,
0x00,
0x01,
0x00,
0x08,
0x00,
0x0A, 0x04, 0x02, 0x00,
0x41,
0x00,
0x42, SyncByte,
0x80,
0x00,
0x01,
0x00,
0x00,
EndOfPesMarker, ];
let field = PesDataField::parse(&bytes).expect("valid PES data field");
println!("{} segments found:\n", field.segments.len());
for seg in &field.segments {
match seg {
AnySegment::DisplayDefinition(dds) => {
println!(
" Display Definition: {}x{}",
dds.display_width + 1,
dds.display_height + 1
);
}
AnySegment::PageComposition(pcs) => {
println!(
" Page Composition: timeout={}s, state={}",
pcs.page_time_out, pcs.page_state
);
for r in &pcs.regions {
println!(
" Region {} @ ({}, {})",
r.region_id, r.region_horizontal_address, r.region_vertical_address
);
}
}
AnySegment::ObjectData(ods) => {
println!(
" Object Data: id={}, coding={}",
ods.object_id, ods.object_coding_method
);
if let ObjectDataPayload::Characters {
character_codes, ..
} = &ods.payload
{
for code in character_codes {
if let Ok(ch) = char::try_from(u32::from(*code)) {
print!(" '{ch}'");
}
}
println!();
}
}
AnySegment::EndOfDisplaySet(_) => {
println!(" End of Display Set");
}
other => println!(" {}: (type=?)", other.name()),
}
}
}