playa_ffmpeg/format/stream/
stream_mut.rs

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