gstreamer_video/
flag_serde.rs
1use glib::{
4 prelude::*,
5 translate::{from_glib, ToGlibPtr},
6 FlagsClass,
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(feature = "v1_22")]
84 check_serialize!(
85 crate::VideoFormatFlags::all(),
86 "\"yuv+rgb+gray+alpha+le+palette+complex+unpack+tiled+subtiles\""
87 );
88 check_serialize!(
89 crate::VideoFrameFlags::all(),
90 "\"interlaced+tff+rff+onefield+multiple-view+first-in-bundle\""
91 );
92 check_serialize!(
93 crate::VideoMultiviewFlags::all(),
94 concat!(
95 "\"right-view-first+left-flipped+left-flopped+right-flipped",
96 "+right-flopped+half-aspect+mixed-mono\""
97 )
98 );
99 #[cfg(feature = "v1_16")]
100 check_serialize!(
101 crate::VideoOverlayFormatFlags::all(),
102 "\"premultiplied-alpha+global-alpha\""
103 );
104 check_serialize!(
105 crate::VideoPackFlags::all(),
106 "\"truncate-range+interlaced\""
107 );
108 #[cfg(feature = "v1_18")]
109 check_serialize!(
110 crate::VideoTimeCodeFlags::all(),
111 "\"drop-frame+interlaced\""
112 );
113 }
114
115 #[test]
116 fn test_deserialize() {
117 gst::init().unwrap();
118
119 #[cfg(feature = "v1_22")]
120 check_deserialize!(
121 crate::NavigationModifierType,
122 crate::NavigationModifierType::all(),
123 concat!(
124 "\"shift-mask+lock-mask+control-mask+mod1-mask+mod2-mask",
125 "+mod3-mask+mod4-mask+mod5-mask+button1-mask",
126 "+button2-mask+button3-mask+button4-mask+button5-mask",
127 "+super-mask+hyper-mask+meta-mask\""
128 )
129 );
130 #[cfg(feature = "v1_18")]
131 check_deserialize!(
132 crate::VideoBufferFlags,
133 crate::VideoBufferFlags::all(),
134 "\"interlaced+tff+rff+onefield+multiple-view+first-in-bundle+marker\""
135 );
136 check_deserialize!(
137 crate::VideoChromaSite,
138 crate::VideoChromaSite::all(),
139 "\"none+h-cosited+v-cosited+alt-line\""
140 );
141 #[cfg(feature = "v1_20")]
142 check_deserialize!(
143 crate::VideoCodecFrameFlags,
144 crate::VideoCodecFrameFlags::all(),
145 "\"decode-only+sync-point+force-keyframe+force-keyframe-headers+corrupted\""
146 );
147 #[cfg(feature = "v1_20")]
148 check_deserialize!(
149 crate::VideoDecoderRequestSyncPointFlags,
150 crate::VideoDecoderRequestSyncPointFlags::all(),
151 "\"discard-input+corrupt-output\""
152 );
153 check_deserialize!(
154 crate::VideoFlags,
155 crate::VideoFlags::all(),
156 "\"variable-fps+premultiplied-alpha\""
157 );
158 #[cfg(feature = "v1_22")]
159 check_deserialize!(
160 crate::VideoFormatFlags,
161 crate::VideoFormatFlags::all(),
162 "\"yuv+rgb+gray+alpha+le+palette+complex+unpack+tiled+subtiles\""
163 );
164 check_deserialize!(
165 crate::VideoFrameFlags,
166 crate::VideoFrameFlags::all(),
167 "\"interlaced+tff+rff+onefield+multiple-view+first-in-bundle\""
168 );
169 check_deserialize!(
170 crate::VideoMultiviewFlags,
171 crate::VideoMultiviewFlags::all(),
172 concat!(
173 "\"right-view-first+left-flipped+left-flopped+right-flipped",
174 "+right-flopped+half-aspect+mixed-mono\""
175 )
176 );
177 #[cfg(feature = "v1_16")]
178 check_deserialize!(
179 crate::VideoOverlayFormatFlags,
180 crate::VideoOverlayFormatFlags::all(),
181 "\"premultiplied-alpha+global-alpha\""
182 );
183 check_deserialize!(
184 crate::VideoPackFlags,
185 crate::VideoPackFlags::all(),
186 "\"truncate-range+interlaced\""
187 );
188 #[cfg(feature = "v1_18")]
189 check_deserialize!(
190 crate::VideoTimeCodeFlags,
191 crate::VideoTimeCodeFlags::all(),
192 "\"drop-frame+interlaced\""
193 );
194 }
195
196 #[test]
197 fn test_serde_roundtrip() {
198 gst::init().unwrap();
199
200 #[cfg(feature = "v1_22")]
201 check_roundtrip!(
202 crate::NavigationModifierType,
203 crate::NavigationModifierType::all()
204 );
205 #[cfg(feature = "v1_18")]
206 check_roundtrip!(crate::VideoBufferFlags, crate::VideoBufferFlags::all());
207 check_roundtrip!(crate::VideoChromaSite, crate::VideoChromaSite::all());
208 #[cfg(feature = "v1_20")]
209 check_roundtrip!(
210 crate::VideoCodecFrameFlags,
211 crate::VideoCodecFrameFlags::all()
212 );
213 #[cfg(feature = "v1_20")]
214 check_roundtrip!(
215 crate::VideoDecoderRequestSyncPointFlags,
216 crate::VideoDecoderRequestSyncPointFlags::all()
217 );
218 check_roundtrip!(crate::VideoFlags, crate::VideoFlags::all());
219 #[cfg(feature = "v1_22")]
220 check_roundtrip!(crate::VideoFormatFlags, crate::VideoFormatFlags::all());
221 check_roundtrip!(crate::VideoFrameFlags, crate::VideoFrameFlags::all());
222 check_roundtrip!(
223 crate::VideoMultiviewFlags,
224 crate::VideoMultiviewFlags::all()
225 );
226 #[cfg(feature = "v1_16")]
227 check_roundtrip!(
228 crate::VideoOverlayFormatFlags,
229 crate::VideoOverlayFormatFlags::all()
230 );
231 check_roundtrip!(crate::VideoPackFlags, crate::VideoPackFlags::all());
232 #[cfg(feature = "v1_18")]
233 check_roundtrip!(crate::VideoTimeCodeFlags, crate::VideoTimeCodeFlags::all());
234 }
235}