gstreamer_rtp/
flag_serde.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use glib::{
4    prelude::*,
5    translate::{from_glib, ToGlibPtr},
6    FlagsClass,
7};
8use gst::{bitflags_deserialize_impl, bitflags_serde_impl, bitflags_serialize_impl};
9
10bitflags_serialize_impl!(crate::RTPBufferFlags, by_ones_decreasing);
11bitflags_deserialize_impl!(crate::RTPBufferFlags);
12bitflags_serde_impl!(crate::RTPBufferMapFlags);
13// use this implementation, since serializing to "sendonly+recvonly"
14// wouldn't make much sense
15bitflags_serialize_impl!(
16    crate::RTPHeaderExtensionDirection,
17    by_ones_decreasing,
18    "v1_20"
19);
20bitflags_deserialize_impl!(crate::RTPHeaderExtensionDirection, "v1_20");
21bitflags_serde_impl!(crate::RTPHeaderExtensionFlags, "v1_20");
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        check_serialize!(crate::RTPBufferFlags::all(), "\"retransmission+redundant\"");
52        check_serialize!(crate::RTPBufferMapFlags::all(), "\"skip-padding\"");
53        #[cfg(feature = "v1_20")]
54        check_serialize!(
55            crate::RTPHeaderExtensionDirection::all(),
56            "\"sendrecv+inherited\""
57        );
58        #[cfg(feature = "v1_20")]
59        check_serialize!(
60            crate::RTPHeaderExtensionDirection::INACTIVE
61                | crate::RTPHeaderExtensionDirection::SENDONLY
62                | crate::RTPHeaderExtensionDirection::INHERITED,
63            "\"sendonly+inherited\""
64        );
65        #[cfg(feature = "v1_20")]
66        check_serialize!(
67            crate::RTPHeaderExtensionFlags::all(),
68            "\"one-byte+two-byte\""
69        );
70    }
71
72    #[test]
73    fn test_deserialize() {
74        gst::init().unwrap();
75
76        check_deserialize!(
77            crate::RTPBufferFlags,
78            crate::RTPBufferFlags::all(),
79            "\"retransmission+redundant\""
80        );
81        check_deserialize!(
82            crate::RTPBufferMapFlags,
83            crate::RTPBufferMapFlags::all(),
84            "\"skip-padding\""
85        );
86        #[cfg(feature = "v1_20")]
87        check_deserialize!(
88            crate::RTPHeaderExtensionDirection,
89            crate::RTPHeaderExtensionDirection::all(),
90            "\"sendrecv+inactive+inherited\""
91        );
92        #[cfg(feature = "v1_20")]
93        check_deserialize!(
94            crate::RTPHeaderExtensionFlags,
95            crate::RTPHeaderExtensionFlags::all(),
96            "\"one-byte+two-byte\""
97        );
98    }
99
100    #[test]
101    fn test_serde_roundtrip() {
102        gst::init().unwrap();
103
104        check_roundtrip!(crate::RTPBufferFlags, crate::RTPBufferFlags::all());
105        check_roundtrip!(crate::RTPBufferMapFlags, crate::RTPBufferMapFlags::all());
106        #[cfg(feature = "v1_20")]
107        check_roundtrip!(
108            crate::RTPHeaderExtensionDirection,
109            crate::RTPHeaderExtensionDirection::all()
110        );
111        #[cfg(feature = "v1_20")]
112        check_roundtrip!(
113            crate::RTPHeaderExtensionFlags,
114            crate::RTPHeaderExtensionFlags::all()
115        );
116    }
117}