@@ -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.
@@ -85,11 +83,8 @@ defmodule ExWebRTC.RTPSender do
85
83
# In other case, if PeerConnection negotiated multiple codecs,
86
84
# user would have to pass RTP codec when sending RTP packets,
87
85
# or assign payload type on their own.
88
- { codec , rtx_codec } = get_default_codec ( codecs )
89
-
90
86
# 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
87
+ { codec , rtx_codec } = get_default_codec ( codecs )
93
88
94
89
% {
95
90
id: Utils . generate_id ( ) ,
@@ -98,8 +93,6 @@ defmodule ExWebRTC.RTPSender do
98
93
rtx_codec: rtx_codec ,
99
94
codecs: codecs ,
100
95
rtp_hdr_exts: rtp_hdr_exts ,
101
- pt: pt ,
102
- rtx_pt: rtx_pt ,
103
96
ssrc: ssrc ,
104
97
rtx_ssrc: rtx_ssrc ,
105
98
mid: mid ,
@@ -126,42 +119,39 @@ defmodule ExWebRTC.RTPSender do
126
119
127
120
# Keep already selected codec if it is still supported.
128
121
# Otherwise, clear it and wait until user sets it again.
129
- codec = if sender . codec in codecs , do: sender . codec , else: nil
122
+ # TODO: handle cases when codec == nil (no valid codecs after negotiation)
123
+ codec = if supported? ( codecs , sender . codec ) , do: sender . codec , else: nil
130
124
rtx_codec = codec && find_associated_rtx_codec ( codecs , codec )
131
125
132
126
log_codec_change ( sender , codec , codecs )
133
127
log_rtx_codec_change ( sender , rtx_codec , codecs )
134
128
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
129
% {
140
130
sender
141
131
| mid: mid ,
142
132
codec: codec ,
143
133
rtx_codec: rtx_codec ,
144
134
codecs: codecs ,
145
- rtp_hdr_exts: rtp_hdr_exts ,
146
- pt: pt ,
147
- rtx_pt: rtx_pt
135
+ rtp_hdr_exts: rtp_hdr_exts
148
136
}
149
137
end
150
138
151
139
defp log_codec_change ( % { codec: codec } = sender , nil , neg_codecs ) when codec != nil do
152
- Logger . debug ( """
140
+ Logger . warning ( """
153
141
Unselecting RTP sender codec as it is no longer supported by the remote side.
154
142
Call set_sender_codec again passing supported codec.
155
- Codec: #{ inspect ( sender . codec ) }
156
- Currently negotiated codecs: #{ inspect ( neg_codecs ) }
143
+ Codec: #{ inspect ( sender . codec , pretty: true ) }
144
+ Currently negotiated codecs: #{ inspect ( neg_codecs , pretty: true ) }
157
145
""" )
146
+
147
+ raise ""
158
148
end
159
149
160
150
defp log_codec_change ( _sender , _codec , _neg_codecs ) , do: :ok
161
151
162
152
defp log_rtx_codec_change ( % { rtx_codec: rtx_codec } = sender , nil , neg_codecs )
163
153
when rtx_codec != nil do
164
- Logger . debug ( """
154
+ Logger . warning ( """
165
155
Unselecting RTP sender codec as it is no longer supported by the remote side.
166
156
Call set_sender_codec again passing supported codec.
167
157
Codec: #{ inspect ( sender . codec ) }
@@ -186,7 +176,13 @@ defmodule ExWebRTC.RTPSender do
186
176
end
187
177
188
178
ssrc_attrs =
189
- get_ssrc_attrs ( sender . pt , sender . rtx_pt , sender . ssrc , sender . rtx_ssrc , sender . track )
179
+ get_ssrc_attrs (
180
+ sender . codec . payload_type ,
181
+ sender . rtx_codec . payload_type ,
182
+ sender . ssrc ,
183
+ sender . rtx_ssrc ,
184
+ sender . track
185
+ )
190
186
191
187
msid_attrs ++ ssrc_attrs
192
188
end
@@ -251,7 +247,7 @@ defmodule ExWebRTC.RTPSender do
251
247
@ doc false
252
248
@ spec set_codec ( sender ( ) , RTPCodecParameters . t ( ) ) :: { :ok , sender ( ) } | { :error , term ( ) }
253
249
def set_codec ( sender , codec ) do
254
- if not rtx? ( codec ) and supported? ( sender , codec ) and same_clock_rate? ( sender , codec ) do
250
+ if not rtx? ( codec ) and supported? ( sender . codecs , codec ) and same_clock_rate? ( sender , codec ) do
255
251
rtx_codec = find_associated_rtx_codec ( sender . codecs , codec )
256
252
sender = % { sender | codec: codec , rtx_codec: rtx_codec }
257
253
{ :ok , sender }
@@ -261,7 +257,17 @@ defmodule ExWebRTC.RTPSender do
261
257
end
262
258
263
259
defp rtx? ( codec ) , do: String . ends_with? ( codec . mime_type , "rtx" )
264
- defp supported? ( sender , codec ) , do: codec in sender . codecs
260
+
261
+ defp supported? ( neg_codecs , codec ) do
262
+ # Once we start checking FMTP in Configuration.intersect_codecs,
263
+ # this code has to be adjusted.
264
+ codec = % { codec | sdp_fmtp_line: nil , rtcp_fbs: MapSet . new ( codec . rtcp_fbs ) }
265
+
266
+ Enum . find ( neg_codecs , fn s_codec ->
267
+ s_codec = % { s_codec | sdp_fmtp_line: nil , rtcp_fbs: MapSet . new ( s_codec . rtcp_fbs ) }
268
+ codec == s_codec
269
+ end ) != nil
270
+ end
265
271
266
272
# As long as report recorder is not initialized i.e. we have not sent any RTP packet,
267
273
# allow for codec changes. Once we start sending RTP packets, require the same clock rate.
@@ -271,12 +277,10 @@ defmodule ExWebRTC.RTPSender do
271
277
@ doc false
272
278
@ spec send_packet ( sender ( ) , ExRTP.Packet . t ( ) , boolean ( ) ) :: { binary ( ) , sender ( ) }
273
279
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
280
{ << >> , sender }
276
281
end
277
282
278
283
def send_packet ( % { codec: nil } = sender , _packet , false ) do
279
- Logger . warning ( "Tried to send packet but there is no selected codec. Ignoring." )
280
284
{ << >> , sender }
281
285
end
282
286
@@ -297,9 +301,9 @@ defmodule ExWebRTC.RTPSender do
297
301
def do_send_packet ( sender , packet , rtx? ) do
298
302
{ pt , ssrc } =
299
303
if rtx? do
300
- { sender . rtx_pt , sender . rtx_ssrc }
304
+ { sender . rtx_codec . payload_type , sender . rtx_ssrc }
301
305
else
302
- { sender . pt , sender . ssrc }
306
+ { sender . codec . payload_type , sender . ssrc }
303
307
end
304
308
305
309
packet = % { packet | payload_type: pt , ssrc: ssrc }
0 commit comments