Skip to content

Commit 61d3d69

Browse files
committed
Improve comments, remove_track API and fix process_remote_track
1 parent 2ed431d commit 61d3d69

File tree

2 files changed

+18
-17
lines changed

2 files changed

+18
-17
lines changed

lib/ex_webrtc/peer_connection.ex

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ defmodule ExWebRTC.PeerConnection do
123123
peer_connection(),
124124
RTPTransceiver.id(),
125125
RTPTransceiver.direction()
126-
) :: :ok
126+
) :: :ok | {:error, :invalid_transceiver_id}
127127
def set_transceiver_direction(peer_connection, transceiver_id, direction)
128128
when direction in [:sendrecv, :sendonly, :recvonly, :inactive] do
129129
GenServer.call(peer_connection, {:set_transceiver_direction, transceiver_id, direction})
@@ -134,7 +134,7 @@ defmodule ExWebRTC.PeerConnection do
134134
GenServer.call(peer_connection, {:add_track, track})
135135
end
136136

137-
@spec remove_track(peer_connection(), RTPSender.id()) :: :ok
137+
@spec remove_track(peer_connection(), RTPSender.id()) :: :ok | {:error, :invalid_sender_id}
138138
def remove_track(peer_connection, sender_id) do
139139
GenServer.call(peer_connection, {:remove_track, sender_id})
140140
end
@@ -366,7 +366,7 @@ defmodule ExWebRTC.PeerConnection do
366366

367367
case idx do
368368
nil ->
369-
{:reply, :ok, state}
369+
{:reply, {:error, :invalid_transceiver_id}, state}
370370

371371
idx ->
372372
tr = Enum.at(state.transceivers, idx)
@@ -438,16 +438,18 @@ defmodule ExWebRTC.PeerConnection do
438438
@impl true
439439
def handle_call({:remove_track, sender_id}, _from, state) do
440440
tr_idx =
441-
Enum.find_index(state.transceivers, fn tr ->
442-
tr.sender.track != nil and tr.sender.id == sender_id
443-
end)
441+
state.transceivers
442+
|> Stream.with_index()
443+
|> Enum.find(fn {tr, _idx} -> tr.sender.id == sender_id end)
444444

445445
case tr_idx do
446446
nil ->
447+
{:reply, {:error, :invalid_sender_id}, state}
448+
449+
{tr, _idx} when tr.sender.track == nil ->
447450
{:reply, :ok, state}
448451

449-
idx ->
450-
tr = Enum.at(state.transceivers, idx)
452+
{tr, idx} ->
451453
sender = %RTPSender{tr.sender | track: nil}
452454

453455
direction =
@@ -585,8 +587,7 @@ defmodule ExWebRTC.PeerConnection do
585587
state.ice_transport.gather_candidates(state.ice_pid)
586588
end
587589

588-
# See W3C WebRTC 4.4.1.5 when "description"
589-
# is not of type "rollback" and "remote" is false.
590+
# See W3C WebRTC 4.4.1.5-4.7.10.1
590591
# Consider scenario where the remote side offers
591592
# sendonly and we want to reject it by setting
592593
# transceiver's direction to inactive after SRD.
@@ -768,25 +769,25 @@ defmodule ExWebRTC.PeerConnection do
768769
Enum.reduce(sdp.media, state.transceivers, fn mline, transceivers ->
769770
{:mid, mid} = ExSDP.get_attribute(mline, :mid)
770771

772+
direction = SDPUtils.get_media_direction(mline) |> reverse_direction()
773+
771774
# TODO: consider recycled transceivers
772775
case find_transceiver(transceivers, mid) do
773776
{idx, %RTPTransceiver{} = tr} ->
774777
new_tr = RTPTransceiver.update(tr, mline, state.config)
775-
new_tr = process_remote_track(new_tr, mline, state.owner)
778+
new_tr = process_remote_track(new_tr, direction, state.owner)
776779
List.replace_at(transceivers, idx, new_tr)
777780

778781
nil ->
779782
new_tr = RTPTransceiver.from_mline(mline, state.config)
780-
new_tr = process_remote_track(new_tr, mline, state.owner)
783+
new_tr = process_remote_track(new_tr, direction, state.owner)
781784
transceivers ++ [new_tr]
782785
end
783786
end)
784787
end
785788

786789
# see W3C WebRTC 5.1.1
787-
defp process_remote_track(transceiver, mline, owner) do
788-
direction = SDPUtils.get_media_direction(mline)
789-
790+
defp process_remote_track(transceiver, direction, owner) do
790791
cond do
791792
direction in [:sendrecv, :recvonly] and
792793
transceiver.fired_direction not in [:sendrecv, :recvonly] ->

test/ex_webrtc/peer_connection_test.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -532,9 +532,9 @@ defmodule ExWebRTC.PeerConnectionTest do
532532
assert tr2.receiver.track != nil
533533
end
534534

535-
test "non-existing sender id" do
535+
test "invalid sender id" do
536536
{:ok, pc} = PeerConnection.start_link()
537-
assert :ok == PeerConnection.remove_track(pc, 123)
537+
assert {:error, :invalid_sender_id} == PeerConnection.remove_track(pc, 123)
538538
end
539539

540540
test "sender without track" do

0 commit comments

Comments
 (0)