gstreamer_video/
flag_serde.rs1use 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}