Skip to content

Commit af752d5

Browse files
committed
Minor fixes - add rid to the on_packet callback, don't duplicate streams_info timer, only create player pc when there is at least one publisher track
1 parent a22a11b commit af752d5

File tree

2 files changed

+26
-16
lines changed

2 files changed

+26
-16
lines changed

lib/live_ex_webrtc/player.ex

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ defmodule LiveExWebRTC.Player do
9999
munger: nil,
100100
layer: nil,
101101
target_layer: nil,
102-
video_layers: [{"h", "high"}],
102+
video_layers: [],
103103
# codec that will be used for video sending
104104
video_send_codec: nil
105105

@@ -253,7 +253,6 @@ defmodule LiveExWebRTC.Player do
253253
socket =
254254
receive do
255255
{^ref, %Player{publisher_id: ^pub_id} = player} ->
256-
player = %Player{player | layer: "h", target_layer: "h"}
257256
PubSub.subscribe(player.pubsub, "streams:info:#{player.publisher_id}")
258257
assign(socket, player: player, display_settings: "hidden")
259258
after
@@ -267,7 +266,10 @@ defmodule LiveExWebRTC.Player do
267266
end
268267

269268
@impl true
270-
def handle_info({:ex_webrtc, _pid, {:connection_state_change, :connected}}, socket) do
269+
def handle_info(
270+
{:ex_webrtc, pc, {:connection_state_change, :connected}},
271+
%{assigns: %{player: %{pc: pc}}} = socket
272+
) do
271273
%{player: player} = socket.assigns
272274

273275
# subscribe only if we managed to negotiate tracks
@@ -323,6 +325,8 @@ defmodule LiveExWebRTC.Player do
323325
publisher_video_track: old_publisher_video_track,
324326
video_layers: old_layers
325327
} ->
328+
if player.pc, do: PeerConnection.close(player.pc)
329+
326330
video_layers = (publisher_video_track && publisher_video_track.rids) || ["h"]
327331

328332
video_layers =
@@ -336,6 +340,7 @@ defmodule LiveExWebRTC.Player do
336340
player
337341
| publisher_audio_track: publisher_audio_track,
338342
publisher_video_track: publisher_video_track,
343+
pc: nil,
339344
layer: "h",
340345
target_layer: "h",
341346
video_layers: video_layers,
@@ -358,8 +363,12 @@ defmodule LiveExWebRTC.Player do
358363
end)
359364
end
360365

361-
socket = push_event(socket, "connect-#{player.id}", %{})
362-
{:noreply, socket}
366+
if publisher_audio_track != nil or publisher_video_track != nil do
367+
socket = push_event(socket, "connect-#{player.id}", %{})
368+
{:noreply, socket}
369+
else
370+
{:noreply, socket}
371+
end
363372
end
364373
end
365374

@@ -456,16 +465,16 @@ defmodule LiveExWebRTC.Player do
456465
audio_tr = Enum.find(transceivers, fn tr -> tr.sender.id == audio_sender.id end)
457466

458467
# check if tracks were negotiated successfully
459-
video_negotiated? = video_tr && video_tr.direction == :sendrecv
460-
audio_negotiated? = audio_tr && audio_tr.direction == :sendrecv
468+
video_negotiated? = video_tr && video_tr.current_direction not in [:recvonly, :inactive]
469+
audio_negotiated? = audio_tr && audio_tr.current_direction not in [:recvonly, :inactive]
461470

462471
new_player = %Player{
463472
player
464473
| pc: pc,
465474
audio_track_id: audio_negotiated? && audio_track.id,
466475
video_track_id: video_negotiated? && video_track.id,
467476
munger: video_negotiated? && Munger.new(List.first(video_tr.codecs)),
468-
video_send_codec: List.first(video_tr.codecs)
477+
video_send_codec: video_negotiated? && List.first(video_tr.codecs)
469478
}
470479

