Skip to content

Commit d74a937

Browse files
committed
Don't require MID RTP header extension.
Some implementations (e.g. gstreamer) seems not to propose MID RTP header extension in their SDP. While this is quite uncommon, they can still demux incoming traffic based on ssrc (if included in SDP by the sender) or payload type. This commit allows to send data without MID RTP header extension being negotiated. To be consistent, we also don't require users of Elixir WebRTC to use MID header extension in their SDP.
1 parent 564e0f3 commit d74a937

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
lines changed

lib/ex_webrtc/peer_connection/configuration.ex

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,11 @@ defmodule ExWebRTC.PeerConnection.Configuration do
224224
extensions = Keyword.get(options, :rtp_header_extensions, @default_rtp_header_extensions)
225225

226226
unless %{type: :all, uri: @mid_uri} in extensions do
227-
raise "Mandatory MID RTP header extensions was not found in #{inspect(extensions)}"
227+
Logger.warning("""
228+
MID RTP header extension was not found in #{inspect(extensions)}.
229+
While this is correct, it is strongly recommended to include \
230+
MID RTP header extension to avoid any difficulties with packet demultiplexing.
231+
""")
228232
end
229233

230234
{audio_extensions, video_extensions} =

lib/ex_webrtc/rtp_sender.ex

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -134,23 +134,32 @@ defmodule ExWebRTC.RTPSender do
134134
@doc false
135135
@spec send_packet(sender(), ExRTP.Packet.t(), boolean()) :: {binary(), sender()}
136136
def send_packet(sender, packet, rtx?) do
137-
%Extmap{} = mid_extmap = Map.fetch!(sender.rtp_hdr_exts, @mid_uri)
138-
139-
mid_ext =
140-
%ExRTP.Packet.Extension.SourceDescription{text: sender.mid}
141-
|> ExRTP.Packet.Extension.SourceDescription.to_raw(mid_extmap.id)
142-
143137
{pt, ssrc} =
144138
if rtx? do
145139
{sender.rtx_pt, sender.rtx_ssrc}
146140
else
147141
{sender.pt, sender.ssrc}
148142
end
149143

144+
packet = %{packet | payload_type: pt, ssrc: ssrc}
145+
146+
# Add mid header extension only if it was negotiated.
147+
# The receiver can still demux packets based
148+
# on ssrc (if it was included in sdp) or payload type.
150149
packet =
151-
%{packet | payload_type: pt, ssrc: ssrc}
152-
|> ExRTP.Packet.remove_extension(mid_extmap.id)
153-
|> ExRTP.Packet.add_extension(mid_ext)
150+
case Map.get(sender.rtp_hdr_exts, @mid_uri) do
151+
%Extmap{} = mid_extmap ->
152+
mid_ext =
153+
%ExRTP.Packet.Extension.SourceDescription{text: sender.mid}
154+
|> ExRTP.Packet.Extension.SourceDescription.to_raw(mid_extmap.id)
155+
156+
packet
157+
|> ExRTP.Packet.remove_extension(mid_extmap.id)
158+
|> ExRTP.Packet.add_extension(mid_ext)
159+
160+
nil ->
161+
packet
162+
end
154163

155164
report_recorder =
156165
if sender.reports? do

0 commit comments

Comments
 (0)