From 36ac2513c16f25b95d50e4c8804bd3950b3381de Mon Sep 17 00:00:00 2001 From: Tae-il Lim Date: Thu, 1 Dec 2016 15:12:36 +0900 Subject: [PATCH] codec/parameters: make api more flexible and consistent --- examples/transcode-audio.rs | 4 ++-- src/codec/parameters.rs | 12 +++++++++++- src/format/stream/stream.rs | 2 +- src/format/stream/stream_mut.rs | 11 +++++------ 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/examples/transcode-audio.rs b/examples/transcode-audio.rs index ce8f339..8d15266 100644 --- a/examples/transcode-audio.rs +++ b/examples/transcode-audio.rs @@ -51,7 +51,7 @@ fn transcoder>(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 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 encoder = try!(output.codec().encoder().audio()); @@ -75,7 +75,7 @@ fn transcoder>(ictx: &mut format::context::Input, octx: &mut form output.set_time_base((1, decoder.rate() as i32)); 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)); diff --git a/src/codec/parameters.rs b/src/codec/parameters.rs index f806a9e..eef1c25 100644 --- a/src/codec/parameters.rs +++ b/src/codec/parameters.rs @@ -2,7 +2,7 @@ use std::rc::Rc; use ffi::*; use media; -use super::Id; +use super::{Id, Context}; pub struct Parameters { 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 + } +} diff --git a/src/format/stream/stream.rs b/src/format/stream/stream.rs index 5d1753a..9951cc4 100644 --- a/src/format/stream/stream.rs +++ b/src/format/stream/stream.rs @@ -27,7 +27,7 @@ impl<'a> Stream<'a> { } } - pub fn codec_parameters(&self) -> codec::Parameters { + pub fn parameters(&self) -> codec::Parameters { unsafe { codec::Parameters::wrap((*self.as_ptr()).codecpar, Some(self.context.destructor())) } diff --git a/src/format/stream/stream_mut.rs b/src/format/stream/stream_mut.rs index c044995..0ef3a03 100644 --- a/src/format/stream/stream_mut.rs +++ b/src/format/stream/stream_mut.rs @@ -2,7 +2,7 @@ use std::ops::Deref; use std::mem; use ffi::*; -use ::{Rational, Error}; +use ::{Rational, codec}; use super::Stream; 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>(&mut self, parameters: P) { + let parameters = parameters.into(); + unsafe { - match avcodec_parameters_from_context((*self.as_mut_ptr()).codecpar, context.as_ptr()) { - e if e < 0 => Err(Error::from(e)), - _ => Ok(()), - } + avcodec_parameters_copy((*self.as_mut_ptr()).codecpar, parameters.as_ptr()); } } }