codec/parameters: make api more flexible and consistent

This commit is contained in:
Tae-il Lim 2016-12-01 15:12:36 +09:00 committed by meh
parent f1ce26a137
commit 36ac2513c1
4 changed files with 19 additions and 10 deletions

View File

@ -51,7 +51,7 @@ fn transcoder<P: AsRef<Path>>(ictx: &mut format::context::Input, octx: &mut form
let codec = try!(ffmpeg::encoder::find(octx.format().codec(path, media::Type::Audio)).expect("failed to find encoder").audio()); let codec = try!(ffmpeg::encoder::find(octx.format().codec(path, media::Type::Audio)).expect("failed to find encoder").audio());
let global = octx.format().flags().contains(ffmpeg::format::flag::GLOBAL_HEADER); let global = octx.format().flags().contains(ffmpeg::format::flag::GLOBAL_HEADER);
try!(decoder.set_parameters(input.codec_parameters())); try!(decoder.set_parameters(input.parameters()));
let mut output = try!(octx.add_stream(codec)); let mut output = try!(octx.add_stream(codec));
let mut encoder = try!(output.codec().encoder().audio()); let mut encoder = try!(output.codec().encoder().audio());
@ -75,7 +75,7 @@ fn transcoder<P: AsRef<Path>>(ictx: &mut format::context::Input, octx: &mut form
output.set_time_base((1, decoder.rate() as i32)); output.set_time_base((1, decoder.rate() as i32));
let encoder = try!(encoder.open_as(codec)); let encoder = try!(encoder.open_as(codec));
try!(output.set_codec_parameters_from(&encoder)); output.set_parameters(&***encoder);
let filter = try!(filter(filter_spec, &decoder, &encoder)); let filter = try!(filter(filter_spec, &decoder, &encoder));

View File

@ -2,7 +2,7 @@ use std::rc::Rc;
use ffi::*; use ffi::*;
use media; use media;
use super::Id; use super::{Id, Context};
pub struct Parameters { pub struct Parameters {
ptr: *mut AVCodecParameters, ptr: *mut AVCodecParameters,
@ -69,3 +69,13 @@ impl Clone for Parameters {
} }
} }
} }
impl<'a> From<&'a Context> for Parameters {
fn from(context: &'a Context) -> Parameters {
let mut parameters = Parameters::new();
unsafe {
avcodec_parameters_from_context(parameters.as_mut_ptr(), context.as_ptr());
}
parameters
}
}

View File

@ -27,7 +27,7 @@ impl<'a> Stream<'a> {
} }
} }
pub fn codec_parameters(&self) -> codec::Parameters { pub fn parameters(&self) -> codec::Parameters {
unsafe { unsafe {
codec::Parameters::wrap((*self.as_ptr()).codecpar, Some(self.context.destructor())) codec::Parameters::wrap((*self.as_ptr()).codecpar, Some(self.context.destructor()))
} }

View File

@ -2,7 +2,7 @@ use std::ops::Deref;
use std::mem; use std::mem;
use ffi::*; use ffi::*;
use ::{Rational, Error}; use ::{Rational, codec};
use super::Stream; use super::Stream;
use format::context::common::Context; use format::context::common::Context;
@ -41,12 +41,11 @@ impl<'a> StreamMut<'a> {
} }
} }
pub fn set_codec_parameters_from(&mut self, context: &::codec::Context) -> Result<(), Error> { pub fn set_parameters<P: Into<codec::Parameters>>(&mut self, parameters: P) {
let parameters = parameters.into();
unsafe { unsafe {
match avcodec_parameters_from_context((*self.as_mut_ptr()).codecpar, context.as_ptr()) { avcodec_parameters_copy((*self.as_mut_ptr()).codecpar, parameters.as_ptr());
e if e < 0 => Err(Error::from(e)),
_ => Ok(()),
}
} }
} }
} }