Skip to main content

ffmpeg_next/codec/
parameters.rs

1use std::any::Any;
2use std::sync::Arc;
3
4use super::{Context, Id};
5use crate::ffi::*;
6use crate::media;
7
8pub struct Parameters {
9    ptr: *mut AVCodecParameters,
10    owner: Option<Arc<dyn Any + Send + Sync>>,
11}
12
13// SAFETY: the parameters either own their `AVCodecParameters` or keep their
14// owner alive through an atomically refcounted, thread-safe handle.
15unsafe impl Send for Parameters {}
16
17impl Parameters {
18    pub unsafe fn wrap(
19        ptr: *mut AVCodecParameters,
20        owner: Option<Arc<dyn Any + Send + Sync>>,
21    ) -> Self {
22        Parameters { ptr, owner }
23    }
24
25    pub unsafe fn as_ptr(&self) -> *const AVCodecParameters {
26        self.ptr as *const _
27    }
28
29    pub unsafe fn as_mut_ptr(&mut self) -> *mut AVCodecParameters {
30        self.ptr
31    }
32}
33
34impl Parameters {
35    pub fn new() -> Self {
36        unsafe {
37            Parameters {
38                ptr: avcodec_parameters_alloc(),
39                owner: None,
40            }
41        }
42    }
43
44    pub fn medium(&self) -> media::Type {
45        unsafe { media::Type::from((*self.as_ptr()).codec_type) }
46    }
47
48    pub fn set_medium(&mut self, value: media::Type) {
49        unsafe {
50            (*self.as_mut_ptr()).codec_type = value.into();
51        }
52    }
53
54    pub fn id(&self) -> Id {
55        unsafe { Id::from((*self.as_ptr()).codec_id) }
56    }
57
58    pub fn set_id(&mut self, value: Id) {
59        unsafe {
60            (*self.as_mut_ptr()).codec_id = value.into();
61        }
62    }
63
64    pub fn bit_rate(&self) -> i64 {
65        unsafe { (*self.as_ptr()).bit_rate }
66    }
67
68    pub fn set_bit_rate(&mut self, value: i64) {
69        unsafe {
70            (*self.as_mut_ptr()).bit_rate = value;
71        }
72    }
73}
74
75impl Default for Parameters {
76    fn default() -> Self {
77        Self::new()
78    }
79}
80
81impl Drop for Parameters {
82    fn drop(&mut self) {
83        unsafe {
84            if self.owner.is_none() {
85                avcodec_parameters_free(&mut self.as_mut_ptr());
86            }
87        }
88    }
89}
90
91impl Clone for Parameters {
92    fn clone(&self) -> Self {
93        let mut ctx = Parameters::new();
94        ctx.clone_from(self);
95
96        ctx
97    }
98
99    fn clone_from(&mut self, source: &Self) {
100        unsafe {
101            avcodec_parameters_copy(self.as_mut_ptr(), source.as_ptr());
102        }
103    }
104}
105
106impl<C: AsRef<Context>> From<C> for Parameters {
107    fn from(context: C) -> Parameters {
108        let mut parameters = Parameters::new();
109        let context = context.as_ref();
110        unsafe {
111            avcodec_parameters_from_context(parameters.as_mut_ptr(), context.as_ptr());
112        }
113        parameters
114    }
115}
116
117#[cfg(test)]
118mod tests {
119    use super::*;
120
121    #[test]
122    fn sets_codec_parameters() {
123        let mut parameters = Parameters::new();
124        parameters.set_medium(media::Type::Subtitle);
125        parameters.set_id(Id::WEBVTT);
126        parameters.set_bit_rate(64_000);
127
128        assert_eq!(parameters.medium(), media::Type::Subtitle);
129        assert_eq!(parameters.id(), Id::WEBVTT);
130        assert_eq!(parameters.bit_rate(), 64_000);
131    }
132}