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 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}