SlideShare a Scribd company logo
1 of 58
Download to read offline
WISH-a-WHIP:
WebRTC ingest for broadcasting
Lorenzo Miniero
@elminiero
IIT Real-Time Communication 2021 – WebRTC Track
October 13th 2021, Chicago, IL, USA
A few words about me
Lorenzo Miniero
• Ph.D @ UniNA
• Chairman @ Meetecho
• Main author of Janus®
Contacts and info
• lorenzo@meetecho.com
• https://twitter.com/elminiero
• https://www.slideshare.net/LorenzoMiniero
• https://soundcloud.com/lminiero
• https://lminiero.bandcamp.com
There would be no WHIP without Dr. Alex r
Traditional broadcasting
Why not WebRTC?
• Traditional broadcasting efficient but higher latency
• At best (live), delay will typically be in the range of a few seconds
• WebRTC natively conceived for very low latency, instead
• Born for conversational audio/video/data
• Can be (and often is) easily used for monodirectional streaming as well
• Strangely not really considered by the industry up until recently, though
• Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”)
• Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/
• Tooling an important aspect to foster WebRTC adoption, here
• e.g., a standard way to send media, and tools à la OBS
Why not WebRTC?
• Traditional broadcasting efficient but higher latency
• At best (live), delay will typically be in the range of a few seconds
• WebRTC natively conceived for very low latency, instead
• Born for conversational audio/video/data
• Can be (and often is) easily used for monodirectional streaming as well
• Strangely not really considered by the industry up until recently, though
• Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”)
• Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/
• Tooling an important aspect to foster WebRTC adoption, here
• e.g., a standard way to send media, and tools à la OBS
Why not WebRTC?
• Traditional broadcasting efficient but higher latency
• At best (live), delay will typically be in the range of a few seconds
• WebRTC natively conceived for very low latency, instead
• Born for conversational audio/video/data
• Can be (and often is) easily used for monodirectional streaming as well
• Strangely not really considered by the industry up until recently, though
• Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”)
• Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/
• Tooling an important aspect to foster WebRTC adoption, here
• e.g., a standard way to send media, and tools à la OBS
Why not WebRTC?
• Traditional broadcasting efficient but higher latency
• At best (live), delay will typically be in the range of a few seconds
• WebRTC natively conceived for very low latency, instead
• Born for conversational audio/video/data
• Can be (and often is) easily used for monodirectional streaming as well
• Strangely not really considered by the industry up until recently, though
• Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”)
• Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/
• Tooling an important aspect to foster WebRTC adoption, here
• e.g., a standard way to send media, and tools à la OBS
Making WebRTC ingestion easy: WHIP!
https://www.meetecho.com/blog/whip-janus/ (September, 2020)
A new Working Group in the IETF...
https://datatracker.ietf.org/wg/wish/about/
... and a new draft for the WHIP specification!
https://www.ietf.org/archive/id/draft-ietf-wish-whip-00.html
WebRTC-HTTP ingestion protocol (WHIP)
• HTTP-based signalling to create sendonly PeerConnections
• HTTP POST to send SDP offer, and get an SDP answer in the response
• Teardown of sessions using HTTP DELETE
• Authentication and authorization via Bearer tokens
• https://www.rfc-editor.org/rfc/rfc6750.html
• Trickle and ICE restart via HTTP PATCH and SDP fragments
• https://www.rfc-editor.org/rfc/rfc8840.html
• Everything else is your usual WebRTC!
• ICE, DTLS, etc.
WebRTC-HTTP ingestion protocol (WHIP)
• HTTP-based signalling to create sendonly PeerConnections
• HTTP POST to send SDP offer, and get an SDP answer in the response
• Teardown of sessions using HTTP DELETE
• Authentication and authorization via Bearer tokens
• https://www.rfc-editor.org/rfc/rfc6750.html
• Trickle and ICE restart via HTTP PATCH and SDP fragments
• https://www.rfc-editor.org/rfc/rfc8840.html
• Everything else is your usual WebRTC!
• ICE, DTLS, etc.
WebRTC-HTTP ingestion protocol (WHIP)
• HTTP-based signalling to create sendonly PeerConnections
• HTTP POST to send SDP offer, and get an SDP answer in the response
• Teardown of sessions using HTTP DELETE
• Authentication and authorization via Bearer tokens
• https://www.rfc-editor.org/rfc/rfc6750.html
• Trickle and ICE restart via HTTP PATCH and SDP fragments
• https://www.rfc-editor.org/rfc/rfc8840.html
• Everything else is your usual WebRTC!
• ICE, DTLS, etc.
WebRTC-HTTP ingestion protocol (WHIP)
• HTTP-based signalling to create sendonly PeerConnections
• HTTP POST to send SDP offer, and get an SDP answer in the response
• Teardown of sessions using HTTP DELETE
• Authentication and authorization via Bearer tokens
• https://www.rfc-editor.org/rfc/rfc6750.html
• Trickle and ICE restart via HTTP PATCH and SDP fragments
• https://www.rfc-editor.org/rfc/rfc8840.html
• Everything else is your usual WebRTC!
• ICE, DTLS, etc.
A few sequence diagrams
A few sequence diagrams
A few sequence diagrams
A WHIP server based on Janus
• Janus is a popular WebRTC server, so good option for WHIP
• It implements its own JSON-based API, though (Janus API)
• Simple (and transparent) solution: basic API translator in front of Janus
• WHIP API maps quite simply to set of Janus API primitives
• No need to change anything in the WebRTC stack
• Implemented simple prototype using node.js and Express
• REST server that implements the WHIP API, and talks to Janus accordingly
• Only takes care of ingest: distribution out of scope (e.g., via SOLEIL)
Simple WHIP Server
https://github.com/lminiero/simple-whip-server/
A WHIP server based on Janus
• Janus is a popular WebRTC server, so good option for WHIP
• It implements its own JSON-based API, though (Janus API)
• Simple (and transparent) solution: basic API translator in front of Janus
• WHIP API maps quite simply to set of Janus API primitives
• No need to change anything in the WebRTC stack
• Implemented simple prototype using node.js and Express
• REST server that implements the WHIP API, and talks to Janus accordingly
• Only takes care of ingest: distribution out of scope (e.g., via SOLEIL)
Simple WHIP Server
https://github.com/lminiero/simple-whip-server/
A WHIP server based on Janus
• Janus is a popular WebRTC server, so good option for WHIP
• It implements its own JSON-based API, though (Janus API)
• Simple (and transparent) solution: basic API translator in front of Janus
• WHIP API maps quite simply to set of Janus API primitives
• No need to change anything in the WebRTC stack
• Implemented simple prototype using node.js and Express
• REST server that implements the WHIP API, and talks to Janus accordingly
• Only takes care of ingest: distribution out of scope (e.g., via SOLEIL)
Simple WHIP Server
https://github.com/lminiero/simple-whip-server/
A WHIP server based on Janus
• Janus is a popular WebRTC server, so good option for WHIP
• It implements its own JSON-based API, though (Janus API)
• Simple (and transparent) solution: basic API translator in front of Janus
• WHIP API maps quite simply to set of Janus API primitives
• No need to change anything in the WebRTC stack
• Implemented simple prototype using node.js and Express
• REST server that implements the WHIP API, and talks to Janus accordingly
• Only takes care of ingest: distribution out of scope (e.g., via SOLEIL)
Simple WHIP Server
https://github.com/lminiero/simple-whip-server/
Distributing a WHIP Janus stream: SOLEIL
Distributing a WHIP Janus stream: SOLEIL
Mapping WHIP interactions to the Janus API
Mapping WHIP interactions to the Janus API
Mapping WHIP interactions to the Janus API
Mapping WHIP interactions to the Janus API
Mapping WHIP interactions to the Janus API
Simple WHIP Server in action
Basic UI to create/manage endpoints
Writing a WHIP client for testing
• Needs to support HTTP (WHIP API) and have a WebRTC stack
• Browsers are the obvious choice, but what about a native solution?
• Many broadcasters today use custom tools (e.g., OBS)
• Unfortunately OBS-WebRTC is not currently an option
• Used legacy WHIP API, and currently only supports Millicast ingestion
• Chose GStreamer’s webrtcbin1 for the purpose
• Used it already with success in other applications (e.g., JamRTC)
• Modular and very powerful, so easy to feed with external sources
Simple WHIP Client
https://github.com/lminiero/simple-whip-client/
1
https://gstreamer.freedesktop.org/documentation/webrtc/
Writing a WHIP client for testing
• Needs to support HTTP (WHIP API) and have a WebRTC stack
• Browsers are the obvious choice, but what about a native solution?
• Many broadcasters today use custom tools (e.g., OBS)
• Unfortunately OBS-WebRTC is not currently an option
• Used legacy WHIP API, and currently only supports Millicast ingestion
• Chose GStreamer’s webrtcbin1 for the purpose
• Used it already with success in other applications (e.g., JamRTC)
• Modular and very powerful, so easy to feed with external sources
Simple WHIP Client
https://github.com/lminiero/simple-whip-client/
1
https://gstreamer.freedesktop.org/documentation/webrtc/
Writing a WHIP client for testing
• Needs to support HTTP (WHIP API) and have a WebRTC stack
• Browsers are the obvious choice, but what about a native solution?
• Many broadcasters today use custom tools (e.g., OBS)
• Unfortunately OBS-WebRTC is not currently an option
• Used legacy WHIP API, and currently only supports Millicast ingestion
• Chose GStreamer’s webrtcbin1 for the purpose
• Used it already with success in other applications (e.g., JamRTC)
• Modular and very powerful, so easy to feed with external sources
Simple WHIP Client
https://github.com/lminiero/simple-whip-client/
1
https://gstreamer.freedesktop.org/documentation/webrtc/
Writing a WHIP client for testing
• Needs to support HTTP (WHIP API) and have a WebRTC stack
• Browsers are the obvious choice, but what about a native solution?
• Many broadcasters today use custom tools (e.g., OBS)
• Unfortunately OBS-WebRTC is not currently an option
• Used legacy WHIP API, and currently only supports Millicast ingestion
• Chose GStreamer’s webrtcbin1 for the purpose
• Used it already with success in other applications (e.g., JamRTC)
• Modular and very powerful, so easy to feed with external sources
Simple WHIP Client
https://github.com/lminiero/simple-whip-client/
1
https://gstreamer.freedesktop.org/documentation/webrtc/
Simple WHIP Client options
Usage:
whip-client [OPTION?] -- Simple WHIP client
Help Options:
-h, --help Show help options
Application Options:
-u, --url Address of the WHIP endpoint (required)
-t, --token Authentication Bearer token to use (optional)
-A, --audio GStreamer pipeline to use for audio (optional, required if audio-only)
-V, --video GStreamer pipeline to use for video (optional, required if video-only)
-S, --stun-server STUN server to use, if any (hostname:port)
-T, --turn-server TURN server to use, if any (username:password@host:port)
-l, --log-level Logging level (0=disable logging, 7=maximum log level; default: 4)
Simple WHIP Client example
./whip-client -u http://localhost:7080/whip/endpoint/abc123 
-t verysecret 
-A "audiotestsrc is-live=true wave=red-noise ! audioconvert !
audioresample ! queue ! opusenc ! rtpopuspay pt=100 ssrc=1 !
queue !
application/x-rtp,media=audio,encoding-name=OPUS,payload=100" 
-V "videotestsrc is-live=true pattern=ball ! videoconvert ! queue !
vp8enc deadline=1 ! rtpvp8pay pt=96 ssrc=2 ! queue !
application/x-rtp,media=video,encoding-name=VP8,payload=96" 
-S stun.l.google.com:19302
Example: NDI output + Simple WHIP Client
Simple WHIP Client in action
Testing my WHIP client with Janus
Other WHIP implementations
• A few other implementations are starting to appear already
• Very useful for interoperability testing!
• Juliusz Chroboczek
• WHIP server: https://github.com/jech/galene/tree/whip (Galene integration)
• Sergio Garcia Murillo
• WHIP client: https://github.com/medooze/whip-js/ (web client)
• WHIP server: Millicast integration
• Gustavo Garcia
• WHIP client: https://github.com/ggarber/whip-go (command-line)
• More to come soon, hopefully!
Other WHIP implementations
• A few other implementations are starting to appear already
• Very useful for interoperability testing!
• Juliusz Chroboczek
• WHIP server: https://github.com/jech/galene/tree/whip (Galene integration)
• Sergio Garcia Murillo
• WHIP client: https://github.com/medooze/whip-js/ (web client)
• WHIP server: Millicast integration
• Gustavo Garcia
• WHIP client: https://github.com/ggarber/whip-go (command-line)
• More to come soon, hopefully!
Other WHIP implementations
• A few other implementations are starting to appear already
• Very useful for interoperability testing!
• Juliusz Chroboczek
• WHIP server: https://github.com/jech/galene/tree/whip (Galene integration)
• Sergio Garcia Murillo
• WHIP client: https://github.com/medooze/whip-js/ (web client)
• WHIP server: Millicast integration
• Gustavo Garcia
• WHIP client: https://github.com/ggarber/whip-go (command-line)
• More to come soon, hopefully!
Other WHIP implementations
• A few other implementations are starting to appear already
• Very useful for interoperability testing!
• Juliusz Chroboczek
• WHIP server: https://github.com/jech/galene/tree/whip (Galene integration)
• Sergio Garcia Murillo
• WHIP client: https://github.com/medooze/whip-js/ (web client)
• WHIP server: Millicast integration
• Gustavo Garcia
• WHIP client: https://github.com/ggarber/whip-go (command-line)
• More to come soon, hopefully!
Other WHIP implementations
• A few other implementations are starting to appear already
• Very useful for interoperability testing!
• Juliusz Chroboczek
• WHIP server: https://github.com/jech/galene/tree/whip (Galene integration)
• Sergio Garcia Murillo
• WHIP client: https://github.com/medooze/whip-js/ (web client)
• WHIP server: Millicast integration
• Gustavo Garcia
• WHIP client: https://github.com/ggarber/whip-go (command-line)
• More to come soon, hopefully!
Testing my WHIP client with Janus
Testing my WHIP client with Galene
Testing my WHIP client with Millicast
Testing Sergio’s WHIP client with Janus
Testing Sergio’s WHIP client with Galene
Testing Sergio’s WHIP client with Millicast
Testing Gustavo’s WHIP client with Janus
Testing Gustavo’s WHIP client with Galene
Testing Gustavo’s WHIP client with Millicast
Got some feedback to improve the spec
• Interoperability was surprisingly quite successful!
• Even in early stage of specification, draft was easy to implement
• All tests across different implementations got a PeerConnection working
• That said, some potential issues or challenges were identified
• Unlike native clients, web-based WHIP clients are subject to CORS
• RFC8840’s format for candidates may be a bit too “convoluted”?
• Document should expand on what to return in case of errors
• How to respond to PATCH for trickle is unclear too (e.g., 204 vs. 200 vs. ??)
• There may be race conditions between PATCH requests when doing an ICE restart
Got some feedback to improve the spec
• Interoperability was surprisingly quite successful!
• Even in early stage of specification, draft was easy to implement
• All tests across different implementations got a PeerConnection working
• That said, some potential issues or challenges were identified
• Unlike native clients, web-based WHIP clients are subject to CORS
• RFC8840’s format for candidates may be a bit too “convoluted”?
• Document should expand on what to return in case of errors
• How to respond to PATCH for trickle is unclear too (e.g., 204 vs. 200 vs. ??)
• There may be race conditions between PATCH requests when doing an ICE restart
Next stop: IETF 112 Hackathon!
https://www.ietf.org/how/runningcode/hackathons/112-hackathon/
Thanks! Questions? Comments?
Get in touch!
• https://twitter.com/elminiero
• https://twitter.com/meetecho
• https://www.meetecho.com

