ffmpeg_next/codec/
parameters.rs1use 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
13unsafe 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}