Skip to content

Commit 1d5465a

Browse files
committed
Add av1 support
1 parent 4bd4651 commit 1d5465a

3 files changed

Lines changed: 22 additions & 16 deletions

File tree

lib/shinkai/pipeline.ex

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,19 @@ defmodule Shinkai.Pipeline do
1515

1616
@spec add_rtmp_client(String.t()) :: :ok
1717
def add_rtmp_client(source_id) do
18-
Sink.RTMP.add_client({:via, Registry, {Source.Registry, {:rtmp_sink, source_id}}}, self())
18+
Sink.RTMP.add_client(rtmp_name(source_id), self())
1919
end
2020

2121
def add_webrtc_peer(source_id) do
22-
Sink.WebRTC.add_new_peer(:"webrtc_sink_#{source_id}")
22+
Sink.WebRTC.add_new_peer(webrtc_name(source_id))
2323
end
2424

2525
def handle_webrtc_peer_answer(source_id, session_id, sdp_answer) do
26-
Sink.WebRTC.handle_peer_answer(:"webrtc_sink_#{source_id}", session_id, sdp_answer)
26+
Sink.WebRTC.handle_peer_answer(webrtc_name(source_id), session_id, sdp_answer)
2727
end
2828

2929
def remove_webrtc_peer(source_id, session_id) do
30-
Sink.WebRTC.remove_peer(:"webrtc_sink_#{source_id}", session_id)
30+
Sink.WebRTC.remove_peer(webrtc_name(source_id), session_id)
3131
end
3232

3333
def stop(source_id) do
@@ -42,7 +42,7 @@ defmodule Shinkai.Pipeline do
4242
children =
4343
[
4444
{Sink.Hls, [id: id] ++ hls_config},
45-
{Sink.WebRTC, id: id, name: :"webrtc_sink_#{id}"}
45+
{Sink.WebRTC, id: id}
4646
] ++ rtmp_sink(rtmp_config[:enabled], id) ++ source(source)
4747

4848
Supervisor.init(children, strategy: :one_for_all)
@@ -54,4 +54,7 @@ defmodule Shinkai.Pipeline do
5454

5555
defp rtmp_sink(false, _id), do: []
5656
defp rtmp_sink(true, id), do: [{Sink.RTMP, [id: id]}]
57+
58+
defp webrtc_name(id), do: {:via, Registry, {Source.Registry, {:webrtc_sink, id}}}
59+
defp rtmp_name(id), do: {:via, Registry, {Source.Registry, {:rtmp_sink, id}}}
5760
end

lib/shinkai/sink/webrtc.ex

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,29 @@ defmodule Shinkai.Sink.WebRTC do
1212
alias Phoenix.PubSub
1313
alias RTSP.RTP.Encoder, as: RTPEncoder
1414

15-
@supported_codecs [:h264, :h265, :pcma]
15+
@supported_codecs [:h264, :h265, :av1, :pcma]
1616
@video_clock_rate 90_000
1717

1818
def start_link(opts) do
19-
GenServer.start_link(__MODULE__, opts, name: opts[:name])
19+
id = {:via, Registry, {Source.Registry, {:webrtc_sink, opts[:id]}}}
20+
GenServer.start_link(__MODULE__, opts, name: id)
2021
end
2122

22-
@spec add_new_peer(server :: pid() | atom()) :: {:ok, String.t(), String.t()} | {:error, any()}
23+
@spec add_new_peer(GenServer.server()) :: {:ok, String.t(), String.t()} | {:error, any()}
2324
def add_new_peer(server) do
2425
GenServer.call(server, :add_new_peer)
2526
end
2627

2728
@spec handle_peer_answer(
28-
server :: pid() | atom(),
29+
GenServer.server(),
2930
session_id :: String.t(),
3031
sdp :: String.t()
3132
) :: :ok | {:error, any()}
3233
def handle_peer_answer(server, session_id, sdp) do
3334
GenServer.call(server, {:handle_peer_answer, session_id, sdp})
3435
end
3536

