ffmpeg_next/codec/
video.rs

1use std::ops::Deref;
2
3use super::codec::Codec;
4use ffi::*;
5use {format, Rational};
6
7#[derive(PartialEq, Eq, Copy, Clone)]
8pub struct Video {
9    codec: Codec,
10}
11
12impl Video {
13    pub unsafe fn new(codec: Codec) -> Video {
14        Video { codec }
15    }
16}
17
18impl Video {
19    pub fn rates(&self) -> Option<RateIter> {
20        unsafe {
21            if (*self.codec.as_ptr()).supported_framerates.is_null() {
22                None
23            } else {
24                Some(RateIter::new((*self.codec.as_ptr()).supported_framerates))
25            }
26        }
27    }
28
29    pub fn formats(&self) -> Option<FormatIter> {
30        unsafe {
31            if (*self.codec.as_ptr()).pix_fmts.is_null() {
32                None
33            } else {
34                Some(FormatIter::new((*self.codec.as_ptr()).pix_fmts))
35            }
36        }
37    }
38}
39
40impl Deref for Video {
41    type Target = Codec;
42
43    fn deref(&self) -> &Self::Target {
44        &self.codec
45    }
46}
47
48pub struct RateIter {
49    ptr: *const AVRational,
50}
51
52impl RateIter {
53    pub fn new(ptr: *const AVRational) -> Self {
54        RateIter { ptr }
55    }
56}
57
58impl Iterator for RateIter {
59    type Item = Rational;
60
61    fn next(&mut self) -> Option<<Self as Iterator>::Item> {
62        unsafe {
63            if (*self.ptr).num == 0 && (*self.ptr).den == 0 {
64                return None;
65            }
66
67            let rate = (*self.ptr).into();
68            self.ptr = self.ptr.offset(1);
69
70            Some(rate)
71        }
72    }
73}
74
75pub struct FormatIter {
76    ptr: *const AVPixelFormat,
77}
78
79impl FormatIter {
80    pub fn new(ptr: *const AVPixelFormat) -> Self {
81        FormatIter { ptr }
82    }
83}
84
85impl Iterator for FormatIter {
86    type Item = format::Pixel;
87
88    fn next(&mut self) -> Option<<Self as Iterator>::Item> {
89        unsafe {
90            if *self.ptr == AVPixelFormat::AV_PIX_FMT_NONE {
91                return None;
92            }
93
94            let format = (*self.ptr).into();
95            self.ptr = self.ptr.offset(1);
96
97            Some(format)
98        }
99    }
100}