media_codec/
packet.rs

1use std::{
2    io::{self, Read, Write},
3    sync::Arc,
4};
5
6use bitflags::bitflags;
7use media_core::{buffer::Buffer, invalid_error, invalid_param_error, rational::Rational64, Result};
8
9bitflags! {
10    #[repr(transparent)]
11    #[derive(Clone, Copy, Debug, Eq, PartialEq)]
12    pub struct PacketFlags: u32 {
13        const Key = 1;
14        const Corrupt = 2;
15    }
16}
17
18#[derive(Clone, Debug)]
19enum PacketData<'a> {
20    Borrowed(&'a [u8]),
21    Owned(Vec<u8>),
22    Buffer(Arc<Buffer>),
23}
24
25impl PacketData<'_> {
26    fn from_slice(slice: &[u8]) -> PacketData<'_> {
27        PacketData::Borrowed(slice)
28    }
29
30    fn from_vec(vec: Vec<u8>) -> PacketData<'static> {
31        PacketData::Owned(vec)
32    }
33
34    fn from_buffer(buffer: Arc<Buffer>) -> PacketData<'static> {
35        PacketData::Buffer(buffer)
36    }
37
38    fn as_slice(&self) -> &[u8] {
39        match self {
40            PacketData::Borrowed(slice) => slice,
41            PacketData::Owned(vec) => vec.as_slice(),
42            PacketData::Buffer(buffer) => buffer.data(),
43        }
44    }
45
46    fn as_mut_slice(&mut self) -> Option<&mut [u8]> {
47        match self {
48            PacketData::Borrowed(_) => None,
49            PacketData::Owned(ref mut vec) => Some(vec.as_mut_slice()),
50            PacketData::Buffer(buffer) => {
51                let mut_buffer = Arc::get_mut(buffer)?;
52                Some(mut_buffer.data_mut())
53            }
54        }
55    }
56
57    fn len(&self) -> usize {
58        match self {
59            PacketData::Borrowed(slice) => slice.len(),
60            PacketData::Owned(vec) => vec.len(),
61            PacketData::Buffer(buffer) => buffer.len(),
62        }
63    }
64
65    fn is_empty(&self) -> bool {
66        self.len() == 0
67    }
68
69    fn capacity(&self) -> usize {
70        match &self {
71            PacketData::Borrowed(slice) => slice.len(),
72            PacketData::Owned(vec) => vec.capacity(),
73            PacketData::Buffer(buffer) => buffer.capacity(),
74        }
75    }
76
77    fn into_owned(self) -> PacketData<'static> {
78        match self {
79            PacketData::Borrowed(slice) => PacketData::Owned(slice.to_vec()),
80            PacketData::Owned(vec) => PacketData::Owned(vec),
81            PacketData::Buffer(buffer) => PacketData::Buffer(buffer),
82        }
83    }
84}
85
86#[derive(Clone, Debug)]
87pub struct Packet<'a> {
88    pub pts: Option<i64>,
89    pub dts: Option<i64>,
90    pub duration: Option<i64>,
91    pub time_base: Option<Rational64>,
92    pub flags: PacketFlags,
93    pub pos: Option<usize>,
94    pub track_index: Option<usize>,
95    data: PacketData<'a>,
96}
97
98impl<'a> Packet<'a> {
99    fn from_data(data: PacketData<'a>) -> Self {
100        Self {
101            pts: None,
102            dts: None,
103            duration: None,
104            time_base: None,
105            flags: PacketFlags::empty(),
106            pos: None,
107            track_index: None,
108            data,
109        }
110    }
111
112    pub fn new(size: usize) -> Self {
113        Self::from_data(PacketData::from_vec(vec![0; size]))
114    }
115
116    pub fn with_capacity(capacity: usize) -> Self {
117        Self::from_data(PacketData::from_vec(Vec::with_capacity(capacity)))
118    }
119
120    pub fn from_slice(data: &'a [u8]) -> Self {
121        Self::from_data(PacketData::from_slice(data))
122    }
123
124    pub fn from_buffer(buffer: Arc<Buffer>) -> Self {
125        Self::from_data(PacketData::from_buffer(buffer))
126    }
127
128    pub fn into_owned(self) -> Packet<'static> {
129        Packet {
130            pts: self.pts,
131            dts: self.dts,
132            duration: self.duration,
133            time_base: self.time_base,
134            flags: self.flags,
135            pos: self.pos,
136            track_index: self.track_index,
137            data: self.data.into_owned(),
138        }
139    }
140
141    pub fn len(&self) -> usize {
142        self.data.len()
143    }
144
145    pub fn is_empty(&self) -> bool {
146        self.data.is_empty()
147    }
148
149    pub fn capacity(&self) -> usize {
150        self.data.capacity()
151    }
152
153    pub fn data(&self) -> &[u8] {
154        self.data.as_slice()
155    }
156
157    pub fn data_mut(&mut self) -> Option<&mut [u8]> {
158        self.data.as_mut_slice()
159    }
160
161    pub fn truncate(&mut self, len: usize) -> Result<()> {
162        let current_len = self.data.len();
163        if len > current_len {
164            return Err(invalid_param_error!(len));
165        }
166
167        match &mut self.data {
168            PacketData::Borrowed(slice) => {
169                self.data = PacketData::Borrowed(&slice[..len]);
170            }
171            PacketData::Owned(vec) => {
172                vec.truncate(len);
173            }
174            PacketData::Buffer(buffer) => {
175                let buffer = Arc::get_mut(buffer).ok_or_else(|| invalid_error!("buffer is shared"))?;
176                buffer.resize(len);
177            }
178        }
179
180        Ok(())
181    }
182}
183
184pub trait ReadPacket: Read {
185    fn read_packet(&mut self, size: usize) -> io::Result<Packet<'_>> {
186        let mut packet = Packet::new(size);
187
188        if let Some(data_mut) = packet.data_mut() {
189            self.read_exact(data_mut)?;
190        } else {
191            // Packet::new always creates an owned packet
192            unreachable!()
193        }
194
195        Ok(packet)
196    }
197}
198
199pub trait WritePacket: Write {
200    fn write_packet(&mut self, packet: &Packet) -> io::Result<()> {
201        self.write_all(packet.data())
202    }
203}
204
205impl<T: Read + ?Sized> ReadPacket for T {}
206impl<T: Write + ?Sized> WritePacket for T {}
207
208#[derive(Clone, Copy, Debug)]
209pub struct PacketProperties {
210    pub pts: Option<i64>,
211    pub dts: Option<i64>,
212    pub duration: Option<i64>,
213    pub time_base: Option<Rational64>,
214    pub flags: PacketFlags,
215    pub pos: Option<usize>,
216    pub track_index: Option<usize>,
217}
218
219impl PacketProperties {
220    pub fn new() -> Self {
221        Self {
222            pts: None,
223            dts: None,
224            duration: None,
225            time_base: None,
226            flags: PacketFlags::empty(),
227            pos: None,
228            track_index: None,
229        }
230    }
231
232    pub fn from_packet(packet: &Packet) -> Self {
233        Self {
234            pts: packet.pts,
235            dts: packet.dts,
236            duration: packet.duration,
237            time_base: packet.time_base,
238            flags: packet.flags,
239            pos: packet.pos,
240            track_index: packet.track_index,
241        }
242    }
243}
244
245impl Default for PacketProperties {
246    fn default() -> Self {
247        Self::new()
248    }
249}