pub struct EncodedAccessUnit {
pub codec: VideoCodec,
pub data: Bytes,
pub timestamp: VideoTimestamp,
pub keyframe: bool,
pub sequence_number: Option<u16>,
pub damaged: bool,
}Expand description
Complete encoded Annex-B access unit submitted to a decoder.
Fields§
§codec: VideoCodecEncoded codec family.
data: BytesAnnex-B NAL units including start codes.
timestamp: VideoTimestampPresentation timestamp.
keyframe: boolWhether this access unit provides a random-access entry point.
sequence_number: Option<u16>Source packet sequence number when available.
damaged: boolWhether packet loss left this access unit incomplete.
Implementations§
Source§impl EncodedAccessUnit
impl EncodedAccessUnit
Sourcepub fn new(
codec: VideoCodec,
data: impl Into<Bytes>,
timestamp: VideoTimestamp,
keyframe: bool,
) -> Self
pub fn new( codec: VideoCodec, data: impl Into<Bytes>, timestamp: VideoTimestamp, keyframe: bool, ) -> Self
Create an encoded access unit.
Examples found in repository?
examples/decode_access_unit.rs (lines 34-39)
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}Sourcepub const fn can_resynchronize(&self) -> bool
pub const fn can_resynchronize(&self) -> bool
Return true when this access unit can safely establish decoder state.
Trait Implementations§
Source§impl Clone for EncodedAccessUnit
impl Clone for EncodedAccessUnit
Source§fn clone(&self) -> EncodedAccessUnit
fn clone(&self) -> EncodedAccessUnit
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for EncodedAccessUnit
impl Debug for EncodedAccessUnit
impl Eq for EncodedAccessUnit
Source§impl From<DepacketizedFrame> for EncodedAccessUnit
impl From<DepacketizedFrame> for EncodedAccessUnit
Source§fn from(value: DepacketizedFrame) -> Self
fn from(value: DepacketizedFrame) -> Self
Converts to this type from the input type.
Source§impl PartialEq for EncodedAccessUnit
impl PartialEq for EncodedAccessUnit
impl StructuralPartialEq for EncodedAccessUnit
Auto Trait Implementations§
impl !Freeze for EncodedAccessUnit
impl RefUnwindSafe for EncodedAccessUnit
impl Send for EncodedAccessUnit
impl Sync for EncodedAccessUnit
impl Unpin for EncodedAccessUnit
impl UnsafeUnpin for EncodedAccessUnit
impl UnwindSafe for EncodedAccessUnit
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