use std::ops::{Deref, DerefMut}; use std::ptr; use ffi::*; use libc::c_int; use super::Encoder as Super; use codec::{traits, Context}; use {Dictionary, Error}; pub struct Subtitle(pub Super); impl Subtitle { pub fn open(mut self) -> Result { 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(mut self, codec: E) -> Result { 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( mut self, codec: E, options: Dictionary, ) -> Result { 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) -> &::Target { &self.0 } } impl DerefMut for Subtitle { fn deref_mut(&mut self) -> &mut ::Target { &mut self.0 } } impl AsRef for Subtitle { fn as_ref(&self) -> &Context { self } } impl AsMut for Subtitle { fn as_mut(&mut self) -> &mut Context { &mut self.0 } } pub struct Encoder(pub Subtitle); impl Encoder { pub fn encode(&mut self, subtitle: &::Subtitle, out: &mut [u8]) -> Result { 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) -> &::Target { &self.0 } } impl DerefMut for Encoder { fn deref_mut(&mut self) -> &mut ::Target { &mut self.0 } } impl AsRef for Encoder { fn as_ref(&self) -> &Context { self } } impl AsMut for Encoder { fn as_mut(&mut self) -> &mut Context { &mut self.0 } }