pub struct DecodedFrame<S> {
pub surface: S,
pub timestamp: VideoTimestamp,
pub duration: Option<VideoTimestamp>,
}Expand description
Decoded frame and its presentation metadata.
Fields§
§surface: SNative decoded surface.
timestamp: VideoTimestampPresentation timestamp carried by the source access unit.
duration: Option<VideoTimestamp>Optional frame duration.
Implementations§
Source§impl<S: DecodedSurface> DecodedFrame<S>
impl<S: DecodedSurface> DecodedFrame<S>
Sourcepub fn dimensions(&self) -> FrameDimensions
pub fn dimensions(&self) -> FrameDimensions
Visible dimensions reported by the decoded surface.
Examples found in repository?
examples/decode_access_unit.rs (line 45)
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}Trait Implementations§
Auto Trait Implementations§
impl<S> Freeze for DecodedFrame<S>where
S: Freeze,
impl<S> RefUnwindSafe for DecodedFrame<S>where
S: RefUnwindSafe,
impl<S> Send for DecodedFrame<S>where
S: Send,
impl<S> Sync for DecodedFrame<S>where
S: Sync,
impl<S> Unpin for DecodedFrame<S>where
S: Unpin,
impl<S> UnsafeUnpin for DecodedFrame<S>where
S: UnsafeUnpin,
impl<S> UnwindSafe for DecodedFrame<S>where
S: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more