decode_access_unit/
decode_access_unit.rs1#[cfg(any(target_os = "macos", target_os = "linux", target_os = "windows"))]
2fn main() -> Result<(), Box<dyn std::error::Error>> {
3 use std::{
4 env, fs, thread,
5 time::{Duration, Instant},
6 };
7
8 use openipc_video::{
9 DecoderOptions, EncodedAccessUnit, PlatformDecoder, VideoCodec, VideoDecoder,
10 VideoTimestamp,
11 };
12
13 let mut args = env::args().skip(1);
14 let codec =
15 match args.next().as_deref() {
16 Some("h264") => VideoCodec::H264,
17 Some("h265") | Some("hevc") => VideoCodec::H265,
18 _ => return Err(
19 "usage: decode_access_unit <h264|h265> <annex-b-access-unit> [--allow-software]"
20 .into(),
21 ),
22 };
23 let path = args
24 .next()
25 .ok_or("usage: decode_access_unit <h264|h265> <annex-b-access-unit> [--allow-software]")?;
26 let allow_software = args.any(|argument| argument == "--allow-software");
27 let data = fs::read(path)?;
28 let capabilities = PlatformDecoder::probe_capabilities();
29 println!("capabilities={capabilities:?}");
30 let mut decoder = PlatformDecoder::new(DecoderOptions {
31 require_hardware: !allow_software,
32 ..DecoderOptions::default()
33 })?;
34 let outcome = decoder.submit(EncodedAccessUnit::new(
35 codec,
36 data,
37 VideoTimestamp::from_rtp(0),
38 true,
39 ))?;
40 println!("submit={outcome:?}");
41
42 let deadline = Instant::now() + Duration::from_secs(1);
43 while Instant::now() < deadline {
44 if let Some(frame) = decoder.latest_frame() {
45 let dimensions = frame.dimensions();
46 println!(
47 "decoded={}x{} pixel_format={:?}",
48 dimensions.width,
49 dimensions.height,
50 openipc_video::DecodedSurface::pixel_format(&frame.surface),
51 );
52 #[cfg(target_os = "macos")]
53 println!("iosurface={}", frame.surface.is_io_surface_backed());
54 #[cfg(target_os = "linux")]
55 println!(
56 "drm_fourcc={:#010x} pitches={:?}",
57 frame.surface.drm_fourcc(),
58 frame.surface.plane_pitches()
59 );
60 #[cfg(target_os = "windows")]
61 println!(
62 "d3d11_subresource={} texture={:?}",
63 frame.surface.subresource_index(),
64 frame.surface.texture()
65 );
66 return Ok(());
67 }
68 thread::sleep(Duration::from_millis(2));
69 }
70 Err(format!("no decoded frame; stats={:?}", decoder.stats()).into())
71}
72
73#[cfg(not(any(target_os = "macos", target_os = "linux", target_os = "windows")))]
74fn main() {
75 eprintln!("decode_access_unit supports macOS, Linux, and Windows");
76}