471480
{:noreply,

lib/live_ex_webrtc/publisher.ex

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ defmodule LiveExWebRTC.Publisher do
2222
* `streams:audio:#{publisher_id}:#{audio_track_id}` - for receiving audio packets
2323
* `streams:video:#{publisher_id}:#{video_track_id}:#{layer}` - for receiving video packets.
2424
The message is in form of `{:live_ex_webrtc, :video, "l" | "m" | "h", ExRTP.Packet.t()}` or
25-
`{:live_ex_webrtc, :audio, ExRTP.Packet.t()}`
25+
`{:live_ex_webrtc, :audio, ExRTP.Packet.t()}`. Packets for non-simulcast video tracks are always
26+
sent with "h" identifier.
2627
* `streams:info:#{publisher.id}"` - for receiving information about publisher tracks and their layers.
2728
The message is in form of: `{:live_ex_webrtc, :info, audio_track :: ExWebRTC.MediaStreamTrack.t(), video_track :: ExWebRTC.MediaStreamTrack.t()}`.
2829
* `publishers:#{publisher_id}` for sending keyframe request.
@@ -126,6 +127,7 @@ defmodule LiveExWebRTC.Publisher do
126127
@type on_packet ::
127128
(publisher_id :: String.t(),
128129
packet_type :: :audio | :video,
130+
layer :: nil | "l" | "m" | "h",
129131
packet :: ExRTP.Packet.t(),
130132
socket :: Phoenix.LiveView.Socket.t() ->
131133
packet :: ExRTP.Packet.t())
@@ -510,6 +512,7 @@ defmodule LiveExWebRTC.Publisher do
510512
socket =
511513
receive do
512514
{^ref, %Publisher{id: ^pub_id} = publisher} ->
515+
Process.send_after(self(), :streams_info, 1000)
513516
codecs = publisher.video_codecs || PeerConnection.Configuration.default_video_codecs()
514517
publisher = %Publisher{publisher | simulcast_supported?: simulcast_supported?(codecs)}
515518
assign(socket, publisher: publisher)
@@ -548,15 +551,15 @@ defmodule LiveExWebRTC.Publisher do
548551
def handle_info({:ex_webrtc, _pc, {:rtp, track_id, rid, packet}}, socket) do
549552
%{publisher: publisher} = socket.assigns
550553

551-
kind =
554+
{kind, rid} =
552555
case publisher do
553-
%Publisher{video_track: %{id: ^track_id}} -> :video
554-
%Publisher{audio_track: %{id: ^track_id}} -> :audio
556+
%Publisher{video_track: %{id: ^track_id}} -> {:video, rid || "h"}
557+
%Publisher{audio_track: %{id: ^track_id}} -> {:audio, nil}
555558
end
556559

557560
packet =
558561
if publisher.on_packet,
559-
do: publisher.on_packet.(publisher.id, kind, packet, socket),
562+
do: publisher.on_packet.(publisher.id, kind, rid, packet, socket),
560563
else: packet
561564

562565
if publisher.record?, do: Recorder.record(publisher.recorder, track_id, nil, packet)
@@ -565,7 +568,7 @@ defmodule LiveExWebRTC.Publisher do
565568
case kind do
566569
:audio -> {"", {:live_ex_webrtc, kind, packet}}
567570
# for non simulcast tracks, push everything with "h" identifier
568-
:video -> {":#{rid || "h"}", {:live_ex_webrtc, kind, rid || "h", packet}}
571+
:video -> {":#{rid}", {:live_ex_webrtc, kind, rid, packet}}
569572
end
570573

571574
PubSub.broadcast(publisher.pubsub, "streams:#{kind}:#{publisher.id}:#{track_id}#{layer}", msg)
@@ -681,8 +684,6 @@ defmodule LiveExWebRTC.Publisher do
681684
video_track: video_track
682685
}
683686

684-
Process.send_after(self(), :streams_info, 1_000)
685-
686687
{:noreply,
687688
socket
688689
|> assign(publisher: new_publisher)

0 commit comments

Comments
 (0)