Skip to content

Commit fadedd9

Browse files
committed
Refactor generate_ssrcs and get_ssrc_attrs
1 parent 8b38a10 commit fadedd9

File tree

3 files changed

+45
-41
lines changed

3 files changed

+45
-41
lines changed

lib/ex_webrtc/peer_connection.ex

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1809,7 +1809,7 @@ defmodule ExWebRTC.PeerConnection do
18091809
end
18101810
end
18111811

1812-
# See W3C WebRTC 4.4.1.5-4.7.10.1
1812+
# See W3C WebRTC 4.4.1.4-4.7.10.1
18131813
defp process_mlines_local(_mlines, transceivers, :offer, _owner), do: transceivers
18141814

18151815
defp process_mlines_local([], transceivers, :answer, _owner), do: transceivers
@@ -1840,7 +1840,7 @@ defmodule ExWebRTC.PeerConnection do
18401840
process_mlines_local(mlines, transceivers, :answer, owner)
18411841
end
18421842

1843-
# See W3C WebRTC 4.4.1.5-4.7.10.2
1843+
# See W3C WebRTC 4.4.1.4-4.7.10.2
18441844
defp process_mlines_remote(mlines, transceivers, sdp_type, demuxer_ssrcs, config, owner) do
18451845
mlines_idx = Enum.with_index(mlines)
18461846
do_process_mlines_remote(mlines_idx, transceivers, sdp_type, demuxer_ssrcs, config, owner)
@@ -1862,12 +1862,7 @@ defmodule ExWebRTC.PeerConnection do
18621862
do: :inactive,
18631863
else: SDPUtils.get_media_direction(mline) |> reverse_direction()
18641864

1865-
rtp_sender_ssrcs = Enum.map(transceivers, & &1.sender.ssrc)
1866-
ssrcs = MapSet.new(demuxer_ssrcs ++ rtp_sender_ssrcs)
1867-
1868-
ssrc = do_generate_ssrc(ssrcs)
1869-
ssrcs = MapSet.put(ssrcs, ssrc)
1870-
rtx_ssrc = do_generate_ssrc(ssrcs)
1865+
{ssrc, rtx_ssrc} = generate_ssrcs(transceivers, demuxer_ssrcs)
18711866

18721867
# Note: in theory we should update transceiver codecs
18731868
# after processing remote track but this shouldn't have any impact
@@ -2198,10 +2193,14 @@ defmodule ExWebRTC.PeerConnection do
21982193
end
21992194

22002195
defp generate_ssrcs(state) do
2201-
rtp_sender_ssrcs = Enum.map(state.transceivers, & &1.sender.ssrc)
2202-
ssrcs = MapSet.new(Map.keys(state.demuxer.ssrc_to_mid) ++ rtp_sender_ssrcs)
2203-
ssrc = do_generate_ssrc(ssrcs, 200)
2204-
rtx_ssrc = do_generate_ssrc(MapSet.put(ssrcs, ssrc), 200)
2196+
generate_ssrcs(state.transceivers, Map.keys(state.demuxer.ssrc_to_mid))
2197+
end
2198+
2199+
defp generate_ssrcs(transceivers, demuxer_ssrcs) do
2200+
rtp_sender_ssrcs = Enum.map(transceivers, & &1.sender.ssrc)
2201+
ssrcs = MapSet.new(demuxer_ssrcs ++ rtp_sender_ssrcs)
2202+
ssrc = do_generate_ssrc(ssrcs)
2203+
rtx_ssrc = do_generate_ssrc(MapSet.put(ssrcs, ssrc))
22052204
{ssrc, rtx_ssrc}
22062205
end
22072206

lib/ex_webrtc/rtp_sender.ex

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -139,16 +139,13 @@ defmodule ExWebRTC.RTPSender do
139139
# Don't include track id. See RFC 8829 sec. 5.2.1
140140
msid_attrs =
141141
case sender.track do
142-
nil ->
142+
%MediaStreamTrack{streams: streams} when streams != [] ->
143+
Enum.map(streams, &ExSDP.Attribute.MSID.new(&1, nil))
144+
145+
_other ->
143146
# In theory, we should do this "for each MediaStream that was associated with the transceiver",
144147
# but web browsers (chrome, ff) include MSID even when there aren't any MediaStreams
145148
[ExSDP.Attribute.MSID.new("-", nil)]
146-
147-
%MediaStreamTrack{streams: streams} ->
148-
case Enum.map(streams, &ExSDP.Attribute.MSID.new(&1, nil)) do
149-
[] -> [ExSDP.Attribute.MSID.new("-", nil)]
150-
other -> other
151-
end
152149
end
153150

