|
1 | 1 | defmodule ExWebRTC.SDPUtils do
|
2 | 2 | @moduledoc false
|
3 | 3 |
|
| 4 | + alias ExWebRTC.SDPUtils |
4 | 5 | alias ExRTP.Packet.Extension
|
5 | 6 | alias ExSDP.Attribute.Extmap
|
6 | 7 |
|
@@ -44,9 +45,13 @@ defmodule ExWebRTC.SDPUtils do
|
44 | 45 |
|
45 | 46 | mline_mids =
|
46 | 47 | Enum.map(sdp.media, fn media ->
|
47 |
| - {:mid, mid} = ExSDP.get_attribute(media, :mid) |
48 |
| - mid |
| 48 | + # rejected m-lines are not included in the BUNDLE group |
| 49 | + unless SDPUtils.rejected?(media) do |
| 50 | + {:mid, mid} = ExSDP.get_attribute(media, :mid) |
| 51 | + mid |
| 52 | + end |
49 | 53 | end)
|
| 54 | + |> Enum.reject(&(&1 == nil)) |
50 | 55 |
|
51 | 56 | case filter_groups(groups, "BUNDLE") do
|
52 | 57 | [%ExSDP.Attribute.Group{semantics: "BUNDLE", mids: group_mids}] ->
|
@@ -129,9 +134,21 @@ defmodule ExWebRTC.SDPUtils do
|
129 | 134 |
|
130 | 135 | @spec add_ice_candidates(ExSDP.t(), [String.t()]) :: ExSDP.t()
|
131 | 136 | def add_ice_candidates(sdp, candidates) do
|
| 137 | + # we only add candidates to the first mline |
| 138 | + # as we don't support bundle-policies other than "max-bundle" |
132 | 139 | candidates = Enum.map(candidates, &{"candidate", &1})
|
133 |
| - media = Enum.map(sdp.media, &ExSDP.add_attributes(&1, candidates)) |
134 |
| - %ExSDP{sdp | media: media} |
| 140 | + |
| 141 | + if sdp.media != [] do |
| 142 | + mline = |
| 143 | + sdp.media |
| 144 | + |> List.first() |
| 145 | + |> ExSDP.add_attribute(candidates) |
| 146 | + |
| 147 | + media = List.replace_at(sdp.media, 0, mline) |
| 148 | + %ExSDP{sdp | media: media} |
| 149 | + else |
| 150 | + sdp |
| 151 | + end |
135 | 152 | end
|
136 | 153 |
|
137 | 154 | @spec get_dtls_role(ExSDP.t()) ::
|
@@ -284,7 +301,13 @@ defmodule ExWebRTC.SDPUtils do
|
284 | 301 | end
|
285 | 302 |
|
286 | 303 | @spec rejected?(ExSDP.Media.t()) :: boolean()
|
287 |
| - def rejected?(%ExSDP.Media{port: 0}), do: true |
| 304 | + def rejected?(%ExSDP.Media{port: 0} = media) do |
| 305 | + # An m-line is only rejected when the port is set to 0, |
| 306 | + # and there is no `bundle-only` attribute. |
| 307 | + # See RFC 8843, sec. 6. |
| 308 | + "bundle-only" not in media.attributes |
| 309 | + end |
| 310 | + |
288 | 311 | def rejected?(%ExSDP.Media{}), do: false
|
289 | 312 |
|
290 | 313 | defp do_get_ice_credentials(sdp_or_mline) do
|
|
0 commit comments