36-
@spec remove_peer(server :: pid() | atom(), session_id :: String.t()) :: :ok
37+
@spec remove_peer(GenServer.server(), session_id :: String.t()) :: :ok
3738
def remove_peer(server, session_id) do
3839
GenServer.cast(server, {:remove_peer, session_id})
3940
end
@@ -165,7 +166,7 @@ defmodule Shinkai.Sink.WebRTC do
165166

166167
track_id = track_ctx.id
167168

168-
Registry.dispatch(Shinkai.Registry, {:webrtc, source_id}, fn peers ->
169+
Registry.dispatch(Sink.Registry, {:webrtc, source_id}, fn peers ->
169170
for {_pid, {pc, _session_id}} <- peers do
170171
Enum.each(packets, fn rtp_packet ->
171172
:ok = ExWebRTC.PeerConnection.send_rtp(pc, track_id, rtp_packet)
@@ -196,6 +197,7 @@ defmodule Shinkai.Sink.WebRTC do
196197

197198
defp mime_type(:h264), do: "video/H264"
198199
defp mime_type(:h265), do: "video/H265"
200+
defp mime_type(:av1), do: "video/AV1"
199201
defp mime_type(:pcma), do: "audio/PCMA"
200202

201203
defp sdp_fmtp_line(:h264, pt) do
@@ -207,10 +209,10 @@ defmodule Shinkai.Sink.WebRTC do
207209
}
208210
end
209211

210-
defp sdp_fmtp_line(:h265, _pt), do: nil
211212
defp sdp_fmtp_line(_codec, _pt), do: nil
212213

213214
defp payloader_mod(:h264), do: RTPEncoder.H264
214215
defp payloader_mod(:h265), do: RTPEncoder.H265
216+
defp payloader_mod(:av1), do: RTPEncoder.AV1
215217
defp payloader_mod(:pcma), do: RTPEncoder.G711
216218
end

lib/shinkai/sink/webrtc/peer_manager.ex

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ defmodule Shinkai.Sink.WebRTC.PeerManager do
6565
def handle_call({:remove_peer, session_id}, _from, state) do
6666
Logger.info("Removing WebRTC peer with session ID: #{session_id}")
6767

68-
case Registry.match(Shinkai.Registry, {:webrtc, state.source_id}, {:_, session_id}) do
68+
case Registry.match(Sink.Registry, {:webrtc, state.source_id}, {:_, session_id}) do
6969
[{_pid, {pc, _session_id}}] -> unregister(state.source_id, pc)
7070
[] -> :ok
7171
end
@@ -138,8 +138,9 @@ defmodule Shinkai.Sink.WebRTC.PeerManager do
138138
end
139139

140140
def handle_info({:ex_webrtc, pid, {:connection_state_change, :connected}}, state) do
141+
Logger.info("New WebRTC peer connected")
141142
{session_id, pc} = Enum.find(state.sessions, fn {_session_id, p} -> p == pid end)
142-
Registry.register(Shinkai.Registry, {:webrtc, state.source_id}, {pc, session_id})
143+
Registry.register(Sink.Registry, {:webrtc, state.source_id}, {pc, session_id})
143144
{:noreply, %{state | sessions: Map.delete(state.sessions, session_id)}}
144145
end
145146

@@ -157,7 +158,7 @@ defmodule Shinkai.Sink.WebRTC.PeerManager do
157158
{:noreply, state}
158159
end
159160

160-
def handle_info({:ex_webrtc, _pid, msg}, state) do
161+
def handle_info({:ex_webrtc, _pid, _msg}, state) do
161162
# Logger.info("Unhandled ExWebRTC message: #{inspect(msg)}")
162163
{:noreply, state}
163164
end
@@ -177,6 +178,6 @@ defmodule Shinkai.Sink.WebRTC.PeerManager do
177178

178179
defp unregister(source_id, pc) do
179180
PeerConnection.stop(pc)
180-
Registry.unregister_match(Shinkai.Registry, {:webrtc, source_id}, {pc, :_})
181+
Registry.unregister_match(Sink.Registry, {:webrtc, source_id}, {pc, :_})
181182
end
182183
end

0 commit comments

Comments
 (0)