Skip to content

Commit cf3018b

Browse files
committed
Add mermaid, improve code snippets
1 parent 1883642 commit cf3018b

File tree

1 file changed

+48
-17
lines changed

1 file changed

+48
-17
lines changed

guides/advanced/simulcast.md

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,17 @@ Currently there is no support for:
1919
* Bandwidth estimation
2020
* Automatic encoding switching
2121

22+
23+
```mermaid
24+
flowchart LR
25+
WB1((Web Browser1)) -->|low| Server
26+
WB1((Web Browser1)) -->|medium| Server
27+
WB1((Web Browser1)) -->|high| Server
28+
Server -->|low| WB2((WebBrowser 2))
29+
Server -->|high| WB3((WebBrowser 3))
30+
```
31+
32+
2233
## Turning simulcast on
2334

2435
### Elixir WebRTC
@@ -51,7 +62,7 @@ pc.addTransceiver(localStream.getVideoTracks()[0], {
5162

5263
> #### Minimal starting resolution {: .warning}
5364
> To run 3 simulcast encodings, the minimal starting resolution
54-
> must be 960x540. See more [here](https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/video/config/simulcast.cc;l=79?q=simulcast.cc)
65+
> must be 960x540. See more [here](https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/video/config/simulcast.cc;l=79?q=simulcast.cc).
5566
5667

5768
## Receiving simulcast packets
@@ -60,7 +71,7 @@ When simulcast is enabled, packets are labeled with an `rid`, which denotes simu
6071
encoding that a packet belongs to:
6172

6273
```elixir
63-
{:ex_webrtc, pc_pid, {:rtp, track_id, rid, packet}}
74+
{:ex_webrtc, input_pc_pid, {:rtp, input_track_id, rid, packet}}
6475
```
6576

6677
## Switching between simulcast encodings
@@ -80,10 +91,16 @@ alias ExWebRTC.RTP.{H264, Munger}
8091
m = Munger.new(90_000)
8192
```
8293

83-
2. When a packet arrives, rewrite its sequnce number and timestamp:
94+
2. When a packet from an encoding that we want to forward arrives, rewrite its sequnce number and timestamp:
8495

8596
```elixir
86-
{packet, munger} = Munger.munge(munger, packet)
97+
receive do
98+
{:ex_webrtc, input_pc, {:rtp, _input_track_id, "m", packet}} ->
99+
{packet, munger} = Munger.munge(munger, packet)
100+
:ok = PeerConnection.send_rtp(output_pc, output_track_id, packet)
101+
{:ex_webrtc, input_pc, {:rtp, _input_track_id, _rid, packet}} ->
102+
# ignore other packets
103+
end
87104
```
88105

89106
3. To switch to another encoding, request a keyframe for this encoding.
@@ -92,22 +109,36 @@ For example, transitioning from encoding `m` to `h`:
92109

93110

94111
```elixir
95-
:ok = PeerConnection.send_pli(input_pc, track_id, "h")
112+
# assume we have the following state
113+
state = %{
114+
current_encoding: "m",
115+
munger: munger,
116+
input_pc: input_pc,
117+
input_track_id: input_track_id,
118+
output_pc: output_pc,
119+
output_track_id: output_track_id
120+
}
121+
122+
:ok = PeerConnection.send_pli(state.input_pc, state.input_track_id, "h")
96123

97124
# ...
98125

99-
def handle_info({:ex_webrtc, input_pc, {:rtp, _track_id, "h", packet}}, state) do
100-
if H264.keyframe?(packet) do
101-
munger = Munger.update(munger)
102-
{munger, packet} = Munger.munge(munger, packet)
103-
PeerConnection.send_rtp(state.output_pc, state.output_track_id, packet)
104-
state = %{state | munger: munger}
105-
{:noreply, state}
106-
else
107-
# Ignore packets from 'h' until we receive a keyframe.
108-
{:noreply, state}
109-
end
126+
receive do
127+
{:ex_webrtc, input_pc, {:rtp, _input_track_id, rid, packet}} ->
128+
cond do
129+
rid == state.current_encoding ->
130+
{munger, packet} = Munger.munge(munger, packet)
131+
:ok = PeerConnection.send_rtp(state.output_pc, state.output_track_id, packet)
132+
%{state | munger: munger}
133+
rid == "h" and H264.keyframe?(packet) ->
134+
munger = Munger.update(munger)
135+
{munger, packet} = Munger.munge(munger, packet)
136+
:ok = PeerConnection.send_rtp(state.output_pc, state.output_track_id, packet)
137+
%{state | munger: munger, current_encoding: "h"}
138+
true ->
139+
state
140+
end
110141
end
111142
```
112143

113-
See our [Broadcaster](https://github.com/elixir-webrtc/apps/tree/master/broadcaster) app source code for more.
144+
See our [Broadcaster](https://github.com/elixir-webrtc/apps/blob/master/broadcaster/lib/broadcaster/forwarder.ex) app source code for more.

0 commit comments

Comments
 (0)