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
use std::ops::{Deref, DerefMut}; use std::ptr; use super::{Audio, Check, Conceal, Opened, Subtitle, Video}; use codec::{traits, Context}; use ffi::*; use {Dictionary, Discard, Error, Rational}; pub struct Decoder(pub Context); impl Decoder { pub fn open(mut self) -> Result<Opened, Error> { unsafe { match avcodec_open2(self.as_mut_ptr(), ptr::null(), ptr::null_mut()) { 0 => Ok(Opened(self)), e => Err(Error::from(e)), } } } pub fn open_as<D: traits::Decoder>(mut self, codec: D) -> Result<Opened, Error> { unsafe { if let Some(codec) = codec.decoder() { match avcodec_open2(self.as_mut_ptr(), codec.as_ptr(), ptr::null_mut()) { 0 => Ok(Opened(self)), e => Err(Error::from(e)), } } else { Err(Error::DecoderNotFound) } } } pub fn open_as_with<D: traits::Decoder>( mut self, codec: D, options: Dictionary, ) -> Result<Opened, Error> { unsafe { if let Some(codec) = codec.decoder() { 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(Opened(self)), e => Err(Error::from(e)), } } else { Err(Error::DecoderNotFound) } } } pub fn video(self) -> Result<Video, Error> { if let Some(codec) = super::find(self.id()) { self.open_as(codec).and_then(|o| o.video()) } else { Err(Error::DecoderNotFound) } } pub fn audio(self) -> Result<Audio, Error> { if let Some(codec) = super::find(self.id()) { self.open_as(codec).and_then(|o| o.audio()) } else { Err(Error::DecoderNotFound) } } pub fn subtitle(self) -> Result<Subtitle, Error> { if let Some(codec) = super::find(self.id()) { self.open_as(codec).and_then(|o| o.subtitle()) } else { Err(Error::DecoderNotFound) } } pub fn conceal(&mut self, value: Conceal) { unsafe { (*self.as_mut_ptr()).error_concealment = value.bits(); } } pub fn check(&mut self, value: Check) { unsafe { (*self.as_mut_ptr()).err_recognition = value.bits(); } } pub fn skip_loop_filter(&mut self, value: Discard) { unsafe { (*self.as_mut_ptr()).skip_loop_filter = value.into(); } } pub fn skip_idct(&mut self, value: Discard) { unsafe { (*self.as_mut_ptr()).skip_idct = value.into(); } } pub fn skip_frame(&mut self, value: Discard) { unsafe { (*self.as_mut_ptr()).skip_frame = value.into(); } } pub fn time_base(&self) -> Rational { unsafe { Rational::from((*self.as_ptr()).time_base) } } } impl Deref for Decoder { type Target = Context; fn deref(&self) -> &<Self as Deref>::Target { &self.0 } } impl DerefMut for Decoder { fn deref_mut(&mut self) -> &mut <Self as Deref>::Target { &mut self.0 } } impl AsRef<Context> for Decoder { fn as_ref(&self) -> &Context { self } } impl AsMut<Context> for Decoder { fn as_mut(&mut self) -> &mut Context { &mut self.0 } }