Skip to main content

gstreamer_video/
flag_serde.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use glib::{
4    FlagsClass,
5    prelude::*,
6    translate::{ToGlibPtr, from_glib},
7};
8use gst::bitflags_serde_impl;
9
10bitflags_serde_impl!(crate::NavigationModifierType, "v1_22");
11bitflags_serde_impl!(crate::VideoBufferFlags);
12bitflags_serde_impl!(crate::VideoChromaSite);
13bitflags_serde_impl!(crate::VideoCodecFrameFlags, "v1_20");
14bitflags_serde_impl!(crate::VideoDecoderRequestSyncPointFlags, "v1_20");
15bitflags_serde_impl!(crate::VideoFlags);
16bitflags_serde_impl!(crate::VideoFormatFlags);
17bitflags_serde_impl!(crate::VideoFrameFlags);
18bitflags_serde_impl!(crate::VideoMultiviewFlags);
19bitflags_serde_impl!(crate::VideoOverlayFormatFlags, "v1_16");
20bitflags_serde_impl!(crate::VideoPackFlags);
21bitflags_serde_impl!(crate::VideoTimeCodeFlags, "v1_18");
22
23#[cfg(test)]
24mod tests {
25    macro_rules! check_serialize {
26        ($flags:expr, $expected:expr) => {
27            let actual = serde_json::to_string(&$flags).unwrap();
28            assert_eq!(actual, $expected);
29        };
30    }
31
32    macro_rules! check_deserialize {
33        ($ty:ty, $expected:expr, $json:expr) => {
34            let actual: $ty = serde_json::from_str(&$json).unwrap();
35            assert_eq!(actual, $expected);
36        };
37    }
38
39    macro_rules! check_roundtrip {
40        ($ty:ty, $flags:expr) => {
41            let json = serde_json::to_string(&$flags).unwrap();
42            let deserialized: $ty = serde_json::from_str(&json).unwrap();
43            assert_eq!(deserialized, $flags);
44        };
45    }
46
47    #[test]
48    fn test_serialize() {
49        gst::init().unwrap();
50
51        #[cfg(feature = "v1_22")]
52        check_serialize!(
53            crate::NavigationModifierType::all(),
54            concat!(
55                "\"shift-mask+lock-mask+control-mask+mod1-mask+mod2-mask+mod3-mask",
56                "+mod4-mask+mod5-mask+button1-mask+button2-mask+button3-mask",
57                "+button4-mask+button5-mask+super-mask+hyper-mask+meta-mask\""
58            )
59        );
60        #[cfg(feature = "v1_18")]
61        check_serialize!(
62            crate::VideoBufferFlags::all(),
63            "\"interlaced+tff+rff+onefield+multiple-view+first-in-bundle+marker\""
64        );
65        check_serialize!(
66            crate::VideoChromaSite::all(),
67            "\"none+h-cosited+v-cosited+alt-line\""
68        );
69        #[cfg(feature = "v1_20")]
70        check_serialize!(
71            crate::VideoCodecFrameFlags::all(),
72            "\"decode-only+sync-point+force-keyframe+force-keyframe-headers+corrupted\""
73        );
74        #[cfg(feature = "v1_20")]
75        check_serialize!(
76            crate::VideoDecoderRequestSyncPointFlags::all(),
77            "\"discard-input+corrupt-output\""
78        );
79        check_serialize!(
80            crate::VideoFlags::all(),
81            "\"variable-fps+premultiplied-alpha\""
82        );
83        #[cfg(all(feature = "v1_22", not(feature = "v1_30")))]
84        check_serialize!(
85            crate::VideoFormatFlags::all(),
86            "\"yuv+rgb+gray+alpha+le+palette+complex+unpack+tiled+subtiles\""
87        );
88        #[cfg(feature = "v1_30")]
89        check_serialize!(
90            crate::VideoFormatFlags::all(),
91            "\"yuv+rgb+gray+alpha+le+palette+complex+unpack+tiled+subtiles+float\""
92        );
93        check_serialize!(
94            crate::VideoFrameFlags::all(),
95            "\"interlaced+tff+rff+onefield+multiple-view+first-in-bundle\""
96        );
97        check_serialize!(
98            crate::VideoMultiviewFlags::all(),
99            concat!(
100                "\"right-view-first+left-flipped+left-flopped+right-flipped",
101                "+right-flopped+half-aspect+mixed-mono\""
102            )
103        );
104        #[cfg(feature = "v1_16")]
105        check_serialize!(
106            crate::VideoOverlayFormatFlags::all(),
107            "\"premultiplied-alpha+global-alpha\""
108        );
109        check_serialize!(
110            crate::VideoPackFlags::all(),
111            "\"truncate-range+interlaced\""
112        );
113        #[cfg(feature = "v1_30")]
114        check_serialize!(
115            crate::VideoTimeCodeFlags::all(),
116            "\"drop-frame+interlaced+discont\""
117        );
118    }
119
120    #[test]
121    fn test_deserialize() {
122        gst::init().unwrap();
123
124        #[cfg(feature = "v1_22")]
125        check_deserialize!(
126            crate::NavigationModifierType,
127            crate::NavigationModifierType::all(),
128            concat!(
129                "\"shift-mask+lock-mask+control-mask+mod1-mask+mod2-mask",
130                "+mod3-mask+mod4-mask+mod5-mask+button1-mask",
131                "+button2-mask+button3-mask+button4-mask+button5-mask",
132                "+super-mask+hyper-mask+meta-mask\""
133            )
134        );
135        #[cfg(feature = "v1_18")]
136        check_deserialize!(
137            crate::VideoBufferFlags,
138            crate::VideoBufferFlags::all(),
139            "\"interlaced+tff+rff+onefield+multiple-view+first-in-bundle+marker\""
140        );
141        check_deserialize!(
142            crate::VideoChromaSite,
143            crate::VideoChromaSite::all(),
144            "\"none+h-cosited+v-cosited+alt-line\""
145        );
146        #[cfg(feature = "v1_20")]
147        check_deserialize!(
148            crate::VideoCodecFrameFlags,
149            crate::VideoCodecFrameFlags::all(),
150            "\"decode-only+sync-point+force-keyframe+force-keyframe-headers+corrupted\""
151        );
152        #[cfg(feature = "v1_20")]
153        check_deserialize!(
154            crate::VideoDecoderRequestSyncPointFlags,
155            crate::VideoDecoderRequestSyncPointFlags::all(),
156            "\"discard-input+corrupt-output\""
157        );
158        check_deserialize!(
159            crate::VideoFlags,
160            crate::VideoFlags::all(),
161            "\"variable-fps+premultiplied-alpha\""
162        );
163        #[cfg(all(feature = "v1_22", not(feature = "v1_30")))]
164        check_deserialize!(
165            crate::VideoFormatFlags,
166            crate::VideoFormatFlags::all(),
167            "\"yuv+rgb+gray+alpha+le+palette+complex+unpack+tiled+subtiles\""
168        );
169        #[cfg(feature = "v1_30")]
170        check_deserialize!(
171            crate::VideoFormatFlags,
172            crate::VideoFormatFlags::all(),
173            "\"yuv+rgb+gray+alpha+le+palette+complex+unpack+tiled+subtiles+float\""
174        );
175        check_deserialize!(
176            crate::VideoFrameFlags,
177            crate::VideoFrameFlags::all(),
178            "\"interlaced+tff+rff+onefield+multiple-view+first-in-bundle\""
179        );
180        check_deserialize!(
181            crate::VideoMultiviewFlags,
182            crate::VideoMultiviewFlags::all(),
183            concat!(
184                "\"right-view-first+left-flipped+left-flopped+right-flipped",
185                "+right-flopped+half-aspect+mixed-mono\""
186            )
187        );
188        #[cfg(feature = "v1_16")]
189        check_deserialize!(
190            crate::VideoOverlayFormatFlags,
191            crate::VideoOverlayFormatFlags::all(),
192            "\"premultiplied-alpha+global-alpha\""
193        );
194        check_deserialize!(
195            crate::VideoPackFlags,
196            crate::VideoPackFlags::all(),
197            "\"truncate-range+interlaced\""
198        );
199        #[cfg(feature = "v1_30")]
200        check_deserialize!(
201            crate::VideoTimeCodeFlags,
202            crate::VideoTimeCodeFlags::all(),
203            "\"drop-frame+interlaced+discont\""
204        );
205    }
206
207    #[test]
208    fn test_serde_roundtrip() {
209        gst::init().unwrap();
210
211        #[cfg(feature = "v1_22")]
212        check_roundtrip!(
213            crate::NavigationModifierType,
214            crate::NavigationModifierType::all()
215        );
216        #[cfg(feature = "v1_18")]
217        check_roundtrip!(crate::VideoBufferFlags, crate::VideoBufferFlags::all());
218        check_roundtrip!(crate::VideoChromaSite, crate::VideoChromaSite::all());
219        #[cfg(feature = "v1_20")]
220        check_roundtrip!(
221            crate::VideoCodecFrameFlags,
222            crate::VideoCodecFrameFlags::all()
223        );
224        #[cfg(feature = "v1_20")]
225        check_roundtrip!(
226            crate::VideoDecoderRequestSyncPointFlags,
227            crate::VideoDecoderRequestSyncPointFlags::all()
228        );
229        check_roundtrip!(crate::VideoFlags, crate::VideoFlags::all());
230        #[cfg(feature = "v1_22")]
231        check_roundtrip!(crate::VideoFormatFlags, crate::VideoFormatFlags::all());
232        check_roundtrip!(crate::VideoFrameFlags, crate::VideoFrameFlags::all());
233        check_roundtrip!(
234            crate::VideoMultiviewFlags,
235            crate::VideoMultiviewFlags::all()
236        );
237        #[cfg(feature = "v1_16")]
238        check_roundtrip!(
239            crate::VideoOverlayFormatFlags,
240            crate::VideoOverlayFormatFlags::all()
241        );
242        check_roundtrip!(crate::VideoPackFlags, crate::VideoPackFlags::all());
243        #[cfg(feature = "v1_18")]
244        check_roundtrip!(crate::VideoTimeCodeFlags, crate::VideoTimeCodeFlags::all());
245    }
246}