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
use std::ops::{Deref, DerefMut}; use std::ptr; use libc::c_int; use ffi::*; use super::Encoder as Super; use ::{Error, Dictionary}; use codec::traits; pub struct Subtitle(pub Super); impl Subtitle { pub fn open(mut self) -> Result<Encoder, Error> { unsafe { match avcodec_open2(self.as_mut_ptr(), ptr::null(), ptr::null_mut()) { 0 => Ok(Encoder(self)), e => Err(Error::from(e)) } } } pub fn open_as<E: traits::Encoder>(mut self, codec: E) -> Result<Encoder, Error> { unsafe { if let Some(codec) = codec.encoder() { match avcodec_open2(self.as_mut_ptr(), codec.as_ptr(), ptr::null_mut()) { 0 => Ok(Encoder(self)), e => Err(Error::from(e)) } } else { Err(Error::EncoderNotFound) } } } pub fn open_as_with<E: traits::Encoder>(mut self, codec: E, options: Dictionary) -> Result<Encoder, Error> { unsafe { if let Some(codec) = codec.encoder() { let mut opts = options.disown(); let res = avcodec_open2(self.as_mut_ptr(), codec.as_ptr(), &mut opts); Dictionary::own(opts); match res { 0 => Ok(Encoder(self)), e => Err(Error::from(e)) } } else { Err(Error::EncoderNotFound) } } } } impl Deref for Subtitle { type Target = Super; fn deref(&self) -> &<Self as Deref>::Target { &self.0 } } impl DerefMut for Subtitle { fn deref_mut(&mut self) -> &mut<Self as Deref>::Target { &mut self.0 } } pub struct Encoder(pub Subtitle); impl Encoder { pub fn encode(&mut self, subtitle: &::Subtitle, out: &mut [u8]) -> Result<bool, Error> { unsafe { match avcodec_encode_subtitle(self.0.as_mut_ptr(), out.as_mut_ptr(), out.len() as c_int, subtitle.as_ptr()) { e if e < 0 => Err(Error::from(e)), _ => Ok(true) } } } } impl Deref for Encoder { type Target = Subtitle; fn deref(&self) -> &<Self as Deref>::Target { &self.0 } }