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