Simulcast/SVC @ IIT-RTC 2019

1,936 views 48 slides Oct 16, 2019
Slide 1
Slide 1 of 48
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48

About This Presentation

The slides for a talk I presented at the WebRTC track of IIT-RTC in Chicago, titled "SFU's, Simulcast and SVC: what's new in WebRTC?". Mostly a high-level introduction to how simulcast and SVC work (or not) today in browsers, how they came to be and where they might be headed from ...


Slide Content

SFU's, Simulcast and SVC
What's new in WebRTC?
Lorenzo Miniero
@elminiero
IIT Real-Time Communication 2019 – WebRTC Track
October 15
th
2019, Chicago, IL, USA

A few words about me
Lorenzo Miniero
Ph.D @ UniNA
Chairman @ Meetecho
Main author of Janus
®
Contacts and info
[email protected]
https://twitter.com/elminiero
https://www.slideshare.net/LorenzoMiniero

WebRTC topologies: full-mesh
https://webrtchacks.com/webrtc-beyond-one-one/

WebRTC topologies: MCU (Multipoint Control Unit)
https://webrtchacks.com/webrtc-beyond-one-one/

WebRTC topologies: SFU (Selective Forwarding Unit)
https://webrtchacks.com/webrtc-beyond-one-one/

Simulcast in a nutshell
https://webrtchacks.com/sfu-simulcast/

SVC as a different way to encode multiple tracks
https://webrtchacks.com/chrome-vp9-svc/

