@@ -5,7 +5,7 @@ defmodule ExWebRTC.RTPSender do
5
5
require Logger
6
6
7
7
alias ExRTCP.Packet . { TransportFeedback.NACK , PayloadFeedback.PLI }
8
- alias ExWebRTC . { MediaStreamTrack , RTPCodecParameters , Utils }
8
+ alias ExWebRTC . { MediaStreamTrack , RTPCodecParameters , Utils , PeerConnection.Configuration }
9
9
alias ExSDP.Attribute.Extmap
10
10
alias __MODULE__ . { NACKResponder , ReportRecorder }
11
11
@@ -22,8 +22,6 @@ defmodule ExWebRTC.RTPSender do
22
22
codecs: [ RTPCodecParameters . t ( ) ] ,
23
23
rtp_hdr_exts: % { Extmap . extension_id ( ) => Extmap . t ( ) } ,
24
24
mid: String . t ( ) | nil ,
25
- pt: non_neg_integer ( ) | nil ,
26
- rtx_pt: non_neg_integer ( ) | nil ,
27
25
# ssrc and rtx_ssrc are always present, even if there is no track,
28
26
# or transceiver direction is recvonly.
29
27
# We preallocate them so they can be included in SDP when needed.
@@ -81,15 +79,8 @@ defmodule ExWebRTC.RTPSender do
81
79
# convert to a map to be able to find extension id using extension uri
82
80
rtp_hdr_exts = Map . new ( rtp_hdr_exts , fn extmap -> { extmap . uri , extmap } end )
83
81
84
- # We always only take one codec to avoid ambiguity when assigning payload type for RTP packets.
85
- # In other case, if PeerConnection negotiated multiple codecs,
86
- # user would have to pass RTP codec when sending RTP packets,
87
- # or assign payload type on their own.
88
- { codec , rtx_codec } = get_default_codec ( codecs )
89
-
90
82
# TODO: handle cases when codec == nil (no valid codecs after negotiation)
91
- pt = if codec != nil , do: codec . payload_type , else: nil
92
- rtx_pt = if rtx_codec != nil , do: rtx_codec . payload_type , else: nil
83
+ { codec , rtx_codec } = get_default_codec ( codecs )
93
84
94
85
% {
95
86
id: Utils . generate_id ( ) ,
@@ -98,8 +89,6 @@ defmodule ExWebRTC.RTPSender do
98
89
rtx_codec: rtx_codec ,
99
90
codecs: codecs ,
100
91
rtp_hdr_exts: rtp_hdr_exts ,
101
- pt: pt ,
102
- rtx_pt: rtx_pt ,
103
92
ssrc: ssrc ,
104
93
rtx_ssrc: rtx_ssrc ,
105
94
mid: mid ,
@@ -126,30 +115,25 @@ defmodule ExWebRTC.RTPSender do
126
115
127
116
# Keep already selected codec if it is still supported.
128
117
# Otherwise, clear it and wait until user sets it again.
129
- codec = if sender . codec in codecs , do: sender . codec , else: nil
118
+ # TODO: handle cases when codec == nil (no valid codecs after negotiation)
119
+ codec = if supported? ( codecs , sender . codec ) , do: sender . codec , else: nil
130
120
rtx_codec = codec && find_associated_rtx_codec ( codecs , codec )
131
121
132
122
log_codec_change ( sender , codec , codecs )
133
123
log_rtx_codec_change ( sender , rtx_codec , codecs )
134
124
135
- # TODO: handle cases when codec == nil (no valid codecs after negotiation)
136
- pt = if codec != nil , do: codec . payload_type , else: nil
137
- rtx_pt = if rtx_codec != nil , do: rtx_codec . payload_type , else: nil
138
-
139
125
% {
140
126
sender
141
127
| mid: mid ,
142
128
codec: codec ,
143
129
rtx_codec: rtx_codec ,
144
130
codecs: codecs ,
145
- rtp_hdr_exts: rtp_hdr_exts ,
146
- pt: pt ,
147
- rtx_pt: rtx_pt
131
+ rtp_hdr_exts: rtp_hdr_exts
148
132
}
149
133
end
150
134
151
135
defp log_codec_change ( % { codec: codec } = sender , nil , neg_codecs ) when codec != nil do
152
- Logger . debug ( """
136
+ Logger . warning ( """
153
137
Unselecting RTP sender codec as it is no longer supported by the remote side.
154
138
Call set_sender_codec again passing supported codec.
155
139
Codec: #{ inspect ( sender . codec ) }
@@ -161,7 +145,7 @@ defmodule ExWebRTC.RTPSender do
161
145
162
146
defp log_rtx_codec_change ( % { rtx_codec: rtx_codec } = sender , nil , neg_codecs )
163
147
when rtx_codec != nil do
164
- Logger . debug ( """
148
+ Logger . warning ( """
165
149
Unselecting RTP sender codec as it is no longer supported by the remote side.
166
150
Call set_sender_codec again passing supported codec.
167
151
Codec: #{ inspect ( sender . codec ) }
@@ -186,18 +170,18 @@ defmodule ExWebRTC.RTPSender do
186
170
end
187
171
188
172
ssrc_attrs =
189
- get_ssrc_attrs ( sender . pt , sender . rtx_pt , sender . ssrc , sender . rtx_ssrc , sender . track )
173
+ get_ssrc_attrs ( sender . codec , sender . rtx_codec , sender . ssrc , sender . rtx_ssrc , sender . track )
190
174
191
175
msid_attrs ++ ssrc_attrs
192
176
end
193
177
194
178
# we didn't manage to negotiate any codec
195
- defp get_ssrc_attrs ( nil , _rtx_pt , _ssrc , _rtx_ssrc , _track ) do
179
+ defp get_ssrc_attrs ( nil , _rtx_codec , _ssrc , _rtx_ssrc , _track ) do
196
180
[ ]
197
181
end
198
182
199
- # we have a codec but not rtx
200
- defp get_ssrc_attrs ( _pt , nil , ssrc , _rtx_ssrc , track ) do
183
+ # we have a codec but not rtx codec
184
+ defp get_ssrc_attrs ( _codec , nil , ssrc , _rtx_ssrc , track ) do
201
185
streams = ( track && track . streams ) || [ ]
202
186
203
187
case streams do
@@ -211,8 +195,8 @@ defmodule ExWebRTC.RTPSender do
211
195
end
212
196
end
213
197
214
- # we have both codec and rtx
215
- defp get_ssrc_attrs ( _pt , _rtx_pt , ssrc , rtx_ssrc , track ) do
198
+ # we have both codec and rtx codec
199
+ defp get_ssrc_attrs ( _codec , _rtx_codec , ssrc , rtx_ssrc , track ) do
216
200
streams = ( track && track . streams ) || [ ]
217
201
218
202
fid = % ExSDP.Attribute.SSRCGroup { semantics: "FID" , ssrcs: [ ssrc , rtx_ssrc ] }
@@ -251,7 +235,7 @@ defmodule ExWebRTC.RTPSender do
251
235
@ doc false
252
236
@ spec set_codec ( sender ( ) , RTPCodecParameters . t ( ) ) :: { :ok , sender ( ) } | { :error , term ( ) }
253
237
def set_codec ( sender , codec ) do
254
- if not rtx? ( codec ) and supported? ( sender , codec ) and same_clock_rate? ( sender , codec ) do
238
+ if not rtx? ( codec ) and supported? ( sender . codecs , codec ) and same_clock_rate? ( sender , codec ) do
255
239
rtx_codec = find_associated_rtx_codec ( sender . codecs , codec )
256
240
sender = % { sender | codec: codec , rtx_codec: rtx_codec }
257
241
{ :ok , sender }
@@ -261,7 +245,13 @@ defmodule ExWebRTC.RTPSender do
261
245
end
262
246
263
247
defp rtx? ( codec ) , do: String . ends_with? ( codec . mime_type , "rtx" )
264
- defp supported? ( sender , codec ) , do: codec in sender . codecs
248
+
249
+ defp supported? ( neg_codecs , codec ) do
250
+ Enum . find ( neg_codecs , fn s_codec ->
251
+ Configuration . codec_equal? ( s_codec , codec ) and
252
+ MapSet . new ( s_codec . rtcp_fbs ) == MapSet . new ( codec . rtcp_fbs )
253
+ end ) != nil
254
+ end
265
255
266
256
# As long as report recorder is not initialized i.e. we have not sent any RTP packet,
267
257
# allow for codec changes. Once we start sending RTP packets, require the same clock rate.
@@ -271,12 +261,10 @@ defmodule ExWebRTC.RTPSender do
271
261
@ doc false
272
262
@ spec send_packet ( sender ( ) , ExRTP.Packet . t ( ) , boolean ( ) ) :: { binary ( ) , sender ( ) }
273
263
def send_packet ( % { rtx_codec: nil } = sender , _packet , true ) do
274
- Logger . warning ( "Tried to retransmit packet but there is no selected RTX codec. Ignoring." )
275
264
{ << >> , sender }
276
265
end
277
266
278
267
def send_packet ( % { codec: nil } = sender , _packet , false ) do
279
- Logger . warning ( "Tried to send packet but there is no selected codec. Ignoring." )
280
268
{ << >> , sender }
281
269
end
282
270
@@ -297,9 +285,9 @@ defmodule ExWebRTC.RTPSender do
297
285
def do_send_packet ( sender , packet , rtx? ) do
298
286
{ pt , ssrc } =
299
287
if rtx? do
300
- { sender . rtx_pt , sender . rtx_ssrc }
288
+ { sender . rtx_codec . payload_type , sender . rtx_ssrc }
301
289
else
302
- { sender . pt , sender . ssrc }
290
+ { sender . codec . payload_type , sender . ssrc }
303
291
end
304
292
305
293
packet = % { packet | payload_type: pt , ssrc: ssrc }
0 commit comments