| 1 | use std::mem; |
| 2 | use std::ops::Deref; |
| 3 | |
| 4 | use super::Stream; |
| 5 | use ffi::*; |
| 6 | use format::context::common::Context; |
| 7 | use {codec, Dictionary, Rational}; |
| 8 | |
| 9 | pub struct StreamMut<'a> { |
| 10 | context: &'a mut Context, |
| 11 | index: usize, |
| 12 | |
| 13 | immutable: Stream<'a>, |
| 14 | } |
| 15 | |
| 16 | impl<'a> StreamMut<'a> { |
| 17 | pub unsafe fn wrap(context: &mut Context, index: usize) -> StreamMut { |
| 18 | StreamMut { |
| 19 | context: mem::transmute_copy(&context), |
| 20 | index, |
| 21 | |
| 22 | immutable: Stream::wrap(context:mem::transmute_copy(&context), index), |
| 23 | } |
| 24 | } |
| 25 | |
| 26 | pub unsafe fn as_mut_ptr(&mut self) -> *mut AVStream { |
| 27 | *(*self.context.as_mut_ptr()).streams.add(self.index) |
| 28 | } |
| 29 | } |
| 30 | |
| 31 | impl<'a> StreamMut<'a> { |
| 32 | pub fn set_time_base<R: Into<Rational>>(&mut self, value: R) { |
| 33 | unsafe { |
| 34 | (*self.as_mut_ptr()).time_base = value.into().into(); |
| 35 | } |
| 36 | } |
| 37 | |
| 38 | pub fn set_rate<R: Into<Rational>>(&mut self, value: R) { |
| 39 | unsafe { |
| 40 | (*self.as_mut_ptr()).r_frame_rate = value.into().into(); |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | pub fn set_avg_frame_rate<R: Into<Rational>>(&mut self, value: R) { |
| 45 | unsafe { |
| 46 | (*self.as_mut_ptr()).avg_frame_rate = value.into().into(); |
| 47 | } |
| 48 | } |
| 49 | |
| 50 | pub fn set_parameters<P: Into<codec::Parameters>>(&mut self, parameters: P) { |
| 51 | let parameters = parameters.into(); |
| 52 | |
| 53 | unsafe { |
| 54 | avcodec_parameters_copy((*self.as_mut_ptr()).codecpar, parameters.as_ptr()); |
| 55 | } |
| 56 | } |
| 57 | |
| 58 | pub fn set_metadata(&mut self, metadata: Dictionary) { |
| 59 | unsafe { |
| 60 | let metadata = metadata.disown(); |
| 61 | (*self.as_mut_ptr()).metadata = metadata; |
| 62 | } |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | impl<'a> Deref for StreamMut<'a> { |
| 67 | type Target = Stream<'a>; |
| 68 | |
| 69 | fn deref(&self) -> &Self::Target { |
| 70 | &self.immutable |
| 71 | } |
| 72 | } |
| 73 | |