Simulcast vs. SVC
Simulcast
Same source, same m-line
Streams of different “quality” are separate tracks
Each track is a different SSRC
Each track can be decoded indepedently from others
SVC
Same source, same m-line
Streams of different “quality” are layers of the same “thing”
All tracks share the same SSRC (since they're layers)
Each track depends on the previous to be decoded
Less bandwidth, but more CPU intensive
Fun fact – Simulcast in browsers also enables temporal scalability
Allows to drop to lower framerate without sacricing quality

Simulcast vs. SVC
Simulcast
Same source, same m-line
Streams of different “quality” are separate tracks
Each track is a different SSRC
Each track can be decoded indepedently from others
SVC
Same source, same m-line
Streams of different “quality” are layers of the same “thing”
All tracks share the same SSRC (since they're layers)
Each track depends on the previous to be decoded
Less bandwidth, but more CPU intensive
Fun fact – Simulcast in browsers also enables temporal scalability
Allows to drop to lower framerate without sacricing quality

Simulcast vs. SVC
Simulcast
Same source, same m-line
Streams of different “quality” are separate tracks
Each track is a different SSRC
Each track can be decoded indepedently from others
SVC
Same source, same m-line
Streams of different “quality” are layers of the same “thing”
All tracks share the same SSRC (since they're layers)
Each track depends on the previous to be decoded
Less bandwidth, but more CPU intensive
Fun fact – Simulcast in browsers also enables temporal scalability
Allows to drop to lower framerate without sacricing quality

Both only make sense with an SFU on the path
Browsers can't negotiate receiving part of simulcast
... unless you're Philipp Hancke's browser!
https://webrtchacks.com/a-playground-for-simulcast-without-an-sfu/
It wouldn't make much sense anyway!
Why receive all “versions” when you only need one?
Job for a SelectiveForwarding Unit!
Pretty much all SFU's support simulcast today
Janus (wink wink!
)
Jitsi
mediasoup
Medooze
...
Most support some avour of SVC as well (more on that later)

Both only make sense with an SFU on the path
Browsers can't negotiate receiving part of simulcast
... unless you're Philipp Hancke's browser!https://webrtchacks.com/a-playground-for-simulcast-without-an-sfu/
It wouldn't make much sense anyway!
Why receive all “versions” when you only need one?
Job for a SelectiveForwarding Unit!
Pretty much all SFU's support simulcast today
Janus (wink wink!
)
Jitsi
mediasoup
Medooze
...
Most support some avour of SVC as well (more on that later)

Both only make sense with an SFU on the path
Browsers can't negotiate receiving part of simulcast
... unless you're Philipp Hancke's browser!https://webrtchacks.com/a-playground-for-simulcast-without-an-sfu/
It wouldn't make much sense anyway!
Why receive all “versions” when you only need one?
Job for a SelectiveForwarding Unit!
Pretty much all SFU's support simulcast today
Janus (wink wink!
)
Jitsi
mediasoup
Medooze
...
Most support some avour of SVC as well (more on that later)

Both only make sense with an SFU on the path
Browsers can't negotiate receiving part of simulcast
... unless you're Philipp Hancke's browser!https://webrtchacks.com/a-playground-for-simulcast-without-an-sfu/
It wouldn't make much sense anyway!
Why receive all “versions” when you only need one?
Job for a SelectiveForwarding Unit!
Pretty much all SFU's support simulcast today
Janus (wink wink!
)
Jitsi
mediasoup
Medooze
...
Most support some avour of SVC as well (more on that later)

Both only make sense with an SFU on the path
Browsers can't negotiate receiving part of simulcast
... unless you're Philipp Hancke's browser!https://webrtchacks.com/a-playground-for-simulcast-without-an-sfu/
It wouldn't make much sense anyway!
Why receive all “versions” when you only need one?
Job for a SelectiveForwarding Unit!
Pretty much all SFU's support simulcast today
Janus (wink wink!
)
Jitsi
mediasoup
Medooze
...
Most support some avour of SVC as well (more on that later)

Tackling simulcast at the IETF 104 hackathon
https://trac.ietf.org/trac/ietf/meeting/wiki/104hackathon/webrtc

Enabling simulcast the ugly way (SDP munging)
a=ssrc:659652645 cname:Taj3/ieCnLbsUFoH
a=ssrc:659652645 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:659652645 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:659652645 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:98148385 cname:Taj3/ieCnLbsUFoH
a=ssrc:98148385 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:98148385 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:98148385 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc-group:FID

Enabling simulcast the ugly way (SDP munging)
a=ssrc: 659652645
a=ssrc:659652645 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:659652645 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:659652645 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc: 98148385
a=ssrc:98148385 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:98148385 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:98148385 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc-group:FID 659652645 98148385

Enabling simulcast the ugly way (SDP munging)
a=ssrc:659652645 cname:Taj3/ieCnLbsUFoH
a=ssrc:659652645 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:659652645 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:659652645 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:98148385 cname:Taj3/ieCnLbsUFoH
a=ssrc:98148385 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:98148385 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:98148385 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1982135572 cname:Taj3/ieCnLbsUFoH
a=ssrc:1982135572 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1982135572 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:1982135572 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:2523084908 cname:Taj3/ieCnLbsUFoH
a=ssrc:2523084908 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:2523084908 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:2523084908 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:3604909222 cname:Taj3/ieCnLbsUFoH
a=ssrc:3604909222 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:3604909222 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:3604909222 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1893605472 cname:Taj3/ieCnLbsUFoH
a=ssrc:1893605472 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1893605472 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:1893605472 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc-group:SIM
a=ssrc-group:FID
a=ssrc-group:FID
a=ssrc-group:FID

Enabling simulcast the ugly way (SDP munging)
a=ssrc:659652645 cname:Taj3/ieCnLbsUFoH
a=ssrc:659652645 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:659652645 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:659652645 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:98148385 cname:Taj3/ieCnLbsUFoH
a=ssrc:98148385 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:98148385 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:98148385 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1982135572 cname:Taj3/ieCnLbsUFoH
a=ssrc:1982135572 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1982135572 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:1982135572 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:2523084908 cname:Taj3/ieCnLbsUFoH
a=ssrc:2523084908 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:2523084908 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:2523084908 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:3604909222 cname:Taj3/ieCnLbsUFoH
a=ssrc:3604909222 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:3604909222 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:3604909222 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1893605472 cname:Taj3/ieCnLbsUFoH
a=ssrc:1893605472 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1893605472 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:1893605472 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc-group:SIM
a=ssrc-group:FID
a=ssrc-group:FID 1982135572 2523084908
a=ssrc-group:FID

Enabling simulcast the ugly way (SDP munging)
a=ssrc:659652645 cname:Taj3/ieCnLbsUFoH
a=ssrc:659652645 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:659652645 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:659652645 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:98148385 cname:Taj3/ieCnLbsUFoH
a=ssrc:98148385 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:98148385 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:98148385 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1982135572 cname:Taj3/ieCnLbsUFoH
a=ssrc:1982135572 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1982135572 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:1982135572 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:2523084908 cname:Taj3/ieCnLbsUFoH
a=ssrc:2523084908 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:2523084908 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:2523084908 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:3604909222 cname:Taj3/ieCnLbsUFoH
a=ssrc:3604909222 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:3604909222 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:3604909222 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1893605472 cname:Taj3/ieCnLbsUFoH
a=ssrc:1893605472 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1893605472 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:1893605472 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc-group:SIM
a=ssrc-group:FID
a=ssrc-group:FID
a=ssrc-group:FID 3604909222 1893605472

Enabling simulcast the ugly way (SDP munging)
a=ssrc:659652645 cname:Taj3/ieCnLbsUFoH
a=ssrc:659652645 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:659652645 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:659652645 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:98148385 cname:Taj3/ieCnLbsUFoH
a=ssrc:98148385 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:98148385 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:98148385 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1982135572 cname:Taj3/ieCnLbsUFoH
a=ssrc:1982135572 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1982135572 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:1982135572 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:2523084908 cname:Taj3/ieCnLbsUFoH
a=ssrc:2523084908 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:2523084908 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:2523084908 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:3604909222 cname:Taj3/ieCnLbsUFoH
a=ssrc:3604909222 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:3604909222 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:3604909222 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1893605472 cname:Taj3/ieCnLbsUFoH
a=ssrc:1893605472 msid:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk 028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc:1893605472 mslabel:i1zOaprU7rZzMDaOXFdqwkq7Q6wP6f3cgUgk
a=ssrc:1893605472 label:028ab73b-cdd0-4b61-a282-ea0ed0c6a9bb
a=ssrc-group:SIM 659652645 1982135572 3604909222
a=ssrc-group:FID
a=ssrc-group:FID 1982135572 2523084908
a=ssrc-group:FID 3604909222 1893605472

Hardcoded table for simulcast bitrates
https://webrtchacks.com/a-playground-for-simulcast-without-an-sfu/

Testing simulcasting via SDP munging
https://www.meetecho.com/blog/simulcast-janus-ssrc/

Enter “rid” (Firefox >= 46)
vargetSenders().find(s => s.track.kind ==video");
vargetParameters();
if(!parameters)
parameters = {};
parameters.encodings
{:h",:,: 900000 },
{:m",:,: 300000,
scaleResolutionDownBy: 2 },
{:l",:,: 100000,
scaleResolutionDownBy: 4 }
];
sender.setParameters(parameters);

Encoding simulcast info in the SDP offer
a=extmap:6/sendonly
[..]
a=rid:h
a=rid:m
a=rid:l
a=simulcast:=h;m;l
a=ssrc:2232294953 cname:{d31e1342-72d7-45e3-9b8d-9419cf7121b6}
a=ssrc:2149721810 cname:{d31e1342-72d7-45e3-9b8d-9419cf7121b6}
a=ssrc:2539596807 cname:{d31e1342-72d7-45e3-9b8d-9419cf7121b6}

Encoding simulcast info in the SDP answer
a=extmap:6/recvonly
[..]
a=rid:h
a=rid:m
a=rid:l
a=simulcast:=h;m;l

Testing Firefox's avour of rid-based simulcasting
https://www.meetecho.com/blog/simulcast-janus-ssrc/

Conguring the simulcast envelope the “spec” way
pc.addTransceiver(track, {
direction:sendrecv",
streams: [stream],
sendEncodings: [
{:h",:,: 900000 },
{:m",:,: 300000,
scaleResolutionDownBy: 2 },
{:l",:,: 100000,
scaleResolutionDownBy: 4 }
]
});
https://www.w3.org/TR/webrtc/#simulcast-functionality

Hey, where's my SSRC?!
a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
[..]
a=rid:h
a=rid:m
a=rid:l
a=simulcast:send

SDP answer
a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
[..]
a=rid:h
a=rid:m
a=rid:l
a=simulcast:

Why remove the SSRC from the SDP?
Many implementations rely on the SSRC for demultiplexing
RTP/RTCP from multiple streams all muxed together
SSRC used to recognize one stream from another
Missing SSRCs break most of those applications
Chrome's perspective: the problem of mapping “rid” to “ssrc”
Both are in the SDP, but how are they mapped?
Order-based just a convention, and at the time not specied anywhere
https://tools.ietf.org/html/draft-alvestrand-mmusic-simulcast-ssrc-00
Solution: parse rid RTP extension on the recipient side
SSRC in related packet allows for specic rid$ssrc association
Once you know the SSRC, keep on multiplexing on that

Why remove the SSRC from the SDP?
Many implementations rely on the SSRC for demultiplexing
RTP/RTCP from multiple streams all muxed together
SSRC used to recognize one stream from another
Missing SSRCs break most of those applications
Chrome's perspective: the problem of mapping “rid” to “ssrc”
Both are in the SDP, but how are they mapped?
Order-based just a convention, and at the time not specied anywhere
https://tools.ietf.org/html/draft-alvestrand-mmusic-simulcast-ssrc-00
Solution: parse rid RTP extension on the recipient side
SSRC in related packet allows for specic rid$ssrc association
Once you know the SSRC, keep on multiplexing on that

Why remove the SSRC from the SDP?
Many implementations rely on the SSRC for demultiplexing
RTP/RTCP from multiple streams all muxed together
SSRC used to recognize one stream from another
Missing SSRCs break most of those applications
Chrome's perspective: the problem of mapping “rid” to “ssrc”
Both are in the SDP, but how are they mapped?
Order-based just a convention, and at the time not specied anywhere
https://tools.ietf.org/html/draft-alvestrand-mmusic-simulcast-ssrc-00
Solution: parse rid RTP extension on the recipient side
SSRC in related packet allows for specic rid$ssrc association
Once you know the SSRC, keep on multiplexing on that

Mapping “rid” values to SSRC

Mapping “rid” values to SSRC

Testing rid-based simulcasting via sendEncodings
https://www.meetecho.com/blog/simulcast-janus-ssrc/

What about SVC?
https://webrtchacks.com/chrome-vp9-svc/

Currently only available in Chrome, and behind a ag
/opt/google/chrome/google-chrome
--user-data-dir=/home/user/customprofile
--no-first-run
--force-fieldtrials=
WebRTC-SupportVP9SVC/EnabledByFlag_2SL3TL/

Testing VP9 SVC in Chrome
https://www.meetecho.com/blog/vp9-svc-in-janus-meetecho-cosmo/

AV1 is coming! (and SVC is mandated)
https://aomediacodec.github.io/av1-spec/

Prefened scalability modes
Name Spatial LayersResolution RatioTemporal LayersInter-layer dependency
L1T2 1 2
L1T3 1 3
L2T1 2 2:1 1 Yes
L2T2 2 2:1 2 Yes
L2T3 2 2:1 3 Yes
S2T1 2 2:1 1 No
S2T2 2 2:1 2 No
S2T3 2 2:1 3 No
L2T1h2 1.5:1 1 Yes
L2T2h2 1.5:1 2 Yes
L2T3h2 1.5:1 3 Yes
S2T1h2 1.5:1 1 No
S2T2h2 1.5:1 2 No
S2T3h2 1.5:1 3 No
... ... ... ... ...
https://w3c.github.io/webrtc-svc/#scalabilitymodes*

Prefened scalability modes
Name Spatial LayersResolution RatioTemporal LayersInter-layer dependency
... ... ... ... ...
L3T1 3 2:1 1 Yes
L3T2 3 2:1 2 Yes
L3T3 3 2:1 3 Yes
S3T1 3 2:1 1 No
S3T2 3 2:1 2 No
S3T3 3 2:1 3 No
L3T2_KEY 3 2:1 2 Yes
L3T3_KEY 3 2:1 3 Yes
L4T5_KEY 4 2:1 5 Yes
L4T7_KEY 4 2:1 7 Yes
L3T2_KEY_SHIFT 3 2:1 2 Yes
L3T3_KEY_SHIFT 3 2:1 3 Yes
L4T5_KEY_SHIFT 4 2:1 5 Yes
L4T7_KEY_SHIFT 4 2:1 7 Yes
https://w3c.github.io/webrtc-svc/#scalabilitymodes*

Programmable SVC – IETF 105 hackathon
https://twitter.com/intenttoship/status/1152955435898605568

WebRTC F2F during W3C TPAC 2019
https://www.w3.org/2011/04/webrtc/wiki/September_19-20_2019

What it may look like in the future
pc.addTransceiver(track, {
direction:sendrecv",
streams: [stream],
sendEncodings: [
{
scalabilityMode:L3T3",
maxBitrate: 600000,
maxFramerate: 30,
spatialLayers: [
{:,: 50000,: [0.6, 0.2, 0.2] },
{:,: 150000,: [0.5, 0.4, 0.2] },
{:,: [0.6, 0.3, 0.3] }
]
},
]
});
https://github.com/w3c/webrtc-svc/issues/14

What's next? – IETF Hackathon in Singapore!
https://www.ietf.org/how/runningcode/hackathons/106-hackathon/

Thanks! Questions? Comments?
Get in touch!

https://twitter.com/elminiero

https://twitter.com/meetecho

https://www.meetecho.com