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
use std::mem; use std::ops::Deref; use super::Stream; use ffi::*; use format::context::common::Context; use {codec, Dictionary, Rational}; pub struct StreamMut<'a> { context: &'a mut Context, index: usize, immutable: Stream<'a>, } impl<'a> StreamMut<'a> { pub unsafe fn wrap(context: &mut Context, index: usize) -> StreamMut { StreamMut { context: mem::transmute_copy(&context), index, immutable: Stream::wrap(mem::transmute_copy(&context), index), } } pub unsafe fn as_mut_ptr(&mut self) -> *mut AVStream { *(*self.context.as_mut_ptr()).streams.add(self.index) } } impl<'a> StreamMut<'a> { pub fn set_time_base<R: Into<Rational>>(&mut self, value: R) { unsafe { (*self.as_mut_ptr()).time_base = value.into().into(); } } pub fn set_rate<R: Into<Rational>>(&mut self, value: R) { unsafe { av_stream_set_r_frame_rate(self.as_mut_ptr(), value.into().into()); } } pub fn set_avg_frame_rate<R: Into<Rational>>(&mut self, value: R) { unsafe { (*self.as_mut_ptr()).avg_frame_rate = value.into().into(); } } pub fn set_parameters<P: Into<codec::Parameters>>(&mut self, parameters: P) { let parameters = parameters.into(); unsafe { avcodec_parameters_copy((*self.as_mut_ptr()).codecpar, parameters.as_ptr()); } } pub fn set_metadata(&mut self, metadata: Dictionary) { unsafe { let metadata = metadata.disown(); (*self.as_mut_ptr()).metadata = metadata; } } } impl<'a> Deref for StreamMut<'a> { type Target = Stream<'a>; fn deref(&self) -> &Self::Target { &self.immutable } }