1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
pub mod side_data; pub use self::side_data::SideData; pub mod video; pub use self::video::Video; pub mod audio; pub use self::audio::Audio; pub mod flag; pub use self::flag::Flags; use ffi::*; use libc::c_int; use {Dictionary, DictionaryRef}; #[derive(PartialEq, Eq, Copy, Clone, Debug)] pub struct Packet { pub duration: i64, pub position: i64, pub size: usize, pub pts: i64, pub dts: i64, } #[derive(PartialEq, Eq)] pub struct Frame { ptr: *mut AVFrame, _own: bool, } unsafe impl Send for Frame {} unsafe impl Sync for Frame {} impl Frame { #[inline(always)] pub unsafe fn wrap(ptr: *mut AVFrame) -> Self { Frame { ptr, _own: false } } #[inline(always)] pub unsafe fn empty() -> Self { Frame { ptr: av_frame_alloc(), _own: true, } } #[inline(always)] pub unsafe fn as_ptr(&self) -> *const AVFrame { self.ptr as *const _ } #[inline(always)] pub unsafe fn as_mut_ptr(&mut self) -> *mut AVFrame { self.ptr } #[inline(always)] pub unsafe fn is_empty(&self) -> bool { (*self.as_ptr()).data[0].is_null() } } impl Frame { #[inline] pub fn is_key(&self) -> bool { unsafe { (*self.as_ptr()).key_frame == 1 } } #[inline] pub fn is_corrupt(&self) -> bool { self.flags().contains(Flags::CORRUPT) } #[inline] pub fn packet(&self) -> Packet { unsafe { Packet { duration: av_frame_get_pkt_duration(self.as_ptr()) as i64, position: av_frame_get_pkt_pos(self.as_ptr()) as i64, size: av_frame_get_pkt_size(self.as_ptr()) as usize, pts: (*self.as_ptr()).pkt_pts, dts: (*self.as_ptr()).pkt_dts, } } } #[inline] pub fn pts(&self) -> Option<i64> { unsafe { match (*self.as_ptr()).pts { AV_NOPTS_VALUE => None, pts => Some(pts as i64), } } } #[inline] pub fn set_pts(&mut self, value: Option<i64>) { unsafe { (*self.as_mut_ptr()).pts = value.unwrap_or(AV_NOPTS_VALUE); } } #[inline] pub fn timestamp(&self) -> Option<i64> { unsafe { match av_frame_get_best_effort_timestamp(self.as_ptr()) { AV_NOPTS_VALUE => None, t => Some(t as i64), } } } #[inline] pub fn quality(&self) -> usize { unsafe { (*self.as_ptr()).quality as usize } } #[inline] pub fn flags(&self) -> Flags { unsafe { Flags::from_bits_truncate((*self.as_ptr()).flags) } } #[inline] pub fn metadata(&self) -> DictionaryRef { unsafe { DictionaryRef::wrap(av_frame_get_metadata(self.as_ptr())) } } #[inline] pub fn set_metadata(&mut self, value: Dictionary) { unsafe { av_frame_set_metadata(self.as_mut_ptr(), value.disown()); } } #[inline] pub fn side_data(&self, kind: side_data::Type) -> Option<SideData> { unsafe { let ptr = av_frame_get_side_data(self.as_ptr(), kind.into()); if ptr.is_null() { None } else { Some(SideData::wrap(ptr)) } } } #[inline] pub fn new_side_data(&mut self, kind: side_data::Type, size: usize) -> Option<SideData> { unsafe { let ptr = av_frame_new_side_data(self.as_mut_ptr(), kind.into(), size as c_int); if ptr.is_null() { None } else { Some(SideData::wrap(ptr)) } } } #[inline] pub fn remove_side_data(&mut self, kind: side_data::Type) { unsafe { av_frame_remove_side_data(self.as_mut_ptr(), kind.into()); } } } impl Drop for Frame { #[inline] fn drop(&mut self) { unsafe { av_frame_free(&mut self.as_mut_ptr()); } } }