Skip to main content

ffmpeg_the_third/codec/encoder/
video.rs

1use std::ops::{Deref, DerefMut};
2use std::ptr;
3
4use crate::ffi::*;
5use libc::{c_float, c_int};
6
7use super::Encoder as Super;
8use super::{Comparison, Decision};
9use crate::codec::{traits, Context};
10use crate::{color, format};
11use crate::{AsMutPtr, Error, Rational};
12
13pub struct Video(pub Super);
14
15impl Video {
16    #[inline]
17    pub fn open(mut self) -> Result<Encoder, Error> {
18        unsafe {
19            match avcodec_open2(self.as_mut_ptr(), ptr::null(), ptr::null_mut()) {
20                0 => Ok(Encoder(self)),
21                e => Err(Error::from(e)),
22            }
23        }
24    }
25
26    #[inline]
27    pub fn open_as<T, Enc>(mut self, codec: Enc) -> Result<Encoder, Error>
28    where
29        Enc: traits::Encoder<T>,
30    {
31        unsafe {
32            if let Some(codec) = codec.encoder() {
33                match avcodec_open2(self.as_mut_ptr(), codec.as_ptr(), ptr::null_mut()) {
34                    0 => Ok(Encoder(self)),
35                    e => Err(Error::from(e)),
36                }
37            } else {
38                Err(Error::EncoderNotFound)
39            }
40        }
41    }
42
43    #[inline]
44    pub fn open_with<Dict>(mut self, mut options: Dict) -> Result<Encoder, Error>
45    where
46        Dict: AsMutPtr<*mut AVDictionary>,
47    {
48        unsafe {
49            let res = avcodec_open2(self.as_mut_ptr(), ptr::null(), options.as_mut_ptr());
50
51            match res {
52                0 => Ok(Encoder(self)),
53                e => Err(Error::from(e)),
54            }
55        }
56    }
57
58    #[inline]
59    pub fn open_as_with<T, Enc, Dict>(
60        mut self,
61        codec: Enc,
62        mut options: Dict,
63    ) -> Result<Encoder, Error>
64    where
65        Enc: traits::Encoder<T>,
66        Dict: AsMutPtr<*mut AVDictionary>,
67    {
68        unsafe {
69            if let Some(codec) = codec.encoder() {
70                let res = avcodec_open2(self.as_mut_ptr(), codec.as_ptr(), options.as_mut_ptr());
71
72                match res {
73                    0 => Ok(Encoder(self)),
74                    e => Err(Error::from(e)),
75                }
76            } else {
77                Err(Error::EncoderNotFound)
78            }
79        }
80    }
81
82    #[inline]
83    pub fn set_width(&mut self, value: u32) {
84        unsafe {
85            (*self.as_mut_ptr()).width = value as c_int;
86        }
87    }
88
89    #[inline]
90    pub fn width(&self) -> u32 {
91        unsafe { (*self.as_ptr()).width as u32 }
92    }
93
94    #[inline]
95    pub fn set_height(&mut self, value: u32) {
96        unsafe {
97            (*self.as_mut_ptr()).height = value as c_int;
98        }
99    }
100
101    #[inline]
102    pub fn height(&self) -> u32 {
103        unsafe { (*self.as_ptr()).height as u32 }
104    }
105
106    #[inline]
107    pub fn set_gop(&mut self, value: u32) {
108        unsafe {
109            (*self.as_mut_ptr()).gop_size = value as c_int;
110        }
111    }
112
113    #[inline]
114    pub fn set_format(&mut self, value: format::Pixel) {
115        unsafe {
116            (*self.as_mut_ptr()).pix_fmt = value.into();
117        }
118    }
119
120    #[inline]
121    pub fn format(&self) -> format::Pixel {
122        unsafe { format::Pixel::from((*self.as_ptr()).pix_fmt) }
123    }
124
125    #[inline]
126    pub fn set_max_b_frames(&mut self, value: usize) {
127        unsafe {
128            (*self.as_mut_ptr()).max_b_frames = value as c_int;
129        }
130    }
131
132    #[inline]
133    pub fn set_b_quant_factor(&mut self, value: f32) {
134        unsafe {
135            (*self.as_mut_ptr()).b_quant_factor = value as c_float;
136        }
137    }
138
139    #[inline]
140    pub fn set_b_quant_offset(&mut self, value: f32) {
141        unsafe {
142            (*self.as_mut_ptr()).b_quant_offset = value as c_float;
143        }
144    }
145
146    #[inline]
147    pub fn set_i_quant_factor(&mut self, value: f32) {
148        unsafe {
149            (*self.as_mut_ptr()).i_quant_factor = value as c_float;
150        }
151    }
152
153    #[inline]
154    pub fn set_i_quant_offset(&mut self, value: f32) {
155        unsafe {
156            (*self.as_mut_ptr()).i_quant_offset = value as c_float;
157        }
158    }
159
160    #[inline]
161    pub fn set_lumi_masking(&mut self, value: f32) {
162        unsafe {
163            (*self.as_mut_ptr()).lumi_masking = value as c_float;
164        }
165    }
166
167    #[inline]
168    pub fn set_temporal_cplx_masking(&mut self, value: f32) {
169        unsafe {
170            (*self.as_mut_ptr()).temporal_cplx_masking = value as c_float;
171        }
172    }
173
174    #[inline]
175    pub fn set_spatial_cplx_masking(&mut self, value: f32) {
176        unsafe {
177            (*self.as_mut_ptr()).spatial_cplx_masking = value as c_float;
178        }
179    }
180
181    #[inline]
182    pub fn set_p_masking(&mut self, value: f32) {
183        unsafe {
184            (*self.as_mut_ptr()).p_masking = value as c_float;
185        }
186    }
187
188    #[inline]
189    pub fn set_dark_masking(&mut self, value: f32) {
190        unsafe {
191            (*self.as_mut_ptr()).dark_masking = value as c_float;
192        }
193    }
194
195    #[inline]
196    pub fn set_aspect_ratio<R: Into<Rational>>(&mut self, value: R) {
197        unsafe {
198            (*self.as_mut_ptr()).sample_aspect_ratio = value.into().into();
199        }
200    }
201
202    #[inline]
203    pub fn set_me_comparison(&mut self, value: Comparison) {
204        unsafe {
205            (*self.as_mut_ptr()).me_cmp = value.into();
206        }
207    }
208
209    #[inline]
210    pub fn set_me_sub_comparison(&mut self, value: Comparison) {
211        unsafe {
212            (*self.as_mut_ptr()).me_sub_cmp = value.into();
213        }
214    }
215
216    #[inline]
217    pub fn set_mb_comparison(&mut self, value: Comparison) {
218        unsafe {
219            (*self.as_mut_ptr()).mb_cmp = value.into();
220        }
221    }
222
223    #[inline]
224    pub fn set_ildct_comparison(&mut self, value: Comparison) {
225        unsafe {
226            (*self.as_mut_ptr()).ildct_cmp = value.into();
227        }
228    }
229
230    #[inline]
231    pub fn set_dia_size(&mut self, value: usize) {
232        unsafe {
233            (*self.as_mut_ptr()).dia_size = value as c_int;
234        }
235    }
236
237    #[inline]
238    pub fn set_last_predictors(&mut self, value: usize) {
239        unsafe {
240            (*self.as_mut_ptr()).last_predictor_count = value as c_int;
241        }
242    }
243
244    #[inline]
245    pub fn set_me_pre_comparison(&mut self, value: Comparison) {
246        unsafe {
247            (*self.as_mut_ptr()).me_pre_cmp = value.into();
248        }
249    }
250
251    #[inline]
252    pub fn set_pre_dia_size(&mut self, value: usize) {
253        unsafe {
254            (*self.as_mut_ptr()).pre_dia_size = value as c_int;
255        }
256    }
257
258    #[inline]
259    pub fn set_me_subpel_quality(&mut self, value: usize) {
260        unsafe {
261            (*self.as_mut_ptr()).me_subpel_quality = value as c_int;
262        }
263    }
264
265    #[inline]
266    pub fn set_me_range(&mut self, value: usize) {
267        unsafe {
268            (*self.as_mut_ptr()).me_range = value as c_int;
269        }
270    }
271
272    #[inline]
273    pub fn set_mb_decision(&mut self, value: Decision) {
274        unsafe {
275            (*self.as_mut_ptr()).mb_decision = value.into();
276        }
277    }
278
279    #[inline]
280    pub fn set_mb_lmin(&mut self, value: i32) {
281        unsafe {
282            (*self.as_mut_ptr()).mb_lmin = value as c_int;
283        }
284    }
285
286    #[inline]
287    pub fn set_mb_lmax(&mut self, value: i32) {
288        unsafe {
289            (*self.as_mut_ptr()).mb_lmax = value as c_int;
290        }
291    }
292
293    #[inline]
294    pub fn set_intra_dc_precision(&mut self, value: u8) {
295        unsafe {
296            (*self.as_mut_ptr()).intra_dc_precision = i32::from(value);
297        }
298    }
299
300    #[inline]
301    pub fn set_qmin(&mut self, value: i32) {
302        unsafe {
303            (*self.as_mut_ptr()).qmin = value as c_int;
304        }
305    }
306
307    #[inline]
308    pub fn set_qmax(&mut self, value: i32) {
309        unsafe {
310            (*self.as_mut_ptr()).qmax = value as c_int;
311        }
312    }
313
314    #[inline]
315    pub fn set_global_quality(&mut self, value: i32) {
316        unsafe {
317            (*self.as_mut_ptr()).global_quality = value as c_int;
318        }
319    }
320
321    #[inline]
322    pub fn set_colorspace(&mut self, value: color::Space) {
323        unsafe {
324            (*self.as_mut_ptr()).colorspace = value.into();
325        }
326    }
327
328    #[inline]
329    pub fn colorspace(&self) -> color::Space {
330        unsafe { (*self.as_ptr()).colorspace.into() }
331    }
332
333    #[inline]
334    pub fn set_color_range(&mut self, value: color::Range) {
335        unsafe {
336            (*self.as_mut_ptr()).color_range = value.into();
337        }
338    }
339
340    #[inline]
341    pub fn color_range(&self) -> color::Range {
342        unsafe { (*self.as_ptr()).color_range.into() }
343    }
344}
345
346impl Deref for Video {
347    type Target = Super;
348
349    #[inline(always)]
350    fn deref(&self) -> &<Self as Deref>::Target {
351        &self.0
352    }
353}
354
355impl DerefMut for Video {
356    #[inline(always)]
357    fn deref_mut(&mut self) -> &mut <Self as Deref>::Target {
358        &mut self.0
359    }
360}
361
362impl AsRef<Context> for Video {
363    fn as_ref(&self) -> &Context {
364        self
365    }
366}
367
368impl AsMut<Context> for Video {
369    fn as_mut(&mut self) -> &mut Context {
370        &mut self.0
371    }
372}
373
374pub struct Encoder(pub Video);
375
376impl Encoder {
377    #[inline]
378    pub fn frame_size(&self) -> u32 {
379        unsafe { (*self.as_ptr()).frame_size as u32 }
380    }
381}
382
383impl Deref for Encoder {
384    type Target = Video;
385
386    #[inline]
387    fn deref(&self) -> &<Self as Deref>::Target {
388        &self.0
389    }
390}
391
392impl DerefMut for Encoder {
393    #[inline]
394    fn deref_mut(&mut self) -> &mut <Self as Deref>::Target {
395        &mut self.0
396    }
397}
398
399impl AsRef<Context> for Encoder {
400    fn as_ref(&self) -> &Context {
401        self
402    }
403}
404
405impl AsMut<Context> for Encoder {
406    fn as_mut(&mut self) -> &mut Context {
407        &mut self.0
408    }
409}