More Related Content

What's hot

What's hot (20)

Janus Workshop pt.2 @ ClueCon 2021
Janus Workshop pt.2 @ ClueCon 2021Janus Workshop pt.2 @ ClueCon 2021
Janus Workshop pt.2 @ ClueCon 2021
 
Can WebRTC help musicians? @ FOSDEM 2021
Can WebRTC help musicians? @ FOSDEM 2021Can WebRTC help musicians? @ FOSDEM 2021
Can WebRTC help musicians? @ FOSDEM 2021
 
Fuzzing RTC @ Kamailio World 2019
Fuzzing RTC @ Kamailio World 2019Fuzzing RTC @ Kamailio World 2019
Fuzzing RTC @ Kamailio World 2019
 
Janus RTP forwarders @ FOSDEM 2020
Janus RTP forwarders @ FOSDEM 2020Janus RTP forwarders @ FOSDEM 2020
Janus RTP forwarders @ FOSDEM 2020
 
Janus/SIP @ OpenSIPS 2017
Janus/SIP @ OpenSIPS 2017Janus/SIP @ OpenSIPS 2017
Janus/SIP @ OpenSIPS 2017
 
Talk@JanusCon2019: Janus, WebRTC and ML - Fantastic technologies and how to m...
Talk@JanusCon2019: Janus, WebRTC and ML - Fantastic technologies and how to m...Talk@JanusCon2019: Janus, WebRTC and ML - Fantastic technologies and how to m...
Talk@JanusCon2019: Janus, WebRTC and ML - Fantastic technologies and how to m...
 
