Browser Idiosyncracies with Simulcast and SVC

It’s been a while since I’ve posted, wanted to make a contribution to the community. I’ve done extensive testing with Chrome, Firefox, and Safari with VP8, VP9, and H264. Took many hours, now my loss is your gain. Here are my results:

Chrome, Firefox, and Safari are all able to consume VP8/H264 simulcast and VP9 SVC. Special note for H264, profile-level-id needs to be set to 42e01f for Firefox consumption. Profile-level-id of 42001f activates hardware encoding in Chrome but isn’t consumable by Firefox.

Regarding producers, it depends on the source:

getUserMedia() source:
SVC support with VP9 using L3T3_KEY. Spatial layers get reduced by Chrome (ie. to L2T3) for cameras that default to smaller dimensions, so use something like getUserMedia(video:{width: { ideal: 1280 }, height: { ideal: 720 }}) to request full size video.
Simulcast support with VP8, but only with L3T2.
Simulcast support for H264 (I think same as VP8 here).
Fun bug: L3T2 auto downgrades to L1T2 after a client-side producer.pause()/resume() if zeroRtpOnPause is enabled. I can’t tell if this is a bug in Firefox (more likely) or mediasoup (less likely). The SDP stuff is over my head. But the SFU receives only one spatial layer despite the browser sending packets for three.
Simulcast support with VP8 at L3T3.
Simulcast support with h264 at L3T1.

getDisplayMedia() source:
Chrome “supports” VP9 SVC only at L1T3 according to getStats(), but only actually sends one temporal layer to the SFU… so Chrome doesn’t actually support SVC :frowning:
Chrome supports simulcast on VP8 at L3T3 but I think it ignores scaleResolutionDownBy. All the outgoing-rtp layers are reported by getStats() to have the same dimensions.
Firefox has no Simulcast support. h264 seems to yield best result for a single stream based on my subjective opinion.
Safari; same as with Chrome. Also has H264 support at L3T3, but suffers the same scaleResolutionBy issue.

@ibc - I did my best to verify your prior success with S3T3 and dtx: true but couldn’t get it to work. According to, dtx is deprecated so I wonder if there was some update to Chrome that caused a regression. Also, see the Firefox zeroRtpOnPause bug above. I’m happy to submit a bug report with mozilla unless you think it might be a mediasoup issue (Firefox reports sending packets for all layers).

Reference post: Chrome and VP9 SVC support

What does “VP8 at L3T3” mean? VP8 supports temporal scalability only.

Sorry, terminology. In that writeout when I refer to L3T3 for VP8/H264 what I mean is L1T3 with 3 simulcast streams, ie:
{ scalabilityMode: ‘L1T3’, scaleResolutionDownBy:3 },
{ scalabilityMode: ‘L1T3’, scaleResolutionDownBy:2 },
{ scalabilityMode: ‘L1T3’, scaleResolutionDownBy:1 }