1 #[cfg(test)]
2 mod interceptor_registry_test;
3
4 use crate::api::media_engine::MediaEngine;
5 use crate::error::Result;
6 use crate::rtp_transceiver::rtp_codec::RTCRtpHeaderExtensionCapability;
7 use crate::rtp_transceiver::{rtp_codec::RTPCodecType, RTCPFeedback, TYPE_RTCP_FB_TRANSPORT_CC};
8
9 use interceptor::nack::{generator::Generator, responder::Responder};
10 use interceptor::registry::Registry;
11 use interceptor::report::{receiver::ReceiverReport, sender::SenderReport};
12 use interceptor::twcc::{receiver::Receiver, sender::Sender};
13
14 /// register_default_interceptors will register some useful interceptors.
15 /// If you want to customize which interceptors are loaded, you should copy the
16 /// code from this method and remove unwanted interceptors.
register_default_interceptors( mut registry: Registry, media_engine: &mut MediaEngine, ) -> Result<Registry>17 pub fn register_default_interceptors(
18 mut registry: Registry,
19 media_engine: &mut MediaEngine,
20 ) -> Result<Registry> {
21 registry = configure_nack(registry, media_engine);
22
23 registry = configure_rtcp_reports(registry);
24
25 registry = configure_twcc_receiver_only(registry, media_engine)?;
26
27 Ok(registry)
28 }
29
30 /// configure_rtcp_reports will setup everything necessary for generating Sender and Receiver Reports
configure_rtcp_reports(mut registry: Registry) -> Registry31 pub fn configure_rtcp_reports(mut registry: Registry) -> Registry {
32 let receiver = Box::new(ReceiverReport::builder());
33 let sender = Box::new(SenderReport::builder());
34 registry.add(receiver);
35 registry.add(sender);
36 registry
37 }
38
39 /// configure_nack will setup everything necessary for handling generating/responding to nack messages.
configure_nack(mut registry: Registry, media_engine: &mut MediaEngine) -> Registry40 pub fn configure_nack(mut registry: Registry, media_engine: &mut MediaEngine) -> Registry {
41 media_engine.register_feedback(
42 RTCPFeedback {
43 typ: "nack".to_owned(),
44 parameter: "".to_owned(),
45 },
46 RTPCodecType::Video,
47 );
48 media_engine.register_feedback(
49 RTCPFeedback {
50 typ: "nack".to_owned(),
51 parameter: "pli".to_owned(),
52 },
53 RTPCodecType::Video,
54 );
55
56 let generator = Box::new(Generator::builder());
57 let responder = Box::new(Responder::builder());
58 registry.add(responder);
59 registry.add(generator);
60 registry
61 }
62
63 /// configure_twcc will setup everything necessary for adding
64 /// a TWCC header extension to outgoing RTP packets and generating TWCC reports.
configure_twcc(mut registry: Registry, media_engine: &mut MediaEngine) -> Result<Registry>65 pub fn configure_twcc(mut registry: Registry, media_engine: &mut MediaEngine) -> Result<Registry> {
66 media_engine.register_feedback(
67 RTCPFeedback {
68 typ: TYPE_RTCP_FB_TRANSPORT_CC.to_owned(),
69 ..Default::default()
70 },
71 RTPCodecType::Video,
72 );
73 media_engine.register_header_extension(
74 RTCRtpHeaderExtensionCapability {
75 uri: sdp::extmap::TRANSPORT_CC_URI.to_owned(),
76 },
77 RTPCodecType::Video,
78 None,
79 )?;
80
81 media_engine.register_feedback(
82 RTCPFeedback {
83 typ: TYPE_RTCP_FB_TRANSPORT_CC.to_owned(),
84 ..Default::default()
85 },
86 RTPCodecType::Audio,
87 );
88 media_engine.register_header_extension(
89 RTCRtpHeaderExtensionCapability {
90 uri: sdp::extmap::TRANSPORT_CC_URI.to_owned(),
91 },
92 RTPCodecType::Audio,
93 None,
94 )?;
95
96 let sender = Box::new(Sender::builder());
97 let receiver = Box::new(Receiver::builder());
98 registry.add(sender);
99 registry.add(receiver);
100 Ok(registry)
101 }
102
103 /// configure_twcc_sender will setup everything necessary for adding
104 /// a TWCC header extension to outgoing RTP packets. This will allow the remote peer to generate TWCC reports.
configure_twcc_sender_only( mut registry: Registry, media_engine: &mut MediaEngine, ) -> Result<Registry>105 pub fn configure_twcc_sender_only(
106 mut registry: Registry,
107 media_engine: &mut MediaEngine,
108 ) -> Result<Registry> {
109 media_engine.register_header_extension(
110 RTCRtpHeaderExtensionCapability {
111 uri: sdp::extmap::TRANSPORT_CC_URI.to_owned(),
112 },
113 RTPCodecType::Video,
114 None,
115 )?;
116
117 media_engine.register_header_extension(
118 RTCRtpHeaderExtensionCapability {
119 uri: sdp::extmap::TRANSPORT_CC_URI.to_owned(),
120 },
121 RTPCodecType::Audio,
122 None,
123 )?;
124
125 let sender = Box::new(Sender::builder());
126 registry.add(sender);
127 Ok(registry)
128 }
129
130 /// configure_twcc_receiver will setup everything necessary for generating TWCC reports.
configure_twcc_receiver_only( mut registry: Registry, media_engine: &mut MediaEngine, ) -> Result<Registry>131 pub fn configure_twcc_receiver_only(
132 mut registry: Registry,
133 media_engine: &mut MediaEngine,
134 ) -> Result<Registry> {
135 media_engine.register_feedback(
136 RTCPFeedback {
137 typ: TYPE_RTCP_FB_TRANSPORT_CC.to_owned(),
138 ..Default::default()
139 },
140 RTPCodecType::Video,
141 );
142 media_engine.register_header_extension(
143 RTCRtpHeaderExtensionCapability {
144 uri: sdp::extmap::TRANSPORT_CC_URI.to_owned(),
145 },
146 RTPCodecType::Video,
147 None,
148 )?;
149
150 media_engine.register_feedback(
151 RTCPFeedback {
152 typ: TYPE_RTCP_FB_TRANSPORT_CC.to_owned(),
153 ..Default::default()
154 },
155 RTPCodecType::Audio,
156 );
157 media_engine.register_header_extension(
158 RTCRtpHeaderExtensionCapability {
159 uri: sdp::extmap::TRANSPORT_CC_URI.to_owned(),
160 },
161 RTPCodecType::Audio,
162 None,
163 )?;
164
165 let receiver = Box::new(Receiver::builder());
166 registry.add(receiver);
167 Ok(registry)
168 }
169