Simulcast/SVC @ IIT-RTC 2019
Simulcast/SVC @ IIT-RTC 2019Simulcast/SVC @ IIT-RTC 2019
Simulcast/SVC @ IIT-RTC 2019
 
WebRTC security+more @ KamailioWorld 2018
WebRTC security+more @ KamailioWorld 2018WebRTC security+more @ KamailioWorld 2018
WebRTC security+more @ KamailioWorld 2018
 
WebRTC, RED and Janus @ ClueCon21
WebRTC, RED and Janus @ ClueCon21WebRTC, RED and Janus @ ClueCon21
WebRTC, RED and Janus @ ClueCon21
 
IETF remote participation via Meetecho @ WebRTC Meetup Stockholm
IETF remote participation via Meetecho @ WebRTC Meetup StockholmIETF remote participation via Meetecho @ WebRTC Meetup Stockholm
IETF remote participation via Meetecho @ WebRTC Meetup Stockholm
 
FOSDEM2018 Janus Lua plugin presentation
FOSDEM2018 Janus Lua plugin presentationFOSDEM2018 Janus Lua plugin presentation
FOSDEM2018 Janus Lua plugin presentation
 
Janus @ ClueCon 2019
Janus @ ClueCon 2019Janus @ ClueCon 2019
Janus @ ClueCon 2019
 
