From cf8708da583dd44a90468f3a0a1c95d8999c3941 Mon Sep 17 00:00:00 2001 From: Sean DuBois Date: Mon, 3 Jul 2023 00:23:39 -0400 Subject: [PATCH] Add RFC: WebRTC Simulcast --- text/0055-webrtc-simulcast.md | 94 ++++++++++++++++++++ text/0055-webrtc-simulcast/service-page.png | Bin 0 -> 40099 bytes 2 files changed, 94 insertions(+) create mode 100644 text/0055-webrtc-simulcast.md create mode 100644 text/0055-webrtc-simulcast/service-page.png diff --git a/text/0055-webrtc-simulcast.md b/text/0055-webrtc-simulcast.md new file mode 100644 index 0000000..5395ba2 --- /dev/null +++ b/text/0055-webrtc-simulcast.md @@ -0,0 +1,94 @@ +# Summary + +Add Simulcast support to WebRTC output. + +Simulcast is a WebRTC protocol feature that allows a uploader to send layers of one track. This is built into the protocol so every WebRTC +ingest already understands this. These layers can be different resolutions, bitrates and even codecs. + +# Motivation + +Live streaming services offer videos at multiple bitrates and resolutions. This is needed to support the wide variety of connections that users will have. +Today streaming services decode the incoming video, modify and then re-encode to generate these different quality levels. This has some draw backs that Simulcast +will fix or improve. + +* **Generation Loss** - Decoding and re-encoding videos causes generation loss. Simulcast means encodes come from the source video which will be higher quality. + +* **Higher Quality Encodes** - Streamers with dedicated hardware can provide higher quality encodes. Streaming services at scale are optimizing for cost. + +* **Lower Latency** - Removing the additional encoding/decoding allows video to be delivered to users faster. + +* **Reduce server complexity** - Users find it difficult to setup RTMP->HLS with transcodes. With Simulcast setting up a streaming server becomes dramatically easier. + +# Design + +## When WHIP is selected service provide a 'Use Simulcast' checkbox + +When users select `WHIP` for their service a checkbox will appear below `Ignore streaming service setting recommendiations`. + +This checkbox will say `Use Simulcast`. This will be unchecked by default. + +## Create multiple encoders with the requested settings. + +A new member will be added to the `BasicOutputHandler` class. This new member `std::vector simulcastEncoders` will contain +the encoders. + +`BasicOutputHandler` will query if `UseSimulcast` is enabled. If enabled it will create two additional encoders `simulcast_0` and `simulcast_1`. +The three encoders will be like the following. + +* `simple_video_stream` - Full Resolution, Full Bitrate +* `simulcast_0` 50% Resolution of `simple_video_stream`, 50% bitrate of `simple_video_stream` +* `simulcast_0` 25% Resolution of `simple_video_stream`, 25% bitrate of `simple_video_stream` + +## Configure PeerConnection in `obs_output_info.start` + +`WHIPOutput::Start` will use `obs_output_get_video_encoder2` to query how many encoders exist. + +If 3 encoders exist we will enable Simulcast and the layers will have RIDs of `h` (high), `m` (medium) and `l` (low). +RIDs are used in the WebRTC protocol to give labels to a stream of video. + +# Proposed UX + +## Stream Page + +When users select `WHIP` for their service a checkbox will appear below `Ignore streaming service setting recommendiations`. + +This checkbox will say `Use Simulcast`. This will be unchecked by default. + +![Settings Example](./0055-webrtc-simulcast/service-page.png) + +## Simple Output Mode + +No changes will be made. + +## Advanced Output Mode + +No changes will be made. + +# Alternatives + +## Do not implement Simulcast + +We could require users to install additional software to use Simulcast. + +## Advanced UIs + +This would require a large amount of UI work. I also wasn't able to find agreement on how this should work among the WebRTC service providers. +The simple mode I was able to find consensus quickly. + +# Drawbacks + +## Additional Complexity + +Simulcast will add additional code to the OBS code base. If this feature is unused it would be extra burden on the project for no value. + +## More Compute/Network Usage + +Simulcast will require extra compute and network. If users encounter hardware/network overusage they will need to reduce bitrate/resolution. + +In the future I would like to write a dynamic simulcast feature. The WebRTC protocol allows layers to be disabled/enabled at anytime. We could detect network +overusage and disable layers to ensure the streamer has the best experience possible. We would then re-enable them when the network and/or hardware recovers. + +# Additional Information + +Implementation: +* [PR](https://github.com/obsproject/obs-studio/pull/9165) diff --git a/text/0055-webrtc-simulcast/service-page.png b/text/0055-webrtc-simulcast/service-page.png new file mode 100644 index 0000000000000000000000000000000000000000..b5203b259b765e9b2a8101ebac76954f978586ee GIT binary patch literal 40099 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 literal 0 HcmV?d00001