| 1 | use ffi::*; |
| 2 | |
| 3 | #[derive (Copy, Clone, Debug)] |
| 4 | pub enum Mode { |
| 5 | Input, |
| 6 | Output, |
| 7 | } |
| 8 | |
| 9 | pub struct Destructor { |
| 10 | ptr: *mut AVFormatContext, |
| 11 | mode: Mode, |
| 12 | } |
| 13 | |
| 14 | impl Destructor { |
| 15 | pub unsafe fn new(ptr: *mut AVFormatContext, mode: Mode) -> Self { |
| 16 | Destructor { ptr, mode } |
| 17 | } |
| 18 | } |
| 19 | |
| 20 | impl Drop for Destructor { |
| 21 | fn drop(&mut self) { |
| 22 | unsafe { |
| 23 | match self.mode { |
| 24 | Mode::Input => avformat_close_input(&mut self.ptr), |
| 25 | |
| 26 | Mode::Output => { |
| 27 | avio_close((*self.ptr).pb); |
| 28 | avformat_free_context(self.ptr); |
| 29 | } |
| 30 | } |
| 31 | } |
| 32 | } |
| 33 | } |
| 34 | |