Virtual IETF meetings with WebRTC @ IETF 109 MOPS
Virtual IETF meetings with WebRTC @ IETF 109 MOPSVirtual IETF meetings with WebRTC @ IETF 109 MOPS
Virtual IETF meetings with WebRTC @ IETF 109 MOPS
 
Scaling WebRTC applications with Janus
Scaling WebRTC applications with JanusScaling WebRTC applications with Janus
Scaling WebRTC applications with Janus
 
Janus/SIP @ OpenSIPS 2019
Janus/SIP @ OpenSIPS 2019Janus/SIP @ OpenSIPS 2019
Janus/SIP @ OpenSIPS 2019
 
Janus Workshop @ ClueCon 2020
Janus Workshop @ ClueCon 2020Janus Workshop @ ClueCon 2020
Janus Workshop @ ClueCon 2020
 
SIP/WebRTC load testing @ KamailioWorld 2017
SIP/WebRTC load testing @ KamailioWorld 2017SIP/WebRTC load testing @ KamailioWorld 2017
SIP/WebRTC load testing @ KamailioWorld 2017
 
WHIP WebRTC Broadcasting @ FOSDEM 2022
WHIP WebRTC Broadcasting @ FOSDEM 2022WHIP WebRTC Broadcasting @ FOSDEM 2022
WHIP WebRTC Broadcasting @ FOSDEM 2022
 
Janus/HOMER/HEPIC @ OpenSIPS18
Janus/HOMER/HEPIC @ OpenSIPS18Janus/HOMER/HEPIC @ OpenSIPS18
Janus/HOMER/HEPIC @ OpenSIPS18
 
Janus: an open source and general purpose WebRTC (gateway) server
Janus: an open source and general purpose WebRTC (gateway) serverJanus: an open source and general purpose WebRTC (gateway) server
Janus: an open source and general purpose WebRTC (gateway) server
 

Similar to WHIP and Janus @ IIT-RTC 2021

Similar to WHIP and Janus @ IIT-RTC 2021 (20)

WebRTC Broadcasting @ TADSummit 2023
WebRTC Broadcasting @ TADSummit 2023WebRTC Broadcasting @ TADSummit 2023
WebRTC Broadcasting @ TADSummit 2023
 
Upperside Webinar - WebRTC Standards Update
Upperside Webinar - WebRTC Standards UpdateUpperside Webinar - WebRTC Standards Update
Upperside Webinar - WebRTC Standards Update
 
Torino js
Torino jsTorino js
Torino js
 
Janus/Asterisk @ Astricon 2017
Janus/Asterisk @ Astricon 2017Janus/Asterisk @ Astricon 2017
Janus/Asterisk @ Astricon 2017
 
WebRTC standards update - November 2014
WebRTC standards update - November 2014WebRTC standards update - November 2014
WebRTC standards update - November 2014
 
WebRTC & Asterisk 11
WebRTC & Asterisk 11WebRTC & Asterisk 11
WebRTC & Asterisk 11
 
