|
1 | | -use std::borrow::Cow; |
2 | | -use std::fmt; |
3 | | - |
4 | | -use util::{Marshal, MarshalSize}; |
5 | | - |
6 | 1 | pub mod abs_send_time_extension; |
7 | 2 | pub mod audio_level_extension; |
8 | 3 | pub mod transport_cc_extension; |
9 | 4 | pub mod video_orientation_extension; |
10 | | - |
11 | | -/// A generic RTP header extension. |
12 | | -pub enum HeaderExtension { |
13 | | - AbsSendTime(abs_send_time_extension::AbsSendTimeExtension), |
14 | | - AudioLevel(audio_level_extension::AudioLevelExtension), |
15 | | - TransportCc(transport_cc_extension::TransportCcExtension), |
16 | | - VideoOrientation(video_orientation_extension::VideoOrientationExtension), |
17 | | - |
18 | | - /// A custom extension |
19 | | - Custom { |
20 | | - uri: Cow<'static, str>, |
21 | | - extension: Box<dyn Marshal + Send + Sync + 'static>, |
22 | | - }, |
23 | | -} |
24 | | - |
25 | | -impl HeaderExtension { |
26 | | - pub fn uri(&self) -> Cow<'static, str> { |
27 | | - use HeaderExtension::*; |
28 | | - |
29 | | - match self { |
30 | | - AbsSendTime(_) => "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time".into(), |
31 | | - AudioLevel(_) => "urn:ietf:params:rtp-hdrext:ssrc-audio-level".into(), |
32 | | - TransportCc(_) => { |
33 | | - "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01".into() |
34 | | - } |
35 | | - VideoOrientation(_) => "urn:3gpp:video-orientation".into(), |
36 | | - Custom { uri, .. } => uri.clone(), |
37 | | - } |
38 | | - } |
39 | | -} |
40 | | - |
41 | | -impl MarshalSize for HeaderExtension { |
42 | | - fn marshal_size(&self) -> usize { |
43 | | - use HeaderExtension::*; |
44 | | - match self { |
45 | | - AbsSendTime(ext) => ext.marshal_size(), |
46 | | - AudioLevel(ext) => ext.marshal_size(), |
47 | | - TransportCc(ext) => ext.marshal_size(), |
48 | | - VideoOrientation(ext) => ext.marshal_size(), |
49 | | - Custom { extension: ext, .. } => ext.marshal_size(), |
50 | | - } |
51 | | - } |
52 | | -} |
53 | | - |
54 | | -impl Marshal for HeaderExtension { |
55 | | - fn marshal_to(&self, buf: &mut [u8]) -> util::Result<usize> { |
56 | | - use HeaderExtension::*; |
57 | | - match self { |
58 | | - AbsSendTime(ext) => ext.marshal_to(buf), |
59 | | - AudioLevel(ext) => ext.marshal_to(buf), |
60 | | - TransportCc(ext) => ext.marshal_to(buf), |
61 | | - VideoOrientation(ext) => ext.marshal_to(buf), |
62 | | - Custom { extension: ext, .. } => ext.marshal_to(buf), |
63 | | - } |
64 | | - } |
65 | | -} |
66 | | - |
67 | | -impl fmt::Debug for HeaderExtension { |
68 | | - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
69 | | - use HeaderExtension::*; |
70 | | - |
71 | | - match self { |
72 | | - AbsSendTime(ext) => f.debug_tuple("AbsSendTime").field(ext).finish(), |
73 | | - AudioLevel(ext) => f.debug_tuple("AudioLevel").field(ext).finish(), |
74 | | - TransportCc(ext) => f.debug_tuple("TransportCc").field(ext).finish(), |
75 | | - VideoOrientation(ext) => f.debug_tuple("VideoOrientation").field(ext).finish(), |
76 | | - Custom { uri, extension: _ } => f.debug_struct("Custom").field("uri", uri).finish(), |
77 | | - } |
78 | | - } |
79 | | -} |
0 commit comments