@@ -3,16 +3,14 @@ use std::sync::Arc;
33use webrtc:: {
44 api:: {
55 interceptor_registry:: register_default_interceptors,
6- media_engine:: { MediaEngine , MIME_TYPE_H264 , MIME_TYPE_OPUS } ,
6+ media_engine:: { MediaEngine , MIME_TYPE_H264 , MIME_TYPE_OPUS , MIME_TYPE_VP8 } ,
77 APIBuilder ,
88 } ,
99 ice_transport:: ice_server:: RTCIceServer ,
1010 interceptor:: registry:: Registry ,
1111 peer_connection:: { configuration:: RTCConfiguration , RTCPeerConnection } ,
1212 rtp_transceiver:: {
13- rtp_codec:: { RTCRtpCodecCapability , RTCRtpCodecParameters , RTPCodecType } ,
14- rtp_transceiver_direction:: RTCRtpTransceiverDirection ,
15- RTCRtpTransceiverInit ,
13+ rtp_codec:: { RTCRtpCodecCapability , RTCRtpCodecParameters , RTPCodecType } , rtp_transceiver_direction:: RTCRtpTransceiverDirection , RTCPFeedback , RTCRtpTransceiverInit
1614 } ,
1715} ;
1816
@@ -25,35 +23,7 @@ pub async fn init_peer_connection(
2523) -> Result < Arc < RTCPeerConnection > , WhipServerError > {
2624 let mut media_engine = MediaEngine :: default ( ) ;
2725
28- media_engine. register_codec (
29- RTCRtpCodecParameters {
30- capability : RTCRtpCodecCapability {
31- mime_type : MIME_TYPE_H264 . to_owned ( ) ,
32- clock_rate : 90000 ,
33- channels : 0 ,
34- sdp_fmtp_line : "" . to_owned ( ) ,
35- rtcp_feedback : vec ! [ ] ,
36- } ,
37- payload_type : 96 ,
38- ..Default :: default ( )
39- } ,
40- RTPCodecType :: Video ,
41- ) ?;
42-
43- media_engine. register_codec (
44- RTCRtpCodecParameters {
45- capability : RTCRtpCodecCapability {
46- mime_type : MIME_TYPE_OPUS . to_owned ( ) ,
47- clock_rate : 48000 ,
48- channels : 2 ,
49- sdp_fmtp_line : "" . to_owned ( ) ,
50- rtcp_feedback : vec ! [ ] ,
51- } ,
52- payload_type : 97 ,
53- ..Default :: default ( )
54- } ,
55- RTPCodecType :: Audio ,
56- ) ?;
26+ register_codecs ( & mut media_engine) ?;
5727
5828 let mut registry = Registry :: new ( ) ;
5929
@@ -98,3 +68,122 @@ pub async fn init_peer_connection(
9868
9969 Ok ( peer_connection)
10070}
71+
72+ fn register_codecs ( media_engine : & mut MediaEngine ) -> webrtc:: error:: Result < ( ) > {
73+ media_engine. register_codec (
74+ RTCRtpCodecParameters {
75+ capability : RTCRtpCodecCapability {
76+ mime_type : MIME_TYPE_OPUS . to_owned ( ) ,
77+ clock_rate : 48000 ,
78+ channels : 2 ,
79+ sdp_fmtp_line : "minptime=10;useinbandfec=1" . to_owned ( ) ,
80+ rtcp_feedback : vec ! [ ] ,
81+ } ,
82+ payload_type : 111 ,
83+ ..Default :: default ( )
84+ } ,
85+ RTPCodecType :: Audio ,
86+ ) ?;
87+
88+ let video_rtcp_feedback = vec ! [
89+ RTCPFeedback {
90+ typ: "goog-remb" . to_owned( ) ,
91+ parameter: "" . to_owned( ) ,
92+ } ,
93+ RTCPFeedback {
94+ typ: "ccm" . to_owned( ) ,
95+ parameter: "fir" . to_owned( ) ,
96+ } ,
97+ RTCPFeedback {
98+ typ: "nack" . to_owned( ) ,
99+ parameter: "" . to_owned( ) ,
100+ } ,
101+ RTCPFeedback {
102+ typ: "nack" . to_owned( ) ,
103+ parameter: "pli" . to_owned( ) ,
104+ } ,
105+ ] ;
106+ let video_codecs = vec ! [
107+ RTCRtpCodecParameters {
108+ capability: RTCRtpCodecCapability {
109+ mime_type: MIME_TYPE_VP8 . to_owned( ) ,
110+ clock_rate: 90000 ,
111+ channels: 0 ,
112+ sdp_fmtp_line: "" . to_owned( ) ,
113+ rtcp_feedback: video_rtcp_feedback. clone( ) ,
114+ } ,
115+ payload_type: 96 ,
116+ ..Default :: default ( )
117+ } ,
118+ RTCRtpCodecParameters {
119+ capability: RTCRtpCodecCapability {
120+ mime_type: MIME_TYPE_H264 . to_owned( ) ,
121+ clock_rate: 90000 ,
122+ channels: 0 ,
123+ sdp_fmtp_line:
124+ "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f"
125+ . to_owned( ) ,
126+ rtcp_feedback: video_rtcp_feedback. clone( ) ,
127+ } ,
128+ payload_type: 102 ,
129+ ..Default :: default ( )
130+ } ,
131+ RTCRtpCodecParameters {
132+ capability: RTCRtpCodecCapability {
133+ mime_type: MIME_TYPE_H264 . to_owned( ) ,
134+ clock_rate: 90000 ,
135+ channels: 0 ,
136+ sdp_fmtp_line:
137+ "level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f"
138+ . to_owned( ) ,
139+ rtcp_feedback: video_rtcp_feedback. clone( ) ,
140+ } ,
141+ payload_type: 127 ,
142+ ..Default :: default ( )
143+ } ,
144+ RTCRtpCodecParameters {
145+ capability: RTCRtpCodecCapability {
146+ mime_type: MIME_TYPE_H264 . to_owned( ) ,
147+ clock_rate: 90000 ,
148+ channels: 0 ,
149+ sdp_fmtp_line:
150+ "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f"
151+ . to_owned( ) ,
152+ rtcp_feedback: video_rtcp_feedback. clone( ) ,
153+ } ,
154+ payload_type: 125 ,
155+ ..Default :: default ( )
156+ } ,
157+ RTCRtpCodecParameters {
158+ capability: RTCRtpCodecCapability {
159+ mime_type: MIME_TYPE_H264 . to_owned( ) ,
160+ clock_rate: 90000 ,
161+ channels: 0 ,
162+ sdp_fmtp_line:
163+ "level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f"
164+ . to_owned( ) ,
165+ rtcp_feedback: video_rtcp_feedback. clone( ) ,
166+ } ,
167+ payload_type: 108 ,
168+ ..Default :: default ( )
169+ } ,
170+ RTCRtpCodecParameters {
171+ capability: RTCRtpCodecCapability {
172+ mime_type: MIME_TYPE_H264 . to_owned( ) ,
173+ clock_rate: 90000 ,
174+ channels: 0 ,
175+ sdp_fmtp_line:
176+ "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032"
177+ . to_owned( ) ,
178+ rtcp_feedback: video_rtcp_feedback. clone( ) ,
179+ } ,
180+ payload_type: 123 ,
181+ ..Default :: default ( )
182+ } ,
183+ ] ;
184+ for codec in video_codecs {
185+ media_engine. register_codec ( codec, RTPCodecType :: Video ) ?;
186+ }
187+
188+ Ok ( ( ) )
189+ }
0 commit comments