WebRTC Standards & Implementation Q&A - The Internals of WebRTC Browsers Impl...
WebRTC Standards & Implementation Q&A - The Internals of WebRTC Browsers Impl...WebRTC Standards & Implementation Q&A - The Internals of WebRTC Browsers Impl...
WebRTC Standards & Implementation Q&A - The Internals of WebRTC Browsers Impl...
 
Boost JBoss AS7 with HTML5 WebRTC for Real Time Communications
Boost JBoss AS7 with HTML5 WebRTC for Real Time CommunicationsBoost JBoss AS7 with HTML5 WebRTC for Real Time Communications
Boost JBoss AS7 with HTML5 WebRTC for Real Time Communications
 
WebRTC for Telco: Informa's WebRTC Global Summit Preconference
WebRTC for Telco: Informa's WebRTC Global Summit PreconferenceWebRTC for Telco: Informa's WebRTC Global Summit Preconference
WebRTC for Telco: Informa's WebRTC Global Summit Preconference
 
Bridging_WebRTC_with_SIP_Alberto_WebRTCventures_Cluecon2023_NoVideo.pptx
Bridging_WebRTC_with_SIP_Alberto_WebRTCventures_Cluecon2023_NoVideo.pptxBridging_WebRTC_with_SIP_Alberto_WebRTCventures_Cluecon2023_NoVideo.pptx
Bridging_WebRTC_with_SIP_Alberto_WebRTCventures_Cluecon2023_NoVideo.pptx
 
Workshop oracle
Workshop oracleWorkshop oracle
Workshop oracle
 
WebRTC Standards Update (October 2014)
WebRTC Standards Update (October 2014)WebRTC Standards Update (October 2014)
WebRTC Standards Update (October 2014)
 
Web sockets - Pentesting
Web sockets - Pentesting Web sockets - Pentesting
Web sockets - Pentesting
 
WebRTC standards update (Jul 2014)
WebRTC standards update (Jul 2014)WebRTC standards update (Jul 2014)
WebRTC standards update (Jul 2014)
 
WebRTC Standards & Implementation Q&A - WebRTC Standards Feature Complete 
No...
WebRTC Standards & Implementation Q&A - WebRTC Standards Feature Complete 
No...WebRTC Standards & Implementation Q&A - WebRTC Standards Feature Complete 
No...
WebRTC Standards & Implementation Q&A - WebRTC Standards Feature Complete 
No...
 
Janus @ DevDay Napoli
Janus @ DevDay NapoliJanus @ DevDay Napoli
Janus @ DevDay Napoli
 
WebSockets wiith Scala and Play! Framework
WebSockets wiith Scala and Play! FrameworkWebSockets wiith Scala and Play! Framework
WebSockets wiith Scala and Play! Framework
 
WebRTC Webinar and Q&A - IP Address Privacy and Microsoft Edge Interoperability
WebRTC Webinar and Q&A - IP Address Privacy and Microsoft Edge InteroperabilityWebRTC Webinar and Q&A - IP Address Privacy and Microsoft Edge Interoperability
WebRTC Webinar and Q&A - IP Address Privacy and Microsoft Edge Interoperability
 
Upperside WebRTC conference - WebRTC intro
Upperside WebRTC conference - WebRTC introUpperside WebRTC conference - WebRTC intro
Upperside WebRTC conference - WebRTC intro
 
Multistream in Janus @ CommCon 2019
Multistream in Janus @ CommCon 2019Multistream in Janus @ CommCon 2019
Multistream in Janus @ CommCon 2019
 

More from Lorenzo Miniero

More from Lorenzo Miniero (12)

SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Getting AV1/SVC to work in the Janus WebRTC Server
Getting AV1/SVC to work in the Janus WebRTC ServerGetting AV1/SVC to work in the Janus WebRTC Server
Getting AV1/SVC to work in the Janus WebRTC Server
 
BWE in Janus
BWE in JanusBWE in Janus
BWE in Janus
 
The challenges of hybrid meetings @ CommCon 2023
The challenges of hybrid meetings @ CommCon 2023The challenges of hybrid meetings @ CommCon 2023
The challenges of hybrid meetings @ CommCon 2023
 
Real-Time Text and WebRTC @ Kamailio World 2023
Real-Time Text and WebRTC @ Kamailio World 2023Real-Time Text and WebRTC @ Kamailio World 2023
Real-Time Text and WebRTC @ Kamailio World 2023
 
Become a rockstar using FOSS!
Become a rockstar using FOSS!Become a rockstar using FOSS!
Become a rockstar using FOSS!
 
Janus SFU cascading @ IIT-RTC 2022
Janus SFU cascading @ IIT-RTC 2022Janus SFU cascading @ IIT-RTC 2022
Janus SFU cascading @ IIT-RTC 2022
 
SIP transfer with Janus/WebRTC @ OpenSIPS 2022
SIP transfer with Janus/WebRTC @ OpenSIPS 2022SIP transfer with Janus/WebRTC @ OpenSIPS 2022
SIP transfer with Janus/WebRTC @ OpenSIPS 2022
 
JamRTC @ Wonder WebRTC unConference
JamRTC @ Wonder WebRTC unConferenceJamRTC @ Wonder WebRTC unConference
JamRTC @ Wonder WebRTC unConference
 
Turning live events to virtual with Janus
Turning live events to virtual with JanusTurning live events to virtual with Janus
Turning live events to virtual with Janus
 
Janus workshop @ RTC2019 Beijing
Janus workshop @ RTC2019 BeijingJanus workshop @ RTC2019 Beijing
Janus workshop @ RTC2019 Beijing
 