154151
ssrc_attrs =
@@ -181,29 +178,37 @@ defmodule ExWebRTC.RTPSender do
181178
defp get_ssrc_attrs(_pt, _rtx_pt, ssrc, rtx_ssrc, track) do
182179
streams = (track && track.streams) || []
183180

184-
case streams do
185-
[] ->
186-
[
187-
%ExSDP.Attribute.SSRCGroup{semantics: "FID", ssrcs: [ssrc, rtx_ssrc]},
188-
%ExSDP.Attribute.SSRC{id: ssrc, attribute: "msid", value: "-"},
189-
%ExSDP.Attribute.SSRC{id: rtx_ssrc, attribute: "msid", value: "-"}
190-
]
181+
fid = %ExSDP.Attribute.SSRCGroup{semantics: "FID", ssrcs: [ssrc, rtx_ssrc]}
191182

192-
streams ->
193-
{ssrc_attrs, rtx_ssrc_attrs} =
194-
Enum.reduce(streams, {[], []}, fn stream, {ssrc_attrs, rtx_ssrc_attrs} ->
195-
ssrc_attr = %ExSDP.Attribute.SSRC{id: ssrc, attribute: "msid", value: stream}
196-
ssrc_attrs = [ssrc_attr | ssrc_attrs]
197-
198-
rtx_ssrc_attr = %ExSDP.Attribute.SSRC{id: rtx_ssrc, attribute: "msid", value: stream}
199-
rtx_ssrc_attrs = [rtx_ssrc_attr | rtx_ssrc_attrs]
200-
201-
{ssrc_attrs, rtx_ssrc_attrs}
202-
end)
183+
ssrc_attrs =
184+
case streams do
185+
[] ->
186+
[
187+
%ExSDP.Attribute.SSRC{id: ssrc, attribute: "msid", value: "-"},
188+
%ExSDP.Attribute.SSRC{id: rtx_ssrc, attribute: "msid", value: "-"}
189+
]
190+
191+
streams ->
192+
{ssrc_attrs, rtx_ssrc_attrs} =
193+
Enum.reduce(streams, {[], []}, fn stream, {ssrc_attrs, rtx_ssrc_attrs} ->
194+
ssrc_attr = %ExSDP.Attribute.SSRC{id: ssrc, attribute: "msid", value: stream}
195+
ssrc_attrs = [ssrc_attr | ssrc_attrs]
196+
197+
rtx_ssrc_attr = %ExSDP.Attribute.SSRC{
198+
id: rtx_ssrc,
199+
attribute: "msid",
200+
value: stream
201+
}
202+
203+
rtx_ssrc_attrs = [rtx_ssrc_attr | rtx_ssrc_attrs]
204+
205+
{ssrc_attrs, rtx_ssrc_attrs}
206+
end)
207+
208+
Enum.reverse(ssrc_attrs) ++ Enum.reverse(rtx_ssrc_attrs)
209+
end
203210

204-
fid = %ExSDP.Attribute.SSRCGroup{semantics: "FID", ssrcs: [ssrc, rtx_ssrc]}
205-
[fid | Enum.reverse(ssrc_attrs) ++ Enum.reverse(rtx_ssrc_attrs)]
206-
end
211+
[fid | ssrc_attrs]
207212
end
208213

209214
@doc false

test/ex_webrtc/rtp_sender_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ defmodule ExWebRTC.RTPSenderTest do
22
use ExUnit.Case, async: true
33

44
alias ExRTP.Packet.Extension.SourceDescription
5-
alias ExSDP.Attribute.{Extmap, FMTP}
5+
alias ExSDP.Attribute.Extmap
66

77
alias ExWebRTC.{MediaStreamTrack, RTPCodecParameters, RTPSender}
88

0 commit comments

Comments
 (0)