1use core::marker::PhantomData;
2use core::slice;
3use x264::*;
4
5pub struct Data<'a> {
9 ptr: *mut x264_nal_t,
10 len: usize,
11 spooky: PhantomData<&'a [x264_nal_t]>,
12}
13
14impl<'a> Data<'a> {
15 #[doc(hidden)]
16 pub unsafe fn from_raw_parts(ptr: *mut x264_nal_t, len: usize) -> Self {
17 Data {
18 ptr,
19 len,
20 spooky: PhantomData,
21 }
22 }
23
24 pub fn len(&self) -> usize {
26 self.len
27 }
28
29 pub fn unit(&self, i: usize) -> Unit<'a> {
38 const D: i32 = Priority::Disposable as i32;
39 const L: i32 = Priority::Low as i32;
40 const H: i32 = Priority::High as i32;
41
42 assert!(i < self.len);
43
44 let nal = unsafe { *self.ptr.add(i) };
45
46 Unit {
47 priority: match nal.i_ref_idc {
48 D => Priority::Disposable,
49 L => Priority::Low,
50 H => Priority::High,
51 _ => Priority::Highest,
52 },
53 payload: unsafe { slice::from_raw_parts(nal.p_payload, nal.i_payload as usize) },
54 }
55 }
56
57 pub fn entirety(&self) -> &[u8] {
59 if self.len == 0 {
60 &[]
61 } else {
62 let (a, b) = unsafe {
63 let a = *self.ptr;
64 let b = *self.ptr.add(self.len - 1);
65 (a, b)
66 };
67
68 let start = a.p_payload;
69 let length = b.p_payload as usize + b.i_payload as usize - start as usize;
70
71 unsafe { slice::from_raw_parts(start, length) }
72 }
73 }
74}
75
76pub struct Unit<'a> {
78 priority: Priority,
79 payload: &'a [u8],
80}
81
82impl<'a> Unit<'a> {
83 pub fn priority(&self) -> Priority {
85 self.priority
86 }
87}
88
89impl<'a> AsRef<[u8]> for Unit<'a> {
90 fn as_ref(&self) -> &[u8] {
91 self.payload
92 }
93}
94
95#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)]
96#[repr(i32)]
97pub enum Priority {
99 Disposable = 0,
101 Low = 1,
103 High = 2,
105 Highest = 3,
107}