ffmpeg_next/software/scaling/
vector.rs

1use std::marker::PhantomData;
2use std::slice;
3
4use ffi::*;
5use libc::{c_double, c_int};
6
7pub struct Vector<'a> {
8    ptr: *mut SwsVector,
9
10    _own: bool,
11    _marker: PhantomData<&'a ()>,
12}
13
14impl<'a> Vector<'a> {
15    pub unsafe fn wrap(ptr: *mut SwsVector) -> Self {
16        Vector {
17            ptr,
18            _own: false,
19            _marker: PhantomData,
20        }
21    }
22
23    pub unsafe fn as_ptr(&self) -> *const SwsVector {
24        self.ptr as *const _
25    }
26
27    pub unsafe fn as_mut_ptr(&mut self) -> *mut SwsVector {
28        self.ptr
29    }
30}
31
32impl<'a> Vector<'a> {
33    pub fn new(length: usize) -> Self {
34        unsafe {
35            Vector {
36                ptr: sws_allocVec(length as c_int),
37                _own: true,
38                _marker: PhantomData,
39            }
40        }
41    }
42
43    pub fn gaussian(variance: f64, quality: f64) -> Self {
44        unsafe {
45            Vector {
46                ptr: sws_getGaussianVec(variance as c_double, quality as c_double),
47                _own: true,
48                _marker: PhantomData,
49            }
50        }
51    }
52
53    #[cfg(not(feature = "ffmpeg_5_0"))]
54    pub fn value(value: f64, length: usize) -> Self {
55        unsafe {
56            Vector {
57                ptr: sws_getConstVec(value as c_double, length as c_int),
58                _own: true,
59                _marker: PhantomData,
60            }
61        }
62    }
63
64    #[cfg(not(feature = "ffmpeg_5_0"))]
65    pub fn identity() -> Self {
66        unsafe {
67            Vector {
68                ptr: sws_getIdentityVec(),
69                _own: true,
70                _marker: PhantomData,
71            }
72        }
73    }
74
75    pub fn scale(&mut self, scalar: f64) {
76        unsafe {
77            sws_scaleVec(self.as_mut_ptr(), scalar as c_double);
78        }
79    }
80
81    pub fn normalize(&mut self, height: f64) {
82        unsafe {
83            sws_normalizeVec(self.as_mut_ptr(), height as c_double);
84        }
85    }
86
87    #[cfg(not(feature = "ffmpeg_5_0"))]
88    pub fn conv(&mut self, other: &Vector) {
89        unsafe {
90            sws_convVec(self.as_mut_ptr(), other.as_ptr() as *mut _);
91        }
92    }
93
94    #[cfg(not(feature = "ffmpeg_5_0"))]
95    pub fn add(&mut self, other: &Vector) {
96        unsafe {
97            sws_addVec(self.as_mut_ptr(), other.as_ptr() as *mut _);
98        }
99    }
100
101    #[cfg(not(feature = "ffmpeg_5_0"))]
102    pub fn sub(&mut self, other: &Vector) {
103        unsafe {
104            sws_subVec(self.as_mut_ptr(), other.as_ptr() as *mut _);
105        }
106    }
107
108    #[cfg(not(feature = "ffmpeg_5_0"))]
109    pub fn shift(&mut self, value: usize) {
110        unsafe {
111            sws_shiftVec(self.as_mut_ptr(), value as c_int);
112        }
113    }
114
115    pub fn coefficients(&self) -> &[f64] {
116        unsafe { slice::from_raw_parts((*self.as_ptr()).coeff, (*self.as_ptr()).length as usize) }
117    }
118
119    pub fn coefficients_mut(&self) -> &[f64] {
120        unsafe {
121            slice::from_raw_parts_mut((*self.as_ptr()).coeff, (*self.as_ptr()).length as usize)
122        }
123    }
124}
125
126#[cfg(not(feature = "ffmpeg_5_0"))]
127impl<'a> Clone for Vector<'a> {
128    fn clone(&self) -> Self {
129        unsafe {
130            Vector {
131                ptr: sws_cloneVec(self.as_ptr() as *mut _),
132                _own: true,
133                _marker: PhantomData,
134            }
135        }
136    }
137}
138
139impl<'a> Drop for Vector<'a> {
140    fn drop(&mut self) {
141        unsafe {
142            if self._own {
143                sws_freeVec(self.as_mut_ptr());
144            }
145        }
146    }
147}