Skip to main content

libav_ng/
avpacket.rs

1use libav_sys_ng::{av_packet_alloc, av_packet_free, av_packet_unref, AVPacket};
2
3pub struct Packet {
4    pub(crate) inner: *mut AVPacket,
5}
6
7impl Default for Packet {
8    fn default() -> Self {
9        Self::new()
10    }
11}
12
13impl Packet {
14    pub fn new() -> Self {
15        Self {
16            inner: unsafe { av_packet_alloc() },
17        }
18    }
19
20    pub fn clear(&mut self) {
21        unsafe {
22            av_packet_unref(self.inner);
23        }
24    }
25
26    pub fn stream_index(&self) -> i32 {
27        unsafe { (*self.inner).stream_index }
28    }
29
30    pub fn data(&self) -> &[u8] {
31        unsafe { core::slice::from_raw_parts((*self.inner).data, (*self.inner).size as _) }
32    }
33
34    pub fn duration(&self) -> i64 {
35        unsafe { (*self.inner).duration }
36    }
37
38    pub fn position(&self) -> i64 {
39        unsafe { (*self.inner).pos }
40    }
41
42    pub unsafe fn raw(&self) -> *const AVPacket {
43        self.inner.cast()
44    }
45
46    pub unsafe fn raw_mut(&mut self) -> *mut AVPacket {
47        self.inner
48    }
49}
50
51impl Drop for Packet {
52    fn drop(&mut self) {
53        unsafe { av_packet_free(&mut self.inner) };
54    }
55}