ffmpeg_the_third/codec/encoder/
video.rs1use 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}