Welcome to JanusCon! -- Past, Present and Future of Janus
Welcome to JanusCon! -- Past, Present and Future of JanusWelcome to JanusCon! -- Past, Present and Future of Janus
Welcome to JanusCon! -- Past, Present and Future of Janus
 

Recently uploaded

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 

Recently uploaded (20)

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 

WHIP and Janus @ IIT-RTC 2021

  • 1. WISH-a-WHIP: WebRTC ingest for broadcasting Lorenzo Miniero @elminiero IIT Real-Time Communication 2021 – WebRTC Track October 13th 2021, Chicago, IL, USA
  • 2. A few words about me Lorenzo Miniero • Ph.D @ UniNA • Chairman @ Meetecho • Main author of Janus® Contacts and info • lorenzo@meetecho.com • https://twitter.com/elminiero • https://www.slideshare.net/LorenzoMiniero • https://soundcloud.com/lminiero • https://lminiero.bandcamp.com
  • 3. There would be no WHIP without Dr. Alex r
  • 5. Why not WebRTC? • Traditional broadcasting efficient but higher latency • At best (live), delay will typically be in the range of a few seconds • WebRTC natively conceived for very low latency, instead • Born for conversational audio/video/data • Can be (and often is) easily used for monodirectional streaming as well • Strangely not really considered by the industry up until recently, though • Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”) • Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/ • Tooling an important aspect to foster WebRTC adoption, here • e.g., a standard way to send media, and tools à la OBS
  • 6. Why not WebRTC? • Traditional broadcasting efficient but higher latency • At best (live), delay will typically be in the range of a few seconds • WebRTC natively conceived for very low latency, instead • Born for conversational audio/video/data • Can be (and often is) easily used for monodirectional streaming as well • Strangely not really considered by the industry up until recently, though • Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”) • Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/ • Tooling an important aspect to foster WebRTC adoption, here • e.g., a standard way to send media, and tools à la OBS
  • 7. Why not WebRTC? • Traditional broadcasting efficient but higher latency • At best (live), delay will typically be in the range of a few seconds • WebRTC natively conceived for very low latency, instead • Born for conversational audio/video/data • Can be (and often is) easily used for monodirectional streaming as well • Strangely not really considered by the industry up until recently, though • Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”) • Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/ • Tooling an important aspect to foster WebRTC adoption, here • e.g., a standard way to send media, and tools à la OBS
  • 8. Why not WebRTC? • Traditional broadcasting efficient but higher latency • At best (live), delay will typically be in the range of a few seconds • WebRTC natively conceived for very low latency, instead • Born for conversational audio/video/data • Can be (and often is) easily used for monodirectional streaming as well • Strangely not really considered by the industry up until recently, though • Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”) • Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/ • Tooling an important aspect to foster WebRTC adoption, here • e.g., a standard way to send media, and tools à la OBS
  • 9. Making WebRTC ingestion easy: WHIP! https://www.meetecho.com/blog/whip-janus/ (September, 2020)
  • 10. A new Working Group in the IETF... https://datatracker.ietf.org/wg/wish/about/
  • 11. ... and a new draft for the WHIP specification! https://www.ietf.org/archive/id/draft-ietf-wish-whip-00.html
  • 12. WebRTC-HTTP ingestion protocol (WHIP) • HTTP-based signalling to create sendonly PeerConnections • HTTP POST to send SDP offer, and get an SDP answer in the response • Teardown of sessions using HTTP DELETE • Authentication and authorization via Bearer tokens • https://www.rfc-editor.org/rfc/rfc6750.html • Trickle and ICE restart via HTTP PATCH and SDP fragments • https://www.rfc-editor.org/rfc/rfc8840.html • Everything else is your usual WebRTC! • ICE, DTLS, etc.
  • 13. WebRTC-HTTP ingestion protocol (WHIP) • HTTP-based signalling to create sendonly PeerConnections • HTTP POST to send SDP offer, and get an SDP answer in the response • Teardown of sessions using HTTP DELETE • Authentication and authorization via Bearer tokens • https://www.rfc-editor.org/rfc/rfc6750.html • Trickle and ICE restart via HTTP PATCH and SDP fragments • https://www.rfc-editor.org/rfc/rfc8840.html • Everything else is your usual WebRTC! • ICE, DTLS, etc.
  • 14. WebRTC-HTTP ingestion protocol (WHIP) • HTTP-based signalling to create sendonly PeerConnections • HTTP POST to send SDP offer, and get an SDP answer in the response • Teardown of sessions using HTTP DELETE • Authentication and authorization via Bearer tokens • https://www.rfc-editor.org/rfc/rfc6750.html • Trickle and ICE restart via HTTP PATCH and SDP fragments • https://www.rfc-editor.org/rfc/rfc8840.html • Everything else is your usual WebRTC! • ICE, DTLS, etc.
  • 15. WebRTC-HTTP ingestion protocol (WHIP) • HTTP-based signalling to create sendonly PeerConnections • HTTP POST to send SDP offer, and get an SDP answer in the response • Teardown of sessions using HTTP DELETE • Authentication and authorization via Bearer tokens • https://www.rfc-editor.org/rfc/rfc6750.html • Trickle and ICE restart via HTTP PATCH and SDP fragments • https://www.rfc-editor.org/rfc/rfc8840.html • Everything else is your usual WebRTC! • ICE, DTLS, etc.
  • 16. A few sequence diagrams
  • 17. A few sequence diagrams
  • 18. A few sequence diagrams
  • 19. A WHIP server based on Janus • Janus is a popular WebRTC server, so good option for WHIP • It implements its own JSON-based API, though (Janus API) • Simple (and transparent) solution: basic API translator in front of Janus • WHIP API maps quite simply to set of Janus API primitives • No need to change anything in the WebRTC stack • Implemented simple prototype using node.js and Express • REST server that implements the WHIP API, and talks to Janus accordingly • Only takes care of ingest: distribution out of scope (e.g., via SOLEIL) Simple WHIP Server https://github.com/lminiero/simple-whip-server/
  • 20. A WHIP server based on Janus • Janus is a popular WebRTC server, so good option for WHIP • It implements its own JSON-based API, though (Janus API) • Simple (and transparent) solution: basic API translator in front of Janus • WHIP API maps quite simply to set of Janus API primitives • No need to change anything in the WebRTC stack • Implemented simple prototype using node.js and Express • REST server that implements the WHIP API, and talks to Janus accordingly • Only takes care of ingest: distribution out of scope (e.g., via SOLEIL) Simple WHIP Server https://github.com/lminiero/simple-whip-server/
  • 21. A WHIP server based on Janus • Janus is a popular WebRTC server, so good option for WHIP • It implements its own JSON-based API, though (Janus API) • Simple (and transparent) solution: basic API translator in front of Janus • WHIP API maps quite simply to set of Janus API primitives • No need to change anything in the WebRTC stack • Implemented simple prototype using node.js and Express • REST server that implements the WHIP API, and talks to Janus accordingly • Only takes care of ingest: distribution out of scope (e.g., via SOLEIL) Simple WHIP Server https://github.com/lminiero/simple-whip-server/
  • 22. A WHIP server based on Janus • Janus is a popular WebRTC server, so good option for WHIP • It implements its own JSON-based API, though (Janus API) • Simple (and transparent) solution: basic API translator in front of Janus • WHIP API maps quite simply to set of Janus API primitives • No need to change anything in the WebRTC stack • Implemented simple prototype using node.js and Express • REST server that implements the WHIP API, and talks to Janus accordingly • Only takes care of ingest: distribution out of scope (e.g., via SOLEIL) Simple WHIP Server https://github.com/lminiero/simple-whip-server/
  • 23. Distributing a WHIP Janus stream: SOLEIL
  • 24. Distributing a WHIP Janus stream: SOLEIL
  • 25. Mapping WHIP interactions to the Janus API
  • 26. Mapping WHIP interactions to the Janus API
  • 27. Mapping WHIP interactions to the Janus API
  • 28. Mapping WHIP interactions to the Janus API
  • 29. Mapping WHIP interactions to the Janus API
  • 30. Simple WHIP Server in action
  • 31. Basic UI to create/manage endpoints
  • 32. Writing a WHIP client for testing • Needs to support HTTP (WHIP API) and have a WebRTC stack • Browsers are the obvious choice, but what about a native solution? • Many broadcasters today use custom tools (e.g., OBS) • Unfortunately OBS-WebRTC is not currently an option • Used legacy WHIP API, and currently only supports Millicast ingestion • Chose GStreamer’s webrtcbin1 for the purpose • Used it already with success in other applications (e.g., JamRTC) • Modular and very powerful, so easy to feed with external sources Simple WHIP Client https://github.com/lminiero/simple-whip-client/ 1 https://gstreamer.freedesktop.org/documentation/webrtc/
  • 33. Writing a WHIP client for testing • Needs to support HTTP (WHIP API) and have a WebRTC stack • Browsers are the obvious choice, but what about a native solution? • Many broadcasters today use custom tools (e.g., OBS) • Unfortunately OBS-WebRTC is not currently an option • Used legacy WHIP API, and currently only supports Millicast ingestion • Chose GStreamer’s webrtcbin1 for the purpose • Used it already with success in other applications (e.g., JamRTC) • Modular and very powerful, so easy to feed with external sources Simple WHIP Client https://github.com/lminiero/simple-whip-client/ 1 https://gstreamer.freedesktop.org/documentation/webrtc/
  • 34. Writing a WHIP client for testing • Needs to support HTTP (WHIP API) and have a WebRTC stack • Browsers are the obvious choice, but what about a native solution? • Many broadcasters today use custom tools (e.g., OBS) • Unfortunately OBS-WebRTC is not currently an option • Used legacy WHIP API, and currently only supports Millicast ingestion • Chose GStreamer’s webrtcbin1 for the purpose • Used it already with success in other applications (e.g., JamRTC) • Modular and very powerful, so easy to feed with external sources Simple WHIP Client https://github.com/lminiero/simple-whip-client/ 1 https://gstreamer.freedesktop.org/documentation/webrtc/
  • 35. Writing a WHIP client for testing • Needs to support HTTP (WHIP API) and have a WebRTC stack • Browsers are the obvious choice, but what about a native solution? • Many broadcasters today use custom tools (e.g., OBS) • Unfortunately OBS-WebRTC is not currently an option • Used legacy WHIP API, and currently only supports Millicast ingestion • Chose GStreamer’s webrtcbin1 for the purpose • Used it already with success in other applications (e.g., JamRTC) • Modular and very powerful, so easy to feed with external sources Simple WHIP Client https://github.com/lminiero/simple-whip-client/ 1 https://gstreamer.freedesktop.org/documentation/webrtc/
  • 36. Simple WHIP Client options Usage: whip-client [OPTION?] -- Simple WHIP client Help Options: -h, --help Show help options Application Options: -u, --url Address of the WHIP endpoint (required) -t, --token Authentication Bearer token to use (optional) -A, --audio GStreamer pipeline to use for audio (optional, required if audio-only) -V, --video GStreamer pipeline to use for video (optional, required if video-only) -S, --stun-server STUN server to use, if any (hostname:port) -T, --turn-server TURN server to use, if any (username:password@host:port) -l, --log-level Logging level (0=disable logging, 7=maximum log level; default: 4)
  • 37. Simple WHIP Client example ./whip-client -u http://localhost:7080/whip/endpoint/abc123 -t verysecret -A "audiotestsrc is-live=true wave=red-noise ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay pt=100 ssrc=1 ! queue ! application/x-rtp,media=audio,encoding-name=OPUS,payload=100" -V "videotestsrc is-live=true pattern=ball ! videoconvert ! queue ! vp8enc deadline=1 ! rtpvp8pay pt=96 ssrc=2 ! queue ! application/x-rtp,media=video,encoding-name=VP8,payload=96" -S stun.l.google.com:19302
  • 38. Example: NDI output + Simple WHIP Client
  • 39. Simple WHIP Client in action
  • 40. Testing my WHIP client with Janus
  • 41. Other WHIP implementations • A few other implementations are starting to appear already • Very useful for interoperability testing! • Juliusz Chroboczek • WHIP server: https://github.com/jech/galene/tree/whip (Galene integration) • Sergio Garcia Murillo • WHIP client: https://github.com/medooze/whip-js/ (web client) • WHIP server: Millicast integration • Gustavo Garcia • WHIP client: https://github.com/ggarber/whip-go (command-line) • More to come soon, hopefully!
  • 42. Other WHIP implementations • A few other implementations are starting to appear already • Very useful for interoperability testing! • Juliusz Chroboczek • WHIP server: https://github.com/jech/galene/tree/whip (Galene integration) • Sergio Garcia Murillo • WHIP client: https://github.com/medooze/whip-js/ (web client) • WHIP server: Millicast integration • Gustavo Garcia • WHIP client: https://github.com/ggarber/whip-go (command-line) • More to come soon, hopefully!
  • 43. Other WHIP implementations • A few other implementations are starting to appear already • Very useful for interoperability testing! • Juliusz Chroboczek • WHIP server: https://github.com/jech/galene/tree/whip (Galene integration) • Sergio Garcia Murillo • WHIP client: https://github.com/medooze/whip-js/ (web client) • WHIP server: Millicast integration • Gustavo Garcia • WHIP client: https://github.com/ggarber/whip-go (command-line) • More to come soon, hopefully!
  • 44. Other WHIP implementations • A few other implementations are starting to appear already • Very useful for interoperability testing! • Juliusz Chroboczek • WHIP server: https://github.com/jech/galene/tree/whip (Galene integration) • Sergio Garcia Murillo • WHIP client: https://github.com/medooze/whip-js/ (web client) • WHIP server: Millicast integration • Gustavo Garcia • WHIP client: https://github.com/ggarber/whip-go (command-line) • More to come soon, hopefully!
  • 45. Other WHIP implementations • A few other implementations are starting to appear already • Very useful for interoperability testing! • Juliusz Chroboczek • WHIP server: https://github.com/jech/galene/tree/whip (Galene integration) • Sergio Garcia Murillo • WHIP client: https://github.com/medooze/whip-js/ (web client) • WHIP server: Millicast integration • Gustavo Garcia • WHIP client: https://github.com/ggarber/whip-go (command-line) • More to come soon, hopefully!
  • 46. Testing my WHIP client with Janus
  • 47. Testing my WHIP client with Galene
  • 48. Testing my WHIP client with Millicast
  • 49. Testing Sergio’s WHIP client with Janus
  • 50. Testing Sergio’s WHIP client with Galene
  • 51. Testing Sergio’s WHIP client with Millicast
  • 52. Testing Gustavo’s WHIP client with Janus
  • 53. Testing Gustavo’s WHIP client with Galene
  • 54. Testing Gustavo’s WHIP client with Millicast
  • 55. Got some feedback to improve the spec • Interoperability was surprisingly quite successful! • Even in early stage of specification, draft was easy to implement • All tests across different implementations got a PeerConnection working • That said, some potential issues or challenges were identified • Unlike native clients, web-based WHIP clients are subject to CORS • RFC8840’s format for candidates may be a bit too “convoluted”? • Document should expand on what to return in case of errors • How to respond to PATCH for trickle is unclear too (e.g., 204 vs. 200 vs. ??) • There may be race conditions between PATCH requests when doing an ICE restart
  • 56. Got some feedback to improve the spec • Interoperability was surprisingly quite successful! • Even in early stage of specification, draft was easy to implement • All tests across different implementations got a PeerConnection working • That said, some potential issues or challenges were identified • Unlike native clients, web-based WHIP clients are subject to CORS • RFC8840’s format for candidates may be a bit too “convoluted”? • Document should expand on what to return in case of errors • How to respond to PATCH for trickle is unclear too (e.g., 204 vs. 200 vs. ??) • There may be race conditions between PATCH requests when doing an ICE restart
  • 57. Next stop: IETF 112 Hackathon! https://www.ietf.org/how/runningcode/hackathons/112-hackathon/
  • 58. Thanks! Questions? Comments? Get in touch! • https://twitter.com/elminiero • https://twitter.com/meetecho • https://www.meetecho.com