Skip to content

Commit 536e60a

Browse files
committed
WIP fixes
1 parent 3dac56e commit 536e60a

File tree

3 files changed

+47
-34
lines changed

3 files changed

+47
-34
lines changed

lib/ex_webrtc/peer_connection/configuration.ex

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@ defmodule ExWebRTC.PeerConnection.Configuration do
2424
]
2525

2626
@default_video_codecs [
27-
%RTPCodecParameters{
28-
payload_type: 96,
29-
mime_type: "video/VP8",
30-
clock_rate: 90_000
31-
},
3227
%RTPCodecParameters{
3328
payload_type: 98,
3429
mime_type: "video/H264",
@@ -40,6 +35,11 @@ defmodule ExWebRTC.PeerConnection.Configuration do
4035
profile_level_id: 0x42E01F
4136
}
4237
},
38+
%RTPCodecParameters{
39+
payload_type: 96,
40+
mime_type: "video/VP8",
41+
clock_rate: 90_000
42+
},
4343
%RTPCodecParameters{
4444
payload_type: 45,
4545
mime_type: "video/AV1",
@@ -528,6 +528,8 @@ defmodule ExWebRTC.PeerConnection.Configuration do
528528
codecs
529529
|> Enum.find(
530530
# as of now, we ignore sdp_fmtp_line
531+
# Once we start checking FMTP, rtp sender code
532+
# needs to be adjusted to check it too.
531533
&(String.downcase(&1.mime_type) == String.downcase(sdp_codec.mime_type) and
532534
&1.payload_type == sdp_codec.payload_type and
533535
&1.clock_rate == sdp_codec.clock_rate and

lib/ex_webrtc/rtp_sender.ex

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ defmodule ExWebRTC.RTPSender do
2222
codecs: [RTPCodecParameters.t()],
2323
rtp_hdr_exts: %{Extmap.extension_id() => Extmap.t()},
2424
mid: String.t() | nil,
25-
pt: non_neg_integer() | nil,
26-
rtx_pt: non_neg_integer() | nil,
2725
# ssrc and rtx_ssrc are always present, even if there is no track,
2826
# or transceiver direction is recvonly.
2927
# We preallocate them so they can be included in SDP when needed.
@@ -85,11 +83,8 @@ defmodule ExWebRTC.RTPSender do
8583
# In other case, if PeerConnection negotiated multiple codecs,
8684
# user would have to pass RTP codec when sending RTP packets,
8785
# or assign payload type on their own.
88-
{codec, rtx_codec} = get_default_codec(codecs)
89-
9086
# 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)
9388

9489
%{
9590
id: Utils.generate_id(),
@@ -98,8 +93,6 @@ defmodule ExWebRTC.RTPSender do
9893
rtx_codec: rtx_codec,
9994
codecs: codecs,
10095
rtp_hdr_exts: rtp_hdr_exts,
101-
pt: pt,
102-
rtx_pt: rtx_pt,
10396
ssrc: ssrc,
10497
rtx_ssrc: rtx_ssrc,
10598
mid: mid,
@@ -126,42 +119,39 @@ defmodule ExWebRTC.RTPSender do
126119

127120
# Keep already selected codec if it is still supported.
128121
# 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
130124
rtx_codec = codec && find_associated_rtx_codec(codecs, codec)
131125

132126
log_codec_change(sender, codec, codecs)
133127
log_rtx_codec_change(sender, rtx_codec, codecs)
134128

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-
139129
%{
140130
sender
141131
| mid: mid,
142132
codec: codec,
143133
rtx_codec: rtx_codec,
144134
codecs: codecs,
145-
rtp_hdr_exts: rtp_hdr_exts,
146-
pt: pt,
147-
rtx_pt: rtx_pt
135+
rtp_hdr_exts: rtp_hdr_exts
148136
}
149137
end
150138

151139
defp log_codec_change(%{codec: codec} = sender, nil, neg_codecs) when codec != nil do
152-
Logger.debug("""
140+
Logger.warning("""
153141
Unselecting RTP sender codec as it is no longer supported by the remote side.
154142
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)}
157145
""")
146+
147+
raise ""
158148
end
159149

160150
defp log_codec_change(_sender, _codec, _neg_codecs), do: :ok
161151

162152
defp log_rtx_codec_change(%{rtx_codec: rtx_codec} = sender, nil, neg_codecs)
163153
when rtx_codec != nil do
164-
Logger.debug("""
154+
Logger.warning("""
165155
Unselecting RTP sender codec as it is no longer supported by the remote side.
166156
Call set_sender_codec again passing supported codec.
167157
Codec: #{inspect(sender.codec)}
@@ -186,7 +176,13 @@ defmodule ExWebRTC.RTPSender do
186176
end
187177

188178
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+
)
190186

191187
msid_attrs ++ ssrc_attrs
192188
end
@@ -251,7 +247,7 @@ defmodule ExWebRTC.RTPSender do
251247
@doc false
252248
@spec set_codec(sender(), RTPCodecParameters.t()) :: {:ok, sender()} | {:error, term()}
253249
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
255251
rtx_codec = find_associated_rtx_codec(sender.codecs, codec)
256252
sender = %{sender | codec: codec, rtx_codec: rtx_codec}
257253
{:ok, sender}
@@ -261,7 +257,17 @@ defmodule ExWebRTC.RTPSender do
261257
end
262258

263259
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
265271

266272
# As long as report recorder is not initialized i.e. we have not sent any RTP packet,
267273
# allow for codec changes. Once we start sending RTP packets, require the same clock rate.
@@ -271,12 +277,10 @@ defmodule ExWebRTC.RTPSender do
271277
@doc false
272278
@spec send_packet(sender(), ExRTP.Packet.t(), boolean()) :: {binary(), sender()}
273279
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.")
275280
{<<>>, sender}
276281
end
277282

278283
def send_packet(%{codec: nil} = sender, _packet, false) do
279-
Logger.warning("Tried to send packet but there is no selected codec. Ignoring.")
280284
{<<>>, sender}
281285
end
282286

@@ -297,9 +301,9 @@ defmodule ExWebRTC.RTPSender do
297301
def do_send_packet(sender, packet, rtx?) do
298302
{pt, ssrc} =
299303
if rtx? do
300-
{sender.rtx_pt, sender.rtx_ssrc}
304+
{sender.rtx_codec.payload_type, sender.rtx_ssrc}
301305
else
302-
{sender.pt, sender.ssrc}
306+
{sender.codec.payload_type, sender.ssrc}
303307
end
304308

305309
packet = %{packet | payload_type: pt, ssrc: ssrc}

lib/ex_webrtc/rtp_transceiver.ex

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,9 +281,16 @@ defmodule ExWebRTC.RTPTransceiver do
281281
@spec set_sender_codec(transceiver(), RTPCodecParameters.t()) ::
282282
{:ok, transceiver()} | {:error, term()}
283283
def set_sender_codec(transceiver, codec) do
284+
dbg(transceiver)
285+
dbg(codec)
286+
284287
case RTPSender.set_codec(transceiver.sender, codec) do
285-
{:ok, sender} -> {:ok, %{transceiver | sender: sender}}
286-
{:error, _reason} = error -> error
288+
{:ok, sender} ->
289+
dbg(sender)
290+
{:ok, %{transceiver | sender: sender}}
291+
292+
{:error, _reason} = error ->
293+
error
287294
end
288295
end
289296

0 commit comments

Comments
 (0)