<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-460321274846352896</id><updated>2026-11-01T05:33:30.388-08:00</updated><category term="skype"/><category term="HD voice"/><category term="corporate"/><category term="facebook"/><category term="google"/><category term="overview"/><category term="software"/><category term="voip"/><title type='text'>Real Time Communications Bits</title><subtitle type='html'>News, Trends and Articles around Real Time Communications</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.rtcbits.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-1878644203349098568</id><published>2025-10-21T09:01:00.000-07:00</published><updated>2025-10-21T09:01:03.443-07:00</updated><title type='text'>WebRTC Architecture that keeps working when us-east-1 goes down</title><content type='html'>&lt;p&gt;&lt;a class=&quot;ah mv&quot; href=&quot;https://www.reuters.com/business/retail-consumer/amazons-cloud-unit-reports-outage-several-websites-down-2025-10-20/&quot; rel=&quot;noopener ugc nofollow&quot; style=&quot;-webkit-tap-highlight-color: transparent; box-sizing: inherit; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot; target=&quot;_blank&quot;&gt;This week AWS had an outage in the northern Virginia region&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;, probably the most commonly used region and many of the most popular services in the world were affected.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;It was at least the third time in five years that AWS’s northern Virginia cluster, known as US-EAST-1, contributed to a major internet meltdown.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;Every service is different, and nowadays, with so many dependencies and coupling, it is hard not to be affected by an incident like this. However, specifically for WebRTC platforms, it should be relatively straightforward to handle cases where one specific AWS region goes down.&lt;/span&gt;&lt;/p&gt;&lt;h2 class=&quot;mw mx gq bg my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;3d28&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 24px; letter-spacing: -0.016em; line-height: 30px; margin: 1.95em 0px -0.28em;&quot;&gt;Basic WebRTC Architecture&lt;/h2&gt;&lt;p class=&quot;pw-post-body-paragraph lx ly gq lz b ma nu mc md me nv mg mh mi nw mk ml mm nx mo mp mq ny ms mt mu gj bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;ffb0&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 0.94em 0px -0.46em; word-break: break-word;&quot;&gt;The basic architecture of most of WebRTC platforms comprises four components:&lt;/p&gt;&lt;ul class=&quot;&quot; style=&quot;background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; list-style: none none; margin: 0px; padding: 0px;&quot;&gt;&lt;li class=&quot;lx ly gq lz b ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu nz oa ob bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;f74c&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 2.14em; padding-left: 0px;&quot;&gt;&lt;span class=&quot;lz gr&quot; style=&quot;box-sizing: inherit; font-weight: 700;&quot;&gt;Load balancing service:&lt;/span&gt;&amp;nbsp;The client application’s initial point of contact, selecting the appropriate media server for a session.&lt;/li&gt;&lt;li class=&quot;lx ly gq lz b ma oc mc md me od mg mh mi oe mk ml mm of mo mp mq og ms mt mu nz oa ob bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;7731&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 1.14em; padding-left: 0px;&quot;&gt;&lt;span class=&quot;lz gr&quot; style=&quot;box-sizing: inherit; font-weight: 700;&quot;&gt;Database:&lt;/span&gt;&amp;nbsp;Stores server information (status, load, location) and session-to-server mappings, often using a fast database like Redis.&lt;/li&gt;&lt;li class=&quot;lx ly gq lz b ma oc mc md me od mg mh mi oe mk ml mm of mo mp mq og ms mt mu nz oa ob bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;c26a&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 1.14em; padding-left: 0px;&quot;&gt;&lt;span class=&quot;lz gr&quot; style=&quot;box-sizing: inherit; font-weight: 700;&quot;&gt;Signaling service:&lt;/span&gt;&amp;nbsp;Manages session state and forwards control messages. For this discussion, it’s assumed to be part of the media server and ignored in the following diagrams.&lt;/li&gt;&lt;li class=&quot;lx ly gq lz b ma oc mc md me od mg mh mi oe mk ml mm of mo mp mq og ms mt mu nz oa ob bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;51e7&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 1.14em; padding-left: 0px;&quot;&gt;&lt;span class=&quot;lz gr&quot; style=&quot;box-sizing: inherit; font-weight: 700;&quot;&gt;Media forwarding service:&lt;/span&gt;&amp;nbsp;The core component, routing audio and video among participants. It’s typically stateless and reports its status.&lt;/li&gt;&lt;/ul&gt;&lt;figure class=&quot;ok ol om on oo op oh oi paragraph-image&quot; style=&quot;background-color: white; box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; margin: 56px auto 0px;&quot;&gt;&lt;div class=&quot;oq or eo os bi ot&quot; role=&quot;button&quot; style=&quot;box-sizing: inherit; cursor: zoom-in; position: relative; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1); width: 680px; z-index: auto;&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;er es et ao eu ev ew ex ey speechify-ignore&quot; style=&quot;border-width: 0px; box-sizing: inherit; clip: rect(0px, 0px, 0px, 0px); height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: absolute; text-wrap-mode: nowrap; width: 1px;&quot;&gt;Press enter or click to view image in full size&lt;/span&gt;&lt;div class=&quot;oh oi oj&quot; style=&quot;box-sizing: inherit; margin-left: auto; margin-right: auto; max-width: 1320px;&quot;&gt;&lt;picture style=&quot;box-sizing: inherit;&quot;&gt;&lt;source sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/format:webp/1*wJDC39hprutYC7-HRqSX5A.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*wJDC39hprutYC7-HRqSX5A.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*wJDC39hprutYC7-HRqSX5A.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*wJDC39hprutYC7-HRqSX5A.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*wJDC39hprutYC7-HRqSX5A.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*wJDC39hprutYC7-HRqSX5A.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*wJDC39hprutYC7-HRqSX5A.png 1400w&quot; style=&quot;box-sizing: inherit;&quot; type=&quot;image/webp&quot;&gt;&lt;/source&gt;&lt;source data-testid=&quot;og&quot; sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/1*wJDC39hprutYC7-HRqSX5A.png 640w, https://miro.medium.com/v2/resize:fit:720/1*wJDC39hprutYC7-HRqSX5A.png 720w, https://miro.medium.com/v2/resize:fit:750/1*wJDC39hprutYC7-HRqSX5A.png 750w, https://miro.medium.com/v2/resize:fit:786/1*wJDC39hprutYC7-HRqSX5A.png 786w, https://miro.medium.com/v2/resize:fit:828/1*wJDC39hprutYC7-HRqSX5A.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*wJDC39hprutYC7-HRqSX5A.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*wJDC39hprutYC7-HRqSX5A.png 1400w&quot; style=&quot;box-sizing: inherit;&quot;&gt;&lt;/source&gt;&lt;img alt=&quot;&quot; class=&quot;bi lh ou c&quot; height=&quot;527&quot; loading=&quot;eager&quot; role=&quot;presentation&quot; src=&quot;https://miro.medium.com/v2/resize:fit:1400/1*wJDC39hprutYC7-HRqSX5A.png&quot; style=&quot;box-sizing: inherit; height: auto; max-width: 100%; vertical-align: middle; width: 680px;&quot; width=&quot;700&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p class=&quot;pw-post-body-paragraph lx ly gq lz b ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu gj bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;3a12&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;The whole solution usually includes other components to manage things like recording or firewall traversal but those are ignored for the purpose of this discussion and anyway usually they are stateless and easy to make them robust in case of a network issue.&lt;/p&gt;&lt;h2 class=&quot;mw mx gq bg my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;06a6&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 24px; letter-spacing: -0.016em; line-height: 30px; margin: 1.95em 0px -0.28em;&quot;&gt;Distributed WebRTC Architecture&lt;/h2&gt;&lt;p class=&quot;pw-post-body-paragraph lx ly gq lz b ma nu mc md me nv mg mh mi nw mk ml mm nx mo mp mq ny ms mt mu gj bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;99a6&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 0.94em 0px -0.46em; word-break: break-word;&quot;&gt;When you want to provide the best possible quality, you deploy media servers in multiple regions, and your architecture typically looks like this:&lt;/p&gt;&lt;figure class=&quot;ok ol om on oo op oh oi paragraph-image&quot; style=&quot;background-color: white; box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; margin: 56px auto 0px;&quot;&gt;&lt;div class=&quot;oq or eo os bi ot&quot; role=&quot;button&quot; style=&quot;box-sizing: inherit; cursor: zoom-in; position: relative; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1); width: 680px; z-index: auto;&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;er es et ao eu ev ew ex ey speechify-ignore&quot; style=&quot;border-width: 0px; box-sizing: inherit; clip: rect(0px, 0px, 0px, 0px); height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: absolute; text-wrap-mode: nowrap; width: 1px;&quot;&gt;Press enter or click to view image in full size&lt;/span&gt;&lt;div class=&quot;oh oi ov&quot; style=&quot;box-sizing: inherit; margin-left: auto; margin-right: auto; max-width: 1572px;&quot;&gt;&lt;picture style=&quot;box-sizing: inherit;&quot;&gt;&lt;source sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/format:webp/1*qE4DYrbA-5wSs3B_fC70yg.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*qE4DYrbA-5wSs3B_fC70yg.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*qE4DYrbA-5wSs3B_fC70yg.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*qE4DYrbA-5wSs3B_fC70yg.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*qE4DYrbA-5wSs3B_fC70yg.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*qE4DYrbA-5wSs3B_fC70yg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*qE4DYrbA-5wSs3B_fC70yg.png 1400w&quot; style=&quot;box-sizing: inherit;&quot; type=&quot;image/webp&quot;&gt;&lt;/source&gt;&lt;source data-testid=&quot;og&quot; sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/1*qE4DYrbA-5wSs3B_fC70yg.png 640w, https://miro.medium.com/v2/resize:fit:720/1*qE4DYrbA-5wSs3B_fC70yg.png 720w, https://miro.medium.com/v2/resize:fit:750/1*qE4DYrbA-5wSs3B_fC70yg.png 750w, https://miro.medium.com/v2/resize:fit:786/1*qE4DYrbA-5wSs3B_fC70yg.png 786w, https://miro.medium.com/v2/resize:fit:828/1*qE4DYrbA-5wSs3B_fC70yg.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*qE4DYrbA-5wSs3B_fC70yg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*qE4DYrbA-5wSs3B_fC70yg.png 1400w&quot; style=&quot;box-sizing: inherit;&quot;&gt;&lt;/source&gt;&lt;img alt=&quot;&quot; class=&quot;bi lh ou c&quot; height=&quot;437&quot; loading=&quot;lazy&quot; role=&quot;presentation&quot; src=&quot;https://miro.medium.com/v2/resize:fit:1400/1*qE4DYrbA-5wSs3B_fC70yg.png&quot; style=&quot;box-sizing: inherit; height: auto; max-width: 100%; vertical-align: middle; width: 680px;&quot; width=&quot;700&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p class=&quot;pw-post-body-paragraph lx ly gq lz b ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu gj bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;b809&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;This is the most common deployment in my experience, but it is obvious that there is a central point of failure that can be the database or the Load Balancing service + Database depending on the way you deploy it.&lt;/p&gt;&lt;h2 class=&quot;mw mx gq bg my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;179e&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 24px; letter-spacing: -0.016em; line-height: 30px; margin: 1.95em 0px -0.28em;&quot;&gt;Robust distributed architecture&lt;/h2&gt;&lt;p class=&quot;pw-post-body-paragraph lx ly gq lz b ma nu mc md me nv mg mh mi nw mk ml mm nx mo mp mq ny ms mt mu gj bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;128a&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 0.94em 0px -0.46em; word-break: break-word;&quot;&gt;If the Load Balancing service and the Database are the problem in case of outage in the region where they are located the solution looks obvious, let’s just duplicate them.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph lx ly gq lz b ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu gj bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;7780&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;Replicating the Load Balancing service is easy, deploy it to as many regions as needed (ideally all of them) and use one of these approaches to failover to a different Load Balancer in case there is an outage in your closest region:&lt;/p&gt;&lt;ul class=&quot;&quot; style=&quot;background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; list-style: none none; margin: 0px; padding: 0px;&quot;&gt;&lt;li class=&quot;lx ly gq lz b ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu nz oa ob bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;ca6f&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 2.14em; padding-left: 0px;&quot;&gt;Rely on health checks and short DNS timeouts. That way if there is an outage the DNS servers will mark some region as unavailable and route client requests to a different one.. This can be in problem in case of an outage affecting the DNS service (like Route53).&lt;/li&gt;&lt;li class=&quot;lx ly gq lz b ma oc mc md me od mg mh mi oe mk ml mm of mo mp mq og ms mt mu nz oa ob bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;3481&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 1.14em; padding-left: 0px;&quot;&gt;Have clients configured to fallback to different url (for example api.domain.com and api-backup.domain.com)&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;pw-post-body-paragraph lx ly gq lz b ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu gj bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;eaec&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;Replicating the database is a little bit harder, the most common approaches are these ones:&lt;/p&gt;&lt;ul class=&quot;&quot; style=&quot;background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; list-style: none none; margin: 0px; padding: 0px;&quot;&gt;&lt;li class=&quot;lx ly gq lz b ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu nz oa ob bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;27f2&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 2.14em; padding-left: 0px;&quot;&gt;The easiest way is to do it in an active/passive way, where multiple instances of the database are available, but only one is used at a given time, with the others just replicating the information. In case of an outage, we move the queries manually or automatically with some monitoring process to use one of those replicas instead.&lt;/li&gt;&lt;li class=&quot;lx ly gq lz b ma oc mc md me od mg mh mi oe mk ml mm of mo mp mq og ms mt mu nz oa ob bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;664f&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 1.14em; padding-left: 0px;&quot;&gt;A more evolved approach is active/active using sharding. It is more complex but possible and gives the additional advantage of distributing the load.&lt;/li&gt;&lt;li class=&quot;lx ly gq lz b ma oc mc md me od mg mh mi oe mk ml mm of mo mp mq og ms mt mu nz oa ob bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;413c&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 1.14em; padding-left: 0px;&quot;&gt;You can use an already distributed database like Azure Spanner. This can be tricky in case this distributed database has some central component, as apparently happened with DynamoDB in the case of the last AWS outage.&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;pw-post-body-paragraph lx ly gq lz b ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu gj bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;eaab&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;This is how the final architecture looks like:&lt;/p&gt;&lt;figure class=&quot;ok ol om on oo op oh oi paragraph-image&quot; style=&quot;background-color: white; box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; margin: 56px auto 0px;&quot;&gt;&lt;div class=&quot;oq or eo os bi ot&quot; role=&quot;button&quot; style=&quot;box-sizing: inherit; cursor: zoom-in; position: relative; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1); width: 680px; z-index: auto;&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;er es et ao eu ev ew ex ey speechify-ignore&quot; style=&quot;border-width: 0px; box-sizing: inherit; clip: rect(0px, 0px, 0px, 0px); height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: absolute; text-wrap-mode: nowrap; width: 1px;&quot;&gt;Press enter or click to view image in full size&lt;/span&gt;&lt;div class=&quot;oh oi ow&quot; style=&quot;box-sizing: inherit; margin-left: auto; margin-right: auto; max-width: 2052px;&quot;&gt;&lt;picture style=&quot;box-sizing: inherit;&quot;&gt;&lt;source sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/format:webp/1*LIHMEaUHQPNXHPMHu77GvQ.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*LIHMEaUHQPNXHPMHu77GvQ.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*LIHMEaUHQPNXHPMHu77GvQ.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*LIHMEaUHQPNXHPMHu77GvQ.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*LIHMEaUHQPNXHPMHu77GvQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*LIHMEaUHQPNXHPMHu77GvQ.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*LIHMEaUHQPNXHPMHu77GvQ.png 1400w&quot; style=&quot;box-sizing: inherit;&quot; type=&quot;image/webp&quot;&gt;&lt;/source&gt;&lt;source data-testid=&quot;og&quot; sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/1*LIHMEaUHQPNXHPMHu77GvQ.png 640w, https://miro.medium.com/v2/resize:fit:720/1*LIHMEaUHQPNXHPMHu77GvQ.png 720w, https://miro.medium.com/v2/resize:fit:750/1*LIHMEaUHQPNXHPMHu77GvQ.png 750w, https://miro.medium.com/v2/resize:fit:786/1*LIHMEaUHQPNXHPMHu77GvQ.png 786w, https://miro.medium.com/v2/resize:fit:828/1*LIHMEaUHQPNXHPMHu77GvQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*LIHMEaUHQPNXHPMHu77GvQ.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*LIHMEaUHQPNXHPMHu77GvQ.png 1400w&quot; style=&quot;box-sizing: inherit;&quot;&gt;&lt;/source&gt;&lt;img alt=&quot;&quot; class=&quot;bi lh ou c&quot; height=&quot;434&quot; loading=&quot;lazy&quot; role=&quot;presentation&quot; src=&quot;https://miro.medium.com/v2/resize:fit:1400/1*LIHMEaUHQPNXHPMHu77GvQ.png&quot; style=&quot;box-sizing: inherit; height: auto; max-width: 100%; vertical-align: middle; width: 680px;&quot; width=&quot;700&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p class=&quot;pw-post-body-paragraph lx ly gq lz b ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu gj bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;67d3&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;With the solutions proposed above your WebRTC infrastructure should be resilient to all the problems affecting a single region in your cloud provider.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph lx ly gq lz b ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu gj bl&quot; data-selectable-paragraph=&quot;&quot; id=&quot;7b33&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;It is possible to go further and for example deploy on multiple providers (AWS, GCP, Azure…) or using your own infrastructure but that’s not something I would recommend unless it is a really critical piece of software or you need it for other reasons like cost or compliance.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/1878644203349098568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2025/10/httpswww.rtcbits.com202510webrtc-architecture-aws-outages.html.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/1878644203349098568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/1878644203349098568'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2025/10/httpswww.rtcbits.com202510webrtc-architecture-aws-outages.html.html' title='WebRTC Architecture that keeps working when us-east-1 goes down'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-7577296069945827666</id><published>2025-06-09T03:11:00.000-07:00</published><updated>2025-06-09T03:11:23.834-07:00</updated><title type='text'>Reflection+Amplification attacks abusing TURN servers</title><content type='html'>&lt;p&gt;&lt;img class=&quot;graf-image&quot; data-height=&quot;575&quot; data-image-id=&quot;0*XBfPh62vdIuxuygE&quot; data-width=&quot;1600&quot; src=&quot;https://cdn-images-1.medium.com/max/800/0*XBfPh62vdIuxuygE&quot; style=&quot;display:none&quot; /&gt;&lt;/p&gt;&lt;p&gt;Last week there were &lt;a class=&quot;markup--anchor markup--p-anchor&quot; data-href=&quot;https://github.com/coturn/coturn/issues/1687&quot; href=&quot;https://github.com/coturn/coturn/issues/1687&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;many messages in the coturn issue tracker&lt;/a&gt; about TURN instances being blocked by some cloud providers because it was detected that those servers were being used to attack other hosts.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;62c7&quot;&gt;This is not new as Wire had&lt;a class=&quot;markup--anchor markup--p-anchor&quot; data-href=&quot;https://github.com/coturn/coturn/pull/1588&quot; href=&quot;https://github.com/coturn/coturn/pull/1588&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt; already reported it and even suggested a mitigation&lt;/a&gt; some months ago.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;e32e&quot;&gt;The attacks being carried out in this case are based on two properties of TURN servers:&lt;/p&gt;&lt;ul class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;b9fa&quot;&gt;&lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;Reflection&lt;/strong&gt;: A TURN server, by design, sends the responses to the TURN messages to the source IP of the Request. If an attacker is able to change his source IP address (spoofing) then it can direct the response of his TURN request to any other host he wants.&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;57f7&quot;&gt;&lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;Amplification&lt;/strong&gt;: TURN responses are usually bigger than the corresponding requests. This is especially problematic for authentication error responses that must include a NONCE value to be used to attempt authentication properly based on the standard authentication defined in the protocol.&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;53fe&quot;&gt;We can see a real example of the second property in a commercial TURN service were the amplification factor is 2x (in other providers this amplification factor is even bigger):&lt;/p&gt;&lt;figure class=&quot;graf graf--figure&quot; name=&quot;8d02&quot;&gt;&lt;img class=&quot;graf-image&quot; data-height=&quot;43&quot; data-image-id=&quot;1*JII6F-zmB35hmGxAvGAOfA.png&quot; data-width=&quot;1152&quot; src=&quot;https://cdn-images-1.medium.com/max/800/1*JII6F-zmB35hmGxAvGAOfA.png&quot; /&gt;&lt;figcaption class=&quot;imageCaption&quot; style=&quot;text-align: center;&quot;&gt;Size of Allocation Request and Response in a TURN&amp;nbsp;server&lt;/figcaption&gt;&lt;/figure&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;1894&quot;&gt;With those two properties in mind this is how the attack looks like:&lt;/p&gt;&lt;figure class=&quot;graf graf--figure&quot; name=&quot;3782&quot;&gt;&lt;img class=&quot;graf-image&quot; data-height=&quot;575&quot; data-image-id=&quot;0*XBfPh62vdIuxuygE&quot; data-width=&quot;1600&quot; src=&quot;https://cdn-images-1.medium.com/max/800/0*XBfPh62vdIuxuygE&quot; /&gt;&lt;/figure&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;33bb&quot;&gt;The root cause of this problem is that the Unauthorized responses sent by the TURN server are bigger than the requests, otherwise the attacker wouldn’t get any benefit from the TURN server and would send the request directly to the attacked host. With the default coturn configuration (and similarly in other servers) this is around 2x-2.5x increase in size depending on your software name and realm configuration, so there is a big incentive to use coturn to reflect the attack instead of sending it directly.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;b81a&quot;&gt;The mitigation suggested by the Wire team was based on limiting the number of unauthenticated responses sent to a specific IP, and that’s effective as they have tested in production, and probably this featurewill be integarted in a way or another in coturn, but this approach has two limitations: 1) there can be other responses outside of 401s that could be used also for these attacks and 2) if the attacker is attacking a range of IPs instead of a single one this mechanism wouldn’t block it without adding more elaborated logic.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;721d&quot;&gt;With all that in mind lets review the format of those error responses and see if we can optimize them. This is an example again from the same commercial TURN provider that uses coturn opensource server:&lt;/p&gt;&lt;figure class=&quot;graf graf--figure&quot; name=&quot;79cd&quot;&gt;&lt;img class=&quot;graf-image&quot; data-height=&quot;561&quot; data-image-id=&quot;1*127FK5pfWGyJ8n4BWdLCeQ.png&quot; data-width=&quot;800&quot; src=&quot;https://cdn-images-1.medium.com/max/800/1*127FK5pfWGyJ8n4BWdLCeQ.png&quot; /&gt;&lt;/figure&gt;&lt;p class=&quot;graf graf--p graf--empty&quot; name=&quot;da86&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;2baf&quot;&gt;Looking at the content of those 401-Unauthorized responses we can see that we could try to reduce the size and because of that the amplification factor. These are the attributes sent in the response and what we could do with them:&lt;/p&gt;&lt;ul class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;af77&quot;&gt;24 bytes of &lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;SOFTWARE&lt;/strong&gt; attribute → You should just remove it given that it is an optional attribute (this was already configurable in coturn, now with the &lt;a class=&quot;markup--anchor markup--li-anchor&quot; data-href=&quot;https://github.com/coturn/coturn/pull/1598&quot; href=&quot;https://github.com/coturn/coturn/pull/1598&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;latest version the default is off&lt;/a&gt;)&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;ab91&quot;&gt;12 bytes of &lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;error phrase in ERROR-CODE&lt;/strong&gt; → The error phrase is not required and it provides little value so we can just remove it (&lt;a class=&quot;markup--anchor markup--li-anchor&quot; data-href=&quot;https://github.com/coturn/coturn/pull/1695&quot; href=&quot;https://github.com/coturn/coturn/pull/1695&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;PR pending review&lt;/a&gt;)&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;3e24&quot;&gt;16 bytes of &lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;NONCE&lt;/strong&gt; → This probably could be shorter, specially when the type of credentials used are already valid for a short period of time, but the impact of changing this is not fully clear and requires more carefull review.&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;24e0&quot;&gt;12 bytes of &lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;REALM&lt;/strong&gt; → The realm is not providing any value, at least for WebRTC use cases, so we should make it as short as possible (for example just ”t”).&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;ff88&quot;&gt;With those suggested changes the message should go from 142 bytes to 95 making the amplification “only” 1.35x that hopefully makes it much less worth it.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;4faf&quot;&gt;In addition to those suggestions, if you can change firewall configuration for the TURN incoming traffic following rules will help blocking illegal traffic:&lt;/p&gt;&lt;ul class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;619b&quot;&gt;Block traffic from illegitimate ports (for example privileged ports — below 1024 — cannot be used by normal clients and as such any traffic from those ports is illegitimate)&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;7c3e&quot;&gt;STUN/TURN (and underlying UDP) allow for very long messages. But in reality, messages longer than MTU are not used, at least for WebRTC use cases. That means that any message fragment is not a valid STUN/TURN message and should be blocked.&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;6a70&quot;&gt;Monitor 401 errors from specific IPs and use fail2ban utility to block those IPs.&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;35c6&quot;&gt;An interesting idea suggested by Philipp Hancke is to have STUN/TURN clients in browsers to send padding data in the request. TURN servers could ignore incoming packets without this attribute. This would make the protocol slightly less efficient but it bring the amplification factor below one. The other option could be to change the way authentication works in TURN to remove the need of those nonce attributes or rethink the authentication and authorization flows.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;e1b8&quot;&gt;Let’s see how these mitigations go and if the attacks keep going maybe we should consider that. And remember to upgrade to the latest version 4.7.0 (which enables multiple options that helps mitigate this type of attacks by default) or at least review your configuration to apply some of the recommendations in this post.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;5c8e&quot;&gt;&lt;em class=&quot;markup--em markup--p-em&quot;&gt;Thank you very much to Philipp Hancke and Pavel Punsky for the review and contributions to this post. 🙇&lt;/em&gt;&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;dff2&quot;&gt;&lt;em class=&quot;markup--em markup--p-em&quot;&gt;You can &lt;/em&gt;&lt;a class=&quot;markup--anchor markup--p-anchor&quot; data-href=&quot;https://twitter.com/anarchyco&quot; href=&quot;https://twitter.com/anarchyco&quot; rel=&quot;noopener ugc nofollow noopener&quot; target=&quot;_blank&quot;&gt;&lt;em class=&quot;markup--em markup--p-em&quot;&gt;follow me in Twitter&lt;/em&gt;&lt;/a&gt;&lt;em class=&quot;markup--em markup--p-em&quot;&gt; if you are interested in Real Time Communications or want to comment about the topic of this post.&lt;/em&gt;&lt;/p&gt;&lt;p class=&quot;graf graf--p graf--empty&quot; name=&quot;2ce2&quot;&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/7577296069945827666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2025/06/turnreflectionattacks.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/7577296069945827666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/7577296069945827666'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2025/06/turnreflectionattacks.html' title='Reflection+Amplification attacks abusing TURN servers'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-2482354448595419070</id><published>2025-03-05T04:07:00.000-08:00</published><updated>2025-03-05T04:08:04.122-08:00</updated><title type='text'>Another sneaky WebRTC optimisation only known by Google Meet (RemoteEstimate RTCP packets)</title><content type='html'>&lt;div class=&quot;separator&quot;&gt;&lt;/div&gt;&lt;p&gt;Google Meet has consistently delivered superior quality among WebRTC applications (at least for web applications). This is especially true compared with typical open-source solutions, but it stands even for most commercial solutions.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;dec1&quot;&gt;The reason is that Google has the team that understands the media stack they have built very well and can make it behave in ways that solve their problems in the browser with knobs hidden in WebRTC that only they are aware of.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;f729&quot;&gt;Some of us still remember how simulcast support was added to WebRTC approximately 12 years ago &lt;a class=&quot;markup--anchor markup--p-anchor&quot; data-href=&quot;https://www.rtcbits.com/2014/09/using-native-webrtc-simulcast-support.html&quot; href=&quot;https://www.rtcbits.com/2014/09/using-native-webrtc-simulcast-support.html&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;with SDP munging&lt;/a&gt; and without any documentation or note behind the x-google-conference flag, or how “Audio Network Adaptation” was added with a secret string encoding an undocumented protobuf schema to tune settings to improve audio quality.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;1cf5&quot;&gt;Today I was trying to debug why a WebRTC application had a less stable bandwidth estimation than Google Meet. The scenario was quite simple: in a perfect network with plenty of bandwidth, add 50ms of extra latency suddenly. You see in all the WebRTC applications the bandwidth estimation calculated by the sending browser drops (left graph), while with Google Meet (right graph) it stays perfectly stable.&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhw6m3kCZb6QM3sFpLY2qghyQL3PA1zNIAR0bV5rhAsxXsKu4e2tXYxVlquIpI7dRLy4FVqiMgyFmOcJChTT1h5Kuyp7JiRgbNxB9yeLZjBpUdJwQ-mnsRzEga9obkw3-QHne_wzNekx6fyrDCkvAmKWi80aIb8TB0a7SK5uaZzIW3NReE4hbeICeqy_tU&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;462&quot; data-original-width=&quot;1533&quot; height=&quot;192&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhw6m3kCZb6QM3sFpLY2qghyQL3PA1zNIAR0bV5rhAsxXsKu4e2tXYxVlquIpI7dRLy4FVqiMgyFmOcJChTT1h5Kuyp7JiRgbNxB9yeLZjBpUdJwQ-mnsRzEga9obkw3-QHne_wzNekx6fyrDCkvAmKWi80aIb8TB0a7SK5uaZzIW3NReE4hbeICeqy_tU=w640-h192&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;c9f3&quot;&gt;After spending hours adding logs to Chrome code and debugging the browser’s behaviour under those conditions, I ended up in the &lt;a class=&quot;markup--anchor markup--p-anchor&quot; data-href=&quot;https://chromium.googlesource.com/external/webrtc/+/refs/heads/master/modules/remote_bitrate_estimator/aimd_rate_control.cc&quot; href=&quot;https://chromium.googlesource.com/external/webrtc/+/refs/heads/master/modules/remote_bitrate_estimator/aimd_rate_control.cc&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;AimdRateControl class&lt;/a&gt;, which decides when to decrease the bandwidth estimation. For all applications (Google Meet and others), it was entering that point with a lower estimation. Surprisingly, for Google Meet, even if the estimation was lower, it would stay with the previous estimation. The reason is in this code clamping the final estimation.&lt;/p&gt;&lt;pre class=&quot;graf graf--pre graf--preV2&quot; data-code-block-lang=&quot;cpp&quot; data-code-block-mode=&quot;2&quot; name=&quot;39a2&quot; spellcheck=&quot;false&quot;&gt;&lt;span class=&quot;pre--content&quot;&gt;new_bitrate = std::&lt;span class=&quot;hljs-built_in&quot;&gt;min&lt;/span&gt;(&lt;br /&gt; current_bitrate_, &lt;br /&gt; std::&lt;span class=&quot;hljs-built_in&quot;&gt;max&lt;/span&gt;(new_bitrate, network_estimate_-&amp;gt;link_capacity_lower * beta_)&lt;br /&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;b726&quot;&gt;So Chrome will never reduce the bitrate below “network_estimate_-&amp;gt;link_capacity_lower * 0.85”. But what is network_estimate_-&amp;gt;link_capacity_lower&amp;nbsp;?!?!&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;3ead&quot;&gt;Some more debugging and I figured out that is some information sent by the server in proprietary RTCP messages of type APP with name “goog” and subtype 13.&lt;/p&gt;&lt;pre class=&quot;graf graf--pre graf--preV2&quot; data-code-block-lang=&quot;cpp&quot; data-code-block-mode=&quot;2&quot; name=&quot;5fc5&quot; spellcheck=&quot;false&quot;&gt;&lt;span class=&quot;pre--content&quot;&gt;&lt;span class=&quot;hljs-function&quot;&gt;&lt;span class=&quot;hljs-type&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;hljs-title&quot;&gt;RTCPReceiver::HandleApp&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(&lt;span class=&quot;hljs-type&quot;&gt;const&lt;/span&gt; rtcp::CommonHeader&amp;amp; rtcp_block,&lt;br /&gt;PacketInformation* packet_information)&lt;/span&gt; &lt;/span&gt;{&lt;br /&gt;  rtcp::App app;&lt;br /&gt;  &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (!app.&lt;span class=&quot;hljs-built_in&quot;&gt;Parse&lt;/span&gt;(rtcp_block)) {&lt;br /&gt;    &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-literal&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;  }&lt;br /&gt;  &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (app.&lt;span class=&quot;hljs-built_in&quot;&gt;name&lt;/span&gt;() == rtcp::RemoteEstimate::kName &amp;amp;&amp;amp;&lt;br /&gt;    app.&lt;span class=&quot;hljs-built_in&quot;&gt;sub_type&lt;/span&gt;() == rtcp::RemoteEstimate::kSubType) {&lt;br /&gt;    &lt;span class=&quot;hljs-function&quot;&gt;rtcp::RemoteEstimate &lt;span class=&quot;hljs-title&quot;&gt;estimate&lt;/span&gt;&lt;span class=&quot;hljs-params&quot;&gt;(std::move(app))&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;    &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; (estimate.&lt;span class=&quot;hljs-built_in&quot;&gt;ParseData&lt;/span&gt;()) {&lt;br /&gt;      packet_information-&amp;gt;network_state_estimate = estimate.&lt;span class=&quot;hljs-built_in&quot;&gt;estimate&lt;/span&gt;();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;span class=&quot;hljs-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;hljs-literal&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;b709&quot;&gt;This extension is described with the following words inside the codebase:&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;b709&quot;&gt;// The RemoteEstimate packet provides network estimation results from the&lt;br /&gt;// receive side. This functionality is experimental and subject to change&lt;br /&gt;// without notice.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;178d&quot;&gt;This RTCP message was added &lt;a class=&quot;markup--anchor markup--p-anchor&quot; data-href=&quot;https://issues.webrtc.org/issues/42220808&quot; href=&quot;https://issues.webrtc.org/issues/42220808&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;back in 2019&lt;/a&gt;. Back then it was wired up to the SDP but even though we have looked at Google Meet frequently since then we never saw the corresponding SDP and it is still not there today.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;7099&quot;&gt;So the server is sending every 50ms a RTCP App message with a bandwidth estimation calculated from the server side.&lt;/p&gt;&lt;figure class=&quot;graf graf--figure&quot; name=&quot;d980&quot;&gt;&lt;img class=&quot;graf-image&quot; data-height=&quot;565&quot; data-image-id=&quot;0*768WDVBbGd-bVxo7&quot; data-width=&quot;832&quot; height=&quot;272&quot; src=&quot;https://cdn-images-1.medium.com/max/1200/0*768WDVBbGd-bVxo7&quot; width=&quot;400&quot; /&gt;&lt;/figure&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;f501&quot;&gt;That RTCP RemoteEstimation message includes two values encoded inside:&lt;/p&gt;&lt;ul class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;324f&quot;&gt;link_capacity_lower&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;daab&quot;&gt;link_capacity_upper&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;37c9&quot;&gt;The lower value works as a cap to not react so fast when the sender side bandwidth estimation detects some sudden drop in the estimation but the server side estimation is still stable. The use of the upper value is disabled behind a flag in AimdRateControl but maybe it is used in other parts of WebRTC codebase.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;bd73&quot;&gt;And now the even harder question. How are those values calculated? They provide two different values and they look like different bandwidth estimations.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;47e6&quot;&gt;After sharing this with &lt;a class=&quot;markup--anchor markup--p-anchor&quot; data-href=&quot;https://x.com/hcornflower&quot; href=&quot;https://x.com/hcornflower&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Philipp Hancke&lt;/a&gt; he suggested to check if it works with abs-send-time extension disabled and he was right, it doesn’t work without it so it looks similar to the old REMB implementation but providing two values (upper and lower) instead of a single one that acts as just a maximum for the sender.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;9820&quot;&gt;In essence the reliance on abs-send-time suggests that a remote bitrate estimator is running on the server. Looking at &lt;a class=&quot;markup--anchor markup--p-anchor&quot; data-href=&quot;https://issues.webrtc.org/issues/42225657&quot; href=&quot;https://issues.webrtc.org/issues/42225657&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;this issue&lt;/a&gt; and the old emails this has quite possibly been happening since 2019, hidden in plain sight.&lt;img class=&quot;graf-image&quot; data-height=&quot;774&quot; data-image-id=&quot;0*ej9Rv3eHixrokkzV&quot; data-is-featured=&quot;true&quot; data-width=&quot;1096&quot; height=&quot;451&quot; src=&quot;https://cdn-images-1.medium.com/max/1200/0*ej9Rv3eHixrokkzV&quot; width=&quot;640&quot; /&gt;&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;27ed&quot;&gt;To verify this hypothesis, I recompiled Chrome to disregard those proprietary RTCP App messages and, there it was! Google Meet now performs as well as (or as poorly as) other implementations under the same testing network conditions.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;817d&quot;&gt;&lt;strong class=&quot;markup--strong markup--p-strong&quot;&gt;So it looks like Google went from receiver-side bandwidth estimation (REMB; RTCP REMB could have been used to transport an upper capacity but not a lower one) to sender-side bandwidth estimation (transport feedback) to just do both&amp;nbsp;:)&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;7e4b&quot;&gt;The necessity of the RemoteEstimate extension for quality in most scenarios is unclear. Probably is not critical given that no WebRTC application out there uses it apart from Google Meet as far as we know but it looks like it provides some value so other WebRTC applications should probably go and copy it. We only need to figure out how to calculate the lower and upper values and send them every 50ms to the sender.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;d5f2&quot;&gt;Thank you very much to Philipp Hancke for his review and feedback.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;a2b7&quot;&gt;&lt;em class=&quot;markup--em markup--p-em&quot;&gt;You can &lt;/em&gt;&lt;a class=&quot;markup--anchor markup--p-anchor&quot; data-href=&quot;https://twitter.com/anarchyco&quot; href=&quot;https://twitter.com/anarchyco&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;em class=&quot;markup--em markup--p-em&quot;&gt;follow me in Twitter&lt;/em&gt;&lt;/a&gt;&lt;em class=&quot;markup--em markup--p-em&quot;&gt; if you are interested in Real Time Communications or want to comment about the topic of this psot.&lt;/em&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/2482354448595419070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2025/03/another-sneaky-webrtc-optimisation-only.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/2482354448595419070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/2482354448595419070'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2025/03/another-sneaky-webrtc-optimisation-only.html' title='Another sneaky WebRTC optimisation only known by Google Meet (RemoteEstimate RTCP packets)'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhw6m3kCZb6QM3sFpLY2qghyQL3PA1zNIAR0bV5rhAsxXsKu4e2tXYxVlquIpI7dRLy4FVqiMgyFmOcJChTT1h5Kuyp7JiRgbNxB9yeLZjBpUdJwQ-mnsRzEga9obkw3-QHne_wzNekx6fyrDCkvAmKWi80aIb8TB0a7SK5uaZzIW3NReE4hbeICeqy_tU=s72-w640-h192-c" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-7651432425734155366</id><published>2024-12-22T00:44:00.000-08:00</published><updated>2024-12-22T00:44:31.945-08:00</updated><title type='text'>OpenAI WebRTC API Review</title><content type='html'>&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;69da&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;There is a new interface added to OpenAI RealTime models. Now it supports WebRTC!&lt;/p&gt;&lt;figure class=&quot;mf mg mh mi mj mk mc md paragraph-image&quot; style=&quot;background-color: white; box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; margin: 56px auto 0px;&quot;&gt;&lt;div class=&quot;ml mm ee mn bh mo&quot; role=&quot;button&quot; style=&quot;box-sizing: inherit; cursor: zoom-in; position: relative; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1); width: 680px; z-index: auto;&quot; tabindex=&quot;0&quot;&gt;&lt;div class=&quot;mc md me&quot; style=&quot;box-sizing: inherit; margin-left: auto; margin-right: auto; max-width: 738px;&quot;&gt;&lt;picture style=&quot;box-sizing: inherit;&quot;&gt;&lt;source sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/format:webp/1*X3p_Y4QVyUebVSKXb51w8Q.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*X3p_Y4QVyUebVSKXb51w8Q.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*X3p_Y4QVyUebVSKXb51w8Q.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*X3p_Y4QVyUebVSKXb51w8Q.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*X3p_Y4QVyUebVSKXb51w8Q.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*X3p_Y4QVyUebVSKXb51w8Q.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*X3p_Y4QVyUebVSKXb51w8Q.png 1400w&quot; style=&quot;box-sizing: inherit;&quot; type=&quot;image/webp&quot;&gt;&lt;/source&gt;&lt;source data-testid=&quot;og&quot; sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/1*X3p_Y4QVyUebVSKXb51w8Q.png 640w, https://miro.medium.com/v2/resize:fit:720/1*X3p_Y4QVyUebVSKXb51w8Q.png 720w, https://miro.medium.com/v2/resize:fit:750/1*X3p_Y4QVyUebVSKXb51w8Q.png 750w, https://miro.medium.com/v2/resize:fit:786/1*X3p_Y4QVyUebVSKXb51w8Q.png 786w, https://miro.medium.com/v2/resize:fit:828/1*X3p_Y4QVyUebVSKXb51w8Q.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*X3p_Y4QVyUebVSKXb51w8Q.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*X3p_Y4QVyUebVSKXb51w8Q.png 1400w&quot; style=&quot;box-sizing: inherit;&quot;&gt;&lt;/source&gt;&lt;img alt=&quot;&quot; class=&quot;bh km mp c&quot; height=&quot;232&quot; loading=&quot;eager&quot; role=&quot;presentation&quot; src=&quot;https://miro.medium.com/v2/resize:fit:1400/1*X3p_Y4QVyUebVSKXb51w8Q.png&quot; style=&quot;box-sizing: inherit; height: auto; max-width: 100%; vertical-align: middle; width: 680px;&quot; width=&quot;700&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;9b3e&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;Given the people working on it I&#39;m sure it has to be great so as usual let’s take a look and see what is under the hood in terms of audio transmission.&lt;/p&gt;&lt;h2 class=&quot;mq mr fu bf ms mt mu mv mw mx my mz na lp nb nc nd lt ne nf ng lx nh ni nj nk bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;77cd&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 24px; margin: 1.72em 0px -0.31em;&quot;&gt;Signalling or Establishment of the connection&lt;/h2&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh nl lj lk ll nm ln lo lp nn lr ls lt no lv lw lx np lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;fd3d&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 0.94em 0px -0.46em; word-break: break-word;&quot;&gt;There are two options for the establishment of a RealTime session with the OpenAI servers:&lt;/p&gt;&lt;ul class=&quot;&quot; style=&quot;background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; list-style: none none; margin: 0px; padding: 0px;&quot;&gt;&lt;li class=&quot;le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb nq nr ns bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;cb06&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 2.14em; padding-left: 0px;&quot;&gt;&lt;span class=&quot;lg fv&quot; style=&quot;box-sizing: inherit; font-weight: 700;&quot;&gt;WebSocket signalling&lt;/span&gt;: much nicer API without ugly SDPs involved but less suited for public networks.&lt;/li&gt;&lt;li class=&quot;le lf fu lg b lh nt lj lk ll nu ln lo lp nv lr ls lt nw lv lw lx nx lz ma mb nq nr ns bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;0efd&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 1.14em; padding-left: 0px;&quot;&gt;&lt;span class=&quot;lg fv&quot; style=&quot;box-sizing: inherit; font-weight: 700;&quot;&gt;HTTP/WebRTC signalling&lt;/span&gt;: has an uglier API including SDP offer/answer negotiations but can work well in real networks that is critical for most of the use cases.&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;44d4&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;In the rest of the post we will focus only in the later (HTTP/WebRTC) that is the most interesting one.&lt;/p&gt;&lt;h2 class=&quot;mq mr fu bf ms mt mu mv mw mx my mz na lp nb nc nd lt ne nf ng lx nh ni nj nk bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;a08e&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 24px; margin: 1.72em 0px -0.31em;&quot;&gt;Authentication&lt;/h2&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh nl lj lk ll nm ln lo lp nn lr ls lt no lv lw lx np lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;9eaf&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 0.94em 0px -0.46em; word-break: break-word;&quot;&gt;The first step to use these RealTime APIs sending audio data directly from clients to OpenAI servers is to obtain an ephemeral key using you OpenAI API Secret. This is a simple HTTP request that for testing you can do from the command line:&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;397a&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;`curl -X POST -H “Content-Type: application/json” -H “Authorization: Bearer OPENAI_API_SECRET” -d ‘{“model”: “gpt-4o-realtime-preview-2024–12–17”, “voice”: “verse”}’&amp;nbsp;&lt;a class=&quot;af ny&quot; href=&quot;https://api.openai.com/v1/realtime/sessions&quot; rel=&quot;noopener ugc nofollow&quot; style=&quot;-webkit-tap-highlight-color: transparent; box-sizing: inherit;&quot; target=&quot;_blank&quot;&gt;https://api.openai.com/v1/realtime/sessions&lt;/a&gt;`&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;3be8&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;One interesting thing is that those credentials retrieved are really short lived and valid only for 60 seconds.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;6835&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;The response of that API also include things like “audio_format”: “pcm16”, that look outdated as the API also support &quot;opus&quot; now with the new WebRTC API and some parameters about voice and silence detection that i&#39;m not sure if they include some way to tune them by developers.&lt;/p&gt;&lt;h2 class=&quot;mq mr fu bf ms mt mu mv mw mx my mz na lp nb nc nd lt ne nf ng lx nh ni nj nk bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;2051&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 24px; margin: 1.72em 0px -0.31em;&quot;&gt;Connectivity&lt;/h2&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh nl lj lk ll nm ln lo lp nn lr ls lt no lv lw lx np lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;a60c&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 0.94em 0px -0.46em; word-break: break-word;&quot;&gt;The WebRTC connection is established using UDP and only UDP. There are no TURN servers or ICE-TCP/SSLTCP candidates so don’t expect this connection to work in restrictive corporate networks.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;28ac&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;This could be ok as you can fallback to websockets API in those cases, although in my opinion OpenAI should provide an SDK doing that fallback or just include iceServers or TCP candidates in the Answer.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;9e4b&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;All the examples also ignore the fact that the connection can get disconnected at some point and you will need to create it again. That’s another small feature that could be hidden in a future OpenAI SDK if needed.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;9c4b&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;As an interesting fact the UDP traffic uses the old trick of reusing the port 3478 to try to pass some firewalls that have STUN traffic open. Also in my case I’m in Europe and the WebRTC server assigned to me is in the US but I guess that will change once this API is out of Beta.&lt;/p&gt;&lt;h2 class=&quot;mq mr fu bf ms mt mu mv mw mx my mz na lp nb nc nd lt ne nf ng lx nh ni nj nk bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;c6df&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 24px; margin: 1.72em 0px -0.31em;&quot;&gt;Audio transmission&lt;/h2&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh nl lj lk ll nm ln lo lp nn lr ls lt no lv lw lx np lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;a4a7&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 0.94em 0px -0.46em; word-break: break-word;&quot;&gt;As expected with a WebRTC the audio transmission is done using Opus Codec at 50 packets per second. PCM and G722 are also negotiated so probably they also work although I don&#39;t see a reason to include them.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;3e2d&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;The whole SDP Answer from the Server can be seen in the following snippet:&lt;/p&gt;&lt;pre class=&quot;mf mg mh mi mj nz oa ob bp oc bb bk&quot; style=&quot;background: rgb(249, 249, 249); border-radius: 4px; border: 1px solid rgb(229, 229, 229); box-sizing: inherit; color: #242424; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; margin-bottom: 0px; margin-top: 56px; overflow-x: auto; padding: 32px;&quot;&gt;&lt;span class=&quot;od mr fu oa b bg oe of l og oh&quot; data-selectable-paragraph=&quot;&quot; id=&quot;d2d5&quot; style=&quot;box-sizing: inherit; display: block; font-size: 14px; letter-spacing: -0.022em; line-height: 1.4; margin-bottom: -0.2em; margin-top: -0.2em; min-width: fit-content;&quot;&gt;v=- 5732503706549353267 1734545489 IN IP4 127.0.0.1&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;s=-&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;t=0 0&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=group:BUNDLE 0 1&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=extmap-allow-mixed&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=msid-semantic: WMS realtimeapi&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;m=audio 3478 UDP/TLS/RTP/SAVPF 111 9 0 8&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;c=IN IP4 13.65.63.209&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=rtcp:3478 IN IP4 13.65.63.209&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=candidate:3461111247 1 udp 2130706431 13.65.63.209 3478 typ host generation 0&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=candidate:3461111247 2 udp 2130706431 13.65.63.209 3478 typ host generation 0&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=ice-ufrag:WGbWWofbaCZKJNIq&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=ice-pwd:SLqkjRNAwXPdKZsRmdlukcvcoPqUEsPw&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=fingerprint:sha-256 D7:A3:67:D9:49:5E:81:C5:A8:41:15:C1:A4:7A:FC:6F:51:8D:6F:6F:81:C2:A3:EB:BC:65:C0:B2:8A:26:4E:A7&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=setup:active&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=mid:0&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=extmap:3 &amp;lt;http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01&amp;gt;&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=sendrecv&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=msid:realtimeapi audio&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=rtcp-mux&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=rtcp-rsize&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=rtpmap:111 opus/48000/2&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=rtcp-fb:111 transport-cc&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=fmtp:111 minptime=10;useinbandfec=1&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=rtpmap:9 G722/8000&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=rtpmap:0 PCMU/8000&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=rtpmap:8 PCMA/8000&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=ssrc:2472058689 cname:realtimeapi&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=ssrc:2472058689 msid:realtimeapi audio&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;m=application 9 UDP/DTLS/SCTP webrtc-datachannel&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;c=IN IP4 0.0.0.0&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=ice-ufrag:WGbWWofbaCZKJNIq&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=ice-pwd:SLqkjRNAwXPdKZsRmdlukcvcoPqUEsPw&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=fingerprint:sha-256 D7:A3:67:D9:49:5E:81:C5:A8:41:15:C1:A4:7A:FC:6F:51:8D:6F:6F:81:C2:A3:EB:BC:65:C0:B2:8A:26:4E:A7&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=setup:active&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=mid:1&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;a=sctp-port:5000&lt;/span&gt;&lt;/pre&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;b2fb&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;I was expecting discontinuous transmission enabled for audio to reduce the bandwidth usage given that the user is probably in silence most of the time but I guess the API is not yet optimised. You can see how it sends and receives 50 packets per second all the time:&lt;/p&gt;&lt;figure class=&quot;mf mg mh mi mj mk mc md paragraph-image&quot; style=&quot;background-color: white; box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; margin: 56px auto 0px;&quot;&gt;&lt;div class=&quot;mc md oi&quot; style=&quot;box-sizing: inherit; margin-left: auto; margin-right: auto; max-width: 286px;&quot;&gt;&lt;picture style=&quot;box-sizing: inherit;&quot;&gt;&lt;source sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 286px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/format:webp/1*aWWZdTQIxTlOfPGmAmbNEg.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*aWWZdTQIxTlOfPGmAmbNEg.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*aWWZdTQIxTlOfPGmAmbNEg.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*aWWZdTQIxTlOfPGmAmbNEg.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*aWWZdTQIxTlOfPGmAmbNEg.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*aWWZdTQIxTlOfPGmAmbNEg.png 1100w, https://miro.medium.com/v2/resize:fit:572/format:webp/1*aWWZdTQIxTlOfPGmAmbNEg.png 572w&quot; style=&quot;box-sizing: inherit;&quot; type=&quot;image/webp&quot;&gt;&lt;/source&gt;&lt;source data-testid=&quot;og&quot; sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 286px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/1*aWWZdTQIxTlOfPGmAmbNEg.png 640w, https://miro.medium.com/v2/resize:fit:720/1*aWWZdTQIxTlOfPGmAmbNEg.png 720w, https://miro.medium.com/v2/resize:fit:750/1*aWWZdTQIxTlOfPGmAmbNEg.png 750w, https://miro.medium.com/v2/resize:fit:786/1*aWWZdTQIxTlOfPGmAmbNEg.png 786w, https://miro.medium.com/v2/resize:fit:828/1*aWWZdTQIxTlOfPGmAmbNEg.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*aWWZdTQIxTlOfPGmAmbNEg.png 1100w, https://miro.medium.com/v2/resize:fit:572/1*aWWZdTQIxTlOfPGmAmbNEg.png 572w&quot; style=&quot;box-sizing: inherit;&quot;&gt;&lt;/source&gt;&lt;img alt=&quot;&quot; class=&quot;bh km mp c&quot; height=&quot;169&quot; loading=&quot;lazy&quot; role=&quot;presentation&quot; src=&quot;https://miro.medium.com/v2/resize:fit:572/1*aWWZdTQIxTlOfPGmAmbNEg.png&quot; style=&quot;box-sizing: inherit; height: auto; max-width: 100%; vertical-align: middle; width: 286px;&quot; width=&quot;286&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;2314&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;The other option I would consider is reducing the uplink audio bitrate given that llm probably doesn’t need an amazing audio quality to understand the content and the emotions associated with it.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;0d33&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;There is also transport-cc RTP extension negotiated that doesn’t have much use in this audio-only use case and probably could be eliminated to remove some tiny overhead in the transmission.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;6344&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;In terms of audio reliability, opus inbandfec is the only addition. There is no RED or Retransmissions. This is probably fine for this specific use case given that LLM should be able to infer missing parts of the sentences by the context. Still I don&#39;t see any reason to not include at least retransmissions.&lt;/p&gt;&lt;h2 class=&quot;mq mr fu bf ms mt mu mv mw mx my mz na lp nb nc nd lt ne nf ng lx nh ni nj nk bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;89fe&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 24px; margin: 1.72em 0px -0.31em;&quot;&gt;Data&lt;/h2&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh nl lj lk ll nm ln lo lp nn lr ls lt no lv lw lx np lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;1591&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 0.94em 0px -0.46em; word-break: break-word;&quot;&gt;There is a reliable datachannel established to receive events from the server side. This is a great feature and provides a lot of flexibility as well as a channel to control things dynamically (like the voice used) without having to recreate the connection.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;bdb9&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;As soon as you start sending and receiving audio there are a lot of events received. Some of the most interesting ones could be:&lt;/p&gt;&lt;ul class=&quot;&quot; style=&quot;background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; list-style: none none; margin: 0px; padding: 0px;&quot;&gt;&lt;li class=&quot;le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb nq nr ns bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;0769&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 2.14em; padding-left: 0px;&quot;&gt;input_audio_buffer.speech_started: Notifies when the user starts&lt;/li&gt;&lt;li class=&quot;le lf fu lg b lh nt lj lk ll nu ln lo lp nv lr ls lt nw lv lw lx nx lz ma mb nq nr ns bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;93dd&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 1.14em; padding-left: 0px;&quot;&gt;speaking input_audio_buffer.speech_stopped: Notifies when the user&lt;/li&gt;&lt;li class=&quot;le lf fu lg b lh nt lj lk ll nu ln lo lp nv lr ls lt nw lv lw lx nx lz ma mb nq nr ns bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;89bf&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 1.14em; padding-left: 0px;&quot;&gt;starts speaking response.audio_transcript.delta: Includes the deltas of the text that you are receiving also by audio.&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;8f2c&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;It is interesting how (as expected) you receive the text much faster than the audio. That makes me wondering if for some use cases reading the text is not a more effective “conversation” than hearing the voice.&lt;/p&gt;&lt;h2 class=&quot;mq mr fu bf ms mt mu mv mw mx my mz na lp nb nc nd lt ne nf ng lx nh ni nj nk bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;3afb&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 24px; margin: 1.72em 0px -0.31em;&quot;&gt;Conclusions&lt;/h2&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh nl lj lk ll nm ln lo lp nn lr ls lt no lv lw lx np lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;b4a7&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 0.94em 0px -0.46em; word-break: break-word;&quot;&gt;It is great to see new products adopting WebRTC and providing real time interfaces. The functionality looks great for a Beta version and I’m sure it will evolve quickly.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph le lf fu lg b lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;96d3&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;I’m still not convinced Opus and WebRTC are the best candidates for this specific type of use case where you are talking to a “machine” instead of &quot;having a meeting&quot; and I hope in the future we end up using more custom codecs and transports tuned for this use case but I could be wrong, and in any case this is a very simple and a great approach for the time being.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/7651432425734155366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2024/12/openai-webrtc-api-review.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/7651432425734155366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/7651432425734155366'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2024/12/openai-webrtc-api-review.html' title='OpenAI WebRTC API Review'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-3111404837363483250</id><published>2024-11-25T06:47:00.000-08:00</published><updated>2024-11-25T06:47:15.728-08:00</updated><title type='text'>Target Bitrates vs Max Bitrates</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h1 class=&quot;ld le fu bf lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;6589&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 24px; letter-spacing: -0.016em; line-height: 30px; margin: 1.95em 0px -0.28em;&quot;&gt;Not all the simulcast layers have the same encoding quality&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p class=&quot;pw-post-body-paragraph mb mc fu md b me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;8dda&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 0.94em 0px -0.46em; word-break: break-word;&quot;&gt;When using simulcast video encoding with WebRTC, the encoder generates different versions or layers of the video input with varying resolutions. Using this techniques a multiparty video server (SFU) can adapt the video that each participant in a room receives based on factors such as available bandwidth, CPU/battery level, or the rendering size of those videos in each receiver.&lt;/p&gt;&lt;figure class=&quot;nc nd ne nf ng nh mz na paragraph-image&quot; style=&quot;background-color: white; box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; margin: 56px auto 0px;&quot;&gt;&lt;div class=&quot;mz na nb&quot; style=&quot;box-sizing: inherit; margin-left: auto; margin-right: auto; max-width: 421px;&quot;&gt;&lt;picture style=&quot;box-sizing: inherit;&quot;&gt;&lt;source sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 421px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/format:webp/1*wP_Wed3WmQOE_7EgQawVmA.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*wP_Wed3WmQOE_7EgQawVmA.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*wP_Wed3WmQOE_7EgQawVmA.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*wP_Wed3WmQOE_7EgQawVmA.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*wP_Wed3WmQOE_7EgQawVmA.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*wP_Wed3WmQOE_7EgQawVmA.png 1100w, https://miro.medium.com/v2/resize:fit:842/format:webp/1*wP_Wed3WmQOE_7EgQawVmA.png 842w&quot; style=&quot;box-sizing: inherit;&quot; type=&quot;image/webp&quot;&gt;&lt;/source&gt;&lt;source data-testid=&quot;og&quot; sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 421px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/1*wP_Wed3WmQOE_7EgQawVmA.png 640w, https://miro.medium.com/v2/resize:fit:720/1*wP_Wed3WmQOE_7EgQawVmA.png 720w, https://miro.medium.com/v2/resize:fit:750/1*wP_Wed3WmQOE_7EgQawVmA.png 750w, https://miro.medium.com/v2/resize:fit:786/1*wP_Wed3WmQOE_7EgQawVmA.png 786w, https://miro.medium.com/v2/resize:fit:828/1*wP_Wed3WmQOE_7EgQawVmA.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*wP_Wed3WmQOE_7EgQawVmA.png 1100w, https://miro.medium.com/v2/resize:fit:842/1*wP_Wed3WmQOE_7EgQawVmA.png 842w&quot; style=&quot;box-sizing: inherit;&quot;&gt;&lt;/source&gt;&lt;img alt=&quot;&quot; class=&quot;bh kl ni c&quot; height=&quot;212&quot; loading=&quot;lazy&quot; role=&quot;presentation&quot; src=&quot;https://miro.medium.com/v2/resize:fit:632/1*wP_Wed3WmQOE_7EgQawVmA.png&quot; style=&quot;box-sizing: inherit; height: auto; max-width: 100%; vertical-align: middle; width: 421px;&quot; width=&quot;421&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;figcaption class=&quot;nj nk nl mz na nm nn bf b bg z dx&quot; data-selectable-paragraph=&quot;&quot; style=&quot;box-sizing: inherit; color: #6b6b6b; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px; margin-left: auto; margin-right: auto; margin-top: 10px; max-width: 728px; text-align: center;&quot;&gt;How simulcast works with an SFU forwarding layers selectively&lt;/figcaption&gt;&lt;/figure&gt;&lt;p class=&quot;pw-post-body-paragraph mb mc fu md b me no mg mh mi np mk ml mm nq mo mp mq nr ms mt mu ns mw mx my fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;3314&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;These different versions of the video have varying resolutions, but what about their encoding quality? For example, if a user is receiving a video and rendering it in a window of 640x360, would he get the same quality if he receives the 640x360 layer as if he receives the highest layer of 1280x720?&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph mb mc fu md b me no mg mh mi np mk ml mm nq mo mp mq nr ms mt mu ns mw mx my fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;65c8&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;To answer this question about the quality of each resolution, we can examine first the bitrates used by each. But the interesting thing is that the bitrate of each resolution is not always the same and this is where we need to distinguish between min bitrate, target bitrate and max bitrate. Each resolution has those three parameters associated with it:&lt;/p&gt;&lt;ul class=&quot;&quot; style=&quot;background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; list-style: none none; margin: 0px; padding: 0px;&quot;&gt;&lt;li class=&quot;mb mc fu md b me no mg mh mi np mk ml mm nq mo mp mq nr ms mt mu ns mw mx my nt nu nv bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;a965&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 2.14em; padding-left: 0px;&quot;&gt;Min bitrate is the bitrate needed to be available to enable this layer.&lt;/li&gt;&lt;li class=&quot;mb mc fu md b me nw mg mh mi nx mk ml mm ny mo mp mq nz ms mt mu oa mw mx my nt nu nv bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;366a&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 1.14em; padding-left: 0px;&quot;&gt;Target bitrate is the bitrate used in ideal conditions when there are other higher layers enabled.&lt;/li&gt;&lt;li class=&quot;mb mc fu md b me nw mg mh mi nx mk ml mm ny mo mp mq nz ms mt mu oa mw mx my nt nu nv bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;e319&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 1.14em; padding-left: 0px;&quot;&gt;Max bitrate is the bitrate used in ideal conditions when this is the highest layer enabled.&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;pw-post-body-paragraph mb mc fu md b me no mg mh mi np mk ml mm nq mo mp mq nr ms mt mu ns mw mx my fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;549b&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;For example, here are the values configured for different simulcast layers in VP8 (you can check them for other layers and codecs at&amp;nbsp;&lt;a class=&quot;af ob&quot; href=&quot;http://simulcast.cc/&quot; rel=&quot;noopener ugc nofollow&quot; style=&quot;-webkit-tap-highlight-color: transparent; box-sizing: inherit;&quot; target=&quot;_blank&quot;&gt;simulcast.cc&lt;/a&gt;):&lt;/p&gt;&lt;figure class=&quot;nc nd ne nf ng nh mz na paragraph-image&quot; style=&quot;background-color: white; box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; margin: 56px auto 0px;&quot;&gt;&lt;div class=&quot;mz na oc&quot; style=&quot;box-sizing: inherit; margin-left: auto; margin-right: auto; max-width: 606px;&quot;&gt;&lt;picture style=&quot;box-sizing: inherit;&quot;&gt;&lt;source sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 606px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/format:webp/1*5yu5BBAzYSXacjbxKWrWng.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*5yu5BBAzYSXacjbxKWrWng.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*5yu5BBAzYSXacjbxKWrWng.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*5yu5BBAzYSXacjbxKWrWng.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*5yu5BBAzYSXacjbxKWrWng.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*5yu5BBAzYSXacjbxKWrWng.png 1100w, https://miro.medium.com/v2/resize:fit:1212/format:webp/1*5yu5BBAzYSXacjbxKWrWng.png 1212w&quot; style=&quot;box-sizing: inherit;&quot; type=&quot;image/webp&quot;&gt;&lt;/source&gt;&lt;source data-testid=&quot;og&quot; sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 606px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/1*5yu5BBAzYSXacjbxKWrWng.png 640w, https://miro.medium.com/v2/resize:fit:720/1*5yu5BBAzYSXacjbxKWrWng.png 720w, https://miro.medium.com/v2/resize:fit:750/1*5yu5BBAzYSXacjbxKWrWng.png 750w, https://miro.medium.com/v2/resize:fit:786/1*5yu5BBAzYSXacjbxKWrWng.png 786w, https://miro.medium.com/v2/resize:fit:828/1*5yu5BBAzYSXacjbxKWrWng.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*5yu5BBAzYSXacjbxKWrWng.png 1100w, https://miro.medium.com/v2/resize:fit:1212/1*5yu5BBAzYSXacjbxKWrWng.png 1212w&quot; style=&quot;box-sizing: inherit;&quot;&gt;&lt;/source&gt;&lt;img alt=&quot;&quot; class=&quot;bh kl ni c&quot; height=&quot;183&quot; loading=&quot;lazy&quot; role=&quot;presentation&quot; src=&quot;https://miro.medium.com/v2/resize:fit:909/1*5yu5BBAzYSXacjbxKWrWng.png&quot; style=&quot;box-sizing: inherit; height: auto; max-width: 100%; vertical-align: middle; width: 606px;&quot; width=&quot;606&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p class=&quot;pw-post-body-paragraph mb mc fu md b me no mg mh mi np mk ml mm nq mo mp mq nr ms mt mu ns mw mx my fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;75ff&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;You can see how these things work with a quick test enabling and disabling different simulcast layers (in this case I used the&amp;nbsp;&lt;a class=&quot;af ob&quot; href=&quot;https://github.com/fippo/simulcast-playground&quot; rel=&quot;noopener ugc nofollow&quot; style=&quot;-webkit-tap-highlight-color: transparent; box-sizing: inherit;&quot; target=&quot;_blank&quot;&gt;simulcast-playground&lt;/a&gt;). See in the graphs the bitrates of each layer in different conditions. On the top is the lowest resolution layer, then the middle layer and in the bottom is the highest resolution layer.&lt;/p&gt;&lt;ul class=&quot;&quot; style=&quot;background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; list-style: none none; margin: 0px; padding: 0px;&quot;&gt;&lt;li class=&quot;mb mc fu md b me no mg mh mi np mk ml mm nq mo mp mq nr ms mt mu ns mw mx my nt nu nv bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;3116&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 2.14em; padding-left: 0px;&quot;&gt;Initially all the layers are enabled and they are sent: 320x180 (150kbps), 640x360 (500kbps), 1280x720 (2500kbps)&lt;/li&gt;&lt;li class=&quot;mb mc fu md b me nw mg mh mi nx mk ml mm ny mo mp mq nz ms mt mu oa mw mx my nt nu nv bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;4803&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 1.14em; padding-left: 0px;&quot;&gt;When the highest layer is disabled, part of that bitrate is used for the middle layer and they are sent as: 320x180 (150kbps), 640x360 (700kbps)&lt;/li&gt;&lt;li class=&quot;mb mc fu md b me nw mg mh mi nx mk ml mm ny mo mp mq nz ms mt mu oa mw mx my nt nu nv bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;3fc5&quot; style=&quot;box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; list-style-type: disc; margin-bottom: -0.46em; margin-left: 30px; margin-top: 1.14em; padding-left: 0px;&quot;&gt;When the middle layer is also disabled only the lowest is sent as: 320x180 (200kbps)&lt;/li&gt;&lt;/ul&gt;&lt;figure class=&quot;nc nd ne nf ng nh mz na paragraph-image&quot; style=&quot;background-color: white; box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; margin: 56px auto 0px;&quot;&gt;&lt;div class=&quot;oe of ee og bh oh&quot; role=&quot;button&quot; style=&quot;box-sizing: inherit; cursor: zoom-in; position: relative; transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1); width: 680px; z-index: auto;&quot; tabindex=&quot;0&quot;&gt;&lt;div class=&quot;mz na od&quot; style=&quot;box-sizing: inherit; margin-left: auto; margin-right: auto; max-width: 734px;&quot;&gt;&lt;picture style=&quot;box-sizing: inherit;&quot;&gt;&lt;source sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/format:webp/1*dGzWag9WlXFIRmPjZmN7Tg.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*dGzWag9WlXFIRmPjZmN7Tg.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*dGzWag9WlXFIRmPjZmN7Tg.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*dGzWag9WlXFIRmPjZmN7Tg.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*dGzWag9WlXFIRmPjZmN7Tg.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*dGzWag9WlXFIRmPjZmN7Tg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*dGzWag9WlXFIRmPjZmN7Tg.png 1400w&quot; style=&quot;box-sizing: inherit;&quot; type=&quot;image/webp&quot;&gt;&lt;/source&gt;&lt;source data-testid=&quot;og&quot; sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/1*dGzWag9WlXFIRmPjZmN7Tg.png 640w, https://miro.medium.com/v2/resize:fit:720/1*dGzWag9WlXFIRmPjZmN7Tg.png 720w, https://miro.medium.com/v2/resize:fit:750/1*dGzWag9WlXFIRmPjZmN7Tg.png 750w, https://miro.medium.com/v2/resize:fit:786/1*dGzWag9WlXFIRmPjZmN7Tg.png 786w, https://miro.medium.com/v2/resize:fit:828/1*dGzWag9WlXFIRmPjZmN7Tg.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*dGzWag9WlXFIRmPjZmN7Tg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*dGzWag9WlXFIRmPjZmN7Tg.png 1400w&quot; style=&quot;box-sizing: inherit;&quot;&gt;&lt;/source&gt;&lt;img alt=&quot;Bitrates of different VP8 simulcast layers while disabling higher layers&quot; class=&quot;bh kl ni c&quot; height=&quot;643&quot; loading=&quot;lazy&quot; src=&quot;https://miro.medium.com/v2/resize:fit:1050/1*dGzWag9WlXFIRmPjZmN7Tg.png&quot; style=&quot;box-sizing: inherit; height: auto; max-width: 100%; vertical-align: middle; width: 680px;&quot; width=&quot;359&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h1 class=&quot;ld le fu bf lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;1a9e&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 24px; letter-spacing: -0.016em; line-height: 30px; margin: 1.95em 0px -0.28em;&quot;&gt;Is this good or bad? 🙂&lt;/h1&gt;&lt;p class=&quot;pw-post-body-paragraph mb mc fu md b me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;650b&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 0.94em 0px -0.46em; word-break: break-word;&quot;&gt;For the original purpose of simulcast — adapting video received to different receivers with varying bandwidth availability — this works well, since lower quality is expected when bandwidth is limited.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph mb mc fu md b me no mg mh mi np mk ml mm nq mo mp mq nr ms mt mu ns mw mx my fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;bf52&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;For other purposes, the results vary. With default bitrate settings, forwarding a lower layer means participants receive both lower resolution and reduced quality.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph mb mc fu md b me no mg mh mi np mk ml mm nq mo mp mq nr ms mt mu ns mw mx my fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;5b66&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;To measure the quality impact, I tested VMAF scores by encoding videos with target and max bitrates using ffmpeg’s real-time encoding settings. While this method differs slightly from WebRTC’s configuration, it provides a reasonable comparison.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph mb mc fu md b me no mg mh mi np mk ml mm nq mo mp mq nr ms mt mu ns mw mx my fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;6161&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;Looking at the lowest resolution (320x180), we find good quality above 100kbps, with notably better results at the max bitrate of 200kbps compared to the target bitrate of 150kbps (a difference of 2.5 VMAF points).&lt;/p&gt;&lt;figure class=&quot;nc nd ne nf ng nh mz na paragraph-image&quot; style=&quot;background-color: white; box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; margin: 56px auto 0px;&quot;&gt;&lt;div class=&quot;mz na oi&quot; style=&quot;box-sizing: inherit; margin-left: auto; margin-right: auto; max-width: 476px;&quot;&gt;&lt;picture style=&quot;box-sizing: inherit;&quot;&gt;&lt;source sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 476px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/format:webp/1*ChOT5WgX603ZiwT73RE8aw.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*ChOT5WgX603ZiwT73RE8aw.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*ChOT5WgX603ZiwT73RE8aw.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*ChOT5WgX603ZiwT73RE8aw.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*ChOT5WgX603ZiwT73RE8aw.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*ChOT5WgX603ZiwT73RE8aw.png 1100w, https://miro.medium.com/v2/resize:fit:952/format:webp/1*ChOT5WgX603ZiwT73RE8aw.png 952w&quot; style=&quot;box-sizing: inherit;&quot; type=&quot;image/webp&quot;&gt;&lt;/source&gt;&lt;source data-testid=&quot;og&quot; sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 476px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/1*ChOT5WgX603ZiwT73RE8aw.png 640w, https://miro.medium.com/v2/resize:fit:720/1*ChOT5WgX603ZiwT73RE8aw.png 720w, https://miro.medium.com/v2/resize:fit:750/1*ChOT5WgX603ZiwT73RE8aw.png 750w, https://miro.medium.com/v2/resize:fit:786/1*ChOT5WgX603ZiwT73RE8aw.png 786w, https://miro.medium.com/v2/resize:fit:828/1*ChOT5WgX603ZiwT73RE8aw.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*ChOT5WgX603ZiwT73RE8aw.png 1100w, https://miro.medium.com/v2/resize:fit:952/1*ChOT5WgX603ZiwT73RE8aw.png 952w&quot; style=&quot;box-sizing: inherit;&quot;&gt;&lt;/source&gt;&lt;img alt=&quot;&quot; class=&quot;bh kl ni c&quot; height=&quot;295&quot; loading=&quot;lazy&quot; role=&quot;presentation&quot; src=&quot;https://miro.medium.com/v2/resize:fit:714/1*ChOT5WgX603ZiwT73RE8aw.png&quot; style=&quot;box-sizing: inherit; height: auto; max-width: 100%; vertical-align: middle; width: 476px;&quot; width=&quot;476&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p class=&quot;pw-post-body-paragraph mb mc fu md b me no mg mh mi np mk ml mm nq mo mp mq nr ms mt mu ns mw mx my fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;0a28&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;This quality degradation affects both simulcast and SVC configurations. SVC faces an additional challenge: the bitrates for different resolutions are hardcoded in WebRTC and cannot be modified using the setParameters API.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph mb mc fu md b me no mg mh mi np mk ml mm nq mo mp mq nr ms mt mu ns mw mx my fn bk&quot; data-selectable-paragraph=&quot;&quot; id=&quot;b738&quot; style=&quot;background-color: white; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2.14em 0px -0.46em; word-break: break-word;&quot;&gt;In summary, a layer’s bitrate varies depending on whether higher layers are enabled. While requesting lower resolutions works well in most cases, remember that lower layers have both reduced resolution and lower encoding quality.&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/3111404837363483250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2024/11/target-bitrates-vs-max-bitrates.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/3111404837363483250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/3111404837363483250'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2024/11/target-bitrates-vs-max-bitrates.html' title='Target Bitrates vs Max Bitrates'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-7396896808708768027</id><published>2024-05-03T00:27:00.000-07:00</published><updated>2024-05-03T00:27:32.739-07:00</updated><title type='text'>The Impact of Bursty Packet Loss on Audio Quality in WebRTC</title><content type='html'>&lt;p&gt;&amp;nbsp;Ensuring high-quality audio in WebRTC encounters a pivotal challenge amidst less than ideal network conditions, predominantly driven by the burstiness of packet loss. This phenomenon is prevalent in congested networks, areas with low mobile coverage, and public Wi-Fi setups.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;9f50&quot;&gt;Within the WebRTC framework, an array of strategies exists to mitigate packet loss, yet their efficacy varies depending on the specific network dynamics. Among the most prevalent techniques are:&lt;/p&gt;&lt;ul class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;4f40&quot;&gt;&lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;OPUS Forward Error Correction (FEC):&lt;/strong&gt; Each audio packet incorporates low-bitrate data from preceding packet, facilitating potential recovery in the event of a single packet lost.&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;5a4b&quot;&gt;&lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;Packet Retransmissions:&lt;/strong&gt; Leveraging standard NACK/RTX mechanisms, the receiver requests retransmission upon detecting packet sequence gaps.&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;70ce&quot;&gt;&lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;Packet Duplication:&lt;/strong&gt; Sending multiple instances of the same packet aims to compensate for potential losses. It is like sending preemptive retransmissions to mitigate the impact of potential packet loss.&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;0e67&quot;&gt;&lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;Redundancy (RED):&lt;/strong&gt; This technique entails embedding encoded audio for the current packet along with copies of previous packets within each packet, typically following the RFC2198 format.&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;3d9e&quot;&gt;&lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;Packet Loss Concealment:&lt;/strong&gt; Employing various concealment techniques such as temporal audio stretching or neural network approximations to mitigate the impact of lost packets.&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;3f05&quot;&gt;&lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;Deep Redundancy (DRED):&lt;/strong&gt; Integrating a neural network encoder to provide lower bitrate copies of previous packets along with the current packet encoded with high quality as usual.&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;29e0&quot;&gt;However, the effectiveness of these techniques hinges on network latency and the magnitude of consecutive packet losses. For instance, retransmissions suffer under high latency, while OPUS FEC and short RED patterns are not effective when faced with extensive consecutive packet losses. Hence, discerning the network’s characteristics is imperative to determine the most suitable approach for optimal results.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Analyzing Packet Loss Bursts in Real&amp;nbsp;Networks&lt;/h2&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;1702&quot;&gt;Exploring consecutive packet losses provides valuable insights into network behavior. How prevalent are these bursts in actual networks, and what magnitude do they typically reach?&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;aa81&quot;&gt;Traditionally, answering these questions posed a challenge. However, with the advent of the new &lt;a class=&quot;markup--anchor markup--p-anchor&quot; data-href=&quot;https://opus-codec.org/demo/opus-1.5/#lossgen&quot; href=&quot;https://opus-codec.org/demo/opus-1.5/#lossgen&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;network simulator developed for the Opus 1.5 release&lt;/a&gt; and leveraging &lt;a class=&quot;markup--anchor markup--p-anchor&quot; data-href=&quot;https://github.com/microsoft/PLC-Challenge&quot; href=&quot;https://github.com/microsoft/PLC-Challenge&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;data from Microsoft&lt;/a&gt;, we now have a simple tool to estimate these parameters more readily.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;39ca&quot;&gt;I used that simulator to run some tests with different packet loss conditions and extract some statistics. The graph below illustrates the extent of loss bursts relative to the average packet loss percentage in a network.&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;graf graf--figure&quot; name=&quot;10aa&quot;&gt;&lt;img class=&quot;graf-image&quot; data-height=&quot;766&quot; data-image-id=&quot;1*UB3GfiXlrXkuHnCWXYJR3Q.png&quot; data-width=&quot;3034&quot; height=&quot;162&quot; src=&quot;https://cdn-images-1.medium.com/max/2400/1*UB3GfiXlrXkuHnCWXYJR3Q.png&quot; width=&quot;640&quot; /&gt;&lt;/figure&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;3aef&quot;&gt;For instance, in a network experiencing 1% packet loss, approximately 16% of losses entail more than one consecutive packet loss. Consequently, employing techniques like OPUS FEC or redundancy with a single packet may prove less effective in such scenarios. Similarly, in networks with 20% packet loss, approximately 5% of losses involve five or more consecutive packet losses so we would need to add a lot of latency to take advantage of redundancy in those cases.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;0ba8&quot;&gt;Given that the efficacy of mitigation techniques depends on the nature of packet loss, the next logical query arises: How can we discern whether packet loss is bursty or not? Traditional RTCP feedback provides insights into the average percentage of loss but lacks details regarding loss patterns. To address this, several approaches exist:&lt;/p&gt;&lt;ol class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;f06b&quot;&gt;&lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;Assuming Bursty Packet Loss:&lt;/strong&gt; This prevalent approach assumes that the length of packet loss gaps correlates with the overall packet loss rate.&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;a33a&quot;&gt;&lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;Transport CC Feedback:&lt;/strong&gt; Although less common, this method involves measuring burstiness based on Transport Congestion Control feedback, offering a theoretically sound approach.&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;b59f&quot;&gt;&lt;strong class=&quot;markup--strong markup--li-strong&quot;&gt;RTCP Extended Reports (XR):&lt;/strong&gt; Leveraging XR reports enables the explicit inclusion of information regarding packet loss bursts.&lt;/li&gt;&lt;/ol&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;3668&quot;&gt;Understanding the burstiness of packet loss is crucial for devising effective strategies to mitigate its impact on audio quality in WebRTC.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;fe10&quot;&gt;The decision regarding which techniques to implement is nuanced and far from black and white. Various combinations can be effective, but in my view, a blend of DRED, retransmissions, and PLC strikes a balance between maintaining quality, managing latency, and optimizing bitrate utilization across diverse network conditions. I’m eager to hear about others’ experiences and insights on this matter.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/7396896808708768027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2024/05/the-impact-of-bursty-packet-loss-on.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/7396896808708768027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/7396896808708768027'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2024/05/the-impact-of-bursty-packet-loss-on.html' title='The Impact of Bursty Packet Loss on Audio Quality in WebRTC'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-6162534248484536725</id><published>2024-01-18T05:04:00.000-08:00</published><updated>2024-01-18T12:06:00.072-08:00</updated><title type='text'>Loss based bandwidth estimation in WebRTC</title><content type='html'>&lt;div class=&quot;separator&quot;&gt;&lt;/div&gt;&lt;p&gt;Measuring available bandwidth and avoiding congestion is the most critical and complex part of the video pipeline in WebRTC. The concept of bandwidth estimation (BWE) is simple: monitor packet latency, and if latency increases or packet loss occurs, back off and send less data. The first part is known as delay-based estimation, while the second part, less known, is referred to as loss-based estimation.&lt;/p&gt;
&lt;p&gt;In the original implementation of WebRTC, the logic for loss-based estimation was straightforward: if there was more than 2% packet loss don&#39;t increase the bitrate sent and if it is more than 10% reduce the bitrate being sent. However, this naive approach had a flaw. Some networks also experience packet loss not due to congestion but inherent to the network itself (e.g., certain WiFi networks). We call that packet loss static or inherent packet loss.&lt;/p&gt;

&lt;p class=&quot;graf graf--p&quot; name=&quot;b2b7&quot;&gt;&lt;/p&gt;&lt;figure class=&quot;graf graf--figure&quot; name=&quot;e685&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img class=&quot;graf-image&quot; data-height=&quot;162&quot; data-image-id=&quot;1*lDiG900xdW1wUOGVzqF7QQ.png&quot; data-width=&quot;867&quot; height=&quot;120&quot; src=&quot;https://cdn-images-1.medium.com/max/1200/1*lDiG900xdW1wUOGVzqF7QQ.png&quot; width=&quot;640&quot; /&gt;&lt;/figure&gt;To address this issue, the latest versions of Google’s WebRTC library introduced a more modern and sophisticated solution after several years of development and experimentation. This solution is known as loss-based bandwidth estimation version 2 (loss-based BWE v2) and it is the third iteration on the feature in the history of WebRTC. We can summarize that evolution of it in the following timeline:&lt;p&gt;&lt;/p&gt;&lt;ul class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;f1a6&quot;&gt;Basic loss based bwe (~2011): Based on static thresholds for packet loss to increase / decrease bwe. &lt;a class=&quot;markup--anchor markup--li-anchor&quot; data-href=&quot;https://chromium.googlesource.com/external/webrtc/+/master/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc#548&quot; href=&quot;https://chromium.googlesource.com/external/webrtc/+/master/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc#548&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Source Code&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;f92e&quot;&gt;Loss based bwe v1 (~2019): Dynamic thresholds for packet loss and smoothing of measurements. &lt;a class=&quot;markup--anchor markup--li-anchor&quot; data-href=&quot;https://chromium.googlesource.com/external/webrtc/+/master/modules/congestion_controller/goog_cc/loss_based_bandwidth_estimation.cc&quot; href=&quot;https://chromium.googlesource.com/external/webrtc/+/master/modules/congestion_controller/goog_cc/loss_based_bandwidth_estimation.cc&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Source Code&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;239f&quot;&gt;Loss based bwe v2 (2023): Maximum likelihood modeling from candidates based on current packet loss and trends. &lt;a class=&quot;markup--anchor markup--li-anchor&quot; data-href=&quot;https://chromium.googlesource.com/external/webrtc/+/master/modules/congestion_controller/goog_cc/loss_based_bwe_v2.cc&quot; href=&quot;https://chromium.googlesource.com/external/webrtc/+/master/modules/congestion_controller/goog_cc/loss_based_bwe_v2.cc&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Source Code&lt;/a&gt;, &lt;a class=&quot;markup--anchor markup--li-anchor&quot; data-href=&quot;https://bugs.chromium.org/p/webrtc/issues/detail?id=12707&quot; href=&quot;https://bugs.chromium.org/p/webrtc/issues/detail?id=12707&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Tracker Ticket&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;This post will focus on describing that newest solution (loss based bwe v2) enabled this year in Chrome and all the browsers and clients based on the same library.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Loss based BWE v2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;At a very high level this diagram shows how loss based bwe is integrated in the estimation logic and what are the inputs taken into account.   The loss based estimation takes as input the estimation from delay based estimation and based on that an the packet loss feedback received from the packets being sent it will try to provide a final estimation.&lt;/p&gt;&lt;figure class=&quot;graf graf--figure&quot; name=&quot;33b7&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhCfcuG3ToXJg5ixAbaC2i8RLKTWU5CGqN4mzlhaqrIIOtwctW5GeGIR4qzyQ86CFzea03U8Gnqq130Qf7tMkF5oAAyQsVqCD9p2oWH95kJTs8nQK6HOcS27Lgzpqd1jIWvChzD_iRnsUtyX-yFu3zF7GmxhtuRWNbmguaIpFcuuFmGyy2_D9R920iB2Ww&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;454&quot; data-original-width=&quot;457&quot; height=&quot;397&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhCfcuG3ToXJg5ixAbaC2i8RLKTWU5CGqN4mzlhaqrIIOtwctW5GeGIR4qzyQ86CFzea03U8Gnqq130Qf7tMkF5oAAyQsVqCD9p2oWH95kJTs8nQK6HOcS27Lgzpqd1jIWvChzD_iRnsUtyX-yFu3zF7GmxhtuRWNbmguaIpFcuuFmGyy2_D9R920iB2Ww=w400-h397&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/figure&gt;
&lt;p&gt;The new loss based BWE v2 runs the following steps every time it needs to provide a new estimation:&lt;/p&gt;
&lt;p&gt;1/ First, it generates a list of potential candidates that describe the network&#39;s (also known as channel&#39;s) characteristics. In this case, the characteristics considered are the available bandwidth and the inherent packet loss of the network.&lt;/p&gt;
&lt;p&gt;1.a. Bandwidth candidates are sourced from different areas. Essentially, delay-based estimations, the most recent loss-based estimations, and the bitrate being sent are all considered. These are then multiplied by certain factors (0.95, 1, 1.02) to generate potential additional new bandwidth candidates.&lt;/p&gt;
&lt;p&gt;1.b. The inherent packet loss candidate is derived from the latest estimation. It is updated based on the trend of recent observations, using Newton&#39;s update method which is based on first and second derivatives. Additionally, there are limits based on the sent bitrate - at higher bitrates, the inherent packet loss should not be too high.&lt;/p&gt;
&lt;p&gt;2/ Second, the algorithm selects the candidate that can most accurately explain the packet loss in the most recent observations.  For that it calculates an objective score for each candidate and this is the maximum likelihood modeling aspect of the algorithm.&lt;/p&gt;
&lt;p&gt;Those two steps can be seen in this snippet of the real code that summarize the concept of the algorithm:&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;  ChannelParameters best_candidate = current_best_estimate_;
  double objective_max = std::numeric_limits&amp;lt;double&amp;gt;::lowest();
  for (ChannelParameters candidate : GetCandidates(in_alr)) {
    NewtonsMethodUpdate(candidate);

    const double candidate_objective = GetObjective(candidate);
    if (candidate_objective &amp;gt; objective_max) {
      objective_max = candidate_objective;
      best_candidate = candidate;
    }
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The bandwidth of the chosen candidate with the highest objective score in this last step is then reported as the final estimation that will be used to decide how much video to encode and send to the network.&lt;/p&gt;
&lt;p&gt;Although the algorithm appears simple based on this description, the coding process is far from trivial. Despite its relatively small size, it features over 30 tuneable parameters. If you&#39;re skeptical, you can review the issue tracker history. You&#39;ll see it took more than two years to develop, optimise, and deploy this new feature to production.&lt;/p&gt;
&lt;p&gt;What do you think? As usual feedback is more than welcomed either here or&amp;nbsp;&lt;a href=&quot;https://www.blogger.com/blog/post/edit/460321274846352896/1447126812316647064#&quot;&gt;in Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;!--notionvc: 8bd5714e-d31f-4b32-984c-4caf5837d980--&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/6162534248484536725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2024/01/loss-based-bandwidth-estimation-inwebrtc.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/6162534248484536725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/6162534248484536725'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2024/01/loss-based-bandwidth-estimation-inwebrtc.html' title='Loss based bandwidth estimation in WebRTC'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhCfcuG3ToXJg5ixAbaC2i8RLKTWU5CGqN4mzlhaqrIIOtwctW5GeGIR4qzyQ86CFzea03U8Gnqq130Qf7tMkF5oAAyQsVqCD9p2oWH95kJTs8nQK6HOcS27Lgzpqd1jIWvChzD_iRnsUtyX-yFu3zF7GmxhtuRWNbmguaIpFcuuFmGyy2_D9R920iB2Ww=s72-w400-h397-c" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-8011542328814728843</id><published>2023-08-27T11:17:00.004-07:00</published><updated>2023-08-27T11:25:09.219-07:00</updated><title type='text'>Audio Mixing or Forwarding</title><content type='html'>&lt;p&gt;How many audio streams should your WebRTC server forward to the participants in a room? There are various options, ranging from the simplest approach of forwarding everything, to the most extreme option of mixing all audio and sending just a single stream.&lt;/p&gt;
&lt;p&gt;A few weeks ago, we engaged in &lt;a class=&quot;notion-link-token notion-focusable-token notion-enable-hover&quot; data-token-index=&quot;1&quot; href=&quot;https://twitter.com/anarchyco/status/1678780208462331906&quot; rel=&quot;noopener noreferrer&quot; style=&quot;cursor: pointer; overflow-wrap: break-word; text-decoration: inherit;&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;link-annotation-unknown-block-id-74022133&quot; style=&quot;border-bottom: 0.05em solid rgba(55, 53, 47, 0.4); border-color: rgba(55,53,47,.4); border-left-color: rgba(55, 53, 47, 0.4); border-right-color: rgba(55, 53, 47, 0.4); border-top-color: rgba(55, 53, 47, 0.4); opacity: 0.7;&quot;&gt;a Twitter conversation about this very topic&lt;/span&gt;&lt;/a&gt;. Following that discussion, bloggeek also wrote &lt;a class=&quot;notion-link-token notion-focusable-token notion-enable-hover&quot; data-token-index=&quot;3&quot; href=&quot;https://bloggeek.me/webrtc-conferences-mix-or-route-audio/&quot; rel=&quot;noopener noreferrer&quot; style=&quot;cursor: pointer; overflow-wrap: break-word; text-decoration: inherit;&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;link-annotation-unknown-block-id--2113991618&quot; style=&quot;border-bottom: 0.05em solid rgba(55, 53, 47, 0.4); border-color: rgba(55,53,47,.4); border-left-color: rgba(55, 53, 47, 0.4); border-right-color: rgba(55, 53, 47, 0.4); border-top-color: rgba(55, 53, 47, 0.4); opacity: 0.7;&quot;&gt;a post on the subject&lt;/span&gt;&lt;/a&gt;. For me it is always interesting to see what different types of applications are doing because at least in some of those cases they have the ability to do A/B testing and compare the results with millions of users before making a decision.&lt;/p&gt;
&lt;p&gt;The simplest way to determine the best approach is to enter a room with different applications and inspect the SDP (Session Description Protocol) in &lt;strong&gt;&lt;code&gt;chrome://webrtc-internals&lt;/code&gt;&lt;/strong&gt;. Within this tool, you can examine how many channels are being forwarded when you&#39;re in a room and look for potential clues within the SDP (some people use the &quot;mixed&quot; identifier for audio tracks, among other things).  For example in case of Google Meet you can see in the SDP that joining a room you get 3 hardcoded audio streams created:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126, mid=3&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126, mid=4&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126, mid=5&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;All the tests below were done with the web clients and Zoom was not included because it doens&#39;t make use of standard WebRTC and everything is binary&amp;amp;compiled so it would take more effort to reverse engineer it (for example analysing the audio bitrates when multiple participants speak).&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg0pe3i33T5ZOgyR73OLmOHNss1RLFMfH2eQJoJLcpVBxFWQah97pNbvMDrOSwuCdQtm4GGrShnnhvB0NDU4zIX5ZjP9AQmnmtk6LWNf5rshaE3V8x3P4Ub4mjghqYgMT_7_c3_BVRHdJ-qZc6_VloCNop4TwxcSzxOA2WO7nfcmHnBrUpMIzUqBs8HPrM&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;940&quot; data-original-width=&quot;1600&quot; height=&quot;376&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg0pe3i33T5ZOgyR73OLmOHNss1RLFMfH2eQJoJLcpVBxFWQah97pNbvMDrOSwuCdQtm4GGrShnnhvB0NDU4zIX5ZjP9AQmnmtk6LWNf5rshaE3V8x3P4Ub4mjghqYgMT_7_c3_BVRHdJ-qZc6_VloCNop4TwxcSzxOA2WO7nfcmHnBrUpMIzUqBs8HPrM=w640-h376&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;What&#39;s the optimal approach for this task? There isn&#39;t a one-size-fits-all solution; it hinges on your particular use case and specific requirements. The most straightforward implementation is plain forwarding, which is what the majority of open-source projects and platforms employ. Interestingly, enterprise solutions tend to lean toward mixing. This inclination might be attributed to the fact that these services have evolved from earlier audio mixing solutions, the necessity for PSTN interconnection, or the need to accommodate unusual scenarios, such as devices with extremely limited available bandwidth.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/8011542328814728843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2023/08/audio-mixing-or-forwarding.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/8011542328814728843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/8011542328814728843'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2023/08/audio-mixing-or-forwarding.html' title='Audio Mixing or Forwarding'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEg0pe3i33T5ZOgyR73OLmOHNss1RLFMfH2eQJoJLcpVBxFWQah97pNbvMDrOSwuCdQtm4GGrShnnhvB0NDU4zIX5ZjP9AQmnmtk6LWNf5rshaE3V8x3P4Ub4mjghqYgMT_7_c3_BVRHdJ-qZc6_VloCNop4TwxcSzxOA2WO7nfcmHnBrUpMIzUqBs8HPrM=s72-w640-h376-c" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-3287924799949279296</id><published>2023-07-11T07:47:00.003-07:00</published><updated>2023-07-11T07:47:39.385-07:00</updated><title type='text'>Architecture for AI integration in conferencing applications</title><content type='html'>&lt;p&gt;With the latest improvements in ML technology, especially generative algorithms and large language models, more and more conferencing applications are adding these capabilities to their offerings.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;9d88&quot;&gt;This ML technology can be applied to conferencing applications at two different levels: &lt;strong class=&quot;markup--strong markup--p-strong&quot;&gt;the infrastructure level&lt;/strong&gt; with improvements in media handling and transmission, and &lt;strong class=&quot;markup--strong markup--p-strong&quot;&gt;the application level&lt;/strong&gt; with new features or capabilities for the users.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;5fea&quot;&gt;At the infrastructure level (codecs, noise suppression, etc.) most of the high-level ideas were covered in this &lt;a class=&quot;markup--anchor markup--p-anchor&quot; data-href=&quot;http://www.rtcbits.com/2017/10/improving-real-time-communications-with.html&quot; href=&quot;http://www.rtcbits.com/2017/10/improving-real-time-communications-with.html&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;other post&lt;/a&gt;. Some interesting recent advances are applying “ML codecs” for audio redundancy, and the next frontier is applying generative algorithms also to video, as well as general applications to photorealistic avatars.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;3821&quot;&gt;This post focuses on the second level (the application part) and how to implement typical features such as summarization, image generation, or moderation. The idea here is to present a reference architecture that can be used to implement these services.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;f1d7&quot;&gt;The architecture presented below is based on two core ideas:&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;f1d7&quot;&gt;1. The system is split into three different subsystems that have different execution patterns:&lt;/p&gt;&lt;ul class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;1fc9&quot;&gt;One on-demand subsystem that the application can use to request specific capabilities when needed.&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;5890&quot;&gt;One offline subsystem that processes files, events and recordings in the background for enhancement, filtering, or extracting relevant information. This system has a tradicional storage bucket as backend (f.e. AWS S3).&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;e9ee&quot;&gt;One online subsystem that processes all communication events (messaging, signaling, messaging) in almost real-time to make decisions, extract information, or enhance those events. This system has a streaming queue as backend (f.e Apache Kafka).&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;83bd&quot;&gt;2. All the ML algorithms are exposed behind an API/Gateway to abstract details of the implementation and interface with hosted models and external providers.&lt;/p&gt;&lt;figure class=&quot;graf graf--figure&quot; name=&quot;6a9b&quot;&gt;&lt;img class=&quot;graf-image&quot; data-height=&quot;764&quot; data-image-id=&quot;1*vAndW35B6s044dVycv1ZHw.png&quot; data-width=&quot;1104&quot; src=&quot;https://cdn-images-1.medium.com/max/800/1*vAndW35B6s044dVycv1ZHw.png&quot; /&gt;&lt;/figure&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;3134&quot;&gt;With that architecture these are some typical features and how they could be implemented:&lt;/p&gt;&lt;ul class=&quot;postList&quot;&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;db95&quot;&gt;Media generation (images, music, memes…) can be requested from the application when requested by the user or automatically when needed by the application.&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;f6d0&quot;&gt;Enhanced recordings, for example with the typical super-resolution algorithms, can be generated by a background post-processing process ran every time there is a new recording generated in the storage bucket.&lt;/li&gt;&lt;li class=&quot;graf graf--li&quot; name=&quot;a933&quot;&gt;Real time extraction of relevant fields from the conversation (f.e. action items) can be implemented with a process reading the captions from the queue, grouping them in chunks by topic or speaker, and then sending those chunks to the AI Gateway. That information can be fed back to the queue so that other processes or the application can make use of them.&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;ddfd&quot;&gt;This post express my personal views. Feedback is more than welcomed either here or&amp;nbsp;&lt;a class=&quot;notion-link-token notion-focusable-token notion-enable-hover&quot; data-token-index=&quot;1&quot; href=&quot;https://www.blogger.com/blog/post/edit/460321274846352896/7591444044709966579#&quot; rel=&quot;noopener noreferrer&quot; style=&quot;cursor: pointer; overflow-wrap: break-word; text-decoration: inherit;&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;link-annotation-unknown-block-id--1099700321&quot; style=&quot;border-bottom: 0.05em solid rgba(55, 53, 47, 0.4); border-color: rgba(55,53,47,0.4); border-left-color: rgba(55, 53, 47, 0.4); border-right-color: rgba(55, 53, 47, 0.4); border-top-color: rgba(55, 53, 47, 0.4); opacity: 0.7;&quot;&gt;in Twitter&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/3287924799949279296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2023/07/architecture-for-ai-integration-in.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/3287924799949279296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/3287924799949279296'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2023/07/architecture-for-ai-integration-in.html' title='Architecture for AI integration in conferencing applications'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-2307504156131600341</id><published>2023-05-24T22:05:00.007-07:00</published><updated>2023-05-29T02:02:15.352-07:00</updated><title type='text'>Review of Signaling in different WebRTC applications</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;This post provides a quick review of the signaling channel implementation in various popular WebRTC platforms. It examines the protocol used for the channel, how messages are serialized, and whether the applications use Session Description Protocol (SDP) as an opaque string over the wire, or if they instead send the required parameters in a custom format.&lt;/p&gt;
&lt;p&gt;To provide a variety of platforms, I have included a mix of popular end-user applications, cloud providers, and open-source implementations in the table. If you would like, I am happy to add others to the list.&lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiwQuILLRWQppPn_fvDI7pxq6Lpf7K5fiThGn4PYcgzcpSq-AkQZyoUU2UwLQJ8BoooLxsBxDyvkQeicjkXw9tMxRv-Zce6ld0Ep67n01GtnhTa25OUgYh4zmfK2SrlNmPU7-XTfeHR8v7pCwQM881yxnFq15ewwQ-ZZbPe1I6qi0PPBBeQmSd0PwlX&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;689&quot; data-original-width=&quot;854&quot; height=&quot;517&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiwQuILLRWQppPn_fvDI7pxq6Lpf7K5fiThGn4PYcgzcpSq-AkQZyoUU2UwLQJ8BoooLxsBxDyvkQeicjkXw9tMxRv-Zce6ld0Ep67n01GtnhTa25OUgYh4zmfK2SrlNmPU7-XTfeHR8v7pCwQM881yxnFq15ewwQ-ZZbPe1I6qi0PPBBeQmSd0PwlX=w640-h517&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;How was it tested?&lt;/h2&gt;
&lt;p&gt;To test it, join a room and check in Chrome Developer Tools whether there are WebSocket connections established or periodic HTTP requests being made.
Then, inspect the messages of those connections and requests and check if the format is Binary/JSON/XML. In case of Binary messages, it&#39;s harder to see the content, and there&#39;s a chance that the information is compressed/encrypted, and there&#39;s some JSON or SDP inside.&lt;/p&gt;
&lt;p&gt;Next, look inside those messages for the typical information in SDP description, such as ufrag, header extensions, and payload types, and see how they are sent.&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;Transport:&lt;/h2&gt;
&lt;p&gt;Most applications seem to use WebSockets, but some of the biggest ones use HTTP polling. This may be due to historical reasons, to better handle specific users with restricted networks or devices, or to react faster to disconnections in unstable connections.&lt;/p&gt;
&lt;p&gt;In case of Google Meet it looks like part of the signaling goes over datachannels in addition to the existing HTTP long polling mechanism.&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;Serialization:&lt;/h2&gt;
&lt;p&gt;The serialization formats are all over the place between binary (the most efficient), JSON (the simplest) and XML in case of using XMPP.  Using JSON can be less efficient over the wire but require less libraries/runtime to process it in a browser.   The ProtoJSON approach used by Google Meet looks like a good compromise in the middle.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;SDP Usage:&lt;/h2&gt;
&lt;p&gt;Most applications seem to not use SDPs over the wire.  Instead they only send the parameters needed and keep the SDPs as an implementation detail in the client side.    That&#39;s slightly more efficient and gives you more flexibility but it is less straightforward to ad those conversions if all your endpoints are libwebrtc based.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;The conclusion could be that there is no single right solution for WebRTC signaling but different alternatives that all of them can work well.&amp;nbsp; &amp;nbsp;However two of the most common approaches seems to be using WebSockets and not sending SDP on the wire that is something that personally I&#39;m very happy about.&lt;br /&gt;Did you find something else interesting or maybe even something that is not accurate in this post? Feedback is more than welcomed either here or&amp;nbsp;&lt;a class=&quot;notion-link-token notion-focusable-token notion-enable-hover&quot; data-token-index=&quot;1&quot; href=&quot;https://www.blogger.com/blog/post/edit/460321274846352896/7591444044709966579#&quot; rel=&quot;noopener noreferrer&quot; style=&quot;cursor: pointer; overflow-wrap: break-word; text-decoration: inherit;&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;link-annotation-unknown-block-id--1099700321&quot; style=&quot;border-bottom: 0.05em solid rgba(55, 53, 47, 0.4); border-color: rgba(55,53,47,0.4); border-left-color: rgba(55, 53, 47, 0.4); border-right-color: rgba(55, 53, 47, 0.4); border-top-color: rgba(55, 53, 47, 0.4); opacity: 0.7;&quot;&gt;in Twitter&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/2307504156131600341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2023/05/webrtc-signaling-review.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/2307504156131600341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/2307504156131600341'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2023/05/webrtc-signaling-review.html' title='Review of Signaling in different WebRTC applications'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEiwQuILLRWQppPn_fvDI7pxq6Lpf7K5fiThGn4PYcgzcpSq-AkQZyoUU2UwLQJ8BoooLxsBxDyvkQeicjkXw9tMxRv-Zce6ld0Ep67n01GtnhTa25OUgYh4zmfK2SrlNmPU7-XTfeHR8v7pCwQM881yxnFq15ewwQ-ZZbPe1I6qi0PPBBeQmSd0PwlX=s72-w640-h517-c" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-7591444044709966579</id><published>2023-05-15T22:10:00.003-07:00</published><updated>2023-05-16T03:01:31.021-07:00</updated><title type='text'>Perfect Interactive Broadcasting Architecture</title><content type='html'>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;While we might sometimes talk about low-latency or interactive broadcasting in a generic way, it&#39;s important to note that there are actually two distinct types of streaming use cases that require different levels of interactivity.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Conversational use cases where multiple participants are talking&lt;/strong&gt; together and that conversation is being streamed to many other viewers. These viewers can potentially become speakers at some point too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single stream use cases where just one person is streaming their video feed&lt;/strong&gt; (it can be their camera, their screen, or a combination of both) to many other viewers who can interact in different ways. The most obvious way is through chat messages, but it can also include emoji reactions or even bids on an auction being streamed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The conversational use case has specific requirements. For instance, it demands effective synchronization of multiple streams, ultra-low latency (less than 250ms) only between the users who are speaking, and an element that performs video composition of all the streams prior to forwarding it to viewers. There are a variety of approaches to implementing this, each with its own set of pros and cons, as exemplified by top products like Streamyard or the way Twitch streamers use to integrate Discord into their streams.&lt;/p&gt;
&lt;p&gt;This post is primarily focused on the second category, which pertains to single stream use cases. What makes this particular use case compelling is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;That single stream needs to be streamed with &lt;strong&gt;perfect quality&lt;/strong&gt; if there are no network limitations. If there are network limitations, it should be streamed with the best possible quality in real-time and send the additional quality layer in the background/later to have at least the recording with the best possible quality.&lt;/li&gt;
&lt;li&gt;There is a single stream being sent so there is &lt;strong&gt;no need for synchronization&lt;/strong&gt; of multiple sources.&lt;/li&gt;
&lt;li&gt;You usually don&#39;t need &amp;lt; 250ms latency and can &lt;strong&gt;prioritize providing a bit higher quality&lt;/strong&gt; and have 1-2sec latency.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One potential requirement for these use cases is support for various endpoints such as browsers, mobile devices, smart TVs, consoles, and mobile phones. These devices have different capabilities in terms of networking, protocols, and codecs.&lt;/p&gt;
&lt;p&gt;What would be the perfect solution in terms of quality and flexibility for this type of scenarios?  (assuming infinite time to develop it and money to run it :))&lt;/p&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhmXytjZw-8TgOvDJ4dSEp-dJsF68uQ40m2RkjTWGkS3u8gM_tFFo2MKMBssuwvD6uxnw9vUHgR1Le6fq-seq1dnekd-6bdTgrTfro6ciZEihN2Xqz8hS2S2-XUSFgAm-9lIc9MURzR3jgjHsvrk5vSd3SHenyeUaPBsUkq-bFmomnsLCyV9DGC7wcV&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;393&quot; data-original-width=&quot;1331&quot; height=&quot;188&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhmXytjZw-8TgOvDJ4dSEp-dJsF68uQ40m2RkjTWGkS3u8gM_tFFo2MKMBssuwvD6uxnw9vUHgR1Le6fq-seq1dnekd-6bdTgrTfro6ciZEihN2Xqz8hS2S2-XUSFgAm-9lIc9MURzR3jgjHsvrk5vSd3SHenyeUaPBsUkq-bFmomnsLCyV9DGC7wcV=w640-h188&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Ingestion&lt;/h3&gt;
&lt;p&gt;Use the best available codec for the endpoint, taking into account device capabilities and status (such as battery load). In many cases, this could be the AV1 video codec with a high-quality Opus audio configuration.&lt;/p&gt;
&lt;p&gt;If possible, send a single stream with perfect quality. However, if there are network issues in the sender&#39;s uplink, send two layers of video instead. One layer should maintain the low-latency requirement, while the other can be sent in the background with as much latency as needed. This ensures that the server will end up with a layer of perfect quality eventually.&lt;/p&gt;
&lt;p&gt;To provide low-latency delivery in the presence of packet loss in the network, use a UDP-based transport. There are different alternatives available, such as SRT, WebRTC, RUSH, and custom protocols. Let&#39;s use RTS (Real Time Streaming) as a generic name for this. If the protocol needs to be supported by browsers as well, then either WebRTC or a custom QUIC/WebTransport protocol seem like reasonable candidates. However, in the case of WebRTC, it may be harder to implement the previous idea of always having a layer with perfect quality in background, and may require some workarounds.&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;Processing&lt;/h3&gt;
&lt;p&gt;There are a variety of audio and video processing algorithms that are gaining popularity, such as audio and video noise removal and superresolution. However, some of these algorithms are too resource-intensive to run on many client devices.&lt;/p&gt;
&lt;p&gt;Furthermore, the most appropriate codec on the sender side may not always be the best or supported by all receivers.&lt;/p&gt;
&lt;p class=&quot;graf graf--p&quot; name=&quot;f933&quot;&gt;For these reasons, a server processing pipeline that includes decoding, processing, and reencoding can be highly advantageous. There are also other tasks that can be incorporated into this pipeline, such as generating captions or adding watermarks to videos.&lt;/p&gt;&lt;p class=&quot;graf graf--p&quot; name=&quot;b580&quot;&gt;This is the most expensive component of the system, and for some applications, it may be excessive and should be eliminated or only applied to the most important streams. If there is no Processing layer in the server then the solution becomes much simpler with the sender generating video streams in multiple qualities and the server just forwarding them without reencoding them.&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;Delivery&lt;/h3&gt;
&lt;p&gt;Different devices require different qualities and codecs. Additionally, some devices may be limited to HLS support, so varying protocols may be necessary.&lt;/p&gt;&lt;p&gt;In most cases, server side recording is also necessary.&lt;/p&gt;&lt;p&gt;For use cases that really require real-time functionality (probably not that many), the RTS protocol can be used. This protocol can provide different media versions, including various resolutions, bitrates, and codecs, which can be distributed using a Real Time CDN. For example, WebRTC can use SFUs infrastructure with this protocol.&lt;/p&gt;&lt;p&gt;


&lt;/p&gt;&lt;p&gt;For use cases that require interactivity, but not real-time functionality (most of them?), or that require compatibility with legacy devices, the LL-HLS protocol can be used. Like the RTS protocol, LL-HLS offers different media versions that can be distributed using a Traditional CDN.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;And that was the proposal for a possible “perfect” broadcasting architecture for interactive use cases would look like. What do you think?  As usual feedback is more than welcomed either here or&amp;nbsp;&lt;a class=&quot;notion-link-token notion-focusable-token notion-enable-hover&quot; data-token-index=&quot;1&quot; href=&quot;https://www.blogger.com/blog/post/edit/460321274846352896/1447126812316647064#&quot; rel=&quot;noopener noreferrer&quot; style=&quot;cursor: pointer; overflow-wrap: break-word; text-decoration: inherit;&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;link-annotation-unknown-block-id-403954376&quot; style=&quot;border-bottom: 0.05em solid rgba(55, 53, 47, 0.4); border-color: rgba(55,53,47,0.4); border-left-color: rgba(55, 53, 47, 0.4); border-right-color: rgba(55, 53, 47, 0.4); border-top-color: rgba(55, 53, 47, 0.4); opacity: 0.7;&quot;&gt;in Twitter&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/7591444044709966579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2023/05/perfect-interactive-broadcasting.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/7591444044709966579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/7591444044709966579'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2023/05/perfect-interactive-broadcasting.html' title='Perfect Interactive Broadcasting Architecture'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhmXytjZw-8TgOvDJ4dSEp-dJsF68uQ40m2RkjTWGkS3u8gM_tFFo2MKMBssuwvD6uxnw9vUHgR1Le6fq-seq1dnekd-6bdTgrTfro6ciZEihN2Xqz8hS2S2-XUSFgAm-9lIc9MURzR3jgjHsvrk5vSd3SHenyeUaPBsUkq-bFmomnsLCyV9DGC7wcV=s72-w640-h188-c" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-4931673386806928400</id><published>2023-05-01T07:51:00.011-07:00</published><updated>2023-05-02T13:19:16.971-07:00</updated><title type='text'>WebRTC header extensions review</title><content type='html'>&lt;p&gt;WebRTC supports the concept of RTP header extensions to extend media packets with additional metadata.&amp;nbsp; &amp;nbsp; One of the most common use cases is to attach the audio level to audio packets so that the server can calculate active speakers without having to decode the audio packets.&lt;/p&gt;&lt;p&gt;Some of these header extensions are standard and have been used for a while, but there are others that are added by Google when needed and are only documented lightly in the website and the libwebrtc code.&amp;nbsp; &amp;nbsp;Those header extensions and its usage is not very well know and this post is an attempt to give visibility of them for the WebRTC community.&lt;/p&gt;&lt;p&gt;To discover some of these headers you can usually take a look at the Offer/Answer of a Google Meet session or take a look at the libwebrtc source code here: https://chromium.googlesource.com/external/webrtc/+/master/api/rtp_parameters.h&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Audio Levels&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;urn:ietf:params:rtp-hdrext:ssrc-audio-level&lt;/span&gt;) &lt;a href=&quot;https://tools.ietf.org/html/rfc6464&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Very common]&lt;/p&gt;&lt;p&gt;The header contains the audio level (volume) of the audio contained in this audio package, as well as an optional bit (not usually utilized) that indicates if the packet is voice or another sort of audio.&lt;/p&gt;&lt;p&gt;Use case: A server not decoding audio can still detect the active and/or dominant speaker in a session.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Mixer to client audio levels&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;urn:ietf:params:rtp-hdrext:csrc-audio-level&lt;/span&gt;) &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc6465.html&quot;&gt;Doc&lt;/a&gt;&amp;nbsp;&lt;br /&gt;[Not very common but Google Meet uses it]&lt;/p&gt;&lt;p&gt;This header extension includes information about the different sources contributing to the audio of this packet and their audio levels.&lt;/p&gt;&lt;p&gt;Use case: If a server combines or merges audio, an audio stream can portray various speakers simultaneously, and this header enables the receiver to identify the particular user who was speaking during that period.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Inband Confort Noise&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;http://www.webrtc.org/experiments/rtp-hdrext/inband-c&lt;/span&gt;) &lt;a href=&quot;http://www.webrtc.org/experiments/rtp-hdrext/inband-c&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Anybody using it?]&lt;/p&gt;&lt;p&gt;This header extension informs if the audio packet includes confort noise and its level.&lt;/p&gt;&lt;p&gt;Use case: A server could de-prioritize these packets or avoid including them in the mixing.&amp;nbsp; A receiver could use it as a hint for discontinuous transmission being enabled.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Absolute Send Time&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time&lt;/span&gt;) &lt;a href=&quot;http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Legacy]&lt;/p&gt;&lt;p&gt;This header extension includes an NTP timestamp for when the packet was sent instead of when the media was captured.&lt;/p&gt;&lt;p&gt;Use case: The main use case is for server side bandwidth estimation to be able to detect changes in inter packet latency and use it to estimate the bandwidth available and send it back to the sender (f.e. using a REMB RTCP packet) if needed.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Capture Time&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time&lt;/span&gt;) &lt;a href=&quot;http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Not very common but Google Meet uses it]&lt;/p&gt;&lt;p&gt;This header extension includes an NTP timestamp for when the frame corresponding to this packet was captured from the input device.&lt;/p&gt;&lt;p&gt;Use case: Implement audio/video synchronization in servers, for example for mixing purposes.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Transport Wide Identifier&lt;/b&gt;&amp;nbsp;(&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01&lt;/span&gt;) &lt;a href=&quot;http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Almost always used]&lt;/p&gt;&lt;p&gt;This header extension includes an unique identifier for each packet so that the receiver can then send feedback back to the sender with relative timestamps of those packets with those identifiers.&amp;nbsp; There is a v2 version that gives more control to the sender on when to receive feedback.&lt;/p&gt;&lt;p&gt;Use case: It is only used to generate TransportControlFeedback packets including the inter packet delay for those identifiers included in the header extension.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Media Identifier&lt;/b&gt; (mid) (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;urn:ietf:params:rtp-hdrext:sdes:mid&lt;/span&gt;) &lt;a href=&quot;https://tools.ietf.org/html/draft-ietf-mmusic-sdp-bundle-negotiation-49#section-15&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Almost always used]&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This header extension includes an ID for the media stream that is also included in the SDP.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Use case: This way the server or the receiver can understand what media stream those packets are for.&amp;nbsp; &amp;nbsp;To save bandwidth this header extension is only included in the first packets of a stream or when the ssrc changes.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;RTP Stream ID&lt;/b&gt;&amp;nbsp;(&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id&lt;/span&gt;)&amp;nbsp;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/draft-ietf-avtext-rid-09&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Very common]&lt;/p&gt;&lt;p&gt;This header extension includes the identifier of each encoding of a stream (f.e. a simulcast layer).&lt;/p&gt;&lt;p&gt;Use case: It is similar to the mid header extension described above but in this case to differentiate multiple encodings in case of simulcast.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Repaired RTP Stream ID&lt;/b&gt;&amp;nbsp;(&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id&lt;/span&gt;)&amp;nbsp;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/draft-ietf-avtext-rid-09&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Very common]&lt;/p&gt;&lt;p&gt;This header extension includes the identifier of retransmission packets that provide redundancy for packets in other RTP stream.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Use case: Differentiate and associate retransmissions to the corresponding RTP stream.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Time Offset&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;urn:ietf:params:rtp-hdrext:toffset&lt;/span&gt;) &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc5450.txt&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Anybody using it?]&lt;/p&gt;&lt;p&gt;Includes the offset from when the packet was captured to when it was sent.&lt;/p&gt;&lt;p&gt;Use case: Allow more accurate jitter calculation in the receiver side.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Video orientation&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;urn:3gpp:video-orientation&lt;/span&gt;) &lt;a href=&quot;http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ts_126114v120700p.pdf&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Commonly used, the only problem is firefox]&lt;/p&gt;&lt;p&gt;This header extension includes the rotation that needs to be applied to the video frames before rendering them (0, 90, 180, 270 degrees).&amp;nbsp; This way a phone sending a 640x480 video in landscape mode can keep sending 640x480 with a value of 90 in the header extension when rotating the phone to portrait mode.&lt;/p&gt;&lt;p&gt;Use case: Used by the sender to avoid having to change the aspect ratio of the stream when a device (usually a phone) goes from portrait to landscape.&amp;nbsp; This is not supported by Firefox making it tricky for some use cases.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Playout Delay&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;http://www.webrtc.org/experiments/rtp-hdrext/playout-delay&lt;/span&gt;) &lt;a href=&quot;http://www.webrtc.org/experiments/rtp-hdrext/playout-delay)&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Not very commonly used, mostly for gamestreaming use cases]&lt;/p&gt;&lt;p&gt;This header extension includes a delay that should be applied to this audio or video stream before rendering it.&lt;/p&gt;&lt;p&gt;Use case: Used by the sender or a server to indicate the receiver that it needs minimum latency (playout delay=0) or it can tolerate some latency to have better quality (f.e. playout delay 500ms).&amp;nbsp; &amp;nbsp;This behaviour can also be controled with the javascript property playoutDelayHint&lt;/p&gt;&lt;p&gt;&lt;b&gt;Video Content Type&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;http://www.webrtc.org/experiments/rtp-hdrext/video-content-type&lt;/span&gt;) &lt;a href=&quot;http://www.webrtc.org/experiments/rtp-hdrext/video-content-type&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Not very commonly used]&lt;/p&gt;&lt;p&gt;This header extension includes information about the type of content (camera or screensharing).&amp;nbsp; &amp;nbsp;Chrome also includes some even more proprietary stuff here to define the spatial layer of this simulcast stream.&lt;/p&gt;&lt;p&gt;Use case: Used by a server to apply different .&amp;nbsp; It could potentially be used by a receiver too to tune some latency or retransmissions behaviour but apparently it is not used for that in Chrome.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Video Timing&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;http://www.webrtc.org/experiments/rtp-hdrext/video-timing&lt;/span&gt;) &lt;a href=&quot;http://www.webrtc.org/experiments/rtp-hdrext/video-timing&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Not very commonly used.&amp;nbsp; Google Meet only maybe?]&lt;/p&gt;&lt;p&gt;This header includes different timestamps for the media corresponding with a specific frame (encode start, encode end, packetization time, pacer time).&lt;/p&gt;&lt;p&gt;Use case: I think the main use case is for monitoring, testing and statistics purposes.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Color Space&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;http://www.webrtc.org/experiments/rtp-hdrext/color-space&lt;/span&gt;) &lt;a href=&quot;(http://www.webrtc.org/experiments/rtp-hdrext/color-space&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Not very commonly used.&amp;nbsp; &amp;nbsp;Stadia?]&amp;nbsp;&lt;/p&gt;&lt;p&gt;This header extension includes the color space used to represent the video frames information.&lt;br /&gt;&lt;br /&gt;Use case: Encode video represented in different color spaces.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Generic Frame Descriptor&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;http://www.webrtc.org/experiments/rtp-hdrext/generic-frame-descriptor-00&lt;/span&gt;) &lt;a href=&quot;http://www.webrtc.org/experiments/rtp-hdrext/generic-frame-descriptor-00&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Legacy.&amp;nbsp; Mostly replaced with the Dependency Descriptor hdrext below]&lt;/p&gt;&lt;p&gt;This header extension includes the information about layers and dependencies of a frame for scalable video.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Use case: Used by a server to be able to filter different frames and resolutions properly in a code-independent way.&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Video Layers allocation&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;http://www.webrtc.org/experiments/rtp-hdrext/video-layers-allocation00&lt;/span&gt;) &lt;a href=&quot;http://www.webrtc.org/experiments/rtp-hdrext/video-layers-allocation00&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Not very commonly used.&amp;nbsp; Google Meet uses it.]&lt;/p&gt;&lt;p&gt;This header extension includes information for streams using scalable video coding or simulcast about the spatial layers, the temporal layers, their resolutions, framerates and bitrates.&lt;/p&gt;&lt;p&gt;Use case: Otherwise the server needs to guess some of this information (f.e. bitrates) to make decissions on what layers to forward to each participant, leading to less accurate values and more complexity.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Dependency descriptor&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension&lt;/span&gt;) &lt;a href=&quot;https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension&quot;&gt;Doc&lt;/a&gt;&lt;br /&gt;[Not very commonly used.&amp;nbsp; Google Meet uses it.]&lt;/p&gt;&lt;p&gt;This header extension includes the information about layers and dependencies of a frame for scalable video.&amp;nbsp; &amp;nbsp;It was designed for AV1 but can be used for other codecs (f.e. VP9).&lt;/p&gt;&lt;p&gt;Use case: Used by a selective forwarding unit to be able to filter different frames and resolutions properly in a code-independent way.&amp;nbsp; &amp;nbsp; It is the same purpose as the legacy Generic Frame Descriptor included above.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Video Frame Tracking Id&lt;/b&gt; (&lt;span style=&quot;background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;http://www.webrtc.org/experiments/rtp-hdrext/video-frame-tracking-id&lt;/span&gt;) &lt;a href=&quot;http://www.webrtc.org/experiments/rtp-hdrext/video-frame-tracking-id&quot;&gt;Doc&lt;/a&gt; &lt;br /&gt;[Only for testing]&lt;/p&gt;&lt;p&gt;Header extension including a unique frame identifier.&lt;/p&gt;&lt;p&gt;Use case: For testing purposes to be able to correlate the frames in the sender and receiver side.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;What do you think? Any other info or feedback about these or other header extensions?&amp;nbsp; Feel free to share those here or&amp;nbsp;&lt;a href=&quot;https://www.twitter.com/anarchyco&quot;&gt;in Twitter&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/4931673386806928400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2023/05/webrtc-header-extensions.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/4931673386806928400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/4931673386806928400'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2023/05/webrtc-header-extensions.html' title='WebRTC header extensions review'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-4903238131400302952</id><published>2023-04-12T07:30:00.016-07:00</published><updated>2023-04-12T07:34:49.835-07:00</updated><title type='text'>Existing WebRTC is not great for broadcasting use cases</title><content type='html'>&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;WebRTC was originally designed for real-time communication with a small number of participants, where latency requirements are extremely strict (typically &amp;lt;250ms). However, it has also been utilized for broadcasting use cases, such as YouTube Studio or Cloudflare CDN, where protocols used in the past have been different, typically Adobe’s RTMP and protocols based on HTTP.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;WebRTC offers a new range of broadcasting use cases, particularly those requiring hyper-low latency, such as those with audience interactivity, for instance, user reactions or auction use cases. However, choosing WebRTC comes with tradeoffs, including increased complexity, scalability challenges, or lower quality. While it&#39;s possible to address the first two with enough time and effort, the primary concern should be how to obtain the best possible quality.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;Why do we have lower quality when using WebRTC?&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;First of all, a clarification.&amp;nbsp; In a perfect network with infinite bandwidth there is no much difference in quality but in other restricted or flaky networks these are some reasons why WebRTC provides lower quality than RTMP&amp;amp;HTTP based solutions:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;Smaller buffers: WebRTC implementations prioritize latency over quality by using small buffers, which can sometimes be too small to receive retransmissions in time. TCP-based protocols with large buffers prioritize quality over latency and do not face this issue.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;Aggressive congestion control: WebRTC employs aggressive congestion control that quickly reduces video transmission when congestion is detected to prevent increased latency and potential packet loss.&amp;nbsp; This helps to have more predictive low latency but in many cases being less aggressive would maintain a higher quality at the expense of a higher latency.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;Only real time reliability: If you lose connectivity for some seconds WebRTC is not going to queue the media to deliver it whenever you recover.&amp;nbsp; &amp;nbsp;Same way it is not going to recover a previous frame after a newer one has been decoded.&amp;nbsp; &amp;nbsp;The most obvious impact on this is in case of server side recordings.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;Fast Encoding: WebRTC codecs configuration are optimized for speed and do not use two-pass encodings or bidirectional predicted frames, instead using conservative settings to ensure fast encoding. However, this means that the encoding efficiency is not as good as that of broadcasting applications, resulting in slightly worse encoding for a given bitrate.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;Unpredictable Bitrate: The fact that WebRTC cannot use 2 pass encoding makes the quality/bitrate decisions by the codecs less optimal and unstable.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;To be honest some of these limitations can be solved if you control the WebRTC implementation (f.e. in a mobile or desktop native app) but that is not so easy or even possible nowadays for web applications where the WebRTC stack is embedded in the browsers.&lt;/span&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;What should we do for interactive broadcasting?&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;Ideally we need a protocol where we can configure the acceptable latency in a range from real time (&amp;lt;250 ms) to traditional broadcasting (5 - 10secs).&amp;nbsp; Once that constraint is set the protocol needs to provide the best possible quality in those conditions.&amp;nbsp; &amp;nbsp;That is doable and we will probably see it in one or both of these ways:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;More tunneable WebRTC.&amp;nbsp; &amp;nbsp;With some more flexibility in WebRTC APIs it should be possible to overcome the limitations described in the previous section.&amp;nbsp; &amp;nbsp;For example things like configurable congestion control with settings like RTCPeerConnection.congestionControl = &quot;low latency&quot; or some lower level APIs in the new WebCodecs API.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;New protocols working over UDP and reusing some of the WebRTC techniques but providing more flexibility (f.e. new QUIC protocols like RUSH).&amp;nbsp; Implementations using those protocols created from scratch can overcome most of those limitations because they leave part of the problem (buffering or encoding) to the application.&amp;nbsp; &amp;nbsp;Although they would also need the ability to control the congestion control behavior.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;So should I use WebRTC or not?&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;I would use it only when it is really required and provides enough business value to make it worth the additional complexity and potential quality degradation.&amp;nbsp; &amp;nbsp;For streaming a traditional soccer game it is probably not needed while for a stream with interactivity with the audience (f.e. reactions) it can provide real value and the quality loss can be worth the benefits in terms of engagement.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;Also we need to keep in mind that we don&#39;t need to have an end to end WebRTC.&amp;nbsp; &amp;nbsp;For example in cases where there is a need for low latency only between speakers it could make sense to use WebRTC for ingestion but keep using HLS for playback.&amp;nbsp; &amp;nbsp; Or in some cases use RTMP for ingestion from broadcasters with good connectivity and RUSH for playback.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/4903238131400302952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2023/04/webrtc-broadcast.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/4903238131400302952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/4903238131400302952'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2023/04/webrtc-broadcast.html' title='Existing WebRTC is not great for broadcasting use cases'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-1575395795804669611</id><published>2023-02-18T09:37:00.019-08:00</published><updated>2023-02-22T03:54:19.092-08:00</updated><title type='text'>Media Ingestion protocols Review</title><content type='html'>&lt;p&gt;This post summaries the most relevant protocols using for media ingestion.&amp;nbsp; &amp;nbsp; In these media ingestion flows a client that is broadcasting some content sends it to an endpoint (typically a server) that will re-format it for distribution to a potentially large audience, using a different protocol optimised for media playback.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfDxbGjKiL2tXkMxIhvGTnnTeR_479PuhNW1CLuMTKfpStihyvUVTcqIUunM-v-Z0vVTxojbs4PZsMR7fB9bB5BzsxK2QEOSMWKZS-AAdRcn1YI3fDSnHfZiWF-U4hMondXW6Nqd9eop-Geuw1oxRPaoJOwRYW-aIKtW7tUzAZXYmoVVYbuNiOMMR-/s2038/Screenshot%202023-02-18%20at%2010.42.54.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;362&quot; data-original-width=&quot;2038&quot; height=&quot;114&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfDxbGjKiL2tXkMxIhvGTnnTeR_479PuhNW1CLuMTKfpStihyvUVTcqIUunM-v-Z0vVTxojbs4PZsMR7fB9bB5BzsxK2QEOSMWKZS-AAdRcn1YI3fDSnHfZiWF-U4hMondXW6Nqd9eop-Geuw1oxRPaoJOwRYW-aIKtW7tUzAZXYmoVVYbuNiOMMR-/w640-h114/Screenshot%202023-02-18%20at%2010.42.54.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;The following sections show the main ideas behind each protocol as well as some of their advantages and disadvantages.&amp;nbsp; &amp;nbsp; The protocols are organised into three buckets (tradicional protocols, modern protocols and next generation protocols) that correspond to three waves of protocols with the first one based on TCP, the second one on UDP or HTTP and the third one with QUIC.&amp;nbsp; You can see a summary of those characteristics as well as the timeline and adoption in the following diagram.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAvgy_1sLhGvEz3u27XlOoe4hAcJhLopcPbn8ypoCCL2dWXsS14qdPLMEjxtSIUgil0fqbXH4SHKdcrsMZTuMHwrPh5uO93vbe6QAPR-bdo45TO9LXKb3stp9WKOZKgSDty_yc8vcLRj4uRTmUWeoUXxoOx5E1kuc4oCLtMvek98o3p8GFp9HKzOO7/s557/Screenshot%202023-02-18%20at%2018.21.37.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;228&quot; data-original-width=&quot;557&quot; height=&quot;262&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAvgy_1sLhGvEz3u27XlOoe4hAcJhLopcPbn8ypoCCL2dWXsS14qdPLMEjxtSIUgil0fqbXH4SHKdcrsMZTuMHwrPh5uO93vbe6QAPR-bdo45TO9LXKb3stp9WKOZKgSDty_yc8vcLRj4uRTmUWeoUXxoOx5E1kuc4oCLtMvek98o3p8GFp9HKzOO7/w640-h262/Screenshot%202023-02-18%20at%2018.21.37.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Traditional protocols&lt;/h2&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;RTMP&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://rtmp.veriskope.com/docs/spec/&quot;&gt;RTMP (Real-Time Messaging Protocol)&lt;/a&gt; is the most widely used protocol for media ingestion nowadays.&amp;nbsp; It was developed more than 20y ago and popularised by Adobe/Flash initially as a playback protocol.&amp;nbsp; &amp;nbsp;It is supported by the biggest Internet video platforms like Youtube, Facebook or Twitch.&lt;/p&gt;&lt;p&gt;The protocol transports media over TCP, includes an initial handshake and support for arbitrary content (metadata, RPC and media) using a proprietary binary format.&amp;nbsp; &amp;nbsp;The feedback mechanisms to control the media transmission is limited as well as the codecs supported.&amp;nbsp; &amp;nbsp;There are some variations of RTMP developed for proxy traversal or P2P but they are not that popular.&lt;/p&gt;&lt;p&gt;It is a protocol used for ingestion and not playback so in most of the cases it requieres other protocol and some repacketization for distribution (typically using HLS protocol).&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;RTSP&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://www.ietf.org/rfc/rfc2326.txt&quot;&gt;RTSP (Real-Time Streaming Protocol)&lt;/a&gt; is another protocol developed in the 90s but in this case it was fully standard from the beginning and reuses other internet standard protocols like RTP (Real-Time Protocol), RTCP (Real-Time Control Protocol) and SDP (Session Description Protocol).&amp;nbsp; &amp;nbsp;The main motivation was its standardisation and the lower latency compared with RTMP.&amp;nbsp; &amp;nbsp;It is not used that much today and mostly limited to specific use cases like IP cameras.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;It is a protocol that separates the control and the media plane.&amp;nbsp; The establishment part of RTSP is similar to HTTP and uses SDP to describe the media content and the media part uses RTP over UDP.&amp;nbsp; It could support most of the feedback and capabilities of RTP extensions but usually the implementations are limited to the basic RTP profile.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Modern protocols&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;SRT&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://www.haivision.com/resources/white-paper/srt-protocol-technical-overview/?utm_campaign=SEO+Resources+SRT+Tech+Specs+PR&quot;&gt;SRT (Secure Reliable Protocol)&lt;/a&gt; is a protocol invented in 2012 and released in 2017 as a replacement for the tradicional protocols to be better suited for low latency transmission over noisy networks.&amp;nbsp; It is used by many professional broadcasters and&amp;nbsp;some internet services like Caffeine.tv.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjLon3sezGovLlS4Q72mf_KdiKHRMqcB2xbFUiu9ytC0w1Wz2niq0Ri1WshYt8PRm_EdKcLnSgvO0B9rU1wmHOsoBsW2t8VyeEEya8h0r1rsnUuLvGmjA2Vm9zkoMvxtTxSgoajFeb9FOikqIPWinmTS7fxRvfGnO4pulRfpEixvA3bzAPQHHBJ4viy&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;400&quot; data-original-width=&quot;788&quot; height=&quot;144&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjLon3sezGovLlS4Q72mf_KdiKHRMqcB2xbFUiu9ytC0w1Wz2niq0Ri1WshYt8PRm_EdKcLnSgvO0B9rU1wmHOsoBsW2t8VyeEEya8h0r1rsnUuLvGmjA2Vm9zkoMvxtTxSgoajFeb9FOikqIPWinmTS7fxRvfGnO4pulRfpEixvA3bzAPQHHBJ4viy=w285-h144&quot; width=&quot;285&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://www.haivision.com/blog/all/srt-everything-you-need-to-know-about-the-secure-reliable-transport-protocol/#:~:text=Products%20%26%20Solutions%20Inc.-,Who%20Uses%20SRT%3F,Microsoft%2C%20to%20name%20a%20few.&quot;&gt;(source)&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The protocol makes use of UDP for the transmission of control and data packets and includes feedback for retransmissions under packet loss.&amp;nbsp; The protocol syntax is based on a previously existing protocol for file transfer called ULP and has different modes to enable use cases from reliable file transfer to low latency streaming.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;RIST&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://www.videoservicesforum.org/RIST.shtml&quot;&gt;RIST (Reliable Internet Stream Transport)&lt;/a&gt; is a protocol similar to SRT in terms of features and motivations.&amp;nbsp; &amp;nbsp; It was developed to increase the reliability against packet losses and the security included in SRT as well as to support higher bitrate streams.&lt;/p&gt;&lt;p&gt;This protocol is also transported over UDP although in this case it uses RTP instead of inventing a new protocol for that. It includes feedback for retransmissions under packet loss.&lt;/p&gt;&lt;p&gt;It is a slightly better protocol that reuses some existing protocols but so far it had lower adoption than SRT.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;WebRTC&lt;/h3&gt;&lt;p&gt;WebRTC is a project that was designed for videoconferencing use cases but that has seen also some adoption for streaming applications.&amp;nbsp; &amp;nbsp;Its real time nature makes it suitable for use cases where ultra low&amp;nbsp; latency is more important than getting the highest possible quality and also the native support in browsers makes it very simple to integrate for applications.&amp;nbsp; &amp;nbsp; Different streaming services use it in different degrees like for example Youtube Studio or StreamYard.&lt;/p&gt;&lt;p&gt;The protocol doesn&#39;t define the signalling/control plane and that&#39;s left to each application although recently a new specification (&lt;a href=&quot;https://datatracker.ietf.org/doc/draft-ietf-wish-whip/&quot;&gt;WHIP&lt;/a&gt;) has defined a very simple HTTP signalling protocol for basic ingestion use cases.&amp;nbsp; &amp;nbsp; The protocol does define the media plane that is composed of different layers for connectivity (ICE protocol), encryption (DTLS&amp;amp;SRTP protocols) and media itself (RTP&amp;amp;RTP procols).&amp;nbsp; &amp;nbsp;That makes it a complex protocol even if it is mostly a composition of protocols existing for many years.&amp;nbsp; &amp;nbsp; It includes feedback mechanisms for retransmissions and bandwidth estimation as well as many other extensions for FEC or buffers control.&lt;/p&gt;&lt;p&gt;The WebRTC protocol stack can be used also for playback if needed although in many cases the applications still rely on traditional protocols for playback to prioritise reachability and quality over the lowest possible latency.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;FLT&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://hayden.fyi/posts/2020-08-03-Faster-Than-Light-protocol-engineering-notes.html&quot;&gt;FLT (Faster than Light Protocol)&lt;/a&gt; is a protocol designed to provide a very low latency replacement for RTMP.&amp;nbsp; &amp;nbsp;The protocol was designed for Microsoft Mixer service and many applications and services implemented it although it is mostly unused with the shutdown of Mixer.&lt;/p&gt;&lt;p&gt;The protocol was making use of UDP and RTP to provide ultra low latency in a way similar to WebRTC but without the ICE and DTLS parts and it includes a control protocol over TCP to establish and negotiate the media connection.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;HTTP ingestion (HLS, DASH...)&lt;/h3&gt;&lt;p&gt;HTTP ingestion consist on reusing the protocols that are mostly used for media delivery (HLS, DASH...) but can also be used for media ingestion.&amp;nbsp; &amp;nbsp;The most popular of these protocols is probably HLS (HTTP Live Streaming) and it is supported by&amp;nbsp;Akamai or Youtube Live in addition to RTMP for ingestion.&lt;/p&gt;&lt;p&gt;These protocols use HTTP as transport to send the media segments encoding pieces of audio+video of a small number of seconds duration and also to send the playlists with the metadata and the references to those segments.&amp;nbsp; They make use of the delivery and encryption mechanisms of HTTP and doesn&#39;t include any specific feedback mechanism to adapt the ingestion to the network conditions beyond controlling latencies and buffers.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Next generation protocols&lt;/h2&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;RUSH&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://www.ietf.org/archive/id/draft-kpugin-rush-00.html&quot;&gt;RUSH (Reliable (unreliable) streaming protocol)&lt;/a&gt; is a bidirectional media protocol designed by Facebook as a replacement for RTMP with the goal to provide support for new audio and video codecs, extensibility ini the form of new message types, and multi-track support.&amp;nbsp; &amp;nbsp;This protocol is only used by Facebook at this point both for ingestion and for media distribution inside their network.&lt;/p&gt;&lt;p&gt;The RUSH protocol is based on two core ideas:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Use QUIC as the transport protocol.&amp;nbsp; The QUIC protocol, built on UDP, serves as the foundation for HTTP/3 and offers robust security measures in addition to affording granular control over packet priorities and reliability.&lt;/li&gt;&lt;li&gt;Use a different QUIC stream for each video frame so that they can be prioritized independently in case of congestion based on the latency and the importance of each frame.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The specification includes a control protocol and the media protocol both running on top of a single QUIC connection.&amp;nbsp; &amp;nbsp;The messages have a binary encoding and include fields similar to the ones in RTP.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;WARP&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://www.ietf.org/id/draft-lcurley-warp-03.html&quot;&gt;WARP (Live media transport over QUIC)&lt;/a&gt; protocol is also a bidirectional protocol but in this case designed by Twitch as a replacement for RTMP for the ingestion but also for existing playback protocols like HLS.&amp;nbsp; &amp;nbsp; Twitch is already using it for the distribution of media chunks in their backbone network.&lt;/p&gt;&lt;p&gt;The ideas behind this protocol are similar to the ones in RUSH with a configurable latency vs quality trade-off.&amp;nbsp; The main difference is that the unit of transmission is not a frame but a segment.&amp;nbsp; A segment is a group of encoded frames packages in a MP4 container.&amp;nbsp; &amp;nbsp;Another difference is that WARP is defined on top of WebTransport instead of just QUIC (WebTransport is a thin layer over QUIC intended for web browsers support)&lt;/p&gt;&lt;p&gt;The specification includes a control protocol and the media protocol both running on top of a single QUIC connection.&amp;nbsp; &amp;nbsp;All the messages (control and media) includes a type-length encoded binary header that should allow any intermediaries in the distribution pipeline to prioritise and filter messages based on their content.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The protocol can also be used for playback and the use of segments makes it very simple to do the conversion to other segment-based protocol like HLS if needed.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Conclussions&lt;/h3&gt;&lt;p&gt;After many years where most of the ingestion has been happening with RTMP there is finally some alternatives getting enough traction.&amp;nbsp; &amp;nbsp; &amp;nbsp;WebRTC and SRT where the first ones and have already been adopted for many use cases while the new protocols designed over QUIC (RUSH, WARP or QUICR) are likely to be widely deployed in the next years.&lt;/p&gt;&lt;p&gt;The use of one protocol over the others depends mostly on two factors:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Support and interoperability.&amp;nbsp; &amp;nbsp;The most widely supported protocol is still RTMP and some streaming equipment only support that protocol or the newer SRT/RIST protocols.&amp;nbsp; &amp;nbsp; &amp;nbsp;However, if we ignore the new QUIC protocols, most of these protocols are already supported in the widely used opensource OBS streaming client.&lt;/li&gt;&lt;li&gt;Latency vs quality trade-off.&amp;nbsp; &amp;nbsp;Depending on the use case it is possible to select a protocol that is better suited for ultra low latency (like WebRTC) or when that is not strictly required other protocol can be selected that can provide the highest possible quality (like HLS).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;As a final note this is the result of the &lt;a href=&quot;https://www.wowza.com/blog/rtmp-streaming-real-time-messaging-protocol&quot;&gt;wowza report&lt;/a&gt;&amp;nbsp;on protocols being used by for ingestion:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgUkaoX0yOrQNvs740b_HUjc6sZVvX1aB8Q73EcCdhyKVnha970XU8Kef3Lq0VYcdgB40VZq8QPC1uB0Ey95_zRJ5YtxC0jKT6am72BUGbZA_sQqbIguEzJkecqnyKMjTPrJE-ldnU9baIY4vS538E9et_W-_dXraSRhIpfMBX8RVV5zR10Ir1ywGpx&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;475&quot; data-original-width=&quot;721&quot; height=&quot;264&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgUkaoX0yOrQNvs740b_HUjc6sZVvX1aB8Q73EcCdhyKVnha970XU8Kef3Lq0VYcdgB40VZq8QPC1uB0Ey95_zRJ5YtxC0jKT6am72BUGbZA_sQqbIguEzJkecqnyKMjTPrJE-ldnU9baIY4vS538E9et_W-_dXraSRhIpfMBX8RVV5zR10Ir1ywGpx=w400-h264&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/1575395795804669611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2023/02/media-ingestion-protocols.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/1575395795804669611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/1575395795804669611'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2023/02/media-ingestion-protocols.html' title='Media Ingestion protocols Review'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfDxbGjKiL2tXkMxIhvGTnnTeR_479PuhNW1CLuMTKfpStihyvUVTcqIUunM-v-Z0vVTxojbs4PZsMR7fB9bB5BzsxK2QEOSMWKZS-AAdRcn1YI3fDSnHfZiWF-U4hMondXW6Nqd9eop-Geuw1oxRPaoJOwRYW-aIKtW7tUzAZXYmoVVYbuNiOMMR-/s72-w640-h114-c/Screenshot%202023-02-18%20at%2010.42.54.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-4842964610459900856</id><published>2022-10-04T11:05:00.004-07:00</published><updated>2022-10-05T06:49:27.823-07:00</updated><title type='text'>Different types of latency measurements in WebRTC </title><content type='html'>&lt;p&gt;When building WebRTC services one of the most important metrics to measure the user experience is the latency of the communications.&amp;nbsp; &amp;nbsp; The latency is important because it has an impact on the conversational interactivity but also on video quality when using retransmissions (that is the most common case) because the effectiveness of retransmissions depend on how fast you get them.&lt;/p&gt;&lt;p&gt;And to be fair at the end of the day latency is what differentiates Real Time Communications from other types of communications and protocols like the ones used for streaming use cases that are less sensitive to delays, so it is clear that latency is an important metric to track.&lt;/p&gt;&lt;p&gt;However there is no single measurement of latency and different platforms, APIs and people usually measure different types of latency.&amp;nbsp; &amp;nbsp;From what I&#39;ve seen in the past we can see differences in these four axis described below.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;One Hop latency vs End to End latency&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;When there are multiple servers involved in a conversation the native WebRTC stats only provides information about the latency in the first hop (from the client to the server).&amp;nbsp; &amp;nbsp;That doesn&#39;t give you the full picture and usually what you prefer is to measure the end to end delay including the latency from the first client to the first server, then from each server to the next one and finally from the last server to the other client.&lt;/p&gt;&lt;p&gt;This can be seen in this great diagram from webrtchacks.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhWdJoNnQqnDZPj0pPT9A8jSIZkQNvaqyf24xwVzCkp_P4Wd2YrFDrXWkX9ek3nQjcNht1l4-YAQXwrVHWmdsmc2FIZwPcIveAHqMS2TmfJdZui2gXgGYNZhmBwz854BFuMyIpbjgzED-uEtc5Fa6DqC70ZqI2MX_x_dr7eoAQhuPcHZvTVr0AKYZ3Q&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;177&quot; data-original-width=&quot;960&quot; height=&quot;118&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhWdJoNnQqnDZPj0pPT9A8jSIZkQNvaqyf24xwVzCkp_P4Wd2YrFDrXWkX9ek3nQjcNht1l4-YAQXwrVHWmdsmc2FIZwPcIveAHqMS2TmfJdZui2gXgGYNZhmBwz854BFuMyIpbjgzED-uEtc5Fa6DqC70ZqI2MX_x_dr7eoAQhuPcHZvTVr0AKYZ3Q=w640-h118&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Mesuring the End-to-End latency is much harder as it is not provided automatically by WebRTC stacks and requires some additional ping-pong messages to be sent (f.e. using datachannels) or a mechanism relaying in synchronized clocks that it is not very practical.&lt;div&gt;&lt;br /&gt;&lt;div&gt;One alternative way to measure it is to measure the latency of each hop and then aggregate the averages per source and destination regions.&amp;nbsp; &amp;nbsp;This doesn&#39;t give you the same thing but it can be an approximation and good enough to detect issues in specific regions.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Real Users latency vs Synthetic Traffic latency&lt;/h2&gt;&lt;p&gt;Some people use synthetic tests to measure the latency provided by their platform.&amp;nbsp; That&#39;s great for alerting purposes but doesn&#39;t give you the full picture of how users are experiencing your service.&amp;nbsp; &amp;nbsp; For example maybe there is one specific region from where users are experiencing high latencies but you don&#39;t have your test clients probing your platform from that very specific region.&lt;/p&gt;&lt;p&gt;When measuring latency for real users you typically have to use the WebRTC getStats API or some datachannels ping-pong messaging but when using synthetic traffic you have more freedom to use special custom RTP packets or a video source with a timestamp watermark.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Network latency or Capture-to-Render latency&lt;/h2&gt;&lt;p&gt;When measuring the latency typically you measure the delay of the packets in the network but that&#39;s not the whole latency that a user will experience for his voice and video.&amp;nbsp; Apart from that network latency there are also delays introduced by the software doing the capture and rendering.&amp;nbsp; This is specially relevant in case of the buffers used in the receiver side to mitigate network issues like jitter, packet loss or packet reordering.&lt;/p&gt;&lt;p&gt;To measure the whole latency including the delays introduced in the capturing and rendering sides you can include in your calculations some additional metrics provided by the WebRTC getStats API like the &lt;a href=&quot;https://www.w3.org/TR/webrtc-stats/#dom-rtcmediastreamtrackstats-jitterbufferdelay&quot;&gt;jitterBufferDelay&lt;/a&gt;, &lt;a href=&quot;https://www.w3.org/TR/webrtc-stats/#dom-rtcaudioplayoutstats-totalplayoutdelay&quot;&gt;playoutDelay&lt;/a&gt;, &lt;a href=&quot;https://www.w3.org/TR/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalpacketsenddelay&quot;&gt;packetSendDelay&lt;/a&gt;...&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Round Trip Time or One Way delay&lt;/h2&gt;Another small difference is if the latency is measured as round trip time latency (the sum of both directions A-&amp;gt;B + B-&amp;gt;A) or just one of the ways independently.&amp;nbsp; &amp;nbsp; In most of the cases what is measured is the round trip time and then just divided by two as a good estimation of the one way delay.&lt;h2 style=&quot;text-align: left;&quot;&gt;Conclussions&lt;/h2&gt;&lt;p&gt;As a summary, next time you provide numbers on the latency of your WebRTC solution please explain what type of latency you are measuring and how are you measuring to make it more clear 🙏.&amp;nbsp;&lt;/p&gt;&lt;p&gt;If you can you should probably try to measure the end-to-end delay but even the hop-by-hop latency is very relevant for monitoring and troubleshooting.&amp;nbsp; If you have enough traffic it is possible that real users latency is what you want to measure, but if you don&#39;t have enough users or you want to have some more data then using synthetic tests to estimate the latencies is also a good approach.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/4842964610459900856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2022/10/different-types-of-latency-measurements.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/4842964610459900856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/4842964610459900856'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2022/10/different-types-of-latency-measurements.html' title='Different types of latency measurements in WebRTC '/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhWdJoNnQqnDZPj0pPT9A8jSIZkQNvaqyf24xwVzCkp_P4Wd2YrFDrXWkX9ek3nQjcNht1l4-YAQXwrVHWmdsmc2FIZwPcIveAHqMS2TmfJdZui2gXgGYNZhmBwz854BFuMyIpbjgzED-uEtc5Fa6DqC70ZqI2MX_x_dr7eoAQhuPcHZvTVr0AKYZ3Q=s72-w640-h118-c" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-7427471515859696772</id><published>2022-08-15T02:57:00.004-07:00</published><updated>2022-08-16T04:56:51.663-07:00</updated><title type='text'>Screensharing content detection</title><content type='html'>&lt;p&gt;&lt;br /&gt;One interesting feature in WebRTC is the ability to configure a content hint for the media tracks so that WebRTC can optimize the transmission for that specific type of content.&amp;nbsp; &amp;nbsp;That way if the content hint is &quot;text&quot; it will try to optimize the transmission for readability and if the content hint is &quot;motion&quot; it will try to optimize the transmission for fluidity even if that means reducing the resolution or the definition of the video.&lt;/p&gt;&lt;p&gt;This is specially useful when sharing documents or slides where the &quot;crispiness&quot; of the text is very important for the user experience.&amp;nbsp; &amp;nbsp;You can see the impact of those hints in the video encoding in this screenshot taken from the W3C spec:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnaI2mQZOo9C-jwarYA9hlVnm183Qqahpte3IUcT1HBDqDUuA89lKty1Y1p_thqWkXMq2paEhNH8eOdyNDgJWEhKh2pur-KaFdJDatBjywQ4-UJVcvr8Om8QyXM1b6QUlywUJNXJeOq-lNGZCtCqHFzjvD7UGtfPD7Q04BzRduDZn3g74dTiu--Th2/s672/lorem-ipsum.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;100&quot; data-original-width=&quot;672&quot; height=&quot;96&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnaI2mQZOo9C-jwarYA9hlVnm183Qqahpte3IUcT1HBDqDUuA89lKty1Y1p_thqWkXMq2paEhNH8eOdyNDgJWEhKh2pur-KaFdJDatBjywQ4-UJVcvr8Om8QyXM1b6QUlywUJNXJeOq-lNGZCtCqHFzjvD7UGtfPD7Q04BzRduDZn3g74dTiu--Th2/w640-h96/lorem-ipsum.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;This is very useful but there is a small problem.&amp;nbsp; What happens when we don&#39;t know the type of content being shared?&amp;nbsp; How do we know if the browser tab being shared has some static text slides or a youtube video being played?&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;One possible option could be to do some type of image processing to detect the type of content in the video frames and check for text content.&amp;nbsp; That&#39;s possible doable and not that expensive if run only once every few seconds.&amp;nbsp; &amp;nbsp;But right now I was more interested on using existing WebRTC statistics as a proxy to detect the type of content so I tried a couple of approaches along those lines.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The other motivation to do this kind of detection could be for analytics purposes to understand better how users are interacting with the product and make further changes in the application to optimize it for those use cases.&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Simplest approach&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The idea is that when you are sending static content (slides) WebRTC notices that the frame didn&#39;t change from the previous one and skips sending a new one so it ends up sending ~1 frame per second only.&lt;br /&gt;&lt;br /&gt;With this approach just checking the framerate sent using the getStats() API we could have a high level of confidence on the content is static.&amp;nbsp; &amp;nbsp;For example, we could use a threshold of 2-3 fps to differentiate static and dynamic content.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Special cases:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;You are sending a low framerate because the available bandwidth is too low and not because the content is static.&amp;nbsp; &amp;nbsp;I don&#39;t think libwebrtc will send such a low framerate in that case but anyway we can differentiate this case by checking the &quot;availableOutgoingBitrate&quot; and/or &quot;qualityLimitationReason&quot; the WebRTC stats.&lt;/li&gt;&lt;li&gt;When you move the cursor over the slides, or your slides have a small animated logo in one corner or you are sharing a text editor but you have a small blinking cursor.&amp;nbsp; &amp;nbsp;In those cases this approach won&#39;t work because the framerate sent will be high.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Elaborated approach&lt;/h2&gt;&lt;p&gt;The idea is that when you are sending static images you can send a higher quality with less number of bits because the image doesn&#39;t change from one frame to the next one so it needs fewer pixels to be encoded.&lt;/p&gt;&lt;p&gt;We can use the framerate, qp (quantization parameter), and resolution statistics from WebRTC and calculate a number that intuitively shows Quality / BitsUsedPerPixel.&amp;nbsp;&lt;/p&gt;&lt;p&gt;You can see the implementation in this jsfiddle: https://jsfiddle.net/zb8w4nd5/3/&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I tested both approaches using a document with two slides, one static with text and one image and one with a youtube video embedded.&amp;nbsp; &amp;nbsp;The results are shown in the next graph.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6xyY3ZvDzkvMz1JckTeU76Rz8qNQRD1Wu69hC9rnkW_GBuN4ge_qTBJf-qWkeDLyiAvzAQNq3ppwgBJQnBcZvFz8LbLe9YmwmBC4kD56cooceyM76vJmI1jW4BZf0Cg0mJrnAUP_Cv27-NQ4FIp-HO31MSRCKtUkJIrhl7lu9l_9ZzUg53yMllABi/s1648/Screenshot%202022-08-13%20at%2012.53.01.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6xyY3ZvDzkvMz1JckTeU76Rz8qNQRD1Wu69hC9rnkW_GBuN4ge_qTBJf-qWkeDLyiAvzAQNq3ppwgBJQnBcZvFz8LbLe9YmwmBC4kD56cooceyM76vJmI1jW4BZf0Cg0mJrnAUP_Cv27-NQ4FIp-HO31MSRCKtUkJIrhl7lu9l_9ZzUg53yMllABi/s1648/Screenshot%202022-08-13%20at%2012.53.01.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiahSkJfGDn3iXb9BYTZNsLJzTV4kcQJ85BqF5nGE7wm3X9bFoBrPLoa6BSzWVLNTVXhGJu4JW3MOb0xSYIJsFz2WVCUtoNVmNzXtp70Brr9UaoyKr6LhUbOsZ-YXJQABw5OC1_NheB-XKGCy-4QMzJObqeNGAQ243EUzlfhEOQ12P31N6M0CuHkNr0&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;776&quot; data-original-width=&quot;1602&quot; height=&quot;310&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiahSkJfGDn3iXb9BYTZNsLJzTV4kcQJ85BqF5nGE7wm3X9bFoBrPLoa6BSzWVLNTVXhGJu4JW3MOb0xSYIJsFz2WVCUtoNVmNzXtp70Brr9UaoyKr6LhUbOsZ-YXJQABw5OC1_NheB-XKGCy-4QMzJObqeNGAQ243EUzlfhEOQ12P31N6M0CuHkNr0=w640-h310&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;One thing we can see in the graph is that the framerate is a good proxy apart from when there is some &quot;artificial&quot; movement like the mouse cursor.&amp;nbsp; &amp;nbsp; In that sense, the Quality factor looks like an approach with fewer issues.&lt;/p&gt;As you can see in the graph after switching from the video slide to the text slide again it took a bit to recover in terms of quality.&amp;nbsp; &amp;nbsp;Combining both approaches and using the framerate in that case could make the detection faster.&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Additional considerations:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Probably is a good idea to ignore the first few seconds as it can take a bit to stabilize.&lt;/li&gt;&lt;li&gt;Add some hysteresis or window average to avoid detecting when switching slides or scrolling in a text document.&lt;/li&gt;&lt;li&gt;The Quality factor is assuming everything is linear and maybe other approaches (logarithmic, quadratic...) could have more accurate results.&lt;/li&gt;&lt;li&gt;I haven&#39;t used this in a real product yet, so take it just as a list of ideas to explore and not a finished reliable algorithm.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/7427471515859696772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2022/08/screensharing-content-detection.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/7427471515859696772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/7427471515859696772'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2022/08/screensharing-content-detection.html' title='Screensharing content detection'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnaI2mQZOo9C-jwarYA9hlVnm183Qqahpte3IUcT1HBDqDUuA89lKty1Y1p_thqWkXMq2paEhNH8eOdyNDgJWEhKh2pur-KaFdJDatBjywQ4-UJVcvr8Om8QyXM1b6QUlywUJNXJeOq-lNGZCtCqHFzjvD7UGtfPD7Q04BzRduDZn3g74dTiu--Th2/s72-w640-h96-c/lorem-ipsum.png" height="72" width="72"/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-7816676067410023996</id><published>2022-06-05T02:47:00.012-07:00</published><updated>2022-06-07T11:28:01.722-07:00</updated><title type='text'>New look at WebRTC usage in Google Meet</title><content type='html'>&lt;div style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span id=&quot;docs-internal-guid-1f779edf-7fff-ad0d-8c59-d6b6e1d26823&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;I hadn&#39;t looked at Google Meet webrtc internals for a while so while I was having a meeting last week I decided that it was a good time to check what were the latest changes that had been added.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;b id=&quot;docs-internal-guid-f716ff55-7fff-811b-1426-2a3a9e37bd96&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 18pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;&quot;&gt;P2P Connections&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;One of the first things that I checked was if Google Meet was using P2P connections when there are only two participants in the room and I was surprised that it was not the case. &amp;nbsp; P2P support was included in the past (&lt;/span&gt;&lt;a href=&quot;https://www.blogger.com/blog/post/edit/460321274846352896/7816676067410023996#&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;&quot;&gt;P2P-SFU transitions discussion&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;) but apparently has been removed.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;This increase the infrastructure cost (not an issue for Google) and increase a bit the end to end latency for the 1:1 calls but given that Google Meet is probably deployed in many points of presence that&#39;s probably not a big increase and the simplicity of not having to handle another type of connections and the transition between them (P2P &amp;lt;-&amp;gt; SFU) is a big benefit so it looks reasonable.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 4pt; margin-top: 18pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 17pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;&quot;&gt;ICE candidates and (NO) TURN servers&lt;/span&gt;&lt;/h2&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;Google Meet is not configuring any ICE servers anymore and their servers are providing candidates for both IPv4 and IPv6 and types: UDP (random port) + TCP (same random port as UDP) + UDP (3478 port) + SSLTCP (443 port).&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;This is the iceServers configuration that is empty as you can see:&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: &#39;Courier New&#39;; font-size: medium; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;https://meet.google.com/_meet/xxx-xxx-xxx, { iceServers: [], iceTransportPolicy: all, bundlePolicy: max-bundle, rtcpMuxPolicy: require, iceCandidatePoolSize: 0, sdpSemantics: &quot;unified-plan&quot;, extmapAllowMixed: true }, {advanced: [{googScreencastMinBitrate: {exact: 100}}]}&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;The fact that it doesn&#39;t use any TURN servers shouldn&#39;t be a huge issue given that the servers have support for SSLTCP and was seen also also in other apps in the past like Jitsi or Houseparty. &amp;nbsp; The main implications could be the lack of support in other browsers like firefox and some very strict proxies/firewalls blocking the pseudo-SSL connection used by SSLTCP.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 4pt; margin-top: 18pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 17pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;&quot;&gt;New RTP header extensions&lt;/span&gt;&lt;/h2&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;Google Meet has always used many header extensions and this time and saw two that I hadn&#39;t seen in the past.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;One header extension is related to the new AV1 video codec and used to provide scalability information that the server can use for selective filtering and forwarding of video layers.&amp;nbsp; It is interesting because AV1 is not used by Google Meet but maybe this is an indication of some work in progress or the support of the new codec in internal versions of the product.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;&lt;span style=&quot;background-color: white; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; font-size: medium;&quot;&gt;a=extmap:15 https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;(@murillo&amp;amp;@HCornflower mentioned in Twitter that even if this header extension was defined for AV1 it can also be used also for VP9 and that is apparently the case based on a quick test with a sniffer)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;The other header extension provides information about target bitrates, resolutions and framerates of the layers so that the server can use that information to decide which layer to forward instead of making those decissions based on the bitrate received like all the SFUs do today.&amp;nbsp; The advantage is that this value is more stable and reliable than the calculated one that can have temporal spikes depending on. the network and pacing implementation and even the content being sent.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #990000; font-family: &#39;Courier New&#39;; font-size: medium; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;a=extmap:12 http://www.webrtc.org/experiments/rtp-hdrext/video-layers-allocation00&lt;/span&gt;&lt;/p&gt;&lt;h2 dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt; padding: 6pt 0pt 4pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 18pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;&quot;&gt;Special RTP Control Messages (RTCP)&lt;/span&gt;&lt;/h2&gt;&lt;p dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt; padding: 8pt 0pt 12pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;There were a couple of RTCP features in the SDP negotiation that got my attention.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;The first one is a new RTCP message called RRTR.&amp;nbsp; Well, it is not really new as it was standardized a long time ago (&lt;/span&gt;&lt;a href=&quot;https://www.blogger.com/blog/post/edit/460321274846352896/7816676067410023996#&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;&quot;&gt;RFC3611&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;) but I haven&#39;t seen it used till now. &amp;nbsp; The purpose of the RRTR message and the corresponding to DLRR is to be able to calculate the round trip time for receiving streams in a similar way to how it is calculated for sending streams with SR and RR messages. &amp;nbsp; &amp;nbsp; Basically RRTR sends a timestamp and DLRR sends back the original timestamp plus the delay between RRTR and DLRR messages.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #a31515; font-family: &#39;Courier New&#39;; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;a=rtcp-fb:96 rrtr&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt; padding: 9pt 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;The other interesting thing is that Google Meet enables transport-cc RTCP messages to use audio packets also for bandwidth estimation and not only video packets like most of the platforms do. &amp;nbsp; This was problematic in the past but apparently it is safe enough now and in that case it looks like a very good idea to have it enabled.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt; padding: 3pt 0pt 12pt;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #990000; font-family: &#39;Courier New&#39;; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;a=rtpmap:111 opus/48000/2&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #990000; font-family: &#39;Courier New&#39;; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #990000; font-family: &#39;Courier New&#39;; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;a=rtcp-fb:111 transport-cc&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt; padding: 6pt 0pt 4pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 18pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;&quot;&gt;Video Encoding&lt;/span&gt;&lt;/h2&gt;&lt;p dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt; padding: 8pt 0pt 12pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;Google Meet uses VP9 with profile 0 although for some reason it falls back to VP8 whenever a Firefox browser joins the room. &amp;nbsp; One interesting thing about the video encoding is the attribute &quot;useadaptativelayering&quot; included in the SDP negotiation.&amp;nbsp; The attribute has been there for a while and there are two versions of it but there is nothing about it in the opensource version of Chromium/WebRTC and neither in the Chrome binary &lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;🤔&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;, so I would assume that is something only used in an old or custom version of libwebrc (mobile?).&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #990000; font-family: &#39;Courier New&#39;; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;a=fmtp:96 useadaptivelayering_v2=true; useadaptivelayering=true&lt;/span&gt;&lt;/p&gt;&lt;h2 dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt; padding: 18pt 0pt 4pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 18pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;&quot;&gt;Audio Encoding&lt;/span&gt;&lt;/h2&gt;&lt;p dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt; padding: 8pt 0pt 12pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;Google Meet is using opus as expected (with dtx and inbandfec enabled) but the most interesting part is that the usage of redundancy encoding (red) is also negotiated for the audio channels.&amp;nbsp; This encoding allows sending multiple copies of the same packet when needed, to provide better robustness against packet loss (&lt;a href=&quot;https://webrtchacks.com/red-improving-audio-quality-with-redundancy/&quot;&gt;detailed analysis of RED in WebRTCHacks&lt;/a&gt;).&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt; padding: 8pt 0pt 12pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; font-family: Arial; font-size: 12pt;&quot;&gt;But even if it is negotiated it is not really active for sending because it is included in the codecs list after opus. I also tested it introducing a 15% packet loss and checking the packets sent and received with a sniffer.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #990000; font-family: &#39;Courier New&#39;; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;a=rtpmap:111 opus/48000/2&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #990000; font-family: &#39;Courier New&#39;; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;a=fmtp:111 minptime=10; useinbandfec=1; stereo=0; sprop-stereo=0; usedtx=1&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #990000; font-family: &#39;Courier New&#39;; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #990000; font-family: &#39;Courier New&#39;; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;a=rtpmap:63 red/48000/2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt; padding: 18pt 0pt 4pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 18pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;&quot;&gt;Media Acquisition&lt;/span&gt;&lt;/h2&gt;&lt;p dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;The last thing I took a look at is at the configuration requested from the microphone and camera. &amp;nbsp; The most interesting thing I found was the fact that the framerate is limited to 24fps explicitly when the default is usually 30fps.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;background-color: white; line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: black; font-family: &#39;Courier New&#39;; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;Video constraints: {deviceId: {exact: [&quot;xxxxxxxxx&quot;]}, advanced: [{frameRate: {min: 24}}, {height: {min: 720}}, {width: {min: 1280}}, {frameRate: {max: 24}}, {width: {max: 1280}}, {height: {max: 720}}, {aspectRatio: {exact: 1.77778}}]}&lt;/span&gt;&lt;span style=&quot;background-color: white; color: black; font-family: &#39;Courier New&#39;; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.47273; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: white; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;There are other things that can be interesting from Google Meet like the usage of a single peer connection (apart from the extra one for the screen sharing), the creation of offers always from the browser side, the multiplexing of audio over 3 transceivers or the codec selection (VP9) but those has been like that for a while and there are other places where they have been discussed.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.47273; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;&lt;span style=&quot;background-color: white; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;What do you think? Any other interesting features that you found in Google Meet?&amp;nbsp; Feel free to share those here or &lt;/span&gt;&lt;a href=&quot;https://www.blogger.com/blog/post/edit/460321274846352896/7816676067410023996#&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;-webkit-text-decoration-skip: none; background-color: white; color: #1155cc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;&quot;&gt;in Twitter&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;background-color: white; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/7816676067410023996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2022/06/webrtc-google-meet.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/7816676067410023996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/7816676067410023996'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2022/06/webrtc-google-meet.html' title='New look at WebRTC usage in Google Meet'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-6124008224977720852</id><published>2022-01-30T07:48:00.004-08:00</published><updated>2022-01-31T01:49:42.094-08:00</updated><title type='text'>Handling back-pressure in RTC services</title><content type='html'>&lt;p style=&quot;background-color: white; box-sizing: border-box; color: rgba(0, 0, 0, 0.7); font-family: proximanova, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 1rem; line-height: 1.6; margin-bottom: 1rem; margin-top: 0px;&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;In the context of software, back-pressure refers to actions taken by systems to “push back” downstream forces. As such, it is a defensive action taken unilaterally while under duress or if the aggregate call pattern exhibits too many spikes, or is too bursty.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This approach is commonly used in microservices infrastructures but we don&#39;t talk too much about it in the context of Real-Time Communication platforms even if they can be equally important to handle spikes of load while keeping the quality of service inside some reasonable limits.&amp;nbsp; &amp;nbsp;During times of spikes or burstiness, the quality could be slightly degraded but it should still be usable and the servers should never go down.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The typical techniques to apply back-pressure and get some protection against those unsustainable patterns of traffic &lt;br /&gt;are buffering, dropping, and controlling the sender:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;Buffering&lt;/b&gt;: Messages can be queued and processed at a lower rate when needed to limit the impact of spikes or high load.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Dropping&lt;/b&gt;: Messages or even connections can be dropped when it is not possible to process them fast enough.&amp;nbsp; &amp;nbsp;This can be problematic in case there are retries from the clients as it could create a multiplicative effect making the problem even worse, so it has to be applied carefully.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Controlling the sender&lt;/b&gt;: The receiver can provide some feedback to the sender to limit the amount of traffic that it is sending to temporarily reduce the impact on the service quality.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjgeMslBpm2Tn1v9sPbG-rYCv7mSZZWbAbuE0Q0Be4HsDYITTZXHdorNAV3mkqgb3rncLwfAIgCCShkJhz3CQ3wIi8F8PCsHvMd-v-hyYisENjCVtNSK8x1zzjZlAUrtlHurJpi7rNzYYlOmgz75Jf9cjnwRxeLYGRFJcwpITqYCDWT79jCGaa6cxn2&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;304&quot; data-original-width=&quot;640&quot; height=&quot;304&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjgeMslBpm2Tn1v9sPbG-rYCv7mSZZWbAbuE0Q0Be4HsDYITTZXHdorNAV3mkqgb3rncLwfAIgCCShkJhz3CQ3wIi8F8PCsHvMd-v-hyYisENjCVtNSK8x1zzjZlAUrtlHurJpi7rNzYYlOmgz75Jf9cjnwRxeLYGRFJcwpITqYCDWT79jCGaa6cxn2=w640-h304&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;The next two sections present some ideas and implications of those techniques applied to the two planes that usually compose the RTC platforms (the signaling plane and the media plane).&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Signaling Plane&lt;/h2&gt;&lt;p&gt;Typically we use a websocket connection to send and receive messages related to session establishment and often also some type of presence and messaging.&amp;nbsp; &amp;nbsp;Given that it is a persistent TCP connection we already get some &lt;b&gt;buffering&lt;/b&gt;&amp;nbsp;for free as part of the operating system implementation that can handle some spikes in traffic.&amp;nbsp; &amp;nbsp;In addition to that buffering it is convenient to have a more strict buffering at connection and at room/session level to avoid a single room overloading the whole server in case of an unexpected surge in traffic in that room.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Dropping&lt;/b&gt; messages is not very common for the signaling plane and usually it is not an option given that we don&#39;t want to lose critical messages.&amp;nbsp; &amp;nbsp;But in some specific cases, it could be an option and reasonable like for example in the case of telemetry messages or sending cursor positions in a screen-sharing application.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Controlling the sender &lt;/b&gt;could be done explicitly (sending a feedback message to the client to suggest the client send fewer&amp;nbsp;messages by adding some batching or reducing the number of videos for example) or can be done implicitly by reading slower from the buffer so that the corresponding buffer in the client-side fills up too.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Media Plane&lt;/h2&gt;&lt;p&gt;When running media servers you get some &lt;b&gt;buffering&lt;/b&gt; by default as part of the OS sockets implementation.&amp;nbsp; The size of those buffers is something that you usually want to tune and gives you some flexibility to deal with spikes trading off delay for packet loss.&amp;nbsp; &amp;nbsp; &amp;nbsp;For traditional use cases you probably don&#39;t want to increase it much but for high bitrate use cases where a keyframe can be really big (f.e. Stadia-like use cases) it is likely that you need to do increase those buffers.&amp;nbsp; Those buffers are the first protection against small spikes but shouldn&#39;t be abused because they also increase the latency and jitter of media packets.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Dropping&lt;/b&gt; messages could be an option, but usually doesn&#39;t save that many resources once you have already read them also because that would trigger retransmissions (at least in case of video).&amp;nbsp; &amp;nbsp;So instead of dropping packets it is a better idea to disable the forwarding of specific video layers to reduce the amount of packets or in case of audio to enable dynamically dtx (discontinuous transmission) or to increase the packetization time.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Controlling the sender&lt;/b&gt; is probably the most common technique for the media plan.&amp;nbsp; The sender can be controlled&amp;nbsp; explicitly by configuring a lower sending bitrate when needed (for example using RTCP REMB messages) or can be done implicitly.&amp;nbsp; &amp;nbsp;In the later case, when the media servers start to get overloaded the the processing time of packets is less predictable and that introduces some jitter that as a consequence reduces the bandwidth estimation because jitter is a signal of congestion.&amp;nbsp; &amp;nbsp;This behaviour is something that happens automatically in most of the existing RTC solutions that include a bandwidth estimation algorithm based variability of packets delay like is &lt;a href=&quot;http://www.rtcbits.com/2017/01/bandwidth-estimation-in-webrtc-and-new.html&quot;&gt;the case of WebRTC&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Those were some of the techniques used in signaling and media servers that I&#39;m aware of.&amp;nbsp; What do you think? Any other ideas do you apply today to your platform?&amp;nbsp; Feel free to share those here or &lt;a href=&quot;https://www.twitter.com/anarchyco&quot;&gt;in Twitter&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/6124008224977720852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2022/01/back-pressure-in-rtc-services.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/6124008224977720852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/6124008224977720852'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2022/01/back-pressure-in-rtc-services.html' title='Handling back-pressure in RTC services'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEjgeMslBpm2Tn1v9sPbG-rYCv7mSZZWbAbuE0Q0Be4HsDYITTZXHdorNAV3mkqgb3rncLwfAIgCCShkJhz3CQ3wIi8F8PCsHvMd-v-hyYisENjCVtNSK8x1zzjZlAUrtlHurJpi7rNzYYlOmgz75Jf9cjnwRxeLYGRFJcwpITqYCDWT79jCGaa6cxn2=s72-w640-h304-c" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-1860582495226341828</id><published>2021-09-13T06:15:00.008-07:00</published><updated>2021-09-14T07:05:55.298-07:00</updated><title type='text'>The role of Real Time Communications in the Multiverse</title><content type='html'>&lt;div class=&quot;separator&quot;&gt;&lt;p style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span data-lucid-content=&quot;{&amp;quot;Objects&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;~JV5p.6heJjX&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;DefaultSquareBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:27,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:180,&amp;quot;y&amp;quot;:680,&amp;quot;w&amp;quot;:240,&amp;quot;h&amp;quot;:60},&amp;quot;FillColor&amp;quot;:&amp;quot;#ffffff00&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillCategory&amp;quot;:null,&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#00000000&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Metaverse&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;b&amp;quot;,&amp;quot;v&amp;quot;:true,&amp;quot;e&amp;quot;:9},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:9},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;fc&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;Bold&amp;quot;,&amp;quot;e&amp;quot;:9},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;fid&amp;quot;,&amp;quot;v&amp;quot;:5,&amp;quot;e&amp;quot;:9},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;v&amp;quot;:24.66666666666666,&amp;quot;e&amp;quot;:9}]},&amp;quot;Text_DynamicFontSize&amp;quot;:false,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;OJV5yG10e.oU&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;DefaultSquareBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:25,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:640,&amp;quot;y&amp;quot;:1015.4,&amp;quot;w&amp;quot;:240,&amp;quot;h&amp;quot;:69.19999999999999},&amp;quot;FillColor&amp;quot;:&amp;quot;#ffffff00&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillCategory&amp;quot;:null,&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#00000000&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Remote Comms (calls, meetings...)&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;b&amp;quot;,&amp;quot;v&amp;quot;:true,&amp;quot;e&amp;quot;:33},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:33},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;fc&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;Bold&amp;quot;,&amp;quot;e&amp;quot;:33},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;fid&amp;quot;,&amp;quot;v&amp;quot;:5,&amp;quot;e&amp;quot;:33},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;v&amp;quot;:24.66666666666666,&amp;quot;e&amp;quot;:33}]},&amp;quot;Text_DynamicFontSize&amp;quot;:false,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;FJV5mSmdp~Qq&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;DefaultSquareBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:24,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:380,&amp;quot;y&amp;quot;:1015.4,&amp;quot;w&amp;quot;:240,&amp;quot;h&amp;quot;:69.19999999999999},&amp;quot;FillColor&amp;quot;:&amp;quot;#ffffff00&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillCategory&amp;quot;:null,&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#00000000&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Face to Face Comms&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;b&amp;quot;,&amp;quot;v&amp;quot;:true,&amp;quot;e&amp;quot;:18},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:18},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;fc&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;Bold&amp;quot;,&amp;quot;e&amp;quot;:18},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;fid&amp;quot;,&amp;quot;v&amp;quot;:5,&amp;quot;e&amp;quot;:18},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;v&amp;quot;:24.66666666666666,&amp;quot;e&amp;quot;:18}]},&amp;quot;Text_DynamicFontSize&amp;quot;:false,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;1JV57M9xvzz4&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;DefaultSquareBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:26,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:180,&amp;quot;y&amp;quot;:860,&amp;quot;w&amp;quot;:240,&amp;quot;h&amp;quot;:60},&amp;quot;FillColor&amp;quot;:&amp;quot;#ffffff00&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillCategory&amp;quot;:null,&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#00000000&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Real World&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;b&amp;quot;,&amp;quot;v&amp;quot;:true,&amp;quot;e&amp;quot;:10},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:10},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;fc&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;Bold&amp;quot;,&amp;quot;e&amp;quot;:10},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;fid&amp;quot;,&amp;quot;v&amp;quot;:5,&amp;quot;e&amp;quot;:10},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;v&amp;quot;:24.66666666666666,&amp;quot;e&amp;quot;:10}]},&amp;quot;Text_DynamicFontSize&amp;quot;:false,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;8IV5wH~-LkjG&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;DefaultSquareBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:22,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:380,&amp;quot;y&amp;quot;:680,&amp;quot;w&amp;quot;:240,&amp;quot;h&amp;quot;:60},&amp;quot;FillColor&amp;quot;:&amp;quot;#ffffff00&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillCategory&amp;quot;:null,&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#00000000&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Digital&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:7},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;v&amp;quot;:26.888888888888882,&amp;quot;e&amp;quot;:7}]},&amp;quot;Text_DynamicFontSize&amp;quot;:false,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;XIV50.eZRXNc&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;DefaultSquareBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:20,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:640,&amp;quot;y&amp;quot;:680,&amp;quot;w&amp;quot;:240,&amp;quot;h&amp;quot;:60},&amp;quot;FillColor&amp;quot;:&amp;quot;#ffffff00&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillCategory&amp;quot;:null,&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#00000000&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Digital&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:7},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;v&amp;quot;:26.888888888888882,&amp;quot;e&amp;quot;:7}]},&amp;quot;Text_DynamicFontSize&amp;quot;:false,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;4IV5JYOshmZO&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;DefaultSquareBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:21,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:640,&amp;quot;y&amp;quot;:860,&amp;quot;w&amp;quot;:240,&amp;quot;h&amp;quot;:60},&amp;quot;FillColor&amp;quot;:&amp;quot;#ffffff00&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillCategory&amp;quot;:null,&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#00000000&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Digital&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:7},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;v&amp;quot;:26.888888888888882,&amp;quot;e&amp;quot;:7}]},&amp;quot;Text_DynamicFontSize&amp;quot;:false,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;aJV5_dmYfy8m&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;DefaultSquareBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:23,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:380,&amp;quot;y&amp;quot;:860,&amp;quot;w&amp;quot;:240,&amp;quot;h&amp;quot;:60},&amp;quot;FillColor&amp;quot;:&amp;quot;#ffffff00&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillCategory&amp;quot;:null,&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#00000000&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Natural&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;v&amp;quot;:26.888888888888882,&amp;quot;e&amp;quot;:7},{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:7}]},&amp;quot;Text_DynamicFontSize&amp;quot;:false,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;FKV544eYZVmw&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:28,&amp;quot;AutoLink&amp;quot;:false,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:null,&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:640,&amp;quot;y&amp;quot;:960,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:null,&amp;quot;Inside&amp;quot;:null,&amp;quot;LinkX&amp;quot;:null,&amp;quot;LinkY&amp;quot;:null,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:640,&amp;quot;y&amp;quot;:640,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:null,&amp;quot;Inside&amp;quot;:null,&amp;quot;LinkX&amp;quot;:null,&amp;quot;LinkY&amp;quot;:null,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;elbow&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}},{&amp;quot;id&amp;quot;:&amp;quot;qIV5gX6xzj_c&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:18,&amp;quot;AutoLink&amp;quot;:false,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:null,&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:400,&amp;quot;y&amp;quot;:800,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:null,&amp;quot;Inside&amp;quot;:null,&amp;quot;LinkX&amp;quot;:null,&amp;quot;LinkY&amp;quot;:null,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:880,&amp;quot;y&amp;quot;:800,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:null,&amp;quot;Inside&amp;quot;:null,&amp;quot;LinkX&amp;quot;:null,&amp;quot;LinkY&amp;quot;:null,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;elbow&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}}],&amp;quot;Base&amp;quot;:{&amp;quot;x&amp;quot;:530,&amp;quot;y&amp;quot;:866.8},&amp;quot;Page&amp;quot;:&amp;quot;0_0&amp;quot;,&amp;quot;Pages&amp;quot;:{},&amp;quot;Size&amp;quot;:{&amp;quot;w&amp;quot;:740,&amp;quot;h&amp;quot;:475.5999999999999},&amp;quot;Plugins&amp;quot;:[&amp;quot;/js/plugins/v2/default.js&amp;quot;],&amp;quot;Document&amp;quot;:&amp;quot;ac27d997-5095-4647-8d18-c8797a49ce55&amp;quot;,&amp;quot;Panel&amp;quot;:&amp;quot;!0_0&amp;quot;,&amp;quot;PanelOffset&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0},&amp;quot;BCUVersion&amp;quot;:61}&quot; data-lucid-type=&quot;application/vnd.lucid.chart.objects&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Recently many companies have been talking about something that they usually call &lt;i&gt;&lt;b&gt;the metaverse&lt;/b&gt;&lt;/i&gt;.&amp;nbsp; &amp;nbsp;There is no single clear definition of what the metaverse is but something like this sounds close enough: &quot;A highly connected environment with lots of interactive players and complex simulation creating rich experiences, something more than a game but less than the real world&quot; (&lt;span face=&quot;&amp;quot;GamesIndustry Sans&amp;quot;, sans-serif&quot; style=&quot;background-color: #fffff5; text-align: center;&quot;&gt;&lt;a href=&quot;https://www.gamesindustry.biz/articles/2021-08-20-what-is-the-metaverse-and-why-is-it-worth-so-much-money&quot; target=&quot;_blank&quot;&gt;What is the metaverse, and why is it worth so much money?&lt;/a&gt;&lt;/span&gt;)&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRjKq6OJ12RoQNJ2Vt_PrNCRZkHGY9CV8eqHk5gR6XfE683le_bMI5qobDa-986dYS38UWlaOcJt94vtpnJzhrLXbMHvCZgIyyGJSwK0Su5hkfRhplSe0unHNqeif94bQ4UxkPKNoXZNE/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;900&quot; data-original-width=&quot;1600&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRjKq6OJ12RoQNJ2Vt_PrNCRZkHGY9CV8eqHk5gR6XfE683le_bMI5qobDa-986dYS38UWlaOcJt94vtpnJzhrLXbMHvCZgIyyGJSwK0Su5hkfRhplSe0unHNqeif94bQ4UxkPKNoXZNE/&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;For me, the easiest way to understand it is to think about something similar to the world shown in the Ready Player One movie where users can interact with each other in a digital environment making use of virtual reality devices and sensors.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Perhaps the biggest company speaking publicly about the metaverse is Facebook and is betting hard on it saying that they want to move from being a &lt;a href=&quot;https://www.businessinsider.com/zuckerberg-said-facebook-will-eventually-become-a-metaverse-company-2021-7?r=US&amp;amp;IR=T&quot; target=&quot;_blank&quot;&gt;&quot;social company to a metaverse company&quot;&lt;/a&gt; but there are also many gaming companies working on that direction or at least talking about it.&amp;nbsp; In this &lt;a href=&quot;https://medium.com/building-the-metaverse/market-map-of-the-metaverse-8ae0cde89696&quot; target=&quot;_blank&quot;&gt;blog post&lt;/a&gt; we can find a nice representation of the market around this trend.&lt;/p&gt;&lt;p&gt;With that context in mind, I started to wonder what is the role of&amp;nbsp;Real-Time Communications (RTC) in this ecosystem or more precisely what are the differences or customizations that we could need to do to our existing RTC solutions to provide the features and quality needed for this futuristic metaverse vision.&amp;nbsp;&lt;/p&gt;&lt;p&gt;To try to frame the problem I started to think about this quadrant with two types of communications (those face to face and those with remote people) and two types of worlds where they can happen (the real and the virtual worlds).&amp;nbsp; &amp;nbsp; Given this classification, the ones that are more interesting or at least specific of the metaverse are the face-to-face communications in the virtual world.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4NUYxLf3bfWw__2Nj1R6NieeE_h1kVgrR8lJvX_uJh8aLSXdpMu5gUTYLM2bRKkXuOvwajqGNuV_ov0ffj7ovvG_6a4XsJPdbiqMJHtvzNO8YFvf69Q2hlBJNymZf6OTFhL45MKKCBRM/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;902&quot; data-original-width=&quot;1511&quot; height=&quot;191&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4NUYxLf3bfWw__2Nj1R6NieeE_h1kVgrR8lJvX_uJh8aLSXdpMu5gUTYLM2bRKkXuOvwajqGNuV_ov0ffj7ovvG_6a4XsJPdbiqMJHtvzNO8YFvf69Q2hlBJNymZf6OTFhL45MKKCBRM/&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;High-quality spatial audio&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;One obvious requirement will be the use of high-quality and spatial audio.&amp;nbsp; &amp;nbsp;To have an immersive experience in the metaverse the audio quality has to be crystal clear and the voice of the people needs to be heard coming from the place where they are supposed to be in the virtual space and with the volume corresponding to the attenuation due to the distance between user avatars in the virtual world.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0iZpGrzei8WD3f8FkGNDELrUPAr7XUCw5OxszmFSuiU6ez1SV82xuv1nrV-iCZFD3DMwakfgXVTratjFQ1p8xKk6CK3BBhAvqcRZR_bfP1PaoyMAlvPO18P0EBGqJQwwPvtV2ATTyqJE/&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;562&quot; data-original-width=&quot;1000&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0iZpGrzei8WD3f8FkGNDELrUPAr7XUCw5OxszmFSuiU6ez1SV82xuv1nrV-iCZFD3DMwakfgXVTratjFQ1p8xKk6CK3BBhAvqcRZR_bfP1PaoyMAlvPO18P0EBGqJQwwPvtV2ATTyqJE/&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;All the technology needed for this is already in place&lt;br /&gt; and there are many applications already doing something similar as you can see from simple apps like &lt;a href=&quot;https://heyhubbub.com/&quot;&gt;hubbub&lt;/a&gt; to fancy products like Google &lt;a href=&quot;https://www.engadget.com/google-project-starline-191228699.html?guccounter=1&amp;amp;guce_referrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8&amp;amp;guce_referrer_sig=AQAAAJtYprLiwTZkKdUD3sWB4AzYQ9AbE7HTFZ9Keu5jsehBmC1SLFpnum40D_ROKiy0aLQ8OAuARk75AuVP4l4kMh_f3psJxjv2n8pVfhuhYzjVw3wicw0CMnp6w-PM30mzmB8vIxruIArVWIJK6JmsOOoXVDvBsox7-ilweqiU7NiI&quot;&gt;Starline&lt;/a&gt;.&amp;nbsp; Some introduction to spatial audio can be found in this interesting presentation from Dolby: &lt;a href=&quot;https://www.youtube.com/watch?v=E2p_2g93xFQ&quot;&gt; Improving intelligibility with spatial audio&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Audio effects&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;The voice coming from participants also needs to be adapted to the environment where you are placed in the virtual space to sound realistic.&amp;nbsp; For example, if you are in a cave the reverberation and echo need to be different than if you are in an open space.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd4MxUWYeGslIroGcyzV8WoX0ozuqoMlnXqYMZLjJJ677Mt2eCJ44HF7z9URQ8qdPxgHKtVaMclwU3-fu9ZAlRlkBoXTBsHJpU-YWI3bHK-crm54KK4aAgA_wFq_4AspiitBoOJ-rWGoU/&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;343&quot; data-original-width=&quot;800&quot; height=&quot;137&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd4MxUWYeGslIroGcyzV8WoX0ozuqoMlnXqYMZLjJJ677Mt2eCJ44HF7z9URQ8qdPxgHKtVaMclwU3-fu9ZAlRlkBoXTBsHJpU-YWI3bHK-crm54KK4aAgA_wFq_4AspiitBoOJ-rWGoU/&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;In addition to that if you can impersonate or take different forms inside the metaverse (a robot, an animal...) it would be cool if some of those customizations also apply to your voice to change your appearance or just to &quot;improve&quot; your voice when you are tired or hoarse.&lt;p&gt;&lt;/p&gt;&lt;p&gt;For the former (adaptation to the space and conditions) those effects could be applied on the receiver side while the later (voice tunning) could be applied probably in the sender side.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Large scale routing infrastructure based on virtual locations&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;While being in the metaverse you are communicating with people around you instead of or not only with people in predefined rooms.&amp;nbsp; &amp;nbsp; That means that the architecture for audio routing has the following particularities:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Routing must be based on location instead of room identifiers.&lt;/li&gt;&lt;li&gt;Routing must be able to scale to a very large number of participants (imagine somebody singing/shouting in a concert venue or thousands of people talking at the same time in that venue).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;To address these requirements we need an architecture where the participants connect to a voice server close to their physical location to have as low latency as possible but the audio routing is based on the virtual location instead.&amp;nbsp; &amp;nbsp;So your server will subscribe to the audio of users with a virtual location (the geographical position in the metaverse) close to yours and when receiving the audio from those servers filter it (or even mix it) based on the distance between the source and the destination of the audio.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;In addition to the distance, there are other parameters (like the presence of walls in the middle) that need to be taken into consideration to decide what are the most relevant audio streams for a user so probably the voice servers need to get access to more information from the 3d world servers than just the location.&lt;/p&gt;&lt;p&gt;Given the tightly coupling required with the 3d environment and the low latency overlay already required &lt;b&gt;it is possible that we don&#39;t really need specific RTC servers&lt;/b&gt; but just to add some new capabilities to the existing gaming servers to properly route and filter audio packets in addition to other 3d interactions.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Video is secondary and replaced with the transmission of face features/expressions&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;My expectation would be that traditional video transmission will become less relevant and even marginal.&amp;nbsp; &amp;nbsp;It would be mostly replaced with very detailed face features extraction on the sender side combined with very realistic 3d rendering of faces on the receiver side.&amp;nbsp; &amp;nbsp;Something like super high-quality 3d animojis that will be even photorealistic for some use cases.&lt;br /&gt;&lt;br /&gt;The technology for that is almost there and you can see demos of videoconferencing doing this way from &lt;a href=&quot;https://blogs.nvidia.com/blog/2020/10/05/gan-video-conferencing-maxine/&quot;&gt;NVIDIA&lt;/a&gt;&amp;nbsp;and amazing digital humans in &lt;a href=&quot;https://www.unrealengine.com/en-US/digital-humans&quot;&gt;this Epic product&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrBFBjinoD3u78JpUWOBeeBGENqLPAkjU5UOzwwVqFs4Zfd4SS7SLwEbu9eCkiaWOv3Y0aEAgoGYg7M5I2hbpEKT8QdPg2QzhcAJL46wzgPxf_Ived1efRnjxOY5ezvG0ANLsfKXR-RiU/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;630&quot; data-original-width=&quot;1200&quot; height=&quot;168&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrBFBjinoD3u78JpUWOBeeBGENqLPAkjU5UOzwwVqFs4Zfd4SS7SLwEbu9eCkiaWOv3Y0aEAgoGYg7M5I2hbpEKT8QdPg2QzhcAJL46wzgPxf_Ived1efRnjxOY5ezvG0ANLsfKXR-RiU/&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Could this apply also to voice so that instead of sending our voice we only need to send its &quot;features&quot;?&amp;nbsp; We have already seen some codecs like &lt;a href=&quot;https://www.youtube.com/watch?v=7CCGTwmGl6M&quot;&gt;Lira&lt;/a&gt; going this way to try to reduce the bandwidth consumption and maybe that&#39;s what the future looks like in terms of audio codecs but I am not an expert and don&#39;t have a clear opinion about it.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Arbitrary data channels are already in place&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;A third dimension of RTC apart from audio and video is sometimes data (for example in the case of WebRTC that&#39;s provided by DataChannels).&amp;nbsp; In the case of the metaverse by definition, it needs to have very low latency and high scale messaging overlay to distribute and synchronize the state of the world so I don&#39;t expect any need for data capabilities in the RTC layers.&amp;nbsp;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Other features&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;Some standard requirements like captioning for accessibility or even recording could also apply (hopefully we don&#39;t end up in a metaverse where everything is recorded) but don&#39;t look like they have different challenges than today.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Wrapping-up&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;It is clear that the metaverse vision is coming one way or another and looks like one of the critical components will be the Real-Time Communications and specifically the voice communications support.&amp;nbsp; &amp;nbsp;Our current solutions for RTC need to evolve and go to the next level especially in terms of audio manipulation (effects and adaptation to the 3d environment) and large-scale architectures while it is possible video communications will be less relevant in these metaverse use cases.&lt;br /&gt;&lt;br /&gt;&lt;i style=&quot;background-color: white; color: #444444; font-family: Roboto, sans-serif; font-size: 15px;&quot;&gt;&lt;span face=&quot;Roboto, sans-serif&quot;&gt;And as usual feedback is more than welcomed either here or&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://twitter.com/anarchyco&quot; style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #2196f3; text-decoration-line: none;&quot;&gt;in Twitter&lt;/a&gt;&lt;span face=&quot;Roboto, sans-serif&quot;&gt;.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/1860582495226341828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2021/09/real-time-communications-metaverse.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/1860582495226341828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/1860582495226341828'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2021/09/real-time-communications-metaverse.html' title='The role of Real Time Communications in the Multiverse'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRjKq6OJ12RoQNJ2Vt_PrNCRZkHGY9CV8eqHk5gR6XfE683le_bMI5qobDa-986dYS38UWlaOcJt94vtpnJzhrLXbMHvCZgIyyGJSwK0Su5hkfRhplSe0unHNqeif94bQ4UxkPKNoXZNE/s72-c" height="72" width="72"/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-1447126812316647064</id><published>2021-02-04T00:55:00.019-08:00</published><updated>2021-02-04T02:24:55.434-08:00</updated><title type='text'>WebRTC Video Codecs performance evaluation</title><content type='html'>&lt;div class=&quot;separator&quot;&gt;&lt;/div&gt;&lt;p&gt;The standard and most popular codecs in WebRTC are VP8 and H.264 but those are not the only options we have.&amp;nbsp; &amp;nbsp;VP9 has been available for a while and some&amp;nbsp;&lt;a href=&quot;https://bloggeek.me/vp9-codec/?utm_source=rss&amp;amp;utm_medium=rss&amp;amp;utm_campaign=vp9-codec&quot;&gt;big services are using it&lt;/a&gt;&amp;nbsp;and&amp;nbsp;AV1 support has been &lt;a href=&quot;https://www.chromestatus.com/feature/6206321818861568&quot;&gt;recently added to Chrome&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;When comparing codecs there are interesting considerations like interoperability and licensing but probably the most important factors are how good the codec is in terms of compression and how cheap the codec is in terms of cpu&amp;amp;memory usage.&lt;/p&gt;&lt;p&gt;The compression ratio is usually the first thing we look at and there are many comparisons available for that, but the resource consumption is equally important if we want to be able to use the codecs for real time use cases.&lt;/p&gt;&lt;p&gt;Given that AV1 is available in the Chrome Canary versions I decided to run some tests to get estimation of where we stand in terms of cpu usage for the 4 available codecs in WebRTC ecosystem.&amp;nbsp; &amp;nbsp;The idea of the test is to compare the whole video pipeline with those 4 codecs and not just the codecs in isolation.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Testing environment&lt;/h4&gt;&lt;p&gt;The tests were done with a simple web page establishing a connection between 2 PeerConnections (one sending and the other receiving).&amp;nbsp; The test page is here in case you want to run the tests yourself:&lt;/p&gt;&lt;p&gt;https://jsfiddle.net/tvo7czxs/&lt;/p&gt;&lt;p&gt;The tests with that page were performed changing 3 variables:&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Codec: VP8, VP9, H264, AV1&lt;/li&gt;&lt;li&gt;Resolution: HD, VGA, QVGA&lt;/li&gt;&lt;li&gt;Bitrate: 200Kbps, 800Kbps, 2Mbps&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;If you look at the test page it is easy to change those 3 parameters to run the tests with other configurations or in other devices.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Chrome version used was the latest one synced from git this week (1/2/21) and the tests were ran in a MacBook Pro (2.4 GHz 8-Core Intel Core i9).&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To check the CPU usage I just looked at the average CPU consumed by the Chrome process in the system Activity Monitor after waiting 30 seconds to give time for the stabilisation of bandwidth estimation and resolution/framerate adaption inside WebRTC.&amp;nbsp; When the results below say 100% that means 1 full core of the machine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nothing too fancy but hopefully easy enough to understand.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;In that environment I ran the 36 combinations of the parameters a couple of times, averaged the results and summarised them in the following sections:&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;QVGA results&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;For QVGA resolution the results were as expected, with VP9 requiring a bit more CPU than VP8 and AV1 requiring almost 2x CPU as VP8.&amp;nbsp; &amp;nbsp;H.264 was the one requiring less CPU usage as it is using hardware acceleration for that.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;google-sheets-html-origin&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;&quot;&gt;&lt;img height=&quot;214&quot; src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAALmCAYAAABSJm0fAAAgAElEQVR4XuzdB9wcReH/8QmBNAihq/QiAYKACQFBuhhAem8SqoBBpHdQQUEIqCgIAUMXQhWQYiDSFFApCUWKhJLQIqGEEiABQvJ/fdf/3G+eeXZvd+9u77Z85vV6XpDn9nZn37O3z+73ZmZ7zJkzZ46hIIAAAggggAACCCCAAAIIIIAAAgggkFOBHgRYOW0ZqoUAAggggAACCCCAAAIIIIAAAgggEAgQYHEgIIAAAggggAACCCCAAAIIIIAAAgjkWoAAK9fNQ+UQQAABBBBAAAEEEEAAAQQQQAABBAiwOAYQQAABBBBAAAEEEEAAAQQQQAABBHItQICV6+ahcggggAACCCCAAAIIIIAAAggggAACBFgcAwgggAACCCCAAAIIIIAAAggggAACuRYgwMp181A5BBBAAAEEEEAAAQQQQAABBBBAAAECLI4BBBBAAAEEEEAAAQQQQAABBBBAAIFcCxBg5bp5qBwCCCCAAAIIIIAAAggggAACCCCAAAEWxwACCCCAAAIIIIAAAggggAACCCCAQK4FCLBy3TxUDgEEEEAAAQQQQAABBBBAAAEEEECAAItjAAEEEEAAAQQQQAABBBBAAAEEEEAg1wIEWLluHiqHAAIIIIAAAggggAACCCCAAAIIIECAxTGAAAIIIIAAAggggAACCCCAAAIIIJBrAQKsXDcPlUMAAQQQQAABBBBAAAEEEEAAAQQQIMDiGEAAAQQQQAABBBBAAAEEEEAAAQQQyLUAAVaum4fKIYAAAggggAACCCCAAAIIIIAAAggQYHEMIIAAAggggAACCCCAAAIIIIAAAgjkWoAAK9fNQ+UQQAABBBBAAAEEEEAAAQQQQAABBAiwOAYQQAABBBBAAAEEEEAAAQQQQAABBHItQICV6+ahcggggAACCCCAAAIIIIAAAggggAACBFgcAwgggAACCCCAAAIIIIAAAggggAACuRYgwMp181A5BBBAAAEEEEAAAQQQQAABBBBAAAECLI4BBBBAAAEEEEAAAQQQQAABBBBAAIFcCxBg5bp5qBwCCCCAAAIIIIAAAggggAACCCCAAAEWxwACCCCAAAIIIIAAAggggAACCCCAQK4FCLBy3TxUDgEEEEAAAQQQQAABBBBAAAEEEECAAItjAAEEEEAAAQQQQAABBBBAAAEEEEAg1wIEWLluHiqHAAIIIIAAAggggAACCCCAAAIIIECAxTGAAAIIIIAAAggggAACCCCAAAIIIJBrAQKsXDcPlUMAAQQQQAABBBBAAAEEEEAAAQQQIMDiGEAAAQQQQAABBBBAAAEEEEAAAQQQyLUAAVaum4fKIYAAAggggAACCCCAAAIIIIAAAggQYHEMIIAAAggggAACCCCAAAIIIIAAAgjkWoAAK9fNQ+UQQAABBBBAAAEEEEAAAQQQQAABBAiwOAYQQAABBBBAAAEEEEAAAQQQQAABBHItQICV6+ahcggggAACCCCAAAIIIIAAAggggAACBFgcAwgggAACCCCAAAIIIIAAAggggAACuRYoTID1+eefm9dee81MnjzZfPDBB+ZrX/uaWWqppcySSy5p5pprrsTIb7/9trn//vtry2+77bamb9++id+ftwXffPNN8+KLL5oPP/zQyGjAgAFmgQUWqPm0sr5a/5QpU8x7771n3n///eBHdosuuqhZZJFFgv/OP//8qTb56aefmlmzZiV6T48ePUzPnj3N3HPPbXr16pXoPXah2bNnm48//rj2Hq2jX79+qdZhF5bDzJkza+/t06dP6vo0tGHehEAKgRkzZpgvvvii9o60n01/U+769Fns379/itp0dtHp06ebOXPmBJWYZ555Qs/5Oj/oPKGS5Pygc+4zzzwTnAdlM++88wbn3gUXXNCsssoqtR3Wdv/zn/8Ynav1HtnZ5ZZZZhmz0EILdRaHrVdSIMlnopIw7DQCCCCAAAII5FqgEAHWq6++ai6++OLQoOOrX/2q2X///YMbgiRl9OjRQeCjogDjpz/9aaoALMk22rHMl19+aS666CIjm7Dy9a9/3Rx00EEtqYq28dBDD5l///vftRu8qBWrPbbeemszcODARNv+yU9+Yj777LNEy/oLzTfffGaNNdYw6667rllsscXqruPJJ580Y8aMqS2jG9Rf/vKXDW332muvNU888UTtvYMGDTL77rtvQ+viTQhkJXDGGWcEgYktxx57bBAyRxWFMK+//nrkZ/f00083H330Ue3tJ5xwQiHCF33h4X7WFeSdcsopXRgUpJ966qm13/Xu3dv84he/iLT6y1/+Yh544IHQ1/WFyllnnRW8pnDrd7/7ndH6w8qWW25pNt5446wOgcqtN+4YrhxIxA4n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73+b8ePHB9vbbLPNzOKLLx677Xfeecfceef/Arlvf/vbZuDAgWbs2LFm6tSpoe+dZ555gnZfdNFFzbe+9a26x81HH31knn76afP8888Hy+k4WG+99RIda7EVb9UCX35qZj0woFVr67aeHgPWNT2H/r3p9U+bNs3cdtttwXo23XRTs9RSS0WuU5/Hq666KvhcfvOb3wx+/DJlyhSjz/Orr75qevbsaZZbbjmzxhprmIUWWqhuXd944w3z7LPPmpdeeik4BvS5HjRoUOL90zFx8803mx49eph99tkn8fuyXvAXj15obpt0X2abuX6Lc83yA6LbrNENv/DCC+af//xn8PbBgwcHbeiWVp0Twur3+uuvm5tuuik4T2+wwQaN7gLvQwABBBAokAABVoEai6oigAACaQT2u3iGee291g4fdLd/+cF9zdILz5WmSl2WPe+888zIkSOD31133XWJbkCGDx9u7rvvPrPIIosEQcmXX34ZhBJJioKRo48+2my99dbdFh89erQ59dRTu/1+mWWWMeeee24QlOShfDrmcvPJZaMyq0q/Pfcz8+4/ouH1P/LII0GwqHLEEUeYY489NnZdo0aNMqef/r+eX/fee69ZeeWVzfbbb28ee+yx2PfON9985oc//GGwLQUSblEIpt9//PHHXX7/ta99zVx66aXdbrRjN5bVAjNfN7MeTnYMN1SFPkuZudd7paG3um9S2LT55psHv7riiivMsGHDItepz+XSSy8dvK7P3FFHHVVbdsaMGebss882f/jDH0Lfr2NBwdJcc3U9t+h9J510krnhhhu6vU+f6V/96lemf//+sft5+OGHB6GHisIw/7iJXUFGC4y4/1Tz+NvPZLR2Y0ZtcqoZulj9EL+Rjevzd/vttwdvXWuttcytt97aZTWtOif4dfvkk0/MdtttF4TTI0aMMKecckoj1ec9CCCAAAIFEyDAKliDUV0EEEAgqUDeAyzdPNpgaNdddw2ConrlrbfeMmuuuWawiA1HPvvss1qApTDD7/Gj19XDwy3XX3+9WX/99Wu/uvbaa80xxxxT+7duhtX7xw1QHn74YbPssssmpc9subwHWLNnzw5sZa6g6NFHH+0WRLg46qGz4YYbBr3ehgwZUrsRdgMsBY9umTVrllFvOTeYUvsdeeSRtcXUU0g3tbbsvPPOZv755w96dv33v/8NAtBx48aZr3zlK5m1VeIVVyzAUlvpM6eitt14442NPqfqhffuu+8Gvz/ttNPMD37wgxrhF198YbbZZhuj3jwqq622WtBbb8KECbXP6VZbbWUuvvjiuoGUf1wQYCU+SkMXfO+998zqq6/e5bV77rnHrLLK/8291qpzgn8OOOSQQ2o9NwmwmmtH3o0AAggUSYAAq0itRV0RQACBFAJ5D7C0K7ZHlf7/xRdfDIbuRZWLLrrI/OIXvwhetoGSG2Adf/zx5rDDDuv2dgUe559/ftBDQ0XBih2GqJsr3WwpDNHvNaxxwQUXDJbT0LPvfe97wf/vsMMO5ve//30K/WwWzXuApb12e1TdcsstZu21147EeOKJJ2o94hRgKshUsQGWhvuF9bjRMn/5y1+C0MoGWf/4xz+Mesx9+OGHQSimMERBlXrbrLjiisF6tezBBx9sHnjggWBY25/+9CejYaYdLRUKsBQKq21V9ttvv6DXox06PH369KDnlXrs2M/fwgsvHPy/2sl+tvWeAw/833xhCkB/+tOfmssuuyz491133RWEW2FFQxY32WSTLsEnAVZzR/7ll18e9HzS507DQBVEq11tj0q79lacE+y6FGLqc6+eV7YQYDXXjrwbAQQQKJIAAVaRWou6IoAAAikEihBgqdfFQQcdFOyVbnK23XbbyD3UHCe6QXJDjSQBll2hO3RIN9LqrTVp0qRab6yf/OQnwXA0t+jmTDdpbuiVoglavmgRAiz1XlNvKpW9997bnHnmmZEO1lcLTJw4MZjbSiVJgKXlNPRUQ9RULrzwwmBIkYItG3Co7TQXl1s0b84666wT/ErD2NRzp6OlQgGWQkoFyeotqfnm+vbt24XeHaY4ZswYs9FGGxmFzPqvPvsatqg2dYf9ucfbz372s9r5xF2xhjTuscceQfDtFgKs5o58BYL63OocruDfDgnXvFhqY1tacU5QWKn168sIvxBgNdeOvBsBBBAokgABVpFai7oigAACKQSKEGApgNIQFPWM0c2p5tYJK7rZtUGDDSq0XJoAy+3FoQmmNRG1hpNpAmCVsJtf9da54447CLBSHHdadP/99zd33313cBOrHhO9evXqtga37dUT76yzzqotkzTAcsOoH/3oR8EcSe7canrdn0tJG/nud78b9OCIC9hS7nZji1cowFIAoV5S6hEXNgfWBx98YFZdddXA8de//rXZfffdg2Go6gGpEjWUV0NWFYYpRNEk/37R0MKf//znQY88BdkKq1UIsBo7ZPUu95ysB2lozjP1fFTRHGff//73u6y82XOCetKqp5eK2lFtqh65qgcBVuPtyDsRQACBogkQYBWtxagvAgggkFCgCAGWdkU3lroZUXnqqaeCmxO/aJiQJt5WIKJl7LCvNAHWNddcY4477rhg1er5ZZ+MZsMMTQavIYR23bop1jw7KurREzbJe8KmaNliReiBpZ2V47777hvsd1gvKP3e7SnltodeSxpgadip5lBSsQHkiSeeGDwBTze7GlYYVnbZpNciDAAAIABJREFUZZfgNc3BpifSdbRUKMCKc9YDGhRmqmhicPXks8Gz7QWpnjjqjaVgVE8hVOC1wAILRK76ueeeq004r15dCsk0f5IKAVZci0S/bntP6pys4dZ6WusWW2wRtIuGZWsuLLc0e05QgKW21vBBPbVW29WXGgRYjbch70QAAQSKKECAVcRWo84IIIBAAoGiBFj/+c9/gt5QKuqFY29g7S66PXU0VEVBhfuafQph1BxYWlY9vDSUzE7o7g5x0ZPvdEOrZXRTtNNOO5lp06bVJhTX7/RkLXdi4gT8mSxSlABLN5uacF/zUGnybc1f5hcFXLqp1UTe999/f5eXkwRYCjI0mb99opwdcubOlab2tnMsuRtQrzv1vgvbdiYNV2+lBQywNM+RDYDDdk3D/uyk+v5TCKMoNFG75pxTzzh3iOEFF1xgfvnLXwa9e/QZ1zxZdrJ3u64TTjgh6IXjt7WeXLjlllsGw9zs3Ex//vOfCbCaPMjlqvbXOdMN9//4xz8atYWKDSDtppo9J2g9WofbxgRYTTYkb0cAAQQKKECAVcBGo8oIIIBAEoGiBFjaF3sj4j6Jzu6jnhxnn0jmP+HK7YGlJ82pZ40tCjgURGmeK/UCsje9YcNNNKzpgAMOCGW182UlMc96maIEWHLQcDEN51NRL5gBAwbUePQUwcGDBwf/VjihUMItNsBSwGQn7revf/TRR0ZPpFRgZSdy1s20njCniaQVSGpooIo74bd9v54+qDBDRb391KOvo6WAAVYaryQBlgIvhZHqbaWieY523HHH4P/dnj52wn71xtITJNX7xhZ/GKpt/9GjRwdPKlW7a5ghAVaa1gtfVoG+huyqqCflGmusEfy/OwQ07MmyzZwTwmpCgNV8W7IGBBBAoGgCBFhFazHqiwACCCQUKFKA5U7G7c9zY+dOUUihoWZucQOsJCyaAF5hlp0sXCGXhjDa+XgUaKy77rrmk08+MRrOpKKeV3oC4corr5xkE5kuU6QA6+WXX67NieM+YVBAl1xySa0n3bPPPtttCJgNsJJgaqignkJn20e9NDSUyYZbmhdLwaaGhqrHl/5tgxACrCTC/1vGnWBdPaTint5oA+O4AEvtpZBKvXdUtt5669qQYv1b4bVCbFs03FjLqLzzzjtBkGInZ1ewstZaawWv/e1vfzN77rln8P/uEFUCrORtHrWkwimZh/Vg1IMw1PtKRcMJF1poodpqmjknhNWFAKv5tmQNCCCAQNEECLCK1mLUFwEEEEgoUKQAa/r06bUAwh0KqBtUO1TJTurs7n5cgKUb7eWWWy6YD0kTQSvYcIvb80o3ZeoNZJ+MpuFn6pVlg5Co+bkSNkdLFitSgKUdVi+aRx55pMuTI/V7+/Qy9Zr73e9+180mLsBSj5oVVlghWK96b/mTxLsTTPsr1zGhnn5///vfGUKY4qh0Ayw9bEEPXYgqeuqfJvVWqRdgffrpp8FwPgWLKhpKrB5Tmk/JlkMPPdTccsstwT81F54erOAWnSPWX3/9IJS0wwTV81LHmEK0Y489NujdZQsBVopGD1nUnRtQx4A/WbuCQ31JoBLWA7LRc0JYrQmwmmtL3o0AAggUUYAAq4itRp0RQACBBAJFCrC0O8ccc4y59tprg7BJ3+736NEjuBFS7wwVzZXVv3//LnvuBli6UdXNri16v4aU1SsaaqYhZxqS9NBDD3XrVRI2SXgC+swWKVqA5T750Q7FdIMQzV+lHm9+sQGWJtHXMeGWsDmtwsBfe+214NhR+6oouNpoo43MYYcdZjShvyZ6ZxL35IdqqwMsBU+aB80OA1SYec4553QLIxUqax4slfHjx5uvfvWr3SqtufHUy8q2p9rYDkdUbz834NTn3Pa4vPLKK4PzjELyhRdeODlGBkuOuP9U8/jbz2Sw5v+tctQmp5qhi32j6fX/5je/CZ4QmaToXC5v90mgjZ4TwrZHgJWkFVgGAQQQKJcAAVa52pO9QQABBGoCRQuwFHAouFCxQ37sEwL1Lb8eze6XNE8hDDs0FJCoR0HYfC12+Q022CB46pmefKU5XDpZihZgqYfNiiuuGJDZpwTap06G3dxa2ySTuCdtBw1RmzJlill88cVrE0DvscceQQ+sqOMq6bpbslwB58BqtgeWhpLttttuwUT6Kgqc9IRQhUl+cUNsTcZuh/+6y9l5suyQNnveSNo+CjPtgySSvqfVyxUhwHInYlcgLO+w8t5779UemKHh4TqH2tLoOSFsOwRYrT4KWR8CCCCQfwECrPy3ETVEAAEEGhIoWoCl+aj0pDGFRZrXRj0yNAxIxX+ilQVpNsCyj33X08/UUyOs2JBLQ9XUG6STpWgBlqxOPPHEoLfTaqutZu64447a0wkVOmhC/bDSTICl4aiPPvpoMHxM63GHo2lb7gTyGr6o46yjpWIB1uTJk812221Xe6iCevQozIoqd999t9E8eCo333xz0MvKL/aJljZk1r/VYyys6PhwJ4PXMpo0PqwnYDuPiyIEWO68YnpAg57YGlbcua4UMtkeb3bZRs4JYdshwGrnEcq2EEAAgXwIEGDlox2oBQIIINBygaIFWALQBM3qoaMhfXqqmHpdhU0UbLGaDbDU60PDydSb4B//+Ee3YUTusCl/IvKWN1iCFRYxwHLno5LhkUceGezphAkTgifJhZVmAiwNNbW9aX71q18Z9bZyi+qg36tEDUlL0BStW6RCAZY/wb4mbv/Od75T13LGjBnBED+FTmFzpr3xxhu1UCtJIMkcWI0fupqvTH4qYUO63TXbua7CPmeNnBPCak2A1Xhb8k4EEECgqAIEWEVtOeqNAAIIxAgUMcBye8fY3Tv99NODyZnDSrMB1uOPPx70BlHR0wY1J84SSywR/Pu5554LJoxWjzAFXJrLZdFFF+3ocVfEAEtgdtJ2i1evx5uWaSbAUk8+PYlOw9M0TFG9v77+9a8bhSfXX399MFRN5cADDwwmme54qVCApaGHJ598ckC++eabBxPwRxW1mf0s2mBby2quPPXc01MQp06dGjylUGGoPqPqIRQ2R5a7DQKsxo54TYyvXpQq6nmlHlj1ijvXlT5zhx9+eJfF054TwrZFgNVYW/IuBBBAoMgCBFhFbj3qjgACCNQRKGKApd3RDenYsWNre+Y/it3d5WYDLK3Ln5RYT7jTROGab8eWPMyRo7oUNcBygwvtR5xnMwGW1u8OddK/1aYKR+3QMQVcV199dRB6dLxUJMBSsLjyyivX2iDO/bTTTgvOBSr2CYPqJWmLwhSdG2xRMDV06NC41QY9iNSTSEW9t8Lm3YpdSQYL5H0IofsZ1mfHDu+Oovjkk09qc2QtssgiQW9H9wEMac8JYdshwMrgQGSVCCCAQM4FCLBy3kBUDwEEEGhUoKgBlp4ap6cDquywww7m97//fSTB559/bpZbbrngdc2r4j6FMI2btvmTn/ykNvGwfa/m29G8V7rxzkMpaoDl9t4Iu5n1be3wI82J5j+FMGk73HPPPeanP/1ptzbV/Go//vGPuz3RMul6W75cQQIs9UgcNmxYsPtxAeSXX35pll566WBZ9ZjSsFHNSbbGGmsk5vN7XqoH3W9/+1szevToLiGYjhEFUu5E4fU2ctttt9XmXiPAStwcxoZFCn2fffbZLmFU1FpOOOEEo2GiKmPGjAmeAmpL2nNC2Da22WaboPedPtMnnXRS8p1hSQQQQACBwgoQYBW26ag4AgggUF+gqAFWJ9v1/fffN5MmTTK9evUKeu3069evk9Xptu2iBlidQlSQoqGECioWXHDBIFTp27dvp6oTvt2CBFh5QVNPrtdffz3oUbfqqqvmrz0bhMp7D6wGd4u3IYAAAggg0FIBAqyWcrIyBBBAID8CBFj5aYtW1YQAq1WSOVoPAVaOGqNzVSHA6pw9W0YAAQQQKI4AAVZx2oqaIoAAAqkECLBScRViYQKsQjRTukoSYKXzKunSBFglbVh2CwEEEECgpQIEWC3lZGUIIIBAfgQu+Ovn5ubHvsikQsssMpe57KCcDcXKZE/ztdIvnn7CfHDUwZlVasCZ55lea62T2fpZcbjAl49+y8yZPiETnrmW+IGZa+VRmayblbZO4PLnbzYXPj2mdSv01vS3na42/ebuk9n6WTECCCCAAALtECDAaocy20AAAQQ6JHDhXz83j0/6sqVb/9oCPcyBm/Qyyy46V0vXy8qSCcz861/MjBuvMXO+nJXsDQmW6tFjLtN3x91Nny23S7A0i7RaYM6nL5nZL51gzKf/9+TLVmyjx4Ibm7lWOq8Vq2IdbRC46N/Xmdsn32/mnbt1Xw4s2Ht+M2L1Pc03F8nHgyjawMgmEEAAAQRKLECAVeLGZdcQQAABBBBAAAEEEEAAAQQQQACBMggQYJWhFdkHBBBAAAEEEEAAAQQQQAABBBBAoMQCBFglblx2DQEEEEAAAQQQQAABBBBAAAEEECiDAAFWGVqRfUAAAQQQQAABBBBAAAEEEEAAAQRKLECAVeLGZdcQQAABBBBAAAEEEEAAAQQQQACBMggQYJWhFdkHBBBAAAEEEEAAAQQQQAABBBBAoMQCBFglblx2DQEEEEAAAQQQQAABBBBAAAEEECiDAAFWGVqRfUAAAQQQQAABBBBAAAEEEEAAAQRKLECAVeLGZdcQQAABBBBAAAEEEEAAAQQQQACBMggQYJWhFdkHBBBAAAEEEEAAAQQQQAABBBBAoMQCBFglblx2DQEEEEAAAQQQQAABBBBAAAEEECiDAAFWGVqRfUAAAQQQQAABBBBAAAEEEEAAAQRKLECAVeLGZdcQQAABBBBAAAEEEEAAAQQQQACBMggQYJWhFdkHBBBAAAEEEEAAAQQQQAABBBBAoMQCBFglblx2DQEEEEAAAQQQQAABBBBAAAEEECiDAAFWGVqRfUAAAQQQQAABBBBAAAEEEEAAAQRKLECAVeLGZdcQQAABBBBAAAEEEEAAAQQQQACBMggQYJWhFdkHBBBAAAEEEEAAAQQQQAABBBBAoMQCBFglblx2DQEEEEAAAQQQQAABBBBAAAEEECiDAAFWGVqRfUAAAQQQQAABBBBAAAEEEEAAAQRKLECAVeLGZdcQQAABBBBAAAEEEEAAAQQQQACBMggQYJWhFdkHBBBAAAEEEEAAAQQQQAABBBBAoMQCBFglblx2DQEEEEAAAQQQQAABBBBAAAEEECiDAAFWGVqRfUAAAQQQQAABBBBAAAEEEEAAAQRKLECAVeLGZdcQQAABBBBAAAEEEEAAAQQQQACBMggQYJWhFdkHBBBAAAEEEEAAAQQQQAABBBBAoMQCpQywXn31VfPuu+/WbbZBgwaZvn37dlvm8ccfN0899ZSZNm2aGTx4sBk6dKhZYIEFSnwIsGsIIIAAAggggAACCCCAAAIIIIBAvgVKGWBtueWWZuzYsXXlJ0yYEARUtrz//vtm+PDh5s477+z2vksuucQccMAB+W5JaocAAggggAACCCCAAAIIIIAAAgiUVKCUAdb8889vpk+fnjjAmjVrlhk2bJh54IEHgvdstdVWZvnllzd33323mThxYvC7Cy+80IwYMaKkhwG7hQACCCCAAAIIIIAAAggggAACCORXoHQB1pQpU8wSSywRiP/lL38x6667bqi+Qq655poreO3GG280u+66a/D/l156qdl///2D/58xY4bZbbfdzO2332769+9v3nrrLdOvX7/8tiY1QwABBBBAAAEEEEAAAQQQQAABBEooULoAa9y4cWbzzTcPmkrzWC244IKxzbb++uubhx9+2AwcONC88MILXZZ/7bXXzDLLLBP87rLLLjP77bdf7PpYAAEEEEAAAQQQQAABBBBAAAEEEECgdQKlC7DOOeccc9xxxwVDAF9++eVYqZkzZ9Ymcz/77LPNscce2+09G264oXnwwQeDYOyuu+6KXScLIIAAAggggAACCCCAAAIIIIAAAgi0TqB0Adb3v/99M2bMGLPXXnuZgw8+OJjXavLkyWa55ZYzQ4YMCUIoO3RQjE888UTwe5X77rvPbLLJJt10TzjhBDNy5Eiz2GKLmalTp7ZOnzUhgAACCCCAAAIIIIAAAggggAACCMQKlC7AWmGFFcwrr7wSuePf+c53zOWXX26WXnrpYJl77rknmMBd5cknnzRrrLFGt/cqvFKIpaIJ33v27BkLywIIIIAAAggggAACCCCAAAIIIIAAAq0RKFWA9dFHH5kBAwbUZJZcckmz9dZbB0ME9UTB5557Lnht0KBBZsKECaZ3797mlltuMTvuuGPwe813tdRSS3WTHT16tDnooIOC3+vphvPNN19r9FkLAggggAACCCCAAAIIIIAAAggggECsQKkCrKeffrrWg2rfffc1Cp7mnnvuAOGLL74wRx99tDn//PODf5911lnm+OOPNzfddJPZZZddgt+9/fbbZtFFF+2Gds011wRDElWSTgwfK88CCCCAAAIIIIAAAggggAACCCCAAAKJBEoVYGmP58yZUwui3Lmu9Npnn30W9L7SEMMNNtjA/P3vf+8yhHDSpElm2WWX7QY3atQoc8ghhwS/16Tv6rmVpowfPz7N4iyLAAIIIIAAAggggAACCCBQUYGPv/zUvPrZW+bdLz4wX86ZnWuFeXr0NAvNM8As0/urZr6e/XJdVyqXTmDNNddM94Y2LF26ACvObMSIEeaiiy4y/fv3Nx9++KF59tlnzWqrrRa8TcMKBw8e3G0VZ5xxhjnllFOC3ysgS1sIsNKKsTwCCCCAAAIIIIAAAgggUD2B1z+bas5544/m8zlfFGrne881jzl2ieFmyd5fKVS9qWy0AAFWDo6OE088MRg+qDJ79mzz3nvv1YYNakL3TTfdtFstjzrqKHPuueea5Zdf3rz88ss52AuqgAACCCCAAAIIIIAAAgggUDaBk/95rhn32sOF3K3Nll7fnLHuEYWsO5UuhkCpemBpfqvf/va35uOPPzavv/666dWrV7dW2H777c2f//xnM2TIEKOeUQqx7FMFTzrpJKPeVn5ZaaWVzMSJE83w4cPNVVddVYyWpZYIIIAAAggggAACCCCAAAKFEtjoT8PNp7NmFKrOtrLz95rP3LvDFYWsO5UuhkCpAqzrr7/e7L777oG8Qqptt922SyvoKYSrrrpq8Ltjjz3WnH322cH/H3744ea8884ziy22mJkyZUot0NJrGlZou85deeWVZu+99y5Gy1JLBBBAAAEEEEAAAQQQQACBQgmsdf3OhaqvX9nHdrup0PWn8vkWKFWApeGAyy23nJk+fXoQRt15551m6NChQQs888wzZqeddgp6UqlMnTo1WEblpZdeMiuuuGLw/3ra4KWXXhr03po8eXIwpFCTvmvZV1991fTp0yffLUrtEEAAAQQQQAABBBBAAAEECilAgFXIZqPSbRIoVYAls7Fjx5ott9yyxrf66qubWbNmGfW+suWOO+4wW221VRdi2wvL/lLve/rpp2vLaL1bbLFFm5qFzSCAAAIIIIAAAggggAACCFRNgACrai3O/qYRKF2ApZ3/17/+ZQ477DDz2GOPdbFYb731zOjRo80qq6wSanTBBRcYTfKuHly2DBw40Ghurc022yyNK8sigAACCCCAAAIIIIAAAgggkEqAACsVFwtXTKCUAZZtw/fffz8YHqhJ2gcNGpRo+N+cOXPMpEmTzJtvvmmWWmqp4MdO8l6xY4PdRQABBBBAAAEEEEAAAQQQaKMAAVYbsdlU4QRKHWAVrjWoMAIIIIAAAggggAACCCCAQGUFCLAq2/TseAIBAqwESCyCAAIIIIAAAggggAACCCCAQNYCBFhZC7P+IgsQYBW59ag7AggggAACCCCAAAIIIIBAaQQIsErTlOxIBgIEWBmgskoEEEAAAQQQQAABBBBAAAEE0goQYKUVY/kqCRBgVam12VcEEEAAAQQQQAABBBBAAIHcChBg5bZpqFgOBAiwctAIVAEBBBBAAAEEEEAAAQQQQAABAiyOAQSiBQiwODoQQAABBBBAAAEEEEAAAQQQyIEAAVYOGoEq5FaAACu3TUPFEEAAAQQQQAABBBBAAAEEqiRAgFWl1mZf0woQYKUVY3kEEEAAAQQQQAABBBBAAAEEMhAgwMoAlVWWRoAAqzRNyY4ggAACCCCAAAIIIIAAAggUWYAAq8itR92zFiDAylqY9SOAAAIIIIAAAggggAACCCCQQIAAKwESi1RWgACrsk3PjiOAAAIIIIAAAggggAACCORJgAArT61BXfImQICVtxahPggggAACCCCAAAIIIIAAApUUIMCqZLOz0wkFCLASQrEYAggggAACCCCAAAIIIIAAAlkKEGBlqcu6iy5AgFX0FqT+CCCAAAIIIIAAAggggAACpRAgwCpFM7ITGQkQYGUEy2oRQAABBBBAAAEEEEAAAQQQSCNAgJVGi2WrJkCAVbUWZ38RQAABBBBAAAEEEEAAAQRyKUCAlctmoVI5ESDAyklDUA0EEEAAAQQQQAABBBBAAIFqCxBgVbv92fv6AgRYHCEIIIAAAggggAACCCCAAAII5ECAACsHjUAVcitAgJXbpqFiCCCAAAIIIIAAAggggAACVRIgwKpSa7OvaQUIsNKKsTwCCCCAAAIIIIAAAggggAACGQgQYGWAyipLI0CAVZqmZEcQQAABBBBAAAEEEEAAAQSKLECAVeTWo+5ZCxBgZS3M+hFAAAEEEEAAAQQQQAABBBBIIECAlQCJRSorQIBV2aZnxxFAAAEEEEAAAQQQQAABBPIkQICVp9agLnkTIMDKW4tQHwQQQAABBBBAAAEEEEAAgUoKEGBVstnZ6YQCBFgJoVgMAQQQQAABBBBAAAEEEEAAgSwFCLCy1GXdRRcgwCp6C1J/BBBAAAEEEEAAAQQQQACBUggQYJWiGdmJjAQIsDKCZbUIIIAAAggggAACjQtM/GCyufL5W8xDU8abT2fNbHxFbXjn/L3mM+t89Ztmn1W2NwMXWLYNW2QTCCBQVgECrLK2LPvVCgECrFYosg4EEEAAAQQQQACBlglM/GCSOeCeU8zMLz9r2TrbsaK+c/c2l2x6BiFWO7DZBgIlFSDAKmnDslstESDAagkjK0EAAQQQQAABBBBolcDJ/zzXjHvt4Vatrq3r2Wzp9c0Z6x7R1m2yMQQQKI8AAVZ52pI9ab0AAVbrTVkjAggggAACCCCAQBMCG/5pLzMj58MGo3ZPwwnv3eGKJvaetyKAQJUFCLCq3Prse5wAAVacEK8jgAACCCCAAAIItE1gjplj1r5+l7ZtL4sNPbbbTVmslnUigEAFBAiwKtDI7GLDAgRYDdPxRgQQQAABBBBAAIFWCxBgtVqU9SGAQJEECLCK1FrUtd0CBFjtFmd7CCCAAAIIIIAAApECBFgcHAggUGUBAqwqtz77HidAgBUnxOsIIIAAAggggAACbRMgwGobNRtCAIEcChBg5bBRqFJuBAiwctMUVAQBBBBAAAEEEECAAItjAAEEqixAgFXl1mff4wQIsOKEeB0BBBBAAAEEEECgbQIEWG2jZkMIIJBDAQKsHDYKVcqNAAFWbpqCiiCAAAIIIIAAAggQYHEMIIBAlQUIsKrc+ux7nAABVpwQryOAAAIIIIAAAgi0TYAAq23UbAgBBHIoQICVw0ahSrkRIMDKTVNQEQQQQAABBBBAAAECLI4BBBCosgABVpVbn32PEyDAihPidQQQQAABBBBAAIG2CRBgtY2aDSGAQA4FCLBy2ChUKTcCBFi5aQoqggACCCCAAAIIIECAxTGAAAJVFiDAqnLrs+9xAgRYcUK8jgACCCCAAAIIINA2AQKstlGzIQQQyKEAAVYOG4Uq5UaAACs3TUFFEEAAAQQQQAABBAiwOAYQQKDKAgRYVW599j1OgAArTojXEUAAAQQQQAABBNomQIDVNmo2hAACORQgwMpho1Cl3AgQYOWmKagIAggggAACCCCAAAEWxwACCFRZgACryq3PvscJEGDFCfE6AggggAACCCCAQNsECLDaRs2GEEAghwIEWDlsFKqUGwECrNw0BRVBAAEEEEAAAQQQIMDiGEAAgSoLEGBVufXZ9zgBAqw4IV5HAAEEEEAAAQQQaJsAAVbbqNkQAgjkUIAAK4eNQpVyI0CAlZumoCIIIIAAAggggAACBFgcAwggUGUBAqwqtz77HidAgBUnxOsIIIAAAggggAACbRMgwGobNRtCAIEcChBg5bBRqFJuBAiwctMUVAQBBBBAAAEEEECAAItjAAEEqixAgFXl1mff4wQIsOKEeB0BBBBAAAEEEECgbQIEWG2jZkMIIJBDAQKsHDYKVcqNAAFWbpqCiiCAAAIIIIAAAggQYHEMIIBAlQUIsKrc+ux7nAABVpwQryOAAAIIIIAAAgi0TYAAq23UbAgBBHIoQICVw0ahSrkRIMDKTVNQEQQQQAABBBBAAAECLI4BBBCosgABVpVbn32PEyDAihPidQQQQAABBBBAAIG2CRBgtY2aDSGAQA4FCLBy2ChUKTcCBFi5aQoqggACCCCAAAIIIECAxTGAAAJVFiDAqnLrs+9xAgRYcUK8jgACCCCAAAIIINA2AQKstlGzIQQQyKEAAVYOG4Uq5UaAACs3TUFFEEAAAQQQQAABBAiwOAYQQKDKAgRYVW599j1OgAArTojXEUAAAQQQQAABBNomQIDVNmo2hAACORQgwMpho1Cl3AgQYOWmKagIAggggAACCCCAAAEWxwACCFRZgACryq3PvscJEGDFCfE6AggggAACCCCAQNsECLDaRs2GEEAghwIEWDlsFKqUGwECrNw0BRVBAAEEEEAAAQQQIMDiGEAAgSoLEGBVufXZ9zgBAqw4IV5HAAEEEEAAAQQQaJsAAVbbqNkQAgjkUIAAK4eNQpVyI0CAlZumoCIIIIAAAggggAACBFgcAwggUGUBAqwqtz77HieHi37QAAAgAElEQVRAgBUnxOsIIIAAAggggAACbRMgwGobNRtCAIEcChBg5bBRqFJuBAiwctMUVAQBBBBAAAEEEECAAItjAAEEqixAgFXl1mff4wQIsOKEeB0BBBBAAAEEEECgbQIEWG2jZkMIIJBDAQKsHDYKVcqNAAFWbpqCiiCAAAIIIIAAAggQYHEMIIBAlQUIsKrc+ux7nEBlAqxx48aZF1980ay77rpmyJAhkS6PP/64eeqpp8y0adPM4MGDzdChQ80CCywQ58jrCCCAAAIIIIAAAi0QIMBqASKrQACBwgoQYBW26ah4GwQqEWA988wzZrXVVgs4zzzzTHPCCSd0o33//ffN8OHDzZ133tnttUsuucQccMABbWgONoEAAggggAACCFRbgACr2u3P3iNQdQECrKofAex/PYHSB1gzZ8403/rWt8zTTz8dGWDNmjXLDBs2zDzwwAPBMltttZVZfvnlzd13320mTpwY/O7CCy80I0aM4GhCAAEEEEAAAQQQyFCAACtDXFaNAAK5FyDAyn0TUcEOCpQ+wDruuOPMOeecUyMO64F14403ml133TVY5tJLLzX7779/8P8zZswwu+22m7n99ttN//79zVtvvWX69evXweZi0wgggAACCCCAQLkFCLDK3b7sHQII1BcgwOIIQSBaoNQB1n333Wc23XTTLnsfFmCtv/765uGHHzYDBw40L7zwQpflX3vtNbPMMssEv7vsssvMfvvtx/GEAAIIIIAAAgggkJEAAVZGsKwWAQQKIUCAVYhmopIdEihtgKU5rVZeeWXz9ttvm5EjR5qLL77YvPLKK93mwNIQw759+wb8Z599tjn22GO7NcWGG25oHnzwQbP55pubu+66q0NNxWYRQAABBBBAAIHyCxBglb+N2UMEEIgWIMDi6EAgWqC0AZaG/t1www1mvfXWC+a2WmmllUIDrCeeeKL2VEL12Npkk026aWnSd4Vgiy22mJk6dSrHEwIIIIAAAggggEBGAgRYGcGyWgQQKIQAAVYhmolKdkiglAHW1VdfHTxRUOXll18OJmRfYYUVQgOse+65J5jAXeXJJ580a6yxRremUHhln1yoCd979uzZoeZiswgggAACCCCAQLkFCLDK3b7sHQII1BcgwOIIQSBaoHQB1qRJk4LASsWdsyoqwLrlllvMjjvuGCyv+a6WWmqpblqjR482Bx10UPD76dOnm/nmm49jCgEEEEAAAQQQQCADAQKsDFBZJQIIFEaAAKswTUVFOyBQqgBLvaM23njjYEL27bbbztx666010qgA66abbjK77LJLsJzmy1p00UW7NcM111xj9tprr+D306ZNMwsuuGCqpho/fnyq5VkYAQQQQAABBBCoqsAcY8yIl84s9O5f9PUTC11/Ko8AAp0T+CHnv87hs+UuAmuuuWbuREoVYJ111lnmxBNPNP379zcvvfRSMGeVLUmGEKr31rLLLtutkUaNGmUOOeSQ4Pea9L13796pGpIAKxUXCyOAAAIIIIBAhQUIsCrc+Ow6AggYAiwOgrwIEGBl2BLPPvus+cY3vhFsYd999zU777xzl63tsccewfC/PffcM/hZYIEFggnen3nmGbPaaqsFy06YMMEMHjy4Wy3POOMMc8oppwS/nzNHl1UUBBBAAAEEEEAAgSwEGEKYhSrrRACBoggwhLAoLUU9OyFQmh5Yt99+u9l2220TGw4ZMsSoZ9S7775bGzaoCd033XTTbus46qijzLnnnhvMraVJ4SkIIIAAAggggAAC2QgQYGXjyloRQKAYAgRYxWgnatkZgdIEWPfdd5/ZZ599IhXfeOON2mtLLrlk0NPqtttuM7Nnz649VfCkk04y6m3ll5VWWslMnDgxeLLhVVdd1ZmWYqsIIIAAAggggEAFBAiwKtDI7CICCEQKEGBxcCAQLVCaACuukaPmwNL7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AdcG1k033SSXXnqpDBgwIHk8UM0nPS688MJkg/e+ffvK9ddfL0cccUTyue6hlb61MCvL1VdfnTx2qIfunTV06NDmqsbVIQCBShBgAlMJmRkkBCBQQwADi5SAQFwCGFhx+RbtnflfUYK090zAtYGVFe7FF1+UT3ziEzJr1qzkY32kUI2r7COEy5cvl+22265O72nTpskJJ5yQfK6bvg8cODBXTtx///25zudkCEAAAkrg00u/3dIgfrj91JaOn+AhAIHmEGgTkSnUv+bA56qVILDNqVNaepxPnjOtpePvKXjmfz0R4u9lEUi3XSrrer25TmUMLIWhK7C22mqr5P/Hjx8vt9xyizz44IMyatSohNX8+fNl9OjRddzOPvtsOfPMM5PP29p0WpXvwMDKx4uzIQCB/yPABIZMgAAEqkgAA6uKqjPmMglgYJVJO/+1mP/lZ0aLOAQwsOJwrev1pZde6nKfKt3vSve9GjFihCxbtkyef/759scGdTXWgQceWNffSSedJBdccEF7m5KGwWUgAIGKE2AJecUTgOFDoKIEeISwosIz7NII8AhhaagbuhDzv4aw0agiBFytwDr//PPl5JNPTt40qHtV9e/fv05GNah0P6y99tpL/vjHP8r69evb3yp4+umni662qj123HFHWbJkiUyaNElmzpxZkdRgmBCAQLMJMIFptgJcHwIQaAYBDKxmUOeaVSKAgWVbbeZ/tvUhuuYScGVgZd8oqI8H6mOC2WPx4sWy0047JR+p0fXd7343+fnEE09MNnYfNmyYPP300+2Glv5NHytMl85dddVVMnny5OYqxtUhAIHKEGACUxmpGSgEIJAhgIFFOkAgLgEMrLh8i/bO/K8oQdp7JuDKwPrHP/4hulpK3yaoZtSMGTNk7NixssEGGyR7XU2cOFEeeuihRE/9/5133jn5eenSpbLDDjskP+vbBqdPn568ufDxxx9PHil87LHHkv6eeOIJGTRokOd8YGwQgIAhAkxgDIlBKBCAQGkEMLBKQ82FKkoAA8u28Mz/bOtDdM0l4MrAUpRz5syRMWPGtFPVxwmHDx/eblzpH6644gr5+Mc/3oF8ugor/XDXXXeVRYsWtZ9z2223ycEHH9xctbg6BCBQKQJMYColN4OFAAT+QwADi1SAQFwCGFhx+RbtnflfUYK090zAnYGlYuljf5/5zGdk7ty5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QAACEIAABCAAAQhAAAItTQADq6XlI3gIxCGwaNEiefjhh+Xxxx+XzTffXEaOHCl77bWXbLjhhl1ecO3atXLXXXfJo48+Kvo2Tz3/rW99qwwcOLDbIOfNmycLFy6UlStXyujRo2XPPfeUIUOG1LX517/+JVdeeWXy+bvf/W7Zeeedu+z3d7/7nSxYsCD5+wYbbCDHH3+8PPHEE3LLLbckn+nv+jkHBCAAgVoCWr/+8Ic/JDXwueeekxEjRiS1afvtt+8Wlr7BWGvPX/7yl6Rmvu1tb5Otttqq2zb/+Mc/5O6775Zly5bJa1/72qTNjjvuKH379q1rN2fOHPnzn/8sG2+8sXz84x/vst/Vq1fLVVddJevWrUvO2X///WW33XaTWbNmJePRsey3334IDwEIQKAwgX/+859JvdQa9tJLLyV1ctSoUZ3WSz3n9ttvb7/mO9/5Ttlll126jeHll1+WK664ov2c97///bLNNtskv1PTCstHBxBoSQIYWC0pG0FDIA4BNaw+//nPy80331x3Ab2JmzZtmowdO7bub2p4HXHEEbJkyZIOfxs8eLD86le/Ssys2uOFF16QSZMmya233lr3t8svv1yOO+64Dp/rTWE6aZk+fboce+yxnULQydF73/ve9r/deOON8sEPflBuu+02ed/73pd8rjeNm222WRyI9AoBCLQsgaVLlya15Z577qkbwxe/+EU566yzZKONNurwNzW8pk6dKuecc05dG61jP/zhD6V///51f7v22mvlk5/8pKxatarD33bffffkJm+LLbbo8PmUKVOSvoYNGyYrVqzolLGaVx/60IeSeqfHu971rqSeb7LJJrLHHnvI/Pnz5dRTT5XvfOc7LasRgUMAAjYIXHrppfKlL32proZpdJ/97GeTepmda/30pz+Vww8/vD34o48+uv2Lya5GdMMNNyQ1LT1+8YtftM/xqGk28oAoIFA2AQyssolzPQgYJaDfcqnR9NBDDyURHnTQQaI3Uk8//bT86Ec/ao/6j3/8YwdD6qmnnkrO02/29VBTasCAAXLddde1T2rmzp2brCxID12tpf3rigI9xo8fn6xymD17drsJdskll4jesKVHbwysWvMqO9HBwDKaeIQFASMEtAbq6qTUiNeapAaQfsufmkwnnHCCXHzxxR0i/vrXvy7/9V//lXymtVBXFejK0tQEU3Nf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/PDDexXRLbfcIk888YRsvPHG8vGPf7zTNg8//LDoeU8++aT85S9/kU033VR22203GTVqlOyxxx6y+eab9+paetKMGTNk9erV0rdvX/nUpz6V/D8HBCAAAQhAAAIQKJsABlbZxLkeBCAAAQhAAAKuCCxYsEA+8YlPyPz587sclxpYl112WWIiZY8DDzxQ7rrrruSjF154QYYMGdItm5dfflle97rXyapVq+TII4+Ua6+9tsP5f/7zn5NY5s6d22U/gwcPliuvvFImTJjQow4PPvhgYnqlxx133CHvec97emzHCRCAAAQgAAEIQCA0AQys0ETpDwIQgAAEIACByhCYNWtWYiSlx9Zbby377befvPnNb5YVK1bIzTffLH/961/b/37DDTfIYYcd1v77NddcIx/5yEeS36+44oouV1SlDbLXqzWTbrrppg59q1G1//77y6677ir/+te/5A9/+IPcd9997df+whe+IBdccEG3Wn35y1+W8847r/2cI444Qq677rrK6MtAIQABCEAAAhCwQwADy44WRAIBCEAAAhCAQAsRWLx4sey0007tEX/ve9+TE088Ufr169f+2dq1a+Xiiy8WNYvS45FHHpEdd9wx+TW7ourd7363/OpXv+qWwPve9z657bbbRI2yxx9/vP1ay5Ytk+2337697dlnny1qPvXv379Df7pKTE2oxx57LPl80aJFHVZYZU9+9dVXZYsttkhWe40fP15uvfXW5M9qyG211VYtpBShQgACEIAABCDggQAGlgcVGQMEIAABCEAAAqUTOOCAA+See+5JrtvTo3VnnHGGfOtb30rOffvb3y6//e1v2+P9/Oc/LxdddFHyu+5XpeZUZ8fTTz/dbhydddZZon2mx9ixY5MY9NC9r9Rw6urQlWH6GKIeuoeWrvzq7Miu6FLDa8SIEclp3/zmN+XMM88snTcXhAAEIAABCECg2gQwsKqtP6OHAAQgAAEIQKABArqKauedd05adrYXVW2X69evTzZpv/HGG5M/6V5V+pihHroqSjdW1+P888+XL37xi51GpH87+eSTk7/p5uzDhw9PflZz6U1velPy86RJk2TmzJk9jkiv8f3vf1901dfs2bPrVmppB4ccckiy6kr379IN6idPniw/+tGPZNiwYfLUU0912qbHC3MCBCAAAQhAAAIQaJAABlaD4GgGAQhAAAIQ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GIPY3717l09RzZ49u99w93h8cOfOnWnMmDH5Mb3mWwqH6Ffo2+bHjx/pzZs3KWZejR49Oi1YsKBv2PtQ97IfAQIECBAgQGC4BQRYwy1sfwIECBAgQIBAQ+Dr1695OHsEShYBAgQIECBAgECZgACrzEkVAQIECBAgQIAAAQIECBAgQIBAJQEBViV4bQkQIECAAAECBAgQIECAAAECBMoEBFhlTqoIECBAgAABAgQIECBAgAABAgQqCQiwKsFrS4AAAQIECBAgQIAAAQIECBAgUCYgwCpzUkWAAAECBAgQIECAAAECBAgQIFBJQIBVCV5bAgQIECBAgAABAgQIECBAgACBMgEBVpmTKgIECBAgQIAAAQIECBAgQIAAgUoCAqxK8NoSIECAAAECBAgQIECAAAECBAiUCQiwypxUESBAgAABAgQIECBAgAABAgQIVBIQYFWC15YAAQIECBAgQIAAAQIECBAgQKBMQIBV5qSKAAECBAgQIECAAAECBAgQIECgkoAAqxK8tgQIECBAgAABAgQIECBAgAABAmUCAqwyJ1UECBAgQIAAAQIECBAgQIAAAQKVBARYleC1JUCAAAECBAgQIECAAAECBAgQKBMQYJU5qSJAgAABAgQIECBAgAABAgQIEKgkIMCqBK8tAQIECBAgQIAAAQIECBAgQIBAmYAAq8xJFQECBAgQIECAAAECBAgQIECAQCUBAVYleG0JECBAgAABAgQIECBAgAABAgTKBARYZU6qCBAgQIAAAQIECBAgQIAAAQIEKgkIsCrBa0uAAAECBAgQIECAAAECBAgQIFAmIMAqc1JFgAABAgQIECBAgAABAgQIECBQSUCAVQleWwIECBAgQIAAAQIECBAgQIAAgTIBAVaZkyoCBAgQIECAAAECBAgQIECAAIFKAgKsSvDaEiBAgAABAgQIECBAgAABAgQIlAkIsMqcVBEgQIAAAQIECBAgQIAAAQIECFQSEGBVgteWAAECBAgQIECAAAECBAgQIECgTECAVeakigABAgQIECBAgAABAgQIECBAoJKAAKsSvLYECBAgQIAAAQIECBAgQIAAAQJlAgKsMidVBAgQIECAAAECBAgQIECAAAEClQQEWJXgtSVAgAABAgQIECBAgAABAgQIECgTEGCVOakiQIAAAQIECBAgQIAAAQIECBCoJCDAqgSvLQECBAgQIECAAAECBAgQIECAQJmAAKvMSRUBAgQIECBAgAABAgQIECBAgEAlAQFWJXhtCRAgQIAAAQIECBAgQIAAAQIEygQEWGVOqggQIECAAAECBAgQIECAAAECBCoJCLAqwWtLgAABAgQIECBAgAABAgQIECBQJiDAKnNSRYAAAQIECBAgQIAAAQIECBAgUElAgFUJXlsCBAgQIECAAAECBAgQIECAAIEyAQFWmZMqAgQIECBAgAABAgQIECBAgACBSgICrErw2hIgQIAAAQIECBAgQIAAAQIECJQJ/Afd2TFmRUokcgAAAABJRU5ErkJggg==&quot; style=&quot;text-align: left;&quot; width=&quot;346&quot; /&gt;&amp;nbsp;&lt;/div&gt;&lt;google-sheets-html-origin&gt;&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; dir=&quot;ltr&quot; style=&quot;border-collapse: collapse; border: none; font-family: Arial; font-size: 10pt; table-layout: fixed; width: 0px;&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;colgroup&gt;&lt;col width=&quot;85&quot;&gt;&lt;/col&gt;&lt;col width=&quot;65&quot;&gt;&lt;/col&gt;&lt;col width=&quot;65&quot;&gt;&lt;/col&gt;&lt;col width=&quot;65&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;% of CPU usage with different codecs&amp;quot;}&quot; style=&quot;border-color: rgb(204, 204, 204) transparent rgb(204, 204, 204) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; overflow: visible; padding: 2px 0px; vertical-align: bottom;&quot;&gt;&lt;div style=&quot;left: 3px; overflow: hidden; position: relative; white-space: nowrap; width: 278px;&quot;&gt;&lt;div style=&quot;float: left;&quot;&gt;% of CPU usage with different codecs&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;border-color: rgb(204, 204, 204) transparent rgb(204, 204, 204) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;&lt;/td&gt;&lt;td style=&quot;border-color: rgb(204, 204, 204) transparent rgb(204, 204, 204) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;QVGA&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;QVGA&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;200Kbps&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;200Kbps&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;800Kbps&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;800Kbps&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;2Mbps&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;2Mbps&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;VP8&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;VP8&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:18}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;18&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:22}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;22&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:28}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;28&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;VP9&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;VP9&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:20}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;20&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:28}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;28&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:33}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;33&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;H264&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;H264&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:10}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;10&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:14}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;14&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:15}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;15&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;AV1&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;AV1&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:36}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;36&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:46}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;46&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:50}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;50&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/google-sheets-html-origin&gt;&lt;/google-sheets-html-origin&gt;&lt;h4 style=&quot;clear: both; text-align: left;&quot;&gt;VGA results&lt;/h4&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;For VGA the results were not very different but at low bitrates only VP9 was able to maintain the resolution and AV1 was using more than 1 core when increasing the bitrate limit to 2 Mbps.&amp;nbsp; &amp;nbsp;Quality of H.264 at 200Kbps was really bad with very low framerate and lot of blocking as adaptation is apparently not working well in this case in Chrome.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;google-sheets-html-origin style=&quot;text-align: start;&quot;&gt;&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; dir=&quot;ltr&quot; style=&quot;border-collapse: collapse; border: none; font-family: Arial; font-size: 10pt; table-layout: fixed; width: 0px;&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;colgroup&gt;&lt;col width=&quot;100&quot;&gt;&lt;/col&gt;&lt;col width=&quot;71&quot;&gt;&lt;/col&gt;&lt;col width=&quot;71&quot;&gt;&lt;/col&gt;&lt;col width=&quot;71&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;% of CPU usage with different codecs&amp;quot;}&quot; style=&quot;border-color: rgb(204, 204, 204) transparent rgb(204, 204, 204) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; overflow: visible; padding: 2px 0px; vertical-align: bottom;&quot;&gt;&lt;div style=&quot;left: 3px; overflow: hidden; position: relative; white-space: nowrap; width: 239px;&quot;&gt;&lt;div style=&quot;float: left;&quot;&gt;% of CPU usage with different codecs&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;border-color: rgb(204, 204, 204) transparent rgb(204, 204, 204) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;VGA&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;VGA&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;200Kbps&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;200Kbps&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;800Kbps&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;800Kbps&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;2Mbps&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;2Mbps&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;VP8&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;VP8&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:18}&quot; style=&quot;background-color: #f1c232; border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;18&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:30}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;30&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:46}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;46&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;VP9&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;VP9&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:26}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;26&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:38}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;38&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:40}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;40&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;H264&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;H264&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:8}&quot; style=&quot;background-color: #cc0000; border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;8&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:13}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;13&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:16}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;16&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;AV1&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); font-weight: bold; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;AV1&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:33}&quot; style=&quot;background-color: #f1c232; border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;33&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:80}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;80&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:150}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;150&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/google-sheets-html-origin&gt;&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;HD (1280x720) results&lt;/h4&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;HD results were similar to VGA but AV1 was not able to encode the original resolution and downscaled it in the tests with all the bitrates.&amp;nbsp; H264 also behaved very poorly at low bitrate and the difference between VP8 and VP9 cost was much higher than with VGA.&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;google-sheets-html-origin style=&quot;text-align: start;&quot;&gt;&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; dir=&quot;ltr&quot; style=&quot;border-collapse: collapse; border: none; font-family: Arial; font-size: 10pt; table-layout: fixed; width: 0px;&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;colgroup&gt;&lt;col width=&quot;100&quot;&gt;&lt;/col&gt;&lt;col width=&quot;71&quot;&gt;&lt;/col&gt;&lt;col width=&quot;71&quot;&gt;&lt;/col&gt;&lt;col width=&quot;71&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;% of CPU usage with different codecs&amp;quot;}&quot; style=&quot;border-color: rgb(204, 204, 204) transparent rgb(204, 204, 204) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; overflow: visible; padding: 2px 0px; vertical-align: bottom;&quot;&gt;&lt;div style=&quot;left: 3px; overflow: hidden; position: relative; white-space: nowrap; width: 239px;&quot;&gt;&lt;div style=&quot;float: left;&quot;&gt;% of CPU usage with different codecs&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;border-color: rgb(204, 204, 204) transparent rgb(204, 204, 204) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;HD&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;HD&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;200Kbps&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;200Kbps&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;800Kbps&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;800Kbps&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;2Mbps&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;2Mbps&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;VP8&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;VP8&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:17}&quot; style=&quot;background-color: #f1c232; border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;17&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:30}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;30&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:65}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;65&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;VP9&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;VP9&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:30}&quot; style=&quot;background-color: #f1c232; border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;30&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:50}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;50&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:80}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;80&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;H264&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;H264&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:8}&quot; style=&quot;background-color: #cc0000; border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;8&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:12}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;12&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:16}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;16&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 21px;&quot;&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;AV1&amp;quot;}&quot; style=&quot;border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; vertical-align: bottom;&quot;&gt;AV1&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:35}&quot; style=&quot;background-color: #f1c232; border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;35&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:48}&quot; style=&quot;background-color: #f1c232; border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;48&lt;/td&gt;&lt;td data-sheets-value=&quot;{&amp;quot;1&amp;quot;:3,&amp;quot;3&amp;quot;:90}&quot; style=&quot;background-color: #f1c232; border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;&quot;&gt;90&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/google-sheets-html-origin&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;i&gt;(In addition AV1 with HD resolution crashed often with a memory issue in a Mac related code, but maybe the bug is fixed at the time you read this)&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Encoding vs Decoding cost&lt;/h4&gt;I did one more test to split the cost between encoding (Sender side) and decoding (Receiver side).&amp;nbsp; &amp;nbsp;That test was performed for VGA at 800 Kbps and the results were the next ones for the four codecs under consideration.&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img height=&quot;247&quot; src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAALmCAYAAABSJm0fAAAgAElEQVR4XuzdC9xt9Zw/8F/JOaopTU1FIXQzpNs5KV1QiqEMQjJSzRTKjBJNElFTMg2pkJJSf2JymUSRmVwaiaGbw8ilkm4k4t9FdP+/vmtmP/999nl2Zz/P3vv5/X57vdfr5aXOs9b6fdf7++u3n/N5rbX2Mg899NBDyUaAAAECBAgQIECAAAECBAgQIECgUIFlBFiFdkZZBAgQIECAAAECBAgQIECAAAECjYAAy0QgQIAAAQIECBAgQIAAAQIECBAoWkCAVXR7FEeAAAECBAgQIECAAAECBAgQICDAMgcIECBAgAABAgQIECBAgAABAgSKFhBgFd0exREgQIAAAQIECBAgQIAAAQIECAiwzAECBAgQIECAAAECBAgQIECAAIGiBQRYRbdHcQQIECBAgAABAgQIECBAgAABAgIsc4AAAQIECBAgQIAAAQIECBAgQKBoAQFW0e1RHAECBAgQIECAAAECBAgQIECAgADLHCBAgAABAgQIECBAgAABAgQIEChaQIBVdHsUR4AAAQIECBAgQIAAAQIECBAgIMAyBwgQIECAAAECBAgQIECAAAECBIoWEGAV3R7FESBAgAABAgQIECBAgAABAgQICLDMAQIECBAgQIAAAQIECBAgQIAAgaIFBFhFt0dxBAgQIECAAAECBAgQIECAAAECAixzgAABAgQIECBAgAABAgQIECBAoGgBAVbR7VEcAQIECBAgQIAAAQIECBAgQICAAMscIECAAAECBAgQIECAAAECBAgQKFpAgFV0exRHgAABAgQIECBAgAABAgQIECAgwDIHCBAgQIAAAQIECBAgQIAAAQIEihYQYBXdHsURIECAAAECBAgQIECAAAECBAgIsMwBAgQIECBAgAABAgQIECBAgACBogUEWEW3R3EECBAgQIAAAQIECBAgQIAAAQICLHOAAAECBAgQIECAAAECBAgQIECgaAEBVtHtURwBAgQIECBAgAABAgQIECBAgIAAyxwgQIAAAQIECBAgQIAAAQIECBAoWkCAVXR7FEeAAAECBAgQIECAAAECBAgQICDAMgcIECBAgAABAgQIECBAgAABAgSKFhBgFd0exREgQIAAAQIECBAgQIAAAQIECAiwzAECBAgQIECAAAECBAgQIECAAIGiBQRYRbdHcQQIECBAgAABAgQIECBAgAABAgIsc4AAAQIECBAgQIAAAQIECBAgQKBoAQFW0e1RHAECBAgQIECAAAECBAgQIECAgADLHCBAgAABAgQIECBAgAABAgQIEChaQIBVdHsUR4AAAQIECBAgQIAAAQIECBAgIMAyBwgQIECAAAECBAgQIECAAAECBIoWEGAV3R7FESBAgMCoBE668N50waL70wrzRnXGlFZZYZn02h3mpS2e/IjRndSZCKSU/vCxD6c/nXdOSvPmj8xjmT/7s7TiXq9L85/13JGd04kIECBAgAABAnMlIMCaK2njECBAgEA2gf/zzXvTx79139jG//xBK6SVl19m6PN/4hOfSA888MDA53nCE56Qdthhh4H3L3XH73znO+mnP/1pWnvttdNOO+3UlPmrX/0q/fu//3vzz3/zN3+T5s0bYfJYKsT/1vXHc85Od334/WOrctX/82/pEWs/fqjzxzw966yz0kMPPbTEeZZbbrn0Z3/2Z2nllVdOm2yySVpttdWGGqvEg3/xi1+kiy66KC277LJpzz33nCrxy1/+crr11lvTU5/61PSMZzyjxNLVRIAAAQIEqhUQYFXbOoUTIECAwKACB3/yT+nK6wcPhgY9b2e/9736UWmzdYa/CysCnJlsL3jBC9Jpp502k0OK3Pdtb3tb+vjHP56e85znpE9+8pNNjRdffHHafffdm3/+4Q9/mFZdddUiax9HUXccdVi65z+/Oo5TN+dc+fBj0vxn7zjU+e+555705Cc/eaBzvP71r0/xvzXXXHOg/WvY6Ytf/GLaf//9m1JvvvnmqZJf8pKXpEsvvTS99rWvTUcccUQNl6JGAgQIECBQjYAAq5pWKZQAAQIEZitQW4AVd6+stdZaS73cZz/72RPxl2QB1uKtri3A6p2vEW7ddttt6a677pq6sNgn7lh67GMfu9R5XcMOAqwauqRGAgQIEJg0AQHWpHXU9RAgQIDAEgK1BVhvfOMb06GHHtqaTk4XYN15553p6quvbgziMbRHPGL4O9xqAa0twHrrW9+aDjjggCV4b7jhhvSBD3wg/eu//mvzs2c961nNHXbx2F3tW78A62c/+1kT3MXdZjO9o7J2E/UTIECAAIFxCwiwxi3s/AQIECCQXUCAlb0FD1vAdAFW2RWPt7pJCbA6SkcffXQ6+eSTm39997vfnfbee+/xAs7B2fsFWHMwtCEIECBAgEBrBQRYrW29CydAgEB7BNoQYP33f/93et/73tc8ehjv3onA4JJLLmn+t84666TNN988HXjggWn99ddfovH33XdfipdPx8vUv/rVrzYvUP/Lv/zLtPPOO6d99tmneRl393b//fc3d9Wcd955adGiRc0dJ1tuuWXaYost0t///d8vsX/n2Hgp++mnn94cE1u88ypegH3++ecv8Q6sH//4x+nYY49t9jvppJPSiiuuOBWAxJ1ZMc4yyyzT3NHz3e9+N11//fXpmc98Znre857X1DzdHVv/8R//0bwzrDN+vGT75S9/eYqX4Z944onpMY95TPrnf/7n7P9hTFqAFfNlwYIF6be//W3z3qx4v1nvdtlll6X4EoMrrrgi/fznP2/mX8zZN7zhDemJT3zitD2Ju50uvPDC9K1vfSt985vfTH/xF3+RNttss+Z9WzEXerdrr702fehDH0rf//73Uxwb/11svPHGabfdduv7ZQhXXXVVc0z8dxT1x11k8d/FSiut1NQWW/c7sN7znvc0X0jwV3/1V1PvcPu3f/u35r+VHXfcsfnfKaeckv7rv/6rebfb05/+9LTVVlulgw46KD360Y9eouZ4Ifypp57a/PcZc3yDDTZoru3Nb35zU1e8TD7exRX//dkIECBAgMCkCwiwJr3Dro8AAQIEUhsCrP/8z/9svq0v3jUUf/GPv9BPt51zzjmL/WX3wQcfbP7y/LnPfW7a/eMv+fGX7843ycW7jSL0iQBgui1ChAipFi5cuNiP4y/x0z1mFjtFzRGCDfIS9wgPIoCIF9hfcMEF09YQ32R45plnLvazuL4I8Kbb4hojHIj///a3v539v5hJC7AC9F/+5V+akDC26667brFvlTzuuOPS+9/f/1sXP/zhD6cXv/jFi/UlAtvnP//5fXsVIW68SL2zxZcExJ1+/bZXv/rV6ZhjjknxDYqdLeb49ttvP+0hnTkbP1zaS9wjiI1HKSPgvemmm5qAuHeLd4NFwNv9jY1/+MMf0i677DLtf2uxf+c80/lkn8QKIECAAAECYxAQYI0B1SkJECBAoCyB2gKsV73qVVPfcNZPMt4jFHemxF1IsXUCrM7+L3rRi9K+++6bHvWoR6WvfOUr6fjjj29+1B0Sxb/HX9rjDqfYXve616U99tgjPfTQQ01oFXd0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J513xf1jK+L/7Ld8etyqy47t/E48nEA8krbjjjsu8X6l7rPGI4SddwoNN9rwR//hYyenuz91xvAn6nOGVT74sfTIv9xobOd34tEIdH9D43RnfP7zn5/iBe7xrY02AgQIECDQBgEBVhu67BoJECDQcoG77nkoHflv96QrfvHAyCX+fqd5adct/AVy5LAjPuEtt9zSfMtcfBNd51vdIrCKF7n/1V/9Vdp4441HPOJwp7v9nQene7/9zeFOMs3RK+69X1phj78b+XmdcPQCDz74YPPFCqeffnqKL2uIl8/Hy/HjDsKFCxc2d1/NxTvkRn9lzkiAAAECBGYnIMCanZujCBAgQKBCgdvuemikVT/qkSmtOH+ZkZ7TycYvEMFA/G9pL/sefyUPP8KDt/1mtCUs98i07KNXGe05nW3OBO677z53W82ZtoEIECBAoEQBAVaJXVETAQIECBAgQIAAAQIECBAgQIDAlIAAy2QgQIAAAQIECBAgQIAAAQIECBAoWkCAVXR7FEeAAAECBAgQIECAAAECBAgQICDAMgcIECBAgAABAgQIECBAgAABAgSKFhBgFd0exREgQIAAAQIECBAgQIAAAQIECAiwzAECBAgQIECAAAECBAgQIECAAIGiBQRYRbdHcQQIECBAgAABAgQIECBAgAABAgIsc4AAAQIECBAgQIAAAQIECBAgQKBoAQFW0e1RHAECBAgQIECAAAECBAgQIECAgADLHCBAgAABAgQIECBAgAABAgQIEChaQIBVdHsUR4AAAQIECBAgQIAAAQIECBAgIMAyBwgQIECAAAECBAgQIECAAAECBIoWEGAV3R7FESBAgAABAgQIECBAgAABAgQICLDMAQIECBAgQIAAAQIECBAgQIAAgaIFBFhFt0dxBAgQIECAAAECBAgQIECAAAECAixzgAABAgQIECBAgAABAgQIECBAoGgBAVbR7VEcAQIECBAgQIAAAQIECBAgQICAAMscIECAAAECBAgQIECAAAECBAgQKFpAgFV0exRHgAABAgQIECBAgAABAgQIECAgwDIHCBAgQIAAAQIECBAgQIAAAQIEihYQYBXdHsURIECAAAECBAgQIECAAAECBAgIsMwBAgQIECBAgAABAgQIECBAgACBogUEWEW3R3EECBAgQIAAAQIECBAgQIAAAQICrErmwMKFC5tKL7vsskoq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YM2KzUEECBAgQIAAAQIEHlZAgGWCECBAQIA1Z3Pg7LPPTq961aua8c4444zmjqqH2z772c82wVVsF154Ydpxxx0XC7Ae97jHpZVXXnnqFPfff3+K0Oumm26a+rM11lgjXXnllWmttdaa+rPTTz897bvvvlP//opXvCL98pe/TJdccsnUn1199dVpvfXWm7GNAGvGZA4gQIAAAQIECBAgsFQBAdZSiexAgEDLBNyBNcaGd99RtcMOO6Svfe1rDzvaC1/4wnTBBRekCKp+8YtfpEc84hGLBVgXX3xx2nbbbZc4x2233Zb233//FAFYbPvss0867bTTmn9+8MEHmzu/4q6uOO/3v//9tNpqqzU/u/zyy5tHD2P7m7/5m/TJT35yxhoCrBmTOYAAAQIECBAgQIDAUgUEWEslsgMBAi0TEGCNueEHHHBA+uAHP9iMcuONNzYh0nRb3BG19tprNz86+uij09vf/vbmn7sfIewXYHWCqsc+9rHp1ltvTfFY4LXXXtscH3dWbbDBBs0/x+OFBx988GLDv/GNb0wf+tCHmrqivpluAqyZitmfAAECBAgQIECAwNIFBFhLN7IHAQLtEhBgjbnfV1xxRVqwYEEzyvvf//5p30PV+dlb3vKWZr8bbrghPf7xj2/+edAAK/aNxwTjccHYOu/ciscLO+c67rjj0pvf/ObFrjgeWYw7twRYY54ITk+AAAECBAgQIEBgBgICrBlg2ZUAgVYICLDmoM3xUvUf/OAHaeONN06LFi2adsT4RsD4dsCdd945xTcRdraZBFivfvWr06c+9anm0Hg/VjyCGFtn/LgTKx4hXH755Zs/j7u0Ou+9etOb3pSOP/74GWu4A2vGZA4gQIAAAQIECBAgsFQBAdZSiexAgEDLBARYc9Dwk08+Ob3hDW9oRvrhD3+YNtpoo8VGveyyy9IWW2zR/NnnP//59JKXvGTGAVYEZJ1vH9xqq63Sd77znalzfOlLX2peJh/vwVpppZXSa17zmvTb3/42feYzn2n2iT/71re+1QRsM90EWDMVsz8BAgQIECBAgACBpQsIsJZuZA8CBNolIMCag37/7ne/m3px+jve8Y501FFHLTbqQQcdlE444YQmSIpgad68edMGWO973/vSpptuOvWzBx54oPk2wXhMsfOerfjheeedl3bZZZfFxjj33HPTS1/60mmvtvuRxZlyCLBmKmZ/AgQIECBAgAABAksXEGAt3cgeBAi0S0CANUf93nPPPdMnPvGJtMYaa6Rf/epXadlll21Gvueee9Lqq6/e3B31tre9LR1zzDGLVdT9COEgpR5yyCHp2GOPndr1oYceSvFurc7jgTH+c57znGa8+MbD2OLOq7POOis9/elPH2SIxfYRYM2YzAEECBAgQIAAAQIEliogwFoqkR0IEGiZgABrjhr+jW98I+2www7NaN/85jfTdttt1/zzF77whalHBn/yk5+keBdW97a0ACsCqfXXX7/5X7zHqvMYYecc3Xde7b333umkk05KK6ywQvPjn//8581dWfH4YWy//vWvm4BtJpsAayZa9iVAgAABAgQIECAwmIAAazAnexEg0B4BAdYc9frBBx9M66yzTopvBdxvv/1SvBcrtl133bV571UEWhFs9W7dAVaEYNtuu+3ULnEXV+dOrn6XEY8Sxjuw4lsG4yXxnRe4d/b/8Y9/nJ761Kc2/zrdtxQujUeAtTQhPydAgAABAgQIECAwcwEB1szNHEGAwGQLCLDmsL/vec970mGHHda86+rWW29Nd9xxR1pzzTWbCuIRvvgWwYcLsC6++OLFAqxBSl933XWbO63i7qszzjhj2kM634D4ute9Ln3kIx8Z5LRT+wiwZsRlZwIECBAgQIAAAQIDCQiwBmKyEwECLRIQYM1hs2+88cb0hCc8oRnx/PPPTzfffHN6/etf3wRat9xyy9Sjfd0ldd+BNZsAa8GCBc1L3uNRwXPOOWfaq+2EXPFNifGI4Uw2AdZMtOxLgAABAgQIECBAYDABAdZgTvYiQKA9AgKsOe5155G+ffbZJ1133XUpAqoDDjggnXjiidNWMmyAFXdVffSjH21CsmuvvbZ5YXz3duWVV6bNN9+8+aO4Qyvu1JrJJsCaiZZ9CRAgQIAAAQIECAwmIMAazMleBAi0R0CANce9jvddxXuvure4Q2qzzTYbS4D17W9/O22zzTbNuePbBs8777ypu8AWLVqUdtttt+bdWBFwXX311VOPNA7KIsAaVMp+BAgQIECAAAECBAYXEGANbmVPAgTaISDAmuM+33PPPc1dUHfeeWczctz9dPnll/etYtg7sOLERx55ZDriiCOmxthggw3Scsstl6666qqpP4tHGnfeeecZawiwZkzmAAIECBAgQIAAAQJLFRBgLZXIDgQItExAgJWh4Yceemg69thjm5FPPfXU9NrXvrZvFRdddFHafvvtm59fcsklaeutt55VxfFNhPGoYrzQvXuLbz/88Ic/nDbaaKNZnVeANSs2BxEgQIAAAQIECBB4WAEBlglCgACBxQUEWC2bEbfddlvzqOD8+fNT3Im14oorDiUgwBqKz8EECBAgQIAAAQIEphUQYJkYBAgQEGCZAyMUEGCNENOpCBAgQIAAAQIECPyvgADLVCBAgIAAyxwYoYAAa4SYTkWAAAECBAgQIEBAgGUOECBAYFoBjxCaGEMJCLCG4nMwAQIECBAgQIAAgWkF3IFlYhAgQGBxAQGWGTGUgABrKD4HEyBAgAABAgQIEBBgmQMECBAYQECANQCSXfoLCLDMDgIECBAgQIAAAQKjF3AH1uhNnZEAgboFBFh19y979QKs7C1QAAECBAgQIECAwAQKCLAmsKkuiQCBoQQEWEPxOViAZQ4QIECAAAECBAgQGL2AAGv0ps5IgEDdAgKsuvuXvXoBVvYWKIAAAQIECBAgQGACBQRYE9hUl0SAwFACAqyh+BwswDIHCBAgQIAAAQIECIxeQIA1elNnJECgbgEBVt39y169ACt7CxRAgAABAgQIECAwgQICrAlsqksiQGAoAQHWUHwOFmCZAwQIECBAgAABAgRGLyDAGr2pMxIgULeAAKvu/mWvXoCVvQUKIECAAAECBAgQmEABAdYENtUlESAwlIAAayg+BwuwzAECBAgQIECAAAECoxcQYI3e1BkJEKhbQIBVd/+yVy/Ayt4CBRAgQIAAAQIECEyggABrApvqkggQGEpAgDUUn4MFWOYAAQIECBAgQIAAgdELCLBGb+qMBAjULSDAqrt/2asXYGVvgQIIECBAgAABAgQmUECANYFNdUkECAwlIMAais/BAixzgAABAgQIECBAgMDoBQRYozd1RgIE6hYQYNXdv+zVC7Cyt0ABBAgQIECAAAECEyggwJrAprokAgSGEhBgDcXnYAGWOUCAAAECBAgQIEBg9AICrNGbOiMBAnULCLDq7l/26gVY2VugAAIECBAgQIAAgQkUEGBNYFNdEgECQwkIsIbic7AAyxwgQIAAAQIECBAgMHoBAdboTZ2RAIG6BQRYdfcve/UCrOwtUAABAgQIECBAgMAECgiwJrCpLokAgaEEBFhD8TlYgGUOECBAgAABAgQIEBi9gABr9KbOSIBA3QICrLr7l716AVb2FiiAAAECBAgQIEBgAgUEWBPYVJdEgMBQAgKsofgcLMAyBwgQIECAAAECBAiMXkCANXpTZyRAoG4BAVbd/ctevQArewsUQIAAAQIECBAgMIECAqwJbKpLIkBgKAEB1lB8DhZgmQMECBAgQIAAAQIERi8gwBq9qTMSIFC3gACr7v5lr16Alb0FCiBAgAABAgQIEJhAAQHWBDbVJREgMJSAAGsoPgcLsMwBAgQIECBAgAABAqMXEGCN3tQZCRCoW0CAVXf/slcvwMreAgUQIECAAAECBAhMoIAAawKb6pIIEBhKQIA1FJ+DBVjmAAECBAgQIECAAIHRCwiwRm/qjAQI1C0gwKq7f9mrF2Blb4ECCBAgQIAAAQIEJlBAgDWBTXVJBAjMWmCZ5VdI1x9xXHP8ggULZn2ecRy4zEMPPfTQOE7snKMVEGCN1tPZCBAgQIAAAQIECISAAMs8IECAwP8XmP+cndLVL9hVgGVSzF5AgDV7O0cSIECAAAECBAgQ6CcgwDI3CBAg8D8Cy8yfn1Y58bS06Pa7BFgmxewFBFizt3MkAQIECBAgQIAAAQGWOUCAAIHpBeKxwXlbbpNW2H3PtNx6G6bLL79cgGWyzF5g4cKFzcGXXXbZ7E/iSAIEJlKg1A+YicR2UQQqE7A+VNYw5RKYQwHrwxxiG4pAZQKlrg/egVXJRBJgVdIoZRLIIFDqB0wGCkMSINAjYH0wJQgQ6CdgfTA3CBCobX0QYFUyZwVYlTRKmQQyCPgFNAO6IQlUImB9qKRRyiSQQcD6kAHdkAQqESh1fRBgVTKBBFiVNEqZBDIIlPoBk4HCkAQI9AhYH0wJAgRqu8NCxwgQyC9Q6u8PAqz8c2OgCgRYAzHZiUArBUr9gGllM1w0gcIErA+FNUQ5BAoSsD4U1AylEChMoNT1QYBV2ETpV44Aq5JGKZNABoFSP2AyUBiSAIEeAeuDKUGAQD8B64O5QYBAbeuDAKuSOSvAqqRRyiSQQcAvoBnQDUmgEgHrQyWNUiaBDALWhwzohiRQiUCp64MAq5IJJMCqpFHKJJBBoNQPmAwUhiRAoEfA+mBKECBQ2x0WOkaAQH6BUn9/EGDlnxsDVSDAGojJTgRaKVDqB0wrm+GiCRQmYH0orCHKIVCQgPWhoGYohUBhAqWuDwKswiZKv3IEWJU0SpkEMgiU+gGTgcKQBAj0CFgfTAkCBPoJWB/MDQIEalsfBFiVzFkBViWNUiaBDAJ+Ac2AbkgClQhYHypplDIJZBCwPmRANySBSgRKXR8EWJVMIAFWJY1SJoEMAqV+wGSgMCQBAj0C1gdTggCB2u6w0DECBPILlPr7gwAr/9wYqAIB1kBMdiLQSoFSP2Ba2QwXTaAwAetDYQ1RDoGCBKwPBTVDKQQKEyh1fRBgFTZR+pUjwKqkUcokkEGg1A+YDBSGJECgR8D6YEoQINBPwPpgbhAgUNv6IMCqZM4KsCpplDIJZBDwC2gGdEMSqETA+lBJo5RJIIOA9SEDuiEJVCJQ6vogwKpkAgmwKmmUMglkECj1AyYDhSEJEOgRsD6YEgQI1HaHhY4RIJBfoNTfHwRY+efGQBUIsAZishOBVgqU+gHTyma4aAKFCVgfCmuIcggUJGB9KKgZSiFQmECp64MAq7CJ0q8cAVYljVImgQwCpX7AZKAwJAECPQLWB1OCAIF+AtYHc4MAgdrWBwFWJXNWgFVJo5RJIIOAX0AzoBuSQCUC1odKGqVMAhkErA8Z0A1JoBKBUtcHAVYlE0iAVUmjlEkgg0CpHzAZKAxJgECPgPXBlCBAoLY7LHSMAIH8AqX+/iDAyj83BqpAgDUQk50ItFKg1A+YVjbDRRMoTMD6UFhDlEOgIAHrQ0HNUAqBwgRKXR8EWIVNlH7lCLAqaZQyCWQQKPUDJgOFIQkQ6BGwPpgSBAj0E7A+mBsECNS2PgiwKpmzAqxKGqVMAhkE/AKaAd2QBCoRsD5U0ihlEsggYH3IgG5IApUIlLo+CLAqmUACrEoapUwCGQRK/YDJQGFIAgR6BKwPpgQBArXdYaFjBAjkFyj19wcBVv65MVAFAqyBmOxEoJUCpX7AtLIZLppAYQLWh8IaohwCBQlYHwpqhlIIFCZQ6vogwCpsovQrR4BVSaOUSSCDQKkfMBkoDEmAQI+A9cGUIECgn4D1wdwgQKC29UGAVcmcFWBV0ihlEsgg4BfQDOiGJFCJgPWhkkYpk0AGAetDBnRDEqhEoNT1QYBVyQQSYFXSKGUSyCBQ6gdMBgpDEiDQI2B9MCUIEKjtDgsdI0Agv0Cpvz8IsPLPjYEqEGANxGQnAq0UKPUDppXNcNEEChOwPhTWEOUQKEjA+lBQM5RCoDCBUtcHAVZhE6VfOQKsShqlTAIZBEr9gMlAYUgCBHoErA+mBAEC/QSsD+YGAQK1rQ8CrErmrACrkkYpk0AGAb+AZkA3JIFKBKwPlTRKmQQyCFgfMqAbkkAlAqWuDwKsSiaQAKuSRimTQAaBUj9gMlAYkgCBHgHrgylBgEBtd1joGAEC+QVK/f1BgJV/bgxUgQBrICY7EWilQKkfMK1shosmUJiA9aGwhiiHQEEC1oeCmqEUAoUJlLo+CLAKmyj9yhFgVdIoZRLIIFDqB0wGCkMSINAjYH0wJQgQ6CdgfTA3CBCobX0QYFUyZwVYlTRKmQQyCPgFNAO6IQlUImB9qKRRyiSQQcD6kAHdkAQqESh1fRBgVTKBBFiVNEqZBDIIlPoBk4HCkAQI9AhYH0wJAgRqu8NCxwgQyC9Q6u8PAqz8c2OgCgRYAzHZiUArBUr9gGllM1w0gcIErA+FNUQ5BAoSsD4U1AylEChMoNT1QYBV2ETpV44Aq5JGKZNABoFSP2AyUBiSAIEeAeuDKUGAQD8B64O5QYBAbeuDAKuSOSvAqqRRyiSQQcAvoBnQDUmgEgHrQyWNUiaBDALWhwzohiRQiUCp64MAq5IJJMCqpFHKJJBBoNQPmAwUhiRAoEfA+mBKECBQ2x0WOkaAQH6BUn9/EGDlnxsDVSDAGojJTgRaKVDqB0wrm+GiCRQmYH0orCHKIVCQgPWhoGYohUBhAqWuDwKswiZKv3IEWJU0SpkEMgiU+gGTgcKQBAj0CFgfTAkCBPoJWB/MDQIEalsfBFiVzFkBViWNUiaBDAJ+Ac2AbkgClQhYHypplDIJZBCwPmRANySBSgRKXR8EWJVMIAFWJY1SJoEMAqV+wGSgMCQBAj0C1gdTggCB2u6w0DECBPILlPr7gwAr/9wYqAIB1kBMdiLQSoFSP2Ba2QwXTaAwAetDYQ1RDoGCBKwPBTVDKQQKEyh1fRBgFTZR+pUjwKqkUcokkEGg1A+YDBSGJECgR8D6YEoQINBPwPpgbhAgUNv6IMCqZM5uu9dH0vwN96ikWmUSIECAAAECBAgQIEBgcgXO/vr2k3txrqx1Asssv0Kat+U2aYXd90zLrbdhKjXgFmBVMjUFWJU0SpkECBAgQIAAAQIECEy8gABr4lvcygtcZv78tMqJp6VFt9/VXP+CBQuKchBgFdWO/sUIsCpplDIJECBAgAABAgQIEJh4AQHWxLe4tRc4/zk7patfsKsAq7UzYAQXLsAaAaJTECBAgAABAgQIECBAYAQCAqwRIDpFkQLxOOH1RxwnwCqyO5UUJcCqpFHKJECAAAECBAgQIEBg4gUEWBPf4lZf4A3HnizAavUMGPLiBVhDAjqcAAECBAgQIECAAAECIxIQYI0I0mmKFBBgFdmWeooSYNXTK5USIECAAAECBAgQIDDZAgKsye5v269OgNX2GTDk9QuwhgR0OAECBAgQIECAAAECBEYkIMAaEaTTFCkgwCqyLfUUJcCqp1cqJUCAAAECBAgQIEBggcKIvgAAIABJREFUsgUEWJPd37ZfnQCr7TNgyOsXYA0J6HACBAgQIECAAAECBAiMSECANSJIpylSQIBVZFvqKUqAVU+vVEqAAAECBAgQIECAwGQLCLAmu79tvzoBVttnwJDXL8AaEtDhBAgQIECAAAECBAgQGJGAAGtEkE5TpIAAq8i21FOUAKueXqmUAAECBAgQIECAAIHJFhBgTXZ/2351Aqy2z4Ahr1+ANSSgwwkQIECAAAECBAgQIDAiAQHWiCCdpkgBAVaRbamnKAFWPb1SKQECBAgQIECAAAECky0gwJrs/rb96gRYbZ8BQ16/AGtIQIcTIECAAAECBAgQIEBgRAICrBFBOk2RAgKsIttST1ECrHp6pVICBAgQIECAAAECBCZbQIA12f1t+9UJsNo+A4a8fgHWkIAOJ0CAAAECBAgQIECAwIgEBFgjgnSaIgUEWEW2pZ6iBFj19EqlBAgQIECAAAECBAhMtoAAa7L72/arE2C1fQYMef0CrCEBHU6AAAECBAgQIECAAIERCQiwRgTpNEUKCLCKbEs9RQmw6umVSgkQIECAAAECBAgQmGwBAdZk97ftVyfAavsMGPL6BVhDAjqcAAECBAgQIECAAAECIxIQYI0I0mmKFBBgFdmWeooSYNXTK5USIECAAAECBAgQIDDZAgKsye5v269OgNX2GTDk9QuwhgR0OAECBAgQIECAAAECBEYkIMAaEaTTFCkgwCqyLfUUJcCqp1cqJUCAAAECBAgQIEBgsgUEWJPd37ZfnQCr7TNgyOsXYA0J6HACBAgQIECAAAECBAiMSECANSJIpylSQIBVZFvqKUqAVU+vVEqAAAECBAgQIECAwGQLCLAmu79tvzoBVttnwJDXL8AaEtDhBAgQIECAAAECBAgQGJGAAGtEkE5TpIAAq8i21FOUAKueXqmUAAECBAgQIECAAIHJFhBgTXZ/2351Aqy2z4Ahr1+ANSSgwwkQIECAAAECBAgQIDAiAQHWiCCdpkgBAVaRbamnKAFWPb1SKQECBAgQIECAAAECky0gwJrs/rb96gRYbZ8BQ16/AGtIQIcTIECAAAECBAgQIEBgRAICrBFBOk2RAgKsIttST1ECrHp6pVICBAgQIECAAAECBCZbQIA12f1t+9UJsNo+A4a8fgHWkIAOJ0CAAAECBAgQIECAwIgEBFgjgnSaIgUEWGNsyymnnJIeeOCBtOaaa6aXv/zlA410/vnnp+uvvz6tuOKKae+9904333xzOvfcc/seO2/evLTqqqumhQsXpnXWWedhx7jpppvSFVdckX784x+n1VZbLW266abNccNsAqxh9BxLgAABAgQIECBAgACB0QkIsEZn6UzlCQiwxtiT5z73uenrX/96M8Lvf//7tMoqqzzsaHfffXd6zGMek+6888602267pU9/+tPN8XGeQbaddtopvfe9702bbLLJYrvff//96Z//+Z/T4YcfvsRptttuu/SFL3wh/fmf//kgQyyxjwBrVmwOIkCAAAECBAgQIECAwMgFBFgjJ3XCggQEWGNsxtlnn51e9apXNSOcccYZzR1VD7d99rOfbYKr2C688MK04447LhZgPe5xj0srr7zy1CkimIrQK+6s6mxrrLFGuvLKK9Naa6019WdveMMb0sknn9z8e/z8ZS97WbrnnnvSxz72sebPIvj68pe/nJZbbrkZawiwZkzmAAIECBAgQIAAAQIECIxFQIA1FlYnLURAgDXGRnTfUbXDDjukr33taw872gtf+MJ0wQUXpAiqfvGLX6RHPOIRiwVYF198cdp2222XOMdtt92W9t9//xQBWGz77LNPOu2005p//va3v5222WabqaAq7urq3G11zTXXND+79dZb00EHHZTe//73z1hDgDVjMgcQIECAAAECBAgQIEBgLAICrLGwOmkhAgKsMTfigAMOSB/84AebUW688cYmnJpu++Uvf5nWXnvt5kdHH310evvb3978c/cjhP0CrNjvwQcfTI997GObMOrJT35yuvbaa5vjDzzwwPSBD3yg7/gRaO2+++7Nz3/1q181jzDOZBNgzUTLvgQIECBAgAABAgQIEBifgABrfLbOnF9AgDXmHsRL0xcsWNCMEnc4xZ1O023xs7e85S3Nj2644Yb0+Mc/vvnnQQOs2HffffdNp59+enNc551bnfdwvehFL0pf/OIXlxg69ouXwMcWjzy+8pWvnJGIAGtGXHYmQIAAAQIECBAgQIDA2AQEWGOjdeICBARYc9CEeKn6D37wg7TxxhunRYsWTTvihhtumH72s5+lnXfeOcU3EXa2mQRYr371q9OnPvWp5tB4P1Y8grjuuuumn//85yneg3XSSSctMXZ8S2Ln3VdHHnlkeuc73zkjEQHWjLjsTIAAAQIECBAgQIAAgbEJCLDGRuvEBQgIsOagCfEC9QiQYvvhD3+YNtpoo8VGveyyy9IWW2zR/NnnP//59JKXvGTGAVYEZJ1vH9xqq63Sd77zneYcnfdqPf/5z09f+cpXlrjaeNfWk570pObP3/SmN6Xjjz9+RiICrBlx2ZkAAQIECBAgQIAAAQJjExBgjY3WiQsQEGDNQRN+97vfpdVWW60Z6R3veEc66qijFhs1His84YQT0korrZR++9vfpnnz5k0bYL3vfe9Lm2666dTP4u6peHdWPKbYec9W/PC8885Lu+yyS7PfoYcemo499tjmny+99NK0cOHCxcaOxxY7L2/fa6+90plnnjkjEQHWjLjsTIAAAQIECBAgQIAAgbEJCLDGRuvEBQgIsOaoCXvuuWf6xCc+kdZYY43mZenLLrtsM/I999yTVl999XTnnXemt73tbemYY45ZrKLuRwgHKfWQQw6ZCqxi/+uuu655qXtsEZCdccYZaaeddkp33XVXOuWUUxYL0/bee+/m5zPZBFgz0bIvAQIECBAgQIAAAQIExicgwBqfrTPnFxBgzVEPvvGNb6QddtihGe2b3/xm2m677Zp//sIXvjD1yOBPfvKTFO/C6t6WFmBFILb++us3/4tHADuPEXafo/sRxt7LfepTn9q8LyvevxV3gnXuxhqURYA1qJT9CBAgQIAAAQIECBAgMF4BAdZ4fZ09r4AAa478H3zwwbTOOuukm266Ke23334pQqXYdt111+a9VxFoRbDVu3UHWBGCbbvttlO7xF1cnTu5lnYZcWwEXPGurNgi+Iqx3/3udzfv34oXvXuJ+9IU/ZwAAQIECBAgQIAAAQLlCgiwyu2NyoYXEGANbzjwGd7znvekww47rHmU79Zbb0133HFHWnPNNZvjzzrrrBTfIvhwAdbFF1+8WIA18MBdO959993Ne7ae8IQnNH967733pvnz5z9sDQ83jjuwZtMFxxAgQIAAAQIECBAgQGD0AgKs0Zs6YzkCAqw57MWNN944FRydf/756eabb06vf/3rm0DrlltuSSussMLIA6z4lsErr7wyxR1gL3vZy5Y4f9z9FXdixXbNNdekddddd0YiAqwZcdmZAAECBAgQIECAAAECYxMQYI2N1okLEBBgzXET4tsBv/SlL6V99tmnecF6PCJ4wAEHpBNPPHHaSrofIZzNHVjxovb999+/OfePf/zj9JSnPGVqnPgWw+c973lNDfEurB/96Ecz1hBgzZjMAQQIECBAgAABAgQIEBiLgABrLKxOWoiAAGuOG9F9x1Nn6CuuuCJtttlmYwmwrr322rTeeus1537pS1/avHsrHlv8wx/+kA488MB0+umnNz8755xzmp/PdBNgzVTM/gQIECBAgAABAgQIEBiPgABrPK7OWoaAAGuO+3DPPfek1VdfPd15553NyJtvvnm6/PLL+1Yx7B1YceLDDz88HX300VNjxN1WV1111dS/x8vd49sHl1lmmRlrCLBmTOYAAgQIECBAgAABAgQIjEVAgDUWVictRECAlaERhx56aDr22GObkU899dT02te+tm8VF110Udp+++2bn19yySVp6623nnHF999/f/OI4sEHH7zYsfFNhEcddVQz/mzCqziZAGvG7XAAAQIECBAgQIAAAQIExiIgwBoLq5MWIiDAKqQRc1FG3P0V792Kb0Bce+210zrrrJOWW265oYYWYA3F52ACBAgQIECAAAECBAiMTECANTJKJypQQIBVYFNqKkmAVVO31EqAAAECBAgQIECAwCQLCLAmubuuTYBlDgwlIMAais/BBAgQIECAAAECBAgQGJmAAGtklE5UoIAAq8Cm1FSSAKumbqmVAAECBAgQIECAAIFJFhBgTXJ3XZsAyxwYSkCANRSfgwkQIECAAAECBAgQIDAyAQHWyCidqEABAVaBTampJAFWTd1SKwECBAgQIECAAAECkywgwJrk7ro2AZY5MJSAAGsoPgcTIECAAAECBAgQIEBgZAICrJFROlGBAgKsAptSU0kCrJq6pVYCBAgQIECAAAECBCZZQIA1yd11bQIsc2AoAQHWUHwOJkCAAAEC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QccTIECAAAECBAgQmL2AAGv2do4kQKAuAQFWXf0qrloBVnEtURABAgQIECBAgECLBARYLWq2SyXQcgEBVssnwLCXL8AaVtDxBAgQIECAAAECBGYvIMCavZ0jCRCoS0CAVVe/iqtWgFVcSxREgAABAgQIECDQIgEBVoua7VIJtFxAgNXyCTDs5QuwhhV0PAECBAgQIECAAIHZCwiwZm/nSAIE6hIQYNXVr+KqFWAV1xIFESBAgAABAgQItEhAgNWiZrtUAi0XEGC1fAIMe/kCrGEFHU+AAAECBAgQIEBg9gICrNnbOZIAgboEBFh19au4agVYxbVEQQQIECBAgAABAi0SEGC1qNkulUDLBQRYLZ8Aw16+AGtYQccTIECAAAECBAgQmL2AAGv2do4kQKAuAQFWXf0qrloBVnEtURABAgQIECBAgECLBARYLWq2SyXQcgEBVssnwLCXL8AaVtDxBAgQIECAAAECBGYvIMCavZ0jCRCoS0CAVVe/iqtWgFVcSxREgAABAgQIECDQIgEBVoua7VIJtFxAgNXyCTDs5QuwhhV0PAECBAgQIECAAIHZCwiwZm/nSAIE6hIQYNXVr+KqFWAV1xIFESBAgAABAgQItEhAgNWiZrtUAi0XEGC1fAIMe/kCrGEFHU+AAAECBAgQIEBg9gICrNnbOZIAgboEBFh19au4agVYxbVEQQQIECBAgAABAi0SEGC1qNkulUDLBQRYLZ8Aw16+AGtYQccTIECAAAECBAgQmL2AAGv2do4kQKAuAQFWXf0qrloBVnEtURABAgQIECBAgECLBARYLWq2SyXQcgEBVssnwLCXL8AaVtDxBAgQIECAAAECBGYvIMCavZ0jCRCoS0CAVVe/iqtWgFVcSxREgAABAgQIECDQIgEBVoua7VIJtFxAgNXyCTDs5QuwhhV0PAECBAgQIECAAIHZCwiwZm/nSAIE6hIQYM2wX7/97W/Tpz/96eaonXfeOT3xiU/se4aHHnoonXzyySn+f4sttkjPeMYzltj39ttvT9/97nfTtddem+6666603nrrpac//enN/z/cdtttt6Xvf//7adGiRWmFFVZIG264YXrWs56VHvGIRwx8RWeeeWb6wx/+kF72spelxzzmMQMf172jAGtWbA4iQIAAAQIECBAgMBIBAdZIGJ2EAIEKBARYM2zSlVdemTbffPPmqC9+8YvpRS96Ud8zPPDAA2m55ZZrfn7EEUekd73rXYvte+qpp6aDDz443XnnnUuc4x/+4R/S0UcfnR796Ecv8bOTTjopxc97t6jr4x//eHra05621Kv62Mc+lvbZZ59mv0suuSRtvfXWSz1muh0EWLNicxABAgQIECBAgACBkQgIsEbC6CQECFQgIMCaYZNGFWCdddZZ6TWveU0z+hprrJF23XXXtOKKK6YLL7ww/eAHP2j+/MUvfnE699xzF6vwzW9+czr++OOnjtttt93Srbfemj7zmc80f/a4xz2uOf7P//zP+17ZNddck9Zff/2pnwuwZjgJ7E6AAAECBAgQIECgEAEBViGNUAYBAmMXEGDNkHgUAdbdd9/dhFWxbbXVVunLX/7yVOAUd20dcsgh6f3vf3/z8/PPP795VDG2eMyw82hhhFvnnHNOWnbZZZufffazn02pAuS0AAAgAElEQVQRZsV2wgknpAMPPHDaK7v//vubu60uvfRSAdYMe293AgQIECBAgAABAqUJCLBK64h6CBAYl4AAa4ayowiwLrroorT99ts3I0eQtHDhwsWquO+++9Jqq63WPFr4jne8Ix111FHNz9/4xjemD33oQ81dVvHuq1VXXXXquHjP1kYbbZSuuuqqJvCK4Gu67Z/+6Z+WeJTRHVgznAR2J0CAAAECBAgQIFCIgACrkEYogwCBsQsIsGZIPIoA63Of+1x6z3vek2666aZ08803T70nq7uUTTbZpHkUMB4zjPda/elPf0rLL798s8sZZ5yR9t577yUq/9WvfpXiDqsIv+LF7r3bf/3Xf6VnPvOZzR/HI4x77LFH888CrBlOArsTIECAAAECBAgQKERAgFVII5RBgMDYBQRYMyQeRYC1tCHjmw5XX331Zrd/+Zd/Sf/4j/+YrrvuuvTkJz+5+bOf//zn6UlPelKKwCpCqXhR/MYbb5zWWWedvqeOu7k23XTT5ti4q+t1r3tdesITniDAWloz/JwAAQIECBAgQIBAwQICrIKbozQCBEYqIMCaIWd3gBXfBLjFFlv0PcODDz6Y/vZv/7b5+XTfQtjvwM6jgvHzCKi23HLL9O1vfztts802zSERXL385S9v7pzq3uIdWKeccsq0L3Dfd9990+mnn94EXfHY4q9//WsB1gx7b3cCBAgQIECAAAECpQkIsErriHoIEBiXgABrhrLdAdZMDh00wProRz/a3B0V22tf+9p06qmnNv8cjx2+4hWvaP55gw02SD/72c/SSiutlJ72tKelH/3oR837smJ76lOfmqLGefPmTZX3+c9/vvmWw9j++7//uznmxhtvFGDNpIH2JUCAAAECBAgQIFCggACrwKYoiQCBsQgIsGbI2h1gRYDUeS9Vv9PceuutzY8GCbDiXVd77bVXs388LnjFFVekRz/60c2/x8vb486sznbooYemI488sgmq7r333vS2t71t6psL4/1a8fPYfvnLX6anPOUpTcDV/e2EAqwZNt7uBAgQIECAAAECBAoUEGAV2BQlESAwFgEB1gxZx/EOrPgGwXe/+93p8MMPb6qJbxmMxwM776iKPzvttNOaO7Jim+5bBuNxxXjEMB45jDu0fvrTn6b4sxe+8IXp3//939MOO+yQLrzwwrTssss25xBgzbDxdidAgAABAgQIECBQoIAAq8CmKIkAgbEICLBmyDrqAOu+++5L+++/f/N+qtjiHVUXXHBBWmuttRarLP4swqjYzj777PTKV75yicpPOumkFO/liu2Pf/xj+uQnP5ni3VexxR1cT3ziE6eOueWWW6Z+dswxxzTjrrvuus3dWjPZtt3rI2n+hv/zbYY2AgQIECBAgAABAgTmVkCANbfeRiNAIJ+AAGuG9qMMsOKxvnivVdwhFdvzn//89JnPfCatvPLKS1TVPe55552XdtlllyX26X5PVjy6eOyxx6bjjjtu4Cs85JBDmmNmsgmwZqJlXwIECBAgQIAAAQKjFRBgjdbT2QgQKFdAgDXD3owqwLr77rubRwEvuuiipoL99tsvfeADH0iPfOQjp63oN7/5TVpjjTWanx199NHp7W9/+xL7HX/88enNb35z8whiPCIY78L68Ic/PO354r1Znfdzxbu84l1bcffWW9/61hmJCLBmxGVnAgQIECBAgAABAiMVEGCNlNPJCBAoWECANcPmjCrAOuigg5qXqsf2rne9q3nJ+9K2v/7rv05x91W84+rSSy9d7E6t+++/P22yySbpqquuSnvvvXc644wzHvZ03oG1NG0/J0CAAAECBAgQIFC+gACr/B6pkACB0QgIsGboOIoAq/sccbdU5/1X05Wy+uqrp80226z50fe+97205ZZbNv8cd2+deeaZ6S/+4i/SPffck970pjelU045pfnZl7/8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AgQIECBAgAABAl0KKGB1qa0tAmUJKGCVlY/qolHAqi5lAiZAgAABAgQIECBQrYACVrWpEziBqQUUsKYm7PcbKGD1O/+OngABAgQIECBAgECXAgpYXWpri0BZAgpYZeWjumgUsKpLmYAJECBAgAABAgQIVCuggFVt6gROYGoBBaypCfv9BgpY/c6/oydAgAABAgQIECDQpYACVpfa2iJQloACVln5qC4aBazqUiZgAgQIECBAgAABAtUKKGBVmzqBE5haQAFrasJ+v4ECVr/z7+gJECBAgAABAgQIdCmggNWltrYIlCWggFVWPqqLRgGrupQJmAABAgQIECBAgEC1AgpY1aZO4ASmFlDAmpqw32+ggNXv/Dt6AgQIECBAgAABAl0KKGB1qa0tAmUJKGCVlY/qolHAqi5lAiZAgAABAgQIECBQrYACVrWpEziBqQUUsKYm7PcbKGD1O/+OngABAgQIECBAgECXAgpYXWpri0BZAgpYZeWjumgUsKpLmYAJECBAgAABAgQIVCuggFVt6gROYGoBBaypCfv9BgpY/c6/oydAgAABAgQIECDQpYACVpfa2iJQloACVln5qC4aBazqUiZgAgQIECBAgAABAtUKKGBVmzqBE5haQAFrasJ+v4ECVr/z7+gJECBAgAABAgQIdCmggNWltrYIlCWggJUxHxdeeGG65pprmgj23Xff9LCHPWy1aN7znvek++67L2222WZpv/32GyvS888/P91www1pgw02SC972ctGvubSSy9N8b8DDjggPfrRjx7rvWfbSQFr3nReSIAAAQIECBAgQIDAhAIKWBOC2Z3AEhJQwMqUzJ///Ofp4Q9/eLrllluaCN70pjelN7/5zatF88xnPjNdcsklzc/uuOOOtNFGG6012p/85Cdp8803Tz/+8Y/TC1/4wnTuuefOuv9VV12Vtttuu+Z3n/rUp9I+++wzbwUFrHnTeSEBAgQIECBAgAABAhMKKGBNCGZ3AktIQAErUzJjptSzn/3smdYf9KAHpVtvvTWtt956Mz8755xzmhlSsb3//e9f64yq2OdDH/pQU7iK7aKLLkq//du/vcbR/fCHP0y77LJLuu666xSwMuVeswQIECBAgAABAgQIzE9AAWt+bl5FYCkIKGBlymLcMvixj30s7bnnnumCCy5ooogC1OCtgoMzqvbYY4908cUXrzXavfbaq3mvmNl1/fXXp/vd736r7R8zsg499NBmhla7mYGVqQNolgABAgQIECBAgACBiQUUsCYm8wICS0ZAAStDKn/wgx+kLbbYomk5iljvete7mlsFd9999/TZz352tYiOOOKI5vex3XjjjU1xarbt+9//ftpyyy2bXx1//PHp6KOPntnt9ttvTwcffHD6xCc+scZLFbAydABNEiBAgAABAgQIECAwLwEFrHmxeRGBJSGggJUhjSeffHJ63ete17Qca1t99KMfTYccckjz76uvvjo97nGPm4nqiiuuSCtWrGj+Ha97zWteM2vEg+/53e9+Nz3iEY+Y2S8Wa4/iWGy77rprisXht99+++bfClgZOoAmCRAgQIAAAQIECBCYl4AC1rzYvIjAkhBQwOo4jatWrUqPfexj07e//e1mDaxPfvKT6bbbbkubbLJJE8lrX/vadNJJJ60W1ROf+MT01a9+NT3hCU9IV1555awRb7vtts177r333inW1xrcooB12GGHpWOPPbZ52uFPf/rTFGtuKWB1nHzNESBAgAABAgQIECAwlYAC1lR8XkygagEFrI7T98UvfjE95SlPaVqNmVfPf/7zm/9+0YtelM4777ymsHTzzTen9ddffyay0047rSlAxfa1r31t5gmC7Q6XX355evKTn9z8M25JfN7znrfaUf3yl79s/r3OOus0/3/33XcrYHWcd80RIECAAAECBAgQIDC9gALW9IbegUCtAgpYHWfula98ZTrjjDOaAtItt9ySHvCABzQRxOLrsQh7bMNPHIw1rDbeeOPmd8ccc0w67rjjVos6bit8xzve0bzn8JMMZzs8BayOk645AgQIECBAgAABAgQWREABa0EYvQmBKgUUsDpM22DhKBZnP+WUU2Za/8UvftEswh5FrZhN9eUvf3m1yA466KB01llnpYc+9KEpFoFvZ1Pde++9adNNN22eLHjUUUelt7zlLXMekQLWnER2IECAAAECBAgQIECgQAEFrAKTIiQCHQkoYHUEHc1EASoKUbHFTKqddtpptdbf9ra3pc9//vPNz+K2wHbx9vh3PJ1wjz32aH532WWXpac97WnNf8eTBdtbBr/5zW+mWAtrrk0Bay4hvydAgAABAgQIECBAoEQBBawSsyImAt0IKGB149y0sttuu80UqOZq9hWveEU6/fTTZ3aLdax+7dd+LX3ve99Lr3rVq1KsixVbLMoe615FQSsKW+NsCljjKNmHAAECBAgQIECAAIHSBBSwSsuIeAh0J6CA1ZH1t771rebpg7FtvfXWza2As21XXXVVcztgbLH21UMe8pCZ3U444YT0hje8YWb9rLvuuittttlmze8/8IEPpBe/+MVjHY0C1lhMdiJAgAABAgQIECBAoDABBazCEiIcAh0KKGB1hP3GN74xHX/88U1r1157bVPEmm173/velw455JDmV+9+97vT4YcfPrPbjTfemB75yEc2/z7//PPTTTfdlGJR+NmeXLi2w1LA6ijpmiFAgAABAgQIECBAYEEFFLAWlNObEahKQAGrg3QNLtC+6667pi984QsjW73zzjvTRhtt1Pz+MY95TIp1rZYtWzaz/z777JM+/elPN0Wu73znO+mSSy5JwwvCz3VIClhzCfk9AQIECBAgQIAAAQIlCihglZgVMRHoRkABqwPnCy64IO21115NS2eeeebMDKtRTUdxKmZixXbppZc2a2e1W6x3FeteDW5XXHFF2mGHHcY+EgWssansSIAAAQIECBAgQIBAQQIKWAUlQygEOhZQwOoAfL/99lVnKAoAACAASURBVEsf+chHmpaG17WarfmYodU+ZfDAAw9MZ5999sxu9957b9p0001n1sl60pOelFauXDnRUShgTcRlZwIECBAgQIAAAQIEChFQwCokEcIgkEFAAWuR0QdvCXzBC16QzjvvvDlbXLVqVdpmm23Sdddd1+x7xx13zNxWGP8+8sgj04knntj87owzzkiHHnronO85uMM999yTNtxww+ZHsZbW3nvvPdHrB3d+6ktPT8u3fcm8X++FBAgQIECAAAECBAgQGFdAAWtcKfsRWHoCClhLL6edHpECVqfcGiNAgAABAgQIECDQawEFrF6n38H3XEABq+cdYNrDV8CaVtDrCRAgQIAAAQIECBAYV0ABa1wp+xFYegIKWEsvp50ekQJWp9waI0CAAAECBAgQINBrAQWsXqffwfdcQAGr5x1g2sNXwJpW0OsJECBAgAABAgQIEBhXQAFrXCn7EVh6AgpYSy+nnR6RAlan3BojQIAAAQIECBAg0GsBBaxep9/B91xAAavnHWDaw1fAmlbQ6wkQIECAAAECBAgQGFdAAWtcKfsRWHoCClhLL6edHpECVqfcGiNAgAABAgQIECDQawEF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4Qmz7nvZZZelt7zlLem3fuu30rHHHpvh6DRJgMBcAnfeeWf60pe+1IwBd999d9pmm23S9ttv3/z/bNvPfvaz9LWvfW2tb/uQhzwkbb311qvtc8EFF6RPfepT6eabb06/+Zu/mV796lenTTfddNb3OfXUU5t9X/GKV6R99913rkPwewIEFkHg9ttvT9/5znfW+s6PfOQjZ/07jtf9x3/8R7rxxhuba4W4tthyyy1HvpfxYRES6C0JLILAT37yk/T1r3997HfeYYcd0v3vf/9m//leP/jsMTa3HQlkFbj00ktT/O+AAw5Ij370o0fG8otf/CJdcskl6ZprrkmrVq1KT37yk5vPBsuXL19r/CVeWyhgddzlzj333HTooYemH//4x6u1/KQnPSl95jOfWeOi9Itf/GJ6ylOeskaU559/ftp7771X+3l0xrhg/cpXvpL+5V/+Je25554dH53mCBCYS+CMM85If/Znf7bGGBCv+6M/+qN0/PHHpwc/+MGrvU0Uu6Iovbbtuc99bvr4xz8+s0sUpOL9BreHPvShTeFsq622Wu3nP/zhD9Pmm2/e/CyKXZttttlch+H3BAgsgsDb3/729PrXv36t7/zOd74z/fEf//HMPnHuP+qoo9KJJ564xusOOeSQ9J73vCetu+66q/3O+LAIyfOWBBZJIArTu+6669jvft1116Vf//Vfb/afz/WDzx5jU9uRQFaBKDRvt912TQzxJfQ+++wzazxf/epX0wte8IL07W9/e7XfP+hBD0oXX3xxU8wa3kq+tlDA6rDbXXjhhel3f/d3mxYf/vCHp+c85zkpPjh+5CMfaX4W35jGSWrjjTeeieqpT31q+vd///d04IEHpje84Q3pH//xH9Pb3va25vX/8z//s1rVNDpuvGd80P3P//zPDo9MUwQIjCPwgQ98IP3BH/xBs2sUk2Km0wYbbJAuuuiiFCeX2IYLUfGzM888syl8r20bfN0dd9yRfvVXf7XZPT7U/t7v/V468sgjU8y4iLHk7LPPXu2toqB20kknpWOOOSYdd9xx4xyKfQgQWASBF7/4xemDH/zgWt95uIAVs63f/OY3N6+JL8Oe/vSnp8svvzx9/vOfb34WF63nnXfezHsaHxYhcd6SwCIKTFrAuummm9IWW2zRRDTp9UO8xmePRUymtyawQAJRQ9hll11SFKxjG1XAivEg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gAABAgQIECBAgAABAgQITCyggDUxmRcQIECAAAECBAgQIECAAAECBAh0KaCA1aW2tggQIECAAAECBAgQIECAAAECBCYWUMCamMwLCBAgQIAAAQIECBAgQIAAAQIEuhRQwOpSW1sECBAgQIAAAQIECBAgQIAAAQITCyhgTUzmBQQIECBAgAABAgQIECBAgAABAl0KKGB1qa0tAgQIECBAgAABAgQIECBAgACBiQUUsCYm8wICBAgQIECAAAECBAgQIECAAIEuBRSwutTWFgECBAgQIECAAAECBAgQIECAwMQCClgTk3kBAQIECBAgQIAAAQIECBAgQIBAlwIKWF1qa4sAAQIECBAgQIAAAQIECBAgQGBiAQWsicm8gAABAgQIECBAgAABAgQIECBAoEsBBawutbVFgAABAgQIECBAgAABAgQIECAwsYAC1sRkXkCAAAECBAgQIECAAAECBAgQINClgAJWl9raIkCAAAECBAgQIECAAAECBAgQmFhAAWtiMi8gQIAAAQIECBAgQIAAAQIECBDoUkABq0ttbREgQIAAAQIECBAgQIAAAQIECEwsoIA1MZkXECBAgAABAgQIECBAgAABAgQIdCmggNWltrYIECBAgAABAgQIECBAgAABAgQmFlDAmpjMCwgQIECAAAECBAgQIECAAAECBLoUUMDqUltbBAgQIECAAAECBAgQIECAAAECEwsoYE1M5gUECBAgQIAAAQIECBAgQIAAAQJdCihgdamtLQIECBAgQIAAAQIECBAgQIAAgYkFFLAmJvMCAgQIECBAgAABAgQIECBAgACBLgUUsLrU1hYBAgQIECBAgAABAgQIECBAgMDEAgpYE5N5AQECBAgQIECAAAECBAgQIECAQJcCClhdamuLAAECBAgQIECAAAECBAgQIEBgYgEFrInJvIAAAQIECBAgQIAAAQIECBAgQKBLAQWsLrW1RYAAAQIECBAgQIAAAQIECBAgMLGAAtbEZF5AgAABAgQIECBAgAABAgQIECDQpYACVpfa2iJAgAABAgQIECBAgAABAgQIEJhYQAFrYjIvIECAAAECBAgQIECAAAECBAgQ6FJAAatLbW0RIECAAAECBAgQIECAAAECBAhMLKCANTGZFxAgQIAAAQIECBAgQIAAAQIECHQpoIDVpba2CBAgQIAAAQIECBAgQIAAAQIEJhZQwJqYzAsIECBAgAABAgQIECBAgAABAgS6FPh/oDSbSyybQfgAAAAASUVORK5CYII=&quot; width=&quot;400&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;The results are not very different but the decoding in case of VP9 and AV1X was relatively cheaper compared with the encoding.&lt;br /&gt;&lt;br /&gt;Comparing just the decoding cost with different codecs it looks like AV1 is around 2x more expensive than the others.&amp;nbsp; &amp;nbsp;VP9 is slightly more expensive than VP8 and VP8 slightly more expensive than H264 but without big differences between those three.&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Conclusions&lt;/h4&gt;Having new codecs is amazing and there is no doubt AV1 is the future of real-time video communications but it looks like we should wait a bit to be able to use it for general purpose videoconferencing applications.&amp;nbsp; &amp;nbsp;In the mean time we can probably use it for specific use cases like broadcasting, dedicated powerful devices or to encode the low resolution versions of the video streams when using simulcast.&lt;br /&gt;&lt;br /&gt;For other use cases VP8 and VP9 look like still the best options unless you don&#39;t worry that much about low bitrate cases or you are using high resolutions and battery/cpu consumption is a big concern and you can consider H264.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also there is apparently a new libaom patch coming that could improve the performance by a 15% so it would be good to repeat these tests with future versions of Chrome and different devices (AV1 could be potentially more optimized for ARM CPUs).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;i&gt;If you want to replicate the test and share your data I will update these tables/graphs with the average of the measurements.&amp;nbsp;&lt;span face=&quot;Roboto, sans-serif&quot; style=&quot;background-color: white; color: #444444; font-size: 15px;&quot;&gt;And as usual feedback is more than welcomed either here or&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://twitter.com/anarchyco&quot; style=&quot;background: rgb(255, 255, 255); color: #2196f3; font-family: Roboto, sans-serif; font-size: 15px; text-decoration-line: none;&quot;&gt;in Twitter&lt;/a&gt;&lt;span face=&quot;Roboto, sans-serif&quot; style=&quot;background-color: white; color: #444444; font-size: 15px;&quot;&gt;.&lt;br /&gt;&lt;br /&gt;Thx a lot for the early feedback from @murillo, @elminiero, @dan_jenkins, @maniksach.&lt;/span&gt;&lt;/i&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/1447126812316647064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2021/02/webrtc-video-codecs-performance.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/1447126812316647064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/1447126812316647064'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2021/02/webrtc-video-codecs-performance.html' title='WebRTC Video Codecs performance evaluation'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-339144383614122540</id><published>2019-10-24T06:21:00.000-07:00</published><updated>2019-10-24T06:21:53.870-07:00</updated><title type='text'>Speech recognition in Hangouts Meet</title><content type='html'>There are many possible applications for speech recognition in Real Time Communication services live captions, simultaneous translation, voice commands or storing/summarising audio conversations.&lt;br /&gt;
&lt;br /&gt;
Speech recognition in the form of live captioning has been&amp;nbsp;&lt;a href=&quot;https://gsuiteupdates.googleblog.com/2019/09/live-captions-in-hangouts-meet-android.html&quot;&gt;available in Hangouts Meet&lt;/a&gt;&amp;nbsp;for some months but recently it was promoted to a button in the main UI and I have started to use it almost every day.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcFmvJukPDBOBjKQOx6M2BMINblAC_0mykR56WDnXt_ns4zYbespIeKRnqq40L0scI9cdEK6tJXZnbF-UB86LFOVMxCbzhy7bZhSe9DmqA52VPXMA-F96RTHfImLnSvrXnxcLDncWu5X4/s1600/Screenshot+2019-10-21+at+18.27.44.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;316&quot; data-original-width=&quot;1600&quot; height=&quot;123&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcFmvJukPDBOBjKQOx6M2BMINblAC_0mykR56WDnXt_ns4zYbespIeKRnqq40L0scI9cdEK6tJXZnbF-UB86LFOVMxCbzhy7bZhSe9DmqA52VPXMA-F96RTHfImLnSvrXnxcLDncWu5X4/s640/Screenshot+2019-10-21+at+18.27.44.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;span id=&quot;goog_1244718133&quot;&gt;&lt;/span&gt;
I&#39;m mostly interested in the recognition technology and specifically on how to integrate&amp;nbsp;&lt;a href=&quot;https://github.com/mozilla/DeepSpeech&quot;&gt;DeepSpeech&lt;/a&gt;&amp;nbsp;in RTC media servers to provide a cost effective solution but in this post I wanted to spend some time analysing how Hangouts Meet implemented captioning from a signalling point of view.&lt;br /&gt;
&lt;br /&gt;
At a very high level there are at least three possible architectures for speech recognition in RTC services:&lt;br /&gt;
&lt;span data-lucid-content=&quot;{&amp;quot;Objects&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;_tj3Gk6CK_Hj&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;DefaultSquareBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:40,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:815.1999999999999,&amp;quot;y&amp;quot;:592.6,&amp;quot;w&amp;quot;:240,&amp;quot;h&amp;quot;:74.8},&amp;quot;DynamicFontSize&amp;quot;:null,&amp;quot;FillColor&amp;quot;:&amp;quot;#ffffff00&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#00000000&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;Link&amp;quot;:null,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Option B: Recognition in a separate server&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:42}]},&amp;quot;Text_DynamicFontSize&amp;quot;:null,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;6kj3KnSNT9_B&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;TerminatorBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:23,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:300,&amp;quot;y&amp;quot;:440,&amp;quot;w&amp;quot;:160,&amp;quot;h&amp;quot;:80},&amp;quot;DynamicFontSize&amp;quot;:null,&amp;quot;FillColor&amp;quot;:&amp;quot;#FFFFFF&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;Link&amp;quot;:null,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Speech Recognition&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:18}]},&amp;quot;Text_DynamicFontSize&amp;quot;:null,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;rij3nWdJqBel&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;TerminatorBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:3,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:480,&amp;quot;y&amp;quot;:440,&amp;quot;w&amp;quot;:160,&amp;quot;h&amp;quot;:80},&amp;quot;DynamicFontSize&amp;quot;:null,&amp;quot;FillColor&amp;quot;:&amp;quot;#FFFFFF&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;Link&amp;quot;:null,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;WebRTC EndPoint&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:15}]},&amp;quot;Text_DynamicFontSize&amp;quot;:null,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;Snj3paiiF0Bw&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;TerminatorBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:29,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:940,&amp;quot;y&amp;quot;:440,&amp;quot;w&amp;quot;:160,&amp;quot;h&amp;quot;:80},&amp;quot;DynamicFontSize&amp;quot;:null,&amp;quot;FillColor&amp;quot;:&amp;quot;#FFFFFF&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;Link&amp;quot;:null,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;WebRTC EndPoint&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:15}]},&amp;quot;Text_DynamicFontSize&amp;quot;:null,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;0kj34vmEo5QR&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;TerminatorBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:14,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:1340,&amp;quot;y&amp;quot;:440,&amp;quot;w&amp;quot;:160,&amp;quot;h&amp;quot;:80},&amp;quot;DynamicFontSize&amp;quot;:null,&amp;quot;FillColor&amp;quot;:&amp;quot;#FFFFFF&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;Link&amp;quot;:null,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;WebRTC EndPoint&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:15}]},&amp;quot;Text_DynamicFontSize&amp;quot;:null,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;yuj3jATsjSWE&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;DefaultSquareBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:41,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:1220,&amp;quot;y&amp;quot;:585.2,&amp;quot;w&amp;quot;:240,&amp;quot;h&amp;quot;:74.8},&amp;quot;DynamicFontSize&amp;quot;:null,&amp;quot;FillColor&amp;quot;:&amp;quot;#ffffff00&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#00000000&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;Link&amp;quot;:null,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Option C: Recognition from the media server&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:43}]},&amp;quot;Text_DynamicFontSize&amp;quot;:null,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;Utj3d3XkzYoh&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;DefaultSquareBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:39,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:380,&amp;quot;y&amp;quot;:600,&amp;quot;w&amp;quot;:240,&amp;quot;h&amp;quot;:60},&amp;quot;DynamicFontSize&amp;quot;:null,&amp;quot;FillColor&amp;quot;:&amp;quot;#ffffff00&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#00000000&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;Link&amp;quot;:null,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Option A: On Device Speech Recognition&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:38}]},&amp;quot;Text_DynamicFontSize&amp;quot;:null,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;Snj3-PaeU1bd&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;TerminatorBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:27,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:940,&amp;quot;y&amp;quot;:220,&amp;quot;w&amp;quot;:160,&amp;quot;h&amp;quot;:80},&amp;quot;DynamicFontSize&amp;quot;:null,&amp;quot;FillColor&amp;quot;:&amp;quot;#FFFFFF&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;Link&amp;quot;:null,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Media Server&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:12}]},&amp;quot;Text_DynamicFontSize&amp;quot;:null,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;fij3W3ZMdx_D&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;TerminatorBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:1,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:480,&amp;quot;y&amp;quot;:220,&amp;quot;w&amp;quot;:160,&amp;quot;h&amp;quot;:80},&amp;quot;DynamicFontSize&amp;quot;:null,&amp;quot;FillColor&amp;quot;:&amp;quot;#FFFFFF&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;Link&amp;quot;:null,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Media Server&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:12}]},&amp;quot;Text_DynamicFontSize&amp;quot;:null,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;Ymj3MJs418yK&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;DefaultSquareBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:25,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:32,&amp;quot;y&amp;quot;:400,&amp;quot;w&amp;quot;:240,&amp;quot;h&amp;quot;:60},&amp;quot;DynamicFontSize&amp;quot;:null,&amp;quot;FillColor&amp;quot;:&amp;quot;#ffffff00&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#00000000&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;Link&amp;quot;:null,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;CLIENT SIDE&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:11}]},&amp;quot;Text_DynamicFontSize&amp;quot;:null,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;0kj3nZaV8dFA&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;TerminatorBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:12,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:1340,&amp;quot;y&amp;quot;:220,&amp;quot;w&amp;quot;:160,&amp;quot;h&amp;quot;:80},&amp;quot;DynamicFontSize&amp;quot;:null,&amp;quot;FillColor&amp;quot;:&amp;quot;#FFFFFF&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;Link&amp;quot;:null,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Media Server&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:12}]},&amp;quot;Text_DynamicFontSize&amp;quot;:null,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;Snj3Ta1gBWyw&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;TerminatorBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:32,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:760,&amp;quot;y&amp;quot;:220,&amp;quot;w&amp;quot;:160,&amp;quot;h&amp;quot;:80},&amp;quot;DynamicFontSize&amp;quot;:null,&amp;quot;FillColor&amp;quot;:&amp;quot;#FFFFFF&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;Link&amp;quot;:null,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Speech Recognition&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:18}]},&amp;quot;Text_DynamicFontSize&amp;quot;:null,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;0kj3-RFxwb5n&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;TerminatorBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:17,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:1160,&amp;quot;y&amp;quot;:220,&amp;quot;w&amp;quot;:160,&amp;quot;h&amp;quot;:80},&amp;quot;DynamicFontSize&amp;quot;:null,&amp;quot;FillColor&amp;quot;:&amp;quot;#FFFFFF&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;Link&amp;quot;:null,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Speech Recognition&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:18}]},&amp;quot;Text_DynamicFontSize&amp;quot;:null,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;1mj36z-yQu1O&amp;quot;,&amp;quot;IsBlock&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateBlock&amp;quot;,&amp;quot;Class&amp;quot;:&amp;quot;DefaultSquareBlock&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:26,&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:32,&amp;quot;y&amp;quot;:240,&amp;quot;w&amp;quot;:240,&amp;quot;h&amp;quot;:60},&amp;quot;DynamicFontSize&amp;quot;:null,&amp;quot;FillColor&amp;quot;:&amp;quot;#ffffff00&amp;quot;,&amp;quot;FlipX&amp;quot;:false,&amp;quot;FlipY&amp;quot;:false,&amp;quot;GutterPadding&amp;quot;:5,&amp;quot;Hyphenate&amp;quot;:false,&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;ImageFillProps&amp;quot;:false,&amp;quot;InsetMargin&amp;quot;:5,&amp;quot;LineColor&amp;quot;:&amp;quot;#00000000&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;Link&amp;quot;:null,&amp;quot;NoteHint&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;Rotation&amp;quot;:0,&amp;quot;Rounding&amp;quot;:0,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAlign&amp;quot;:&amp;quot;center&amp;quot;,&amp;quot;TextLinks&amp;quot;:{},&amp;quot;TextVAlign&amp;quot;:&amp;quot;middle&amp;quot;,&amp;quot;TextWrap&amp;quot;:&amp;quot;fit&amp;quot;,&amp;quot;TRotation&amp;quot;:0,&amp;quot;Text&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;SERVER SIDE&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:11}]},&amp;quot;Text_DynamicFontSize&amp;quot;:null,&amp;quot;Text_VAlign&amp;quot;:null,&amp;quot;Text_TRotation&amp;quot;:null}}},{&amp;quot;id&amp;quot;:&amp;quot;0kj3LvwPrQWG&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:20,&amp;quot;AutoLink&amp;quot;:true,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:[],&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:1450.75,&amp;quot;y&amp;quot;:301,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;0kj3nZaV8dFA&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.6921875,&amp;quot;LinkY&amp;quot;:1.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:1437.5714285714287,&amp;quot;y&amp;quot;:439,&amp;quot;Style&amp;quot;:&amp;quot;Arrow&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;0kj34vmEo5QR&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.6098214285714292,&amp;quot;LinkY&amp;quot;:-0.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[{&amp;quot;x&amp;quot;:1480,&amp;quot;y&amp;quot;:340}],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;diagonal&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true,&amp;quot;t0&amp;quot;:{&amp;quot;Location&amp;quot;:0.6513494241129913,&amp;quot;Side&amp;quot;:0,&amp;quot;Value&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Text&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:4}]}},&amp;quot;t1&amp;quot;:null},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}},{&amp;quot;id&amp;quot;:&amp;quot;0kj39A2ljdYG&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:15,&amp;quot;AutoLink&amp;quot;:true,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:[],&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:1399.5,&amp;quot;y&amp;quot;:439,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;0kj34vmEo5QR&amp;quot;,&amp;quot;Inside&amp;quot;:true,&amp;quot;LinkX&amp;quot;:0.371875,&amp;quot;LinkY&amp;quot;:-0.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:1395.4,&amp;quot;y&amp;quot;:301,&amp;quot;Style&amp;quot;:&amp;quot;Arrow&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;0kj3nZaV8dFA&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.34625000000000056,&amp;quot;LinkY&amp;quot;:1.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[{&amp;quot;x&amp;quot;:1360,&amp;quot;y&amp;quot;:360}],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;diagonal&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true,&amp;quot;t0&amp;quot;:{&amp;quot;Location&amp;quot;:0.3363187655094046,&amp;quot;Side&amp;quot;:0,&amp;quot;Value&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Audio&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:5}]}},&amp;quot;t1&amp;quot;:null},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}},{&amp;quot;id&amp;quot;:&amp;quot;0kj3KhoAxJI5&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:22,&amp;quot;AutoLink&amp;quot;:true,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:[],&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:1293.7911209088509,&amp;quot;y&amp;quot;:300.3433406816381,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;0kj3-RFxwb5n&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.836194505680318,&amp;quot;LinkY&amp;quot;:1.0042917585204763,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:1358.0837644159508,&amp;quot;y&amp;quot;:297.1497413504296,&amp;quot;Style&amp;quot;:&amp;quot;Arrow&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;0kj3nZaV8dFA&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.11302352759969239,&amp;quot;LinkY&amp;quot;:0.9643717668803703,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[{&amp;quot;x&amp;quot;:1320,&amp;quot;y&amp;quot;:320}],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;diagonal&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true,&amp;quot;t0&amp;quot;:{&amp;quot;Location&amp;quot;:0.4233503659857385,&amp;quot;Side&amp;quot;:0,&amp;quot;Value&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Text&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:4}]}},&amp;quot;t1&amp;quot;:null},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}},{&amp;quot;id&amp;quot;:&amp;quot;0kj3E5J_ynj1&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:19,&amp;quot;AutoLink&amp;quot;:true,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:[],&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:1366.2088790911491,&amp;quot;y&amp;quot;:219.6566593183619,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;0kj3nZaV8dFA&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.16380549431968205,&amp;quot;LinkY&amp;quot;:-0.004291758520476208,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:1301.9162355840494,&amp;quot;y&amp;quot;:222.85025864957038,&amp;quot;Style&amp;quot;:&amp;quot;Arrow&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;0kj3-RFxwb5n&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.8869764724003091,&amp;quot;LinkY&amp;quot;:0.035628233119629725,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[{&amp;quot;x&amp;quot;:1340,&amp;quot;y&amp;quot;:200}],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;diagonal&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true,&amp;quot;t0&amp;quot;:{&amp;quot;Location&amp;quot;:0.41241555306658917,&amp;quot;Side&amp;quot;:0,&amp;quot;Value&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Audio&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:5}]}},&amp;quot;t1&amp;quot;:null},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}},{&amp;quot;id&amp;quot;:&amp;quot;Snj3qUDsqwAr&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:34,&amp;quot;AutoLink&amp;quot;:false,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:[],&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:950.5745724745053,&amp;quot;y&amp;quot;:448.82107607215266,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;Snj3paiiF0Bw&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.06609107796565823,&amp;quot;LinkY&amp;quot;:0.11026345090190826,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:858,&amp;quot;y&amp;quot;:301,&amp;quot;Style&amp;quot;:&amp;quot;Arrow&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;Snj3Ta1gBWyw&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.6125,&amp;quot;LinkY&amp;quot;:1.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[{&amp;quot;x&amp;quot;:880,&amp;quot;y&amp;quot;:400}],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;diagonal&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true,&amp;quot;t0&amp;quot;:{&amp;quot;Location&amp;quot;:0.5,&amp;quot;Side&amp;quot;:0,&amp;quot;Value&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Audio&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:5}]}},&amp;quot;t1&amp;quot;:null},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}},{&amp;quot;id&amp;quot;:&amp;quot;Snj3aJXwtOIf&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:37,&amp;quot;AutoLink&amp;quot;:false,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:[],&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:829.75,&amp;quot;y&amp;quot;:301,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;Snj3Ta1gBWyw&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.4359375,&amp;quot;LinkY&amp;quot;:1.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:943.6538791094813,&amp;quot;y&amp;quot;:459.1783306662221,&amp;quot;Style&amp;quot;:&amp;quot;Arrow&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;Snj3paiiF0Bw&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.022836744434257827,&amp;quot;LinkY&amp;quot;:0.23972913332777623,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[{&amp;quot;x&amp;quot;:800,&amp;quot;y&amp;quot;:420}],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;diagonal&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true,&amp;quot;t0&amp;quot;:{&amp;quot;Location&amp;quot;:0.4233503659857385,&amp;quot;Side&amp;quot;:0,&amp;quot;Value&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Text&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:4}]}},&amp;quot;t1&amp;quot;:null},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}},{&amp;quot;id&amp;quot;:&amp;quot;~ij3B5c6KxZP&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:8,&amp;quot;AutoLink&amp;quot;:false,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:[],&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:495.4012869386494,&amp;quot;y&amp;quot;:444.62496584806763,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;rij3nWdJqBel&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.09625804336655878,&amp;quot;LinkY&amp;quot;:0.057812073100845664,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:422.6666666666667,&amp;quot;y&amp;quot;:439,&amp;quot;Style&amp;quot;:&amp;quot;Arrow&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;6kj3KnSNT9_B&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.7666666666666668,&amp;quot;LinkY&amp;quot;:-0.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[{&amp;quot;x&amp;quot;:460,&amp;quot;y&amp;quot;:420}],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;diagonal&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true,&amp;quot;t0&amp;quot;:{&amp;quot;Location&amp;quot;:0.4195402298850576,&amp;quot;Side&amp;quot;:0,&amp;quot;Value&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Audio&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:5}]}},&amp;quot;t1&amp;quot;:null},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}},{&amp;quot;id&amp;quot;:&amp;quot;-jj3nIUfV7~A&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:11,&amp;quot;AutoLink&amp;quot;:false,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:[],&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:421,&amp;quot;y&amp;quot;:521,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;6kj3KnSNT9_B&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.75625,&amp;quot;LinkY&amp;quot;:1.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:493.02031195296,&amp;quot;y&amp;quot;:513.4898440235199,&amp;quot;Style&amp;quot;:&amp;quot;Arrow&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;rij3nWdJqBel&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.08137694970600026,&amp;quot;LinkY&amp;quot;:0.9186230502939999,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[{&amp;quot;x&amp;quot;:440,&amp;quot;y&amp;quot;:540}],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;diagonal&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true,&amp;quot;t0&amp;quot;:{&amp;quot;Location&amp;quot;:0.4233503659857385,&amp;quot;Side&amp;quot;:0,&amp;quot;Value&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Text&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:4}]}},&amp;quot;t1&amp;quot;:null},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}},{&amp;quot;id&amp;quot;:&amp;quot;zij3C7ItJXb8&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:4,&amp;quot;AutoLink&amp;quot;:true,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:[],&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:535.4,&amp;quot;y&amp;quot;:439,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;rij3nWdJqBel&amp;quot;,&amp;quot;Inside&amp;quot;:true,&amp;quot;LinkX&amp;quot;:0.34624999999999984,&amp;quot;LinkY&amp;quot;:-0.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:539.5,&amp;quot;y&amp;quot;:301,&amp;quot;Style&amp;quot;:&amp;quot;Arrow&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;fij3W3ZMdx_D&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.371875,&amp;quot;LinkY&amp;quot;:1.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[{&amp;quot;x&amp;quot;:500,&amp;quot;y&amp;quot;:380}],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;diagonal&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true,&amp;quot;t0&amp;quot;:{&amp;quot;Location&amp;quot;:0.3687627170749224,&amp;quot;Side&amp;quot;:0,&amp;quot;Value&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Audio&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:5}]}},&amp;quot;t1&amp;quot;:null},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}},{&amp;quot;id&amp;quot;:&amp;quot;Snj3BRUf~zwB&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:30,&amp;quot;AutoLink&amp;quot;:true,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:[],&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:995.4,&amp;quot;y&amp;quot;:439,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;Snj3paiiF0Bw&amp;quot;,&amp;quot;Inside&amp;quot;:true,&amp;quot;LinkX&amp;quot;:0.34624999999999984,&amp;quot;LinkY&amp;quot;:-0.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:999.5,&amp;quot;y&amp;quot;:301,&amp;quot;Style&amp;quot;:&amp;quot;Arrow&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;Snj3-PaeU1bd&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.371875,&amp;quot;LinkY&amp;quot;:1.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[{&amp;quot;x&amp;quot;:960,&amp;quot;y&amp;quot;:380}],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;diagonal&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true,&amp;quot;t0&amp;quot;:{&amp;quot;Location&amp;quot;:0.3363187655094046,&amp;quot;Side&amp;quot;:0,&amp;quot;Value&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Audio&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:5}]}},&amp;quot;t1&amp;quot;:null},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}},{&amp;quot;id&amp;quot;:&amp;quot;qoj3c_SgFE2l&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:38,&amp;quot;AutoLink&amp;quot;:true,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:[],&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:1044.6,&amp;quot;y&amp;quot;:439,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;Snj3paiiF0Bw&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.6537499999999994,&amp;quot;LinkY&amp;quot;:-0.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:1040.5,&amp;quot;y&amp;quot;:301,&amp;quot;Style&amp;quot;:&amp;quot;Arrow&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;Snj3-PaeU1bd&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.628125,&amp;quot;LinkY&amp;quot;:1.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[{&amp;quot;x&amp;quot;:1080,&amp;quot;y&amp;quot;:380}],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;diagonal&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true,&amp;quot;t0&amp;quot;:{&amp;quot;Location&amp;quot;:0.39059160719380204,&amp;quot;Side&amp;quot;:0,&amp;quot;Value&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Text&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:4}]}},&amp;quot;t1&amp;quot;:null},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}},{&amp;quot;id&amp;quot;:&amp;quot;8jj32fWG4hqo&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:10,&amp;quot;AutoLink&amp;quot;:true,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:[],&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:584.6,&amp;quot;y&amp;quot;:439,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;rij3nWdJqBel&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.6537500000000002,&amp;quot;LinkY&amp;quot;:-0.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:580.5,&amp;quot;y&amp;quot;:301,&amp;quot;Style&amp;quot;:&amp;quot;Arrow&amp;quot;,&amp;quot;Block&amp;quot;:&amp;quot;fij3W3ZMdx_D&amp;quot;,&amp;quot;Inside&amp;quot;:false,&amp;quot;LinkX&amp;quot;:0.628125,&amp;quot;LinkY&amp;quot;:1.0125,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[{&amp;quot;x&amp;quot;:620,&amp;quot;y&amp;quot;:380}],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;diagonal&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true,&amp;quot;t0&amp;quot;:{&amp;quot;Location&amp;quot;:0.4284283500665238,&amp;quot;Side&amp;quot;:0,&amp;quot;Value&amp;quot;:{&amp;quot;t&amp;quot;:&amp;quot;Text&amp;quot;,&amp;quot;m&amp;quot;:[{&amp;quot;s&amp;quot;:0,&amp;quot;n&amp;quot;:&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;000000ff&amp;quot;,&amp;quot;e&amp;quot;:4}]}},&amp;quot;t1&amp;quot;:null},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}},{&amp;quot;id&amp;quot;:&amp;quot;Nmj35n-Xfkj1&amp;quot;,&amp;quot;IsLine&amp;quot;:true,&amp;quot;Action&amp;quot;:{&amp;quot;Action&amp;quot;:&amp;quot;CreateLine&amp;quot;,&amp;quot;Properties&amp;quot;:{&amp;quot;BG&amp;quot;:0,&amp;quot;Hidden&amp;quot;:0,&amp;quot;Opacity&amp;quot;:100,&amp;quot;Restrictions&amp;quot;:{&amp;quot;acap&amp;quot;:false,&amp;quot;scap&amp;quot;:false},&amp;quot;RuleList&amp;quot;:[],&amp;quot;ZOrder&amp;quot;:24,&amp;quot;AutoLink&amp;quot;:false,&amp;quot;BezierJoints&amp;quot;:[],&amp;quot;BoundingBox&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0,&amp;quot;w&amp;quot;:1,&amp;quot;h&amp;quot;:1},&amp;quot;ControlPoints&amp;quot;:{},&amp;quot;DoubleLine&amp;quot;:false,&amp;quot;ElbowControlPoints&amp;quot;:null,&amp;quot;ElbowPoints&amp;quot;:null,&amp;quot;Endpoint1&amp;quot;:{&amp;quot;x&amp;quot;:160,&amp;quot;y&amp;quot;:360,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:null,&amp;quot;Inside&amp;quot;:null,&amp;quot;LinkX&amp;quot;:null,&amp;quot;LinkY&amp;quot;:null,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;Endpoint2&amp;quot;:{&amp;quot;x&amp;quot;:1560,&amp;quot;y&amp;quot;:360,&amp;quot;Style&amp;quot;:&amp;quot;None&amp;quot;,&amp;quot;Block&amp;quot;:null,&amp;quot;Inside&amp;quot;:null,&amp;quot;LinkX&amp;quot;:null,&amp;quot;LinkY&amp;quot;:null,&amp;quot;Padding&amp;quot;:null,&amp;quot;Line&amp;quot;:null,&amp;quot;LineP&amp;quot;:null},&amp;quot;IgnoreTheme&amp;quot;:{},&amp;quot;Inset&amp;quot;:0,&amp;quot;Joints&amp;quot;:[],&amp;quot;LineColor&amp;quot;:&amp;quot;#000000ff&amp;quot;,&amp;quot;LineWidth&amp;quot;:2,&amp;quot;LineOffsets&amp;quot;:[0],&amp;quot;Rounding&amp;quot;:0,&amp;quot;Shape&amp;quot;:&amp;quot;diagonal&amp;quot;,&amp;quot;StrokeStyle&amp;quot;:&amp;quot;solid&amp;quot;,&amp;quot;TextAreas&amp;quot;:{&amp;quot;IsFullPropSettings&amp;quot;:true},&amp;quot;XPlanes&amp;quot;:[],&amp;quot;YPlanes&amp;quot;:[]}}}],&amp;quot;Base&amp;quot;:{&amp;quot;x&amp;quot;:791.5,&amp;quot;y&amp;quot;:433.08},&amp;quot;Page&amp;quot;:&amp;quot;0_0&amp;quot;,&amp;quot;Pages&amp;quot;:{},&amp;quot;Size&amp;quot;:{&amp;quot;w&amp;quot;:1559,&amp;quot;h&amp;quot;:508.64},&amp;quot;Plugins&amp;quot;:[&amp;quot;/js/plugins/v2/default.js&amp;quot;,&amp;quot;/js/plugins/v2/flowchart.js&amp;quot;],&amp;quot;Document&amp;quot;:&amp;quot;d687a403-4dd1-4b74-bc6a-646bdf1204fe&amp;quot;,&amp;quot;Panel&amp;quot;:&amp;quot;!0_0&amp;quot;,&amp;quot;PanelOffset&amp;quot;:{&amp;quot;x&amp;quot;:0,&amp;quot;y&amp;quot;:0}}&quot; data-lucid-type=&quot;application/vnd.lucid.chart.objects&quot;&gt; &lt;/span&gt;&lt;img height=&quot;208&quot; src=&quot;https://documents.lucidchart.com/documents/d687a403-4dd1-4b74-bc6a-646bdf1204fe/pages/0_0?a=707&amp;amp;x=-66&amp;amp;y=153&amp;amp;w=1715&amp;amp;h=560&amp;amp;store=1&amp;amp;accept=image%2F*&amp;amp;auth=LCA%20dbaf91744566df4fd4c2cca9c5ef0e9cada0f26a-ts%3D1571780360&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
A) &lt;b&gt;On device speech recognition&lt;/b&gt;:&amp;nbsp; This is the cheapest option but not all the devices have support for it, the quality of the models is not as good as in the cloud ones and it requires some additional CPU usage that can be a problem for limited devices.&lt;br /&gt;
B) &lt;b&gt;Recognition in a separate server&lt;/b&gt;:&amp;nbsp; This is very inefficient in terms of network because the client needs to send the audio twice in parallel, it is expensive for the service provider but doesn&#39;t require changes in the media server.&lt;br /&gt;
C) &lt;b&gt;Recognition from the media server&lt;/b&gt;:&amp;nbsp; This is very efficient from the client and network point of view but requires changes in the media server and it is expensive for the service provider.&lt;br /&gt;
&lt;br /&gt;
Given the fact that Google owns its own Speech Recognition service and because of that the cost is probably not their biggest concern it looks like the most reasonable approach for Hangouts Meet could be the Option C.&amp;nbsp; &amp;nbsp;So I tried to confirm it and see how the transcriptions are sent between the media server and the browser.&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
First thing I did was to take a look at the minified code and to the HTTP requests sent by Hangouts Meet web&amp;nbsp; page during the conversation but I couldn&#39;t find and reference to stt/transcription/recognition or anything like that.&amp;nbsp; &amp;nbsp;I also ran a very simple&amp;nbsp;&lt;a href=&quot;https://jsfiddle.net/pr4egok1/&quot;&gt;WebSpeech snippet&lt;/a&gt;&amp;nbsp;in the browser console while connected to Hangouts and saw the results where different in the Hangouts page and in the on-device recognition (It was better in the page).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
So next I decided to take a look at the&amp;nbsp;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel&quot;&gt;DataChannels&lt;/a&gt;&amp;nbsp;in chrome://webrtc-internals and voilà, there were a lot of messages received while I was talking so those had to be the messages with the speech recognition content.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE6aA3L-7WLz9l0u79RXwbFWEqhyp9bHleYPUlx6XRpRfdrXgcWRb-SR9Eul4xfIpI74IBXIjO5WHOrFGvRPKGWYG3gbZaFkcJGIBD8e9t6kYtn-ZZ5S5vHFFzmYe84TgZO_6gmhhSJKs/s1600/Screenshot+2019-10-23+at+00.15.17.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;453&quot; data-original-width=&quot;1600&quot; height=&quot;111&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE6aA3L-7WLz9l0u79RXwbFWEqhyp9bHleYPUlx6XRpRfdrXgcWRb-SR9Eul4xfIpI74IBXIjO5WHOrFGvRPKGWYG3gbZaFkcJGIBD8e9t6kYtn-ZZ5S5vHFFzmYe84TgZO_6gmhhSJKs/s400/Screenshot+2019-10-23+at+00.15.17.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0erx6XN6Sjme5KI0Ff6dbBRs34HalwevG8-TwM-dSn_s0h5Oiw2JFXAOVdHU1_bO_Vzp4_ZN2lTZTKE9A5GZVHnPN37WqND6FmvUVvKuDzF3v0EeUi9wG2c9_NfBceGqUMyzBSm25YoQ/s1600/Screenshot+2019-10-21+at+18.52.23.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;152&quot; data-original-width=&quot;866&quot; height=&quot;56&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0erx6XN6Sjme5KI0Ff6dbBRs34HalwevG8-TwM-dSn_s0h5Oiw2JFXAOVdHU1_bO_Vzp4_ZN2lTZTKE9A5GZVHnPN37WqND6FmvUVvKuDzF3v0EeUi9wG2c9_NfBceGqUMyzBSm25YoQ/s320/Screenshot+2019-10-21+at+18.52.23.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;After that I checked in webrtc-internals events and I saw there was a specific DataChannel created for the captions the first time you enable them in addition to the default DataChannel that it is always open in Hangouts Meet.&lt;br /&gt;
&lt;br /&gt;
To try to figure out the exact options of that DataChannel and the format of the information sent in those messages I replaced the RTCPeerConnection.createDataChannel API with my own to be able to intercept those calls using &lt;a href=&quot;https://jsfiddle.net/ea6rucyg/&quot;&gt;this simple snippet&lt;/a&gt; in the browser console.&lt;br /&gt;
&lt;br /&gt;
With that in place I saw the &lt;b&gt;unreliable DataChannel for the captions is created with maxRetransmissions=10 and the payload is binary data probably in protobuf format&lt;/b&gt;. Still we can convert it to string and see a couple of fields with the user id and the text inside:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd67TmCeDySZrVyRG6vhL5HZEw86nQuO3-pFP6PLoK4N3sSemTeMTX9o7lAe2eVNiGJhs-ohzo0Gg7Y5rKQm6WeLO5nkKTX_KykoY3s4MX56apbJ3pfEmQCMJ3U5-_1lhVsaE9D8_Q3Ik/s1600/Screenshot+2019-10-21+at+19.27.02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;380&quot; data-original-width=&quot;1466&quot; height=&quot;82&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd67TmCeDySZrVyRG6vhL5HZEw86nQuO3-pFP6PLoK4N3sSemTeMTX9o7lAe2eVNiGJhs-ohzo0Gg7Y5rKQm6WeLO5nkKTX_KykoY3s4MX56apbJ3pfEmQCMJ3U5-_1lhVsaE9D8_Q3Ik/s320/Screenshot+2019-10-21+at+19.27.02.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
And that&#39;s all for today.&amp;nbsp; In the next post I&#39;ll try to share some information around my DeepSpeech experiments.&amp;nbsp; As usual feedback is more than welcomed either here or &lt;a href=&quot;https://twitter.com/anarchyco&quot;&gt;in Twitter&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/339144383614122540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2019/10/speech-recognition-in-hangouts-meet.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/339144383614122540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/339144383614122540'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2019/10/speech-recognition-in-hangouts-meet.html' title='Speech recognition in Hangouts Meet'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcFmvJukPDBOBjKQOx6M2BMINblAC_0mykR56WDnXt_ns4zYbespIeKRnqq40L0scI9cdEK6tJXZnbF-UB86LFOVMxCbzhy7bZhSe9DmqA52VPXMA-F96RTHfImLnSvrXnxcLDncWu5X4/s72-c/Screenshot+2019-10-21+at+18.27.44.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-2833689891338140290</id><published>2019-04-12T14:05:00.004-07:00</published><updated>2019-05-06T13:00:03.140-07:00</updated><title type='text'>Implementing P2P-SFU transitions in WebRTC</title><content type='html'>&lt;div style=&quot;-en-clipboard: true;&quot;&gt;
One of the more disruptive aspects of WebRTC is the ability of establishing P2P connections without any server involved in the media path. &amp;nbsp; However &lt;a href=&quot;https://webrtchacks.com/webrtc-beyond-one-one/&quot;&gt;this doesn’t scale well for multiparty audio/video calls&lt;/a&gt; as the bandwidth and cpu required for a full mesh of N:N P2P connections is too much in most of the cases.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But the fact that you support multiparty calls doesn’t mean that you shouldn’t consider using P2P connections when there are only two participants in the room and switch back to the SFU when the third participant joins or when you need to enable some recording or broadcasting capabilities only available in the SFU.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0bRnNVouQMLZeMa2Cfhj0BywYpvv-sLWEpCONhTHB7pYN666iYu3j7AarpDlioaTUasvmBXYAh9kMb63kyZqzAfHLiJ_8PRNeZTQO0qIaylwKdcpT5WJE5I1GVd2i3837D7TULyinpNU/s1600/Untitled+4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;201&quot; data-original-width=&quot;1037&quot; height=&quot;124&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0bRnNVouQMLZeMa2Cfhj0BywYpvv-sLWEpCONhTHB7pYN666iYu3j7AarpDlioaTUasvmBXYAh9kMb63kyZqzAfHLiJ_8PRNeZTQO0qIaylwKdcpT5WJE5I1GVd2i3837D7TULyinpNU/s640/Untitled+4.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In fact this approach of using P2P when only two participants are connected and switching to the SFU has been successfully implemented in many products in the last years (&lt;a href=&quot;https://jitsi.org/news/p2p4121/&quot;&gt;Jitsi&lt;/a&gt;, &lt;a href=&quot;https://support.google.com/a/answer/6334301?hl=en&quot;&gt;Hangouts&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/watch?v=F7UWvflUZoc&quot;&gt;Facebook&lt;/a&gt;). &amp;nbsp; The implementation of this feature is not trivial but it provides enough advantages to be worth it:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div&gt;
Minimise the network hops &lt;b&gt;reducing the end to end delay&lt;/b&gt; and the chances of having congestion. &amp;nbsp; This is specially interesting in countries where you don&#39;t have datacenters or meetings inside corporate networks.
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;
Be able to &lt;b&gt;use all the features included in WebRTC&lt;/b&gt;. &amp;nbsp;For example even if your SFU only supports REMB based congestion control you can use the newer transport feedback based congestion control at least while in P2P mode.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;
Reduce the &lt;b&gt;infrastructure costs&lt;/b&gt; (specially the bandwidth cost).&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
There are different ways to implement this feature but at a high level the biggest decision is probably: Are you still connected to the SFU while having the P2P connection or not?
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Having the SFU connection always established makes the switching faster but on the other side not having that connection open all the time is more efficient both for the endpoints and the infrastructure.
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I did a quick review of the most popular WebRTC services / platforms to see how they do it and this is what I saw:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMqVLGbP19zEZh3p8MPD6G7srRGPe64-jLSCnQY901dkdsNrIgRQ-0Hck4Ohl2u1B-kmeJhtCePC2IVd8xGDtbH-3Gvp_0_SmtBEkfpi-ZfzDD5Htp1AS6i0PJrg4mONs_-EBRBIwG_2U/s1600/Untitled+3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;183&quot; data-original-width=&quot;704&quot; height=&quot;166&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMqVLGbP19zEZh3p8MPD6G7srRGPe64-jLSCnQY901dkdsNrIgRQ-0Hck4Ohl2u1B-kmeJhtCePC2IVd8xGDtbH-3Gvp_0_SmtBEkfpi-ZfzDD5Htp1AS6i0PJrg4mONs_-EBRBIwG_2U/s640/Untitled+3.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As you can see there is no obvious winner based on the choices of those popular platforms and both approaches have its merits.&lt;br /&gt;
Note: I tested other services, platforms and opensource implementations and couldn’t find this feature. &amp;nbsp;If I’m wrong please let me know the name and I will update the table.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
Apart from that decision about maintaining the SFU connection open or not you also need to decide when and how to do the switching and there are many optimisations that can be done here specially in mobile native apps to minimise the transition and make it as seamless as possible.&amp;nbsp; But that can be a topic for other day... :)&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/2833689891338140290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2019/04/implementing-p2p-sfu-switching-in-webrtc.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/2833689891338140290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/2833689891338140290'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2019/04/implementing-p2p-sfu-switching-in-webrtc.html' title='Implementing P2P-SFU transitions in WebRTC'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0bRnNVouQMLZeMa2Cfhj0BywYpvv-sLWEpCONhTHB7pYN666iYu3j7AarpDlioaTUasvmBXYAh9kMb63kyZqzAfHLiJ_8PRNeZTQO0qIaylwKdcpT5WJE5I1GVd2i3837D7TULyinpNU/s72-c/Untitled+4.png" height="72" width="72"/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-1458791735731055178</id><published>2018-12-10T05:53:00.003-08:00</published><updated>2018-12-10T06:14:13.459-08:00</updated><title type='text'>Sending Packet Loss Feedback in WebRTC SFUs</title><content type='html'>One of the responsibilities of WebRTC &lt;a href=&quot;https://webrtcglossary.com/sfu/&quot;&gt;SFUs&lt;/a&gt; is to receive and send &lt;a href=&quot;https://tools.ietf.org/html/rfc3550&quot;&gt;RTCP&lt;/a&gt; packets.&amp;nbsp; RTCP packets include different types of feedback about audio and video streams and one of the most important RTCP packets is the &lt;a href=&quot;https://tools.ietf.org/html/rfc3550#section-6.4.2&quot;&gt;Receiver Report (RR)&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
RR packets are sent from the receiver of the media stream towards the sender of that media stream.&amp;nbsp; In case of an SFU the RR are generated and sent from the SFU to the media stream Sender and also from every stream Receiver to the SFU (Figure 1).&lt;br /&gt;
&lt;br /&gt;
The feedback sent inside RR packets include fields to calculate the round-trip-time delay, the jitter and the packet loss introduced by the network.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://www.blogger.com/blogger.g?blogID=460321274846352896&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;168&quot; src=&quot;data:image/png;base64,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HWwErYBmow0ePFh69OhhvtHN4vFBe6sZGAIIIBBwApptrl/6mTZtmvl7UbO5mzZtGmscOp0dU9rFYmEHAggggAACCCAgBJT4JUAAAQQQCEiBl156yUxr56zzGoh55ZVXZOjQoebwv//9b+nYsaMMHDjQWXUZOXKkCShpgOr99993WifmzocffjjOupcuXZLu3bubDyw0M+df//qXTJw4MWYTLr3XQNE777wj8QVkVq1aJXv37nWpPW9WatOmjZ25xHR33pT37bX0/38aVNUfDah26NDBBJd0Gsb4fo9922uujgACCCAQrAKa4T5jxgwzbbL+22RlTSdLlsyeZjhYx864EEAAAQQQQAABdwv8/68Ou7tl2kMAAQQQQMBHAvqh9QsvvGBfXdc/stYlsnd6cCNTpkwyevRoSZEihbnKli1bEn21fPnymXN0yrvly5fHe75eS0vmzJklbdq08dZ1PKhT7CWlXL9+3WmmV8y2UqdObdaT0jWlEgokaDaZtksJfAHHe61Zet9//73Ur1/frKGl2Xb79+8P/EEyAgQQQAABvxfQLCT99ydPnjzyzDPPyIIFC8zfL40aNZKvvvpKjh07Jo899pjfj4MOIoAAAggggAAC/iRAQMmf7gZ9QQABBBBwm0DBggXtOe917SP98WbRbCcrK0c/QHc21V58/WnevLlky5bNVNEP5OMqOs3eTz/9ZA4//vjjkiZNmriqmv07d+6Uv//971K2bFkTfNIPWTp16iQjRoywv7HrrIE5c+aYehoc0qCVBovq1q0rkydPdlbd7Fu8eLE0aNDA/Bw9ejRWvZUrV5rMsfz580uqVKnsdqtUqWKyy7wZBIzVOXa4XeDQoUMmW69YsWJSp04d+fbbb+Xy5ctuvw4NIoAAAgggoAJdu3aVX3/9VTQTSQNHOr3dqVOnRKdm7d27t+TKlQsoBBBAAAEEEEAAgUQKMOVdIsGojgACCCAQGAIajNBvnmrRNYxiroHkjVFcvHjRXCZjxowJZujE7I/2t0uXLvL555/LlClT5IsvvhBna9Hot2+vXLliTn/yySdN3ZhtWe9HjRolL774olnrydp38uRJmTRpkvnRb+7qtpVZpXU0c6h///7y0UcfWaeY11u3bsmKFSvMjwaWnBVte+nSpeaQBr4ci47n+eefd9xltjVrav369eZn8+bN4o9rQ8XqNDui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9uyzz2ZcwH9yPPjgg3bHHXe4T/pOvHXr1pj3JWNiCXCdSazzQW0QQAABBBBAAAEEckaAIe9yxjXDUvfv32/nnnuu+wMyvWCSClKg791333VPLH711VcZlk0GBBBAAAEEEEAAAQRSSSDRvjtHexDPCyrEan/kyBE/a2b39XdkAQEEEEAAAQQQQAABBBDIJQG6guQSdPAw+sPxsssus9mzZ/urq1atagMHDrTmzZu7HjsKMi1ZssQ94agh8JQOHjxoffr0sfnz55uG0yAhgAACCCCAAAIIIJDqArnx3blNmzZuyOlYLUuVKhVrVvIhgAACCCCAAAIIIIAAAikjQEApD06lehlNmDDBP/L5559v48ePN42bHky9evWyW2+91W666SZ76qmn3Kb169fbnXfeaS+88EIwK8sIIIAAAggggAACCKSkQG58d37sscesdevWKelHoxBAAAEEEEAAAQQQQACBeAkw5F28JDNRzqxZs/zcxYsXt3/9619pgklehiJFitioUaOsS5cu3ioL7u+vZAEBBBBAAAEEEEAAgRQUCH735btzCp5gmoQAAggggAACCCCAAAJJI0BAKQ9OVfCP4qZNm9qxxx6bbi0KFixomuDXS8uXL7fffvvN+xj1XRMXz5gxw6ZOnWorV660w4cPR82b0QYNwffpp5/a4sWL3dB7GeUP375582b7/PPPXX02btwYvjlTn+PVrkOHDtkPP/xgn332mW3YsCFTdSAzAggggAACCCCAQO4I5NZ359xpDUdBAAEEEEAAAQQQQAABBJJXgIBSHpy7vXv3+kddvXq1HT161P8cbUE9lBR8qlevntWtW9cFiCLlPXDggA0bNszq16/vxoE/44wz7Mwzz7RatWpZlSpVbPjw4Rac/DdYxrXXXmsnnniie+kP9x07dtigQYOsZs2aVrFiRevWrZudfvrpVqJECevQoYOtWLEiuHua5Z9++skuvfRS0/xQmvOpa9eupvpUqlTJzRX10Ucfpdkn2orstGvAgAF+uxYuXGiaRPkf//iHq5c8zznnHJs5c2a0Q7MeAQQQQAABBBBAIA8FcvK7cx42i0MjgAACCCCAAAIIIIAAAkknwBxKeXDK2rVrZ1OmTHFHVs8YBTeGDh1qxxxzTNTalClTxubPnx91uzaot40CON9//33EfOoZdPfdd9vSpUvtjTfeMPV8CqZdu3bZli1b3Kq1a9faLbfcYhqzPjypp5MCTk2aNHG9ltq3bx+exSZNmmT9+vWz7du3p9mmFWpLz549Q3peRcz458rstku9q7x2KTB1+eWXu/ZHOx7rEUAAAQQQQAABBBJHIKe+OydOC6kJAggggAACCCCAAAIIIJAcAgSU8uA8dezYMeSo6lGk3jrXXXed6y1TunTpkO2xfFi/fr21bNnSNBycUoECBUyBnoYNG9rWrVtdAGjdunVu29ixY12vqLfeeitNUMll+POfvn37eovWuHFj9ypVqpTNnj3bD2zt27fP/v73v7th7PzMfy5oaLzu3buH9LyqUaOGtW3b1tVr7ty5rneTego999xzwV3TLMe7XaNHj44YTCpbtmyaY7MCAQQQQAABBBBAIO8FcuK7c963ihoggAACCCCAAAIIIIAAAsknQEApD87ZWWedZddcc409/fTT/tEVqNGrUKFC1qJFC2vTpo17derUycqVK+fni7ag3kReMKlatWouaKKnOb30+++/25133mmPPvqoW/Wvf/3L+vTpYxdffLGXJc27AkjPPvusXXbZZf42BYFuv/12e/jhh906DRW3bNkyNxSfVmi7gkzeMH6FCxe21157zfWc8gv5c0HzKV100UWmXlHppXi3S3VRKlq0qKunhuDTsHca6o+EAAIIIIAAAgggkHgCOfHdObyV+o64aNGi8NVpPuthrVatWqVZzwoEEEAAAQQQQAABBBBAID8IEFDKo7OsnjIlS5a0J554whTs8ZKGk5szZ457aZ2GwWvevLn16NHDBaEiBZdmzJhh6nWkpIDU+++/73oUuRX/+efYY4+1kSNHut5KY8aMcWtfeOGFdANKTz31VEgwSTupPg888IC9/vrrpuH6lDRXkoIySjr2ggUL3LL+eeWVV9IEk7T+7LPPtmnTprm2ecEnrQ+mnGqXekupnpoPioQAAggggAACCCCQ+ALx/O4cqbXPPPNMpNVp1mlO0U8++STNelYggAACCCCAAAIIIIAAAvlBoEB+aGQitlGBGfXyWbNmjd1zzz122mmnRaymevzMmzfP5VHPo9tuu800D1Awvffee/7HAQMGpAkm+Rv/XFAPJW/upMmTJ9vq1auDm/3l+vXruzmQ/BWBBQWtGjVq5K/xhtLTimBdVN9g7yZ/h/8saA6mCy+8MHy1/zlYVrzapcI1ZxXBJJ+ZBQQQQAABBBBAIOEF4vndOeEbSwURQAABBBBAAAEEEEAAgQQVoIdSHp8YDbV27733utemTZtsypQp9uWXX5rmGfr+++9NPZa8tHfvXnvkkUdcEOidd95x8xFp25IlS7wsprmAtH96ST2jdu7c6Yan05B1p556aprsmo9Jf7hHS8cdd5y/KRjgWrlypb++f//+fh39lWEL/+///T8bP3582Nr/+5gT7VLgrlevXhGPx0oEEEAAAQQQQACBxBaIx3fnSC3U99ZKlSpF2hSyrk6dOiGf+YAAAggggAACCCCAAAII5CcBAkoJdLZPOukk69u3r3upWtu3b7ePPvrIzYf0xRdf+DUdN26c3Xfffe6llcHAi4a10yvWtHnz5ohZNSxcVtKqVav83WrXru0vR1tIL09OtEvzSqUXKItWT9YjgAACCCCAAAIIJJZAVr87R2rFtddea61bt460iXUIIIAAAggggAACCCCAAAL/EWDIuwT+UShTpoxdccUV9vnnn9vzzz9vxYoV82vrDQd36NAh27hxo78+swvRAkqacynWpGH5lFSXrVu3+ruVKlXKX462ULFixYibcqpdp5xySsTjsRIBBBBAAAEEEEAguQVi+e6cEy0MPqwUnBs1lmMFe/pn5vt3LGWTBwEEEEAAAQQQQAABBBCItwA9lOItmkF5b7/9tt16660ul3oBTZ8+PYM9/m+zhobTXEovvPCCW7F06VLbtWuXKWijoIwXVNJwbjVr1oypTGWK55OYhQsXtvLly9uWLVvc8TVEX0YpGIAK5lVZOdGuypUrBw/DMgIIIIAAAggggEACC+TEd+d4N1cPLGmoaqXg8M+xHCc4n2mRIkVi2YU8CCCAAAIIIIAAAggggECeCRBQymX60qVL2/r1691RN2zYYL/99pudcMIJMdWiW7dufkDp6NGjpqCSAkL16tXzA0o9e/a0gQMHxlReTmSqVauWH1D68ccfMzxEen9050S7+EM9w1NCBgQQQAABBBBAIGEEcuK7c7wbp++sH3/8sSt2+fLlmSo++F24YcOGmdqXzAgggAACCCCAAAIIIIBAbgsw5F0ui7do0cI/ooaK++yzz/zPGS2sXbs2JEvZsmXdZ/0R66VYejzdddddduWVV7pX8KlIr4zsvCug5KXXX3/djhw54n2M+P7qq69GXK+VidSuqJVkAwIIIIAA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gAABAgQIEKi0wMqVK9NTTz2VzjjjjCanydvd9covendX1+8ECBBojUB5nBFQao2gcwgQIECAAAECBAgQIECAAAECBAgQILCXBcovevfyrbg8AQI1KlAeZzrUaB91iwABAgQIECBAgAABAgQIECBAgAABAgQIECBAoEICAkoVgtQMAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBWBQSUavXJ6hcBAgQIECBAgAABAgQIECBAgAABAgQIECBAoEICAkoVgtQMAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBWBQSUavXJ6hcBAgQIECBAgAABAgQIECBAgAABAgQIECBAoEICAkoVgtQMAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBWBQSUavXJ6hcBAgQIECBAgAABAgQIECBAgAABAgQIECBAoEICAkoVgtQMAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBWBQSUavXJ6hcBAgQIECBAgAABAgQIECBAgAABAgQIECBAoEICAkoVgtQMAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBWBQSUavXJ6hcBAgQIECBAgAABAgQIECBAgAABAgQIECBAoEICAkoVgtQMAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBWBQSUavXJ6hcBAgQIECBAgAABAgQIECBAgAABAgQIECBAoEICAkoVgtQMAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBWBQSUavXJ6hcBAgQIECBAgAABAgQIECBAgAABAgQIECBAoEICAkoVgtQMAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBWBQSUavXJ6hcBAgQIECBAgAABAgQIECBAgAABAgQIECBAoEICAkoVgtQMAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBWBQSUavXJ6hcBAgQIECBAgAABAgQIECBAgAABAgQIECBAoEICAkoVgtQMAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBWBQSUavXJ6hcBAgQIECBAgAABAgQIECBAgAABAgQIECBAoEICAkoVgtQMAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBWBQSUavXJ6hcBAgQIECBAgAABAgQIECBAgAABAgQIECBAoEICAkoVgtQMAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBWBQSUavXJ6hcBAgQIECBAgAABAgQIECBAgAABAjUt0KNHj6x/9fX1Nd1PnSNAYO8I5GNLPtYIKO2d5+CqBAgQIECAAAECBAgQIECAAAECBAgQaJNA7969s/PXrl3bpnacTIAAgaYE8rElH2sElJpScowAAQIECBAgQIAAAQIECBAgQIAAAQL7uMARRxyR3WH+0ncfv123R4BAlQnkY0s+1ggoVdkDdLsECBAgQIAAAQIECBAgQIAAAQIECBAIgfwl7zPPPAOEAAECFRfIx5Y+ffpkbQsoVZxYgwQIECBAgAABAgQIECBAgAABAgQIENjzAqNHj84usmDBgj1/MVcgQKDdCeRjy6hRo7K+77fjjdLuFHSYAAECBAgQIECAAAECBAgQIECAAAECVS6wbt26FJkD3bp1Sy+++GLq0qVLlffI7RMgsK8IvP766+mQQw5JmzdvTmvWrEmxjpIMpX3l6bgPAgQIECBAgAABAgQIECBAgAABAgQItEAgXvCOGDEibdq0KS1cuLAFZ6pKgACBXQvEmBJjS4wxMdZEEVDatZlfCRAgQIAAAQIECBAgQIAAAQIECBAgsM8KTJw4Mbu36dOnJ5NR7bOPyY0RqCqBGEuuvvrq7J7zMSZ2THlXVY/RzRIgQIAAAQIECBAgQIAAAQIECBAgQOBNga1bt6aBAwemVatWpTlz5qRJkya9+aMtAgQItEJg7ty5afLkyalv377pySefTHV1dVkrMpRagekUAgQIECBAgAABAgQIECBAgAABAgQI7AsC8aI3spOiTJ06Nb366qv7wm25BwIEqlQgxpAYS6LE2JIHk2JfhlIoKAQIECBAgAABAgQIECBAgAABAgQIEKhSgf/+97/ppJNOSitWrEhnnXVWmj9/furQQS5BlT5Ot01grwnEWHL22Wdna7INGzYsLVu2rMFYYlTZa4/GhQkQIECAAAECBAgQIECAAAECBAgQINB2gQge3XXXXalXr17Zi+DLLrus7Y1qgQCBdicQY8fChQuzsSTGlMaBaQGldvdXQocJECBAgAABAgQIECBAgAABAgQIEKg1gaOOOirdfffdqXPnzun6669Pl1xySYpsA4UAAQK7E4ixIsaMGDtiDImxJMaUxkVAqbGIfQIECBAgQIAAAQIECBAgQIAAAQIECFShwMiRI9Ntt91WBJVi6iprKlXhg3TLBN5GgRgjYqzIg0kxhsRY0lQRUGpKxTECBAgQIECAAAECBAgQIECAAAECBAhUocCECRPS4sWLi+nvBg8enObOnZt27NhRhb1xywQI7CmBGBNibIgxIp/mLsaOGEN2VvZ74yQjyc50HCdAgAABAgQIECBAgAABAgQIECBAgEAVCjz77LPpvPPOSytWrMju/sQTT0zTpk1LZ511VurSpUsV9sgtEyBQCYHXX389CyBNnz49Pf7441mTw4YNy9Zha2qau/I1BZTKGrYJECBAgAABAgQIECBAgAABAgQIECBQIwKxLkpkIEQgadWqVVmvunfvnsaNG5fGjx+f+vfvn4444ojsc8ABB9RIr3WDAIFcoL6+Pq1duzb7PPPMM2nBggVp0aJFadOmTVmVvn37pggsTZo0KXXosPsJ7QSUclnfBAgQIECAAAECBAgQIECAAAECBAgQqEGBrVu3plmzZmXBpeXLl5v+rgafsS4RaK7Afvvtl4YPH54FkT73uc+lurq65p6aBJSaTaUiAQIECBAgQIAAAQIECBAgQIAAAQIEqltg3bp16d57701Lly5Na9asKbIXIpNBIUCgtgQi8zDPQuzTp08aNWpUOuecc1Lv3r1b1dH/A/XuCrKA4yPGAAAAAElFTkSuQmCC&quot; style=&quot;cursor: move;&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The packet loss reported in these RR packets is important because the audio and video being sent will be adjusted based on that parameter:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;In case of &lt;b&gt;audio&lt;/b&gt; streams the packet loss in the network modifies the level of robustness of the OPUS codec.&amp;nbsp;&amp;nbsp; In presence of high packet loss the sender increases the level of redundancy of the forward error correction (FEC) included in the audio packets.&lt;/li&gt;
&lt;li&gt;In case of &lt;b&gt;video&lt;/b&gt; streams the packet loss modifies the video bitrate encoded and sent.&amp;nbsp;&amp;nbsp; In presence of high packet loss the sender decreases the bitrate sent to reduce the possible congestion in the network.&lt;/li&gt;
&lt;/ul&gt;
Based on that behavior the question is... How should a SFU calculate the packet loss reported in the RR packets sent from the SFU to the Sender to get the best possible user experience?&lt;br /&gt;
&lt;br /&gt;
In the next sections you can find a suggestion for how to handle this in three different types of streams: Audio, Video with simulcast and Video without simulcast.&lt;br /&gt;
&lt;h2&gt;
Audio&lt;/h2&gt;
Opus FEC is sent &lt;i&gt;inband&lt;/i&gt; and because of that FEC is end to end (cannot be added/updated in an SFU) and everybody in the room will receive the same level of FEC.&lt;br /&gt;
&lt;br /&gt;
If we want audio FEC to work well for the participant with the weakest link then we have to make sure we report the worse packet loss to the sender.&lt;br /&gt;
&lt;br /&gt;
Because of that the packet loss reported from the SFU to the sender 
should be the worse packet of the receivers (max(PL1, PL2)).&lt;br /&gt;
&lt;br /&gt;
For example the packet loss reported to the sender will be 20% if one of the receiving participants is experiencing a 20% packet loss in the downlink even if the sender and rest of receivers are in perfect network conditions.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt=&quot;&quot; height=&quot;168&quot; src=&quot;data:image/png;base64,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3S9fvqzyEW+pWbNmymVdlixZBHGGtMCqx5kLO13GurVXWOljSZIkkTx58uhdj7ewUNKSO3dup9ZJugy2RYoUcahQCsa4cD7EdKKQAAmQAAmQAAmQAAmENwFf586ORo356KeffuroEPNIgARIgARIgARIgARIgARIgAQsBOjyzgIjlJIJEiSQKlWqyLBhw5Qbubp165rdgxs8bV108uRJM9/bBJRTt27dilUN1kVwSeeJQPGl5ezZszrp1IWfWeC/iezZs9tnqf1gjAuKsmzZsjk8HzNJgARIgARIgARIgATCl4Cnc+dAjxDn1YI4pd6I1dLf6kXAmzZYlgRIgARIgARIgARIgARIgATikgAtlOKStnGuypUrCwL/QsaNGyfPP/+8Srv6A2uf6dOnS968eZXlEsrCLV7Lli1Vnq6bNWtW6dChg971aPv48WOPynlSKFeuXGYxR4oq86AlAeWYI8FYtQRqXDly5PBYUabPzS0JkAAJkAAJkAAJkED8EQj03DnQI4FVv44hanX/7Ml5jh07ZhbDgi4KCZAACZAACZAACZAACZAACYQ6ASqU4vgKwfLnzJkz6qyrVq3ySKGEwlAqlSpVSvbs2aPq7t27V22LFy+utviDlY2fffaZuR/XicKFC5unPHHihDx48EBgFeRKnD14B2NcfFB3dSV4jARIgARIgARIgARCj0Cg586BHiHmrIsWLVLNHjx40KvmrfPgMmXKeFWXhUmABEiABEiABEiABEiABEggPgh45tcsPnoWoefEKkstK1eulEePHuldl1u4ltOKKBTMlCmTKm9VvJw+fVqscYwcNbht2zb5+9//rj6ff/65oyI+51kVSvfv35eZM2e6bAurMteuXeuwTCiNy2EHmUkCJEACXhK4du2arFmzRrkshYtQq8tQL5ticRIgARKIGgKBnjsHGlyxYsXMJi9cuCDLly83910lDh8+bFo2oVzZsmVdFecxEiABEiABEiABEiABEiABEggJArRQiuPLYH0ohpVRt27d5Ouvv3bbi6VLl8rly5fNcqVLl1bpzJkzq1hLW7ZsEbive//992XWrFlmOfvEqFGjzONvvvmm/WG/9p944gmpVKmSQGkFQXDjNm3aKMspRw1/8sknqs+OjoXSuBz1j3kkQAKhSQCK9zp16rjtHO4xhQoVUmU7duwoCO6OF4HVqlVzW9dZ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iXLx4kWnZT1VKLVr107FZkJDmzdvVgomp43+98CVK1fUSxy4yqtdu7Z68YND3ozF3TkcHfemfVesAtWOoz4yjwQCQYC/QYGgyDZIgARcEQj1+8z169eVFbNWMO3YsUMePHhgDgn9L1OmjKlggqu8HDlymMeZIAESIAESIAESIAESIAFNgC7vNAluSYAESIAEoopArly5TGsgrOQ9f/683+MvXbq02caoUaPMtKvEpk2bRMcXQ5yDUJRAsQpUO6HIiH0iARIgARIggVAlkDZtWnn22Wfls88+Uwterl27Jr/88ovAXR4slJInT65iMI4ZM0Zat24tOXPmFMRlfP3112X69Oly8uTJUB0a+0UCJEACJEACJEACJBDHBKhQimPgPB0JkAAJkEDoEChfvrzZGSiV/JXOnTtLunTpVDOzZ8+WQ4cOuWwSiiQE09ZSr149nQy5baBYBaqdkAPEDpEACZAACZBAmBCAi92GDRvKkCFDlOXS1atX1Rb7yIcC6uDBg8p1MGI05suXT/LmzSuvvvqqfPvtt3L48OEwGSm7SQIkQAIkQAIkQAIkEGgCiQPdINsjARIgARIggXAhgJcjWly5vNNl3G0zZswovXv3loEDB6pYBVAQLVy4UMUpsK8LZRJe3GzYsEEdKleunNSqVcu+WMjsB4pVoNoJGTDsCAmQAAmQAAmEOYGkSZOa7u4wFMRb2r59uxmDCXOVU6dOydSpU9UHZbJmzSqY5+g4TCVLlpSECbleFWwoJEACJEACJEACJBDJBDjji+Sry7GRAAmQAAm4JJAhQwbz+PHjx820P4levXqp2Exo49y5c+pFywcffCDLli0TxEuC4mrlypXSqFEjpXhCObiagUuZJEmSYDckJVCsAtVOSEJip0iABEiABEggAggkSpRIxYHs27evLFiwQC5cuCA7d+6U0aNHS6tWrZRLvL/++kt++OEH6datm4q/hHiUzZs3F7j83bZtmzx8+DACSHAIJEACJEACJEACJEAC9gRooWRPhPskQAIkQAJRQyB9+vTmWNesWSMdOnQw931NpEmTRr1IgVsYWCfdvn1bWSI5aw/lv/76a8HK3lCWQLEKVDuhzIp9IwESIAESIIFIIpAgQQIpW7as+nTv3l0NDS7xfvvtN/ODOEvz589XHxRIlSqVsrzWFkyVK1eWZMmSRRIWjoUESIAESIAE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oULJGSnmkwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJhA2BBw8eyNatW00FE6yZYNVkldy5c5sKprp160qxYsWshz1Knzt3zsbyKVmyZDJ06FDp1auXJEyY0KM2AlHI/kVvINpkGyRAAiRgJWB/n6FCyUqHaRIgARIgARIgARIgARIgARIgARIgARIgARIggYgggHhLO3fuNBVMa9euFcRlskqWLFlMBRNc5JUpU8atUuj777+Xtm3bWptRacRwmjx5shQoUCDWsWBk2L/oDcY52CYJkEB0E7C/z1ChFN3fB46eBEiABEiABEiABEiABEiABEiABEiABEiABKKCQExMjOzfv99UMP32229y9uxZm7GnT59eatasqZRMsGCqWLFirBhJb775pnz11Vc29fROypQpZeTIkfLGG2/orKBt7V/0Bu1EbJgESCBqCdjfZ6hQitqvAgdOAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAtFNAHGQoFjSnz/++MMGSKpUqaR69eqmFVPVqlWlcuXKsnfvXpty9jsNGzb8//buBd6qMf/j+E90kWRKoQ5FpYtbSuVSuU5DSWbcSuU+RIMZI4ZxL/VCZDSM3EUZxkjjUhmUymWaEnJJKZROpRqkey7nv78Pz/qvs84+5+xrnb3353m9tr32Ws969nreq/N4vdZvP7/HHn74YVOKvWyV6IPebH0P7SKAQOEKRMcZAkqF+2+BniOAAAIIIIAAAggggAACCCCAAAIIIIBASGDJkiVBcElBprlz54aOmtWoUcM2b95cal95H+rWrWsjR460s846q7wqae2PPuhNqzFORgABBOIIRMcZAkpxkNiFAAIIIIAAAggggAACCCCAAAIIIIAAAgisXLmyVIDpvffeM6XOS6b06tXL7r//ftt1112TOa3SutEHvZWeQAUEEEAgSYHoOENAKUlAqiOAAAIIIIAAAggggAACCCCAAAL5KLBw4UL78MMPrVWrVu6VS31cvHixvfvuu9a4cWPr0KFDLl0615pjAgMHDrR777036aveeeed3Xmnnnpq0ueWd0L0QW959diPAAIIpCoQHWcIKKUqyXkIIIAAAggggAACCCCAAAIIIIBAnggohdeBBx7o0nuNHj3azjzzTLvyyivtmWeeqbCHjRo1spYtW9oxxxxjffv2Nf/gSScVFxe7dWe0rRkad955pzaTKitWrLBJkybZO++8Y/PmzTN9X+vWre20006zpk2bBm0pGNamTRurWbOmzZ8/39ULDrKBQAYFFLB8++23U26xT58+ds8991j9+vVTbsOf6P/ekp0x5c/nHQEEEKhMIDrOEFCqTIzjCCCAAAIIIIAAAggggAACCCCAQJ4L3HTTTXbjjTfaAQcc4II31apVs3POOcceffTRhHvepUsXGzdunDVs2NCds2jRIttzzz3d9umnn25PPPFEwm2p4vPPP2/nnXeeKeVYtChw9Mc//tGGDh0aBLEuvPBCu+++++yMM86wxx57LHoKnxFIW2DNmjX2i1/8wn788ce02tptt93swQcftOOPPz6tdqIPetNqjJMRQACBOALRcYaAUhwkdiGAAAIIIIAAAggggAACCCCAAAKFIvDpp5+62T2apTRhwgTr3r2763o4oHTRRReVmlGhGRHLly93KfJmzJgRUPXr18/GjBnjPqcTUNJ1+IftCm517NjRBbsWLFhgU6ZMCb5v+PDhNmjQIPdZM6JatGhhmzZtMl2TzqEgkEkBzZbzfx/ptrv99tubArlXXHFFyk1FH/Sm3FCenLh+/XqbM2dOwr1p0KCBC3pvt912CZ+TDxU//vhj++abb1xX2rdvbzVq1MiHbiXdhw0bNlitWrWCHyUk3UCBnBAdZwrrr6VAbjLdRAABBBBAAAEEEEAAAQQQQAABBBIVuPvuu03BJK2dVN7D8j/84Q8utV28Nv/973/bCSec4NoYO3asXXvttS4tXby6iez74YcfXLo91a1evbo9/vjj1rt37+DUV1991Xr27GkbN260q6++2s4++2zTg+GioiLT+jSqf9ttt9nTTz8dnMMGApkQmDZtWsLNaCZTkyZNXGpGpWf0L83a0/Yuu+yScFtUTExA6S4PPfTQxCr/XGvbbbd1QaUBAwbYJZdc4gIMSTWQg5XbtWvnxk9dutaf22OPPXKwF8lfsgJI+v/df/7zH7fm3meffWYK7Or/ffvvv78L7u63337JN1xgZxBQKrAbTncRQAABBBBAAAEEEEAAAQQQQAABL7Bu3Tp75JFH3Mf+/fv73Um9/+pXv7KLL77YRowY4c7TDAGtc5Rq0UP7Dz/80J1+wQUXlAomaafWa/rzn/9s119/vX3//fc2a9YsO+6441x9zZBSQOnZZ581zZAKr7PkKvAf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&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;h2&gt;
Video with Simulcast&lt;/h2&gt;
When using &lt;a href=&quot;https://webrtchacks.com/sfu-simulcast/&quot;&gt;Simulcast&lt;/a&gt; the SFU has the ability to send a different video quality to each participant so there is no need to adapt the sender stream to any specific participant.&lt;br /&gt;
&lt;br /&gt;
Because of that the packet loss reported from the SFU to the sender should be the packet loss in that link (Sender-SFU) no matter what the packet loss received the Receiver 1 and 2 is.&lt;br /&gt;
&lt;br /&gt;
For example the packet loss reported to the sender will be 0 if the sender uplink is good even if the receivers are experiencing big packet loss in the downlink.&amp;nbsp;&amp;nbsp; That will be corrected with retransmissions and bitrate adaptation done in the SFU by selection a lower resolution/layer to be forwarded to those participants.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt=&quot;&quot; height=&quot;169&quot; src=&quot;data:image/png;base64,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D2HqRAABBBBAAAEEEEAAAQQQQAABBDJIYNWqVbbPPvuY3l988UU75ZRTbMmSJdayZcuUn6J27do2cuRIO++886Jzzj77bHviiSfc+ueff26tW7eO9hW3oEyQCy+80MaMGZPw0A4dOthjjz1m7du3d/t1v6pfHevz5s0zBZ4oCKRbYNiwYXb77beXuVoFb0eNGmUaDq8sJezoLUs9nIsAAggkEwjbme2THcR2BBBAAAEEEEAAAQQQQAABBBBAAIHcELjmmmtcMKlLly4umBT71Pvtt19cRsX69evtyy+/tEmTJtl3331n69ats4suusgOPfRQ23fffWOrKNG6gkLdu3e39957z53XsGFD69q1q9WoUcOU6fT111+7eW369OnjMpc0BFmLFi3s/PPPt3vvvdcGDx5sr776aomuycEIpCIwderUVA4r9hhlBCoT8IUXXrBWrVoVezwHpCawcOFCW716dUoHV69e3QXN1X7kUlm7dq198skn7pHVtubq92/r1q22efNmq1mzZi59/GV+VgJKZSakAgQQQAABBBBAAAEEEEAAAQQQQCBzBVauXGl///vf3QNcccUVCR/kgAMOsFtuuSXhvjVr1tiZZ55p48ePty1bttjNN9+cNKsoYQUJNqqT3QeT8vLybMKECbbTTju5I3/88UcbNGiQvfLKK/bVV1/Z8OHD7e6773b7Lr/8chdQ0rBkn376qSkQRkEgXQIKms6ePTul6rbbbjtr2rSpC3Qq2Bn7at68OR3ZKUmW7CANszlu3LgSnaQsMQXC1cYp8zHby/33329XX321e0wNFfroo49m+yNHzzdjxgx79tln3Q8SPv74Y/dDCP2dathWDWV5wQUXmAKNlOQCBJSS27AHAQQQQAABBBBAAAEEEEAAAQQQyHoBzeeyadMmq1u3rp1wwgklfl4FejR30W677eYCSuqkK2t58MEHXRXVqlVzwSkfTNJG3aeG0Zs8ebJpWLyZM2dGl9N8TgcffLCbc0nD740ePTraxwICZRXQd+3nn3921Wj+MAWFYgNFfr1JkyamoBKl6guoHcnPz7eJEyfalVdemfVzsPnvcNX/ZNJ3hz/99JP7scNtt90W/Q372vXDBL3eeustNwyl/k88+uij/W7eYwQIKMWAsIoAAggggAACCCCAAAIIIIAAAgjkkoA6z1ROOukkUyd5aYqGjNKw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WrVqpeMSOVEHAaWc+Jh5SAQQQAABBBBAAAEEEEAAAQQQQCCxgCaHVzBJE8hrKCD/63l15MUGaxLXkHzrQw89ZHqVtISBrZKe64d9O/XUU01zEeVaUeerMgf0uuqqq5I+viaj11xLmzZtMg0N5ofI04T04dwrSStgBwJZIqC/meOOO84efPBB90Qa8i4sysLxAaU+ffrY2WefHe5OaTmcB04Zg2pbNcxasqIh8t544w23u27dui54FGYD6W9Uw7OVV9EcbppfSJlNn332mc2bN8/2339/8wElZbaefvrpcZdPh1VYaUl/lBCeGy5fffXV9te//jXa1LFjR5eJ5ofyi3awUKxAesJ7xV6GAxBAAAEEEEAAAQQQQAABBBBAAAEEqqJAz549rXXr1vbzzz/bmDFjquItpnxPGvrtww8/dMerM5SSXEBZSX44QWVk3HLLLS6opGHCFFzS+qxZs5JXwB4EskigXbt20dMocy8sYSDHDwMX7o9dvv766+2cc85xL5/1FAaU1q5dG80TF3uuX9dwlWrD9Hruuefc5vA+li5daosXL/aHJ3yfM2dOdB933313wmOSbVT7cPLJJ0e7Nezde++9Z1999ZXbprnZGjRoEO33C+E9ltbK15Wu93feeadQMGnAgAH27rvvRvNCpes6uVIPAaVc+aR5TgQQQAABBBBAAAEEEEAAAQQQQCCBgH4l7+c3UqejMlYytfhfoCtQ0qVLl0x9jAq5bw33NGHCBDeXyGuvvWaDBw+2Dh062ObNm23y5MmmTnEN1/XEE09UyP1wEQQqUyAcTm716tWFbkVBd1+UATl//ny/Gve+cOFCF4x9/PHHXQaMn7NIw+T57E+ddMcddyTNAFXAKQzu//73v3fXUcalsglVNHzddddd55aT/XPXXXeZ7kOv4oJPierQsHe+KKDks5O0LXa4O39cOqx8Xel4VybYFVdcEVV1yimn2JNPPmkano9SOgECSqVz4ywEEEAAAQQQQAABBBBAAAEEEEAgawTUOaiOSk36/sADD2Tkc2nuJU24rqGgSjPMXkY+dBpuWsNpqRNYHdzvv/++rVy50nUcX3zxxS5TKdmQUMpoW7ZsWRrugCoQqHyBMNtGQXUNCemL/j66du3qVvW97969u02bNs3vjt71t6OAhS+aw23XXXd1qwpghPP3aH6z/v37uwCuP17vP/74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AggggAACCCCAAAIIIJCBAl9++aWdfPLJNmfOHHf3HTp0sOuvv9569OhhNWvWzMAn4pYRQCAdAhs3bnQBpOHDh9sHH3zgquzUqZObhy3RMHfhNQkohRosI4AAAggggAACCCCAAAIIIIAAAggggAACWSKgeVGUgaBA0pIlS9xT1a5d27p37249e/a0PfbYwxo3buxederUyZKn5jEQQMALrF271goKCtxr8eLFlp+fb2+88YatW7fOHdKiRQtTYGnAgAG27bbFD2hHQMnL8o4AAggggAACCCCAAAIIIIAAAggggAACCGShwKZNm+yhhx5ywaXZs2cz/F0WfsY8EgKpCmyzzTbWuXNnF0Q6//zzrUaNGqmeagSUUqbiQAQQQAABBBBAAAEEEEAAAQQQQAABBBBAILMFli9fbuPHj7dp06bZsmXLouwFZTJQEEAguwSUeeizEJs0aWJ5eXnWp08fa9SoUakelIBSqdg4CQEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBDIHYHiB8XLHQueFAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAIIHA/wGi3AFvAKs/cwAAAABJRU5ErkJggg==&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;h2&gt;
Video with No-Simulcast&amp;nbsp;&amp;nbsp; &lt;/h2&gt;
When there is no &lt;a href=&quot;https://webrtchacks.com/sfu-simulcast/&quot;&gt;Simulcast&lt;/a&gt;
 the SFU has to send the same video quality to every
participant.&amp;nbsp; Because of that it is important that the sender adapts the
 sending bitrate to the participant with the weakest link (and/or 
disable the video for some participants).&lt;br /&gt;
&lt;br /&gt;
This bitrate 
adaptation is mostly controlled by REMB RTCP packets where the SFU includes the bandwith available in the worse receiver. &amp;nbsp; But packet loss 
has also an impact on top of the bitrate reported in the REMB packets so we need to decide what packet loss to include in the RR packets.&lt;br /&gt;
&lt;br /&gt;
In this case I think both approaches described in the previous sections can work reasonably well.&amp;nbsp;&amp;nbsp; Either a) the SFU reports back the worse packet loss of the receivers or b) use the packet loss of each receiver to estimate its bandwidth and report only the sender side packet loss in the RR packets.&lt;br /&gt;
&lt;br /&gt;
Note:
 If you use P2P connections when there are 2 participants in the room 
and switch to the SFU with Simulcast when there are 3 or more participants 
in the room you should be almost never in this Video with No-Simulcast 
and multiple participants case.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;i style=&quot;background-color: white; color: #444444; font-family: roboto, sans-serif; font-size: 15px;&quot;&gt;You can&amp;nbsp;&lt;a href=&quot;https://twitter.com/anarchyco&quot; style=&quot;color: #2196f3;&quot;&gt;follow me in Twitter&lt;/a&gt;&amp;nbsp;if you are interested in Real Time Communications.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/1458791735731055178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2018/12/sending-packet-loss-feedback-in-webrtc.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/1458791735731055178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/1458791735731055178'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2018/12/sending-packet-loss-feedback-in-webrtc.html' title='Sending Packet Loss Feedback in WebRTC SFUs'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-4865487206122658230</id><published>2018-10-05T07:19:00.003-07:00</published><updated>2018-10-05T07:20:30.731-07:00</updated><title type='text'>Measuring WebRTC video quality for different bitrates - Playing with VMAF</title><content type='html'>I&#39;ve been wanting to play with &lt;a href=&quot;https://github.com/Netflix/vmaf&quot;&gt;Netflix Video Multi-Method Assessment Fusion (VMAF&lt;/a&gt;) for a while and yesterday I found the time and the motivation to give it a try.&lt;br /&gt;
&lt;br /&gt;
Netflix VMAF is an algorithm to generate a video quality score by comparing a reference image/video with a distorted image/video.&amp;nbsp; &amp;nbsp;To do that VMAF calculates scores using tradicional image quality metrics like VIF or DLM and then aggregate them using a Machine Learning model (SVM) trained with the videos and scores coming from real users.&amp;nbsp; Smart, isn&#39;t it?&amp;nbsp; (You can see a high level description of those metrics that are aggregated in this &lt;a href=&quot;https://medium.com/netflix-techblog/toward-a-practical-perceptual-video-quality-metric-653f208b9652&quot;&gt;Netflix post&lt;/a&gt;&amp;nbsp;or the &lt;a href=&quot;https://en.wikipedia.org/wiki/Video_Multimethod_Assessment_Fusion&quot;&gt;Wikipedia page&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
It is important to notice that &lt;b&gt;VMAF works in a per-frame base so it is NOT a good tool to measure the quality impact of many artefacts happening in Real Time Communications&lt;/b&gt; (delays, reduced/frozen framerate, audio/video desync).&amp;nbsp; &amp;nbsp;However we can use it to measure the impact of different encoding settings like the average bitrate of the encoding.&lt;br /&gt;
&lt;br /&gt;
As you can expect coming from Netflix VMAF was designed for video streaming and trained using images from movies.&amp;nbsp; &amp;nbsp;Anyway I was interested on seeing how it performs with mobile videoconference like videos so I recorded a short typical VGA video with a talking face not very stable.&lt;br /&gt;
&lt;br /&gt;
I reencoded that sample video in VP8 using ffmpeg with different bitrates (50kbps, 100kbps, 200kbps, 400kbps, 600kpbs, 800kpbs, 1.2mbps, 2mpbs) and then used the &lt;a href=&quot;https://github.com/Netflix/vmaf/blob/master/resource/doc/VMAF_Python_library.md&quot;&gt;ffmpeg2vmaf&lt;/a&gt; command line tool to calculate the score of those videos and presented them in the following graph:&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img height=&quot;395&quot; src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAALmCAYAAABSJm0fAAAgAElEQVR4XuzdCZgdVbXo8dXpTqczEEgIBEKCBJkCGiIEkBsGUQZRZsGAAUEGH1wTYgSFKwqXSAABZbgGhAtiQOYpPIISFAhBAgQFEgiDEmSegmSQTJ109/tW8U5b6ZzTfU6d2nXW3vU/3/e+p+mqXWv/Vq1791m3ap+6tra2NuGDAAIIIIAAAggggAACCCCAAAIIIICAUYE6GlhGM0NYCCCAAAIIIIAAAggggAACCCCAAAKRAA0sbgQEEEAAAQQQQAABBBBAAAEEEEAAAdMCNLBMp4fgEEAAAQQQQAABBBBAAAEEEEAAAQRoYHEPIIAAAggggAACCCCAAAIIIIAAAgiYFqCBZTo9BIcAAggggAACCCCAAAIIIIAAAgggQAOLewABBBBAAAEEEEAAAQQQQAABBBBAwLQADSzT6SE4BBBAAAEEEEAAAQQQQAABBBBAAAEaWNwDCCCAAAIIIIAAAggggAACCCCAAAKmBWhgmU4PwSGAAAIIIIAAAggggAACCCCAAAII0MDiHkAAAQQQQAABBBBAAAEEEEAAAQQQMC1AA8t0eggOAQQQQAABBBBAAAEEEEAAAQQQQIAGFvcAAggggAACCCCAAAIIIIAAAggggIBpARpYptNDcAgggAACCCCAAAIIIIAAAggggAACNLC4BxBAAAEEEEAAAQQQQAABBBBAAAEETAvQwDKdHoJDAAEEEEAAAQQQQAABBBBAAAEEEKCBxT2AAAIIIIAAAggggAACCCCAAAIIIGBagAaW6fQQHAIIIIAAAggggAACCCCAAAIIIIAADSzuAQQQQAABBBBAAAEEEEAAAQQQQAAB0wI0sEynh+AQQAABBBBAAAEEEEAAAQQQQAABBGhgcQ8ggAACCCCAAAIIIIAAAggggAACCJgWoIFlOj0EhwACCCCAAAIIIIAAAggggAACCCBAA4t7AAEEEEAAAQQQQAABBBBAAAEEEEDAtAANLNPpITgEEEAAAQQQQAABBBBAAAEEEEAAARpY3AMIIIAAAggggAACCCCAAAIIIIAAAqYFaGCZTg/BIYAAAggggAACCCCAAAIIIIAAAgjQwOIeQAABBBBAAAEEEEAAAQQQQAABBBAwLUADy3R6CA4BBBBAAAEEEEAAAQQQQAABBBBAgAYW9wACCCCAAAIIIIAAAggggAACCCCAgGkBGlim00NwCCCAAAIIIIAAAggggAACCCCAAAI0sLgHEEAAAQQQQAABBBBAAAEEEEAAAQRMC9DAMp0egkMAAQQQQAABBBBAAAEEEEAAAQQQoIHFPYAAAggggAACCCCAAAIIIIAAAgggYFqABpbp9BAcAggggAACCCCAAAIIIIAAAggggAANLO4BBBBAAAEEEEAAAQQQQAABBBBAAAHTAjSwTKeH4BBAAAEEEEAAAQQQQAABBBBAAAEEaGBxDyCAAAIIIIAAAggggAACCCCAAAIImBaggWU6PQSHAAIIIIAAAggggAACCCAQusCL77TK0/Nb5JX3W+S9RW2ydEWb9G6qk43Xq5OtN66XnTavl2036RY6A/NDoFMBrxpYCxculFmzZsm//vUvGT16tNTV1ZWc3Msvvyy///3v5eOPP5bu3btLW1ubbLfddnLggQdKU1NT0fNWrlwp9913n7z44ovR8atXr5a+ffvKfvvtJ8OHDy/7VtJzH3vsMZk5c2Y0hsapMeyyyy6y1157Sbduxf8Hz4IFC+Tee++VN954QxoaGqJzBw8eHMU8aNCgsq/PgQgggAACCCCAAAIIIIAAAvYFZr68Wm5/cpW89G5rl8EOG9RNvvnF7rLHNg1dHlvpAR999JFMnz49Om3IkCGyxx57dDrEe++9Jw8++GD0vXXo0KHyH//xH/LKK6/I7Nmzo++++h34G9/4RvT3rj7PPfecPP/889F5+v8OPvjgTs8rXEe/Vx9wwAGy7rrrlrzEo48+Km+99VaXceh373322UcGDhzYVbiybNkyeeSRR+Sll16SpUuXRsf36tVLtt12W9l1112lf//+XY7BAckEzDewmpubZc6cOVFD6P33349m2adPHznrrLOkvr6+6KzvvvtuefLJJ4v+TW/ysWPHRo2h+EebR5deemnUNCr22X777eVb3/pWp00zPU/Pnzx5srzzzjtFxxkwYICceuqpazXRtGhvvvnmklk89NBDo2LggwACCCCAAAIIIIAAAggg4LdAm4hcPG2lTJ9b/PtnZ7Pbb3iD/PDrPaST5zkqxtGGlH4f1o9+z/7Zz37WadPnjjvukKeffjo6/otf/KIcdthhcs8998gTTzzRfu0jjjhCdtppp05j0Yc/zjvvvOghFf1o4+uMM84o2QTS4y+55BLR7+/62W233eSggw4qeo2Ox3aFcvjhh8vOO+/c6WEzZsyIHpTp7KMPrey///5dXY6/JxAw28BasmSJaFFod7XjRxtYP/nJT4o+yfTUU0/JXXfd1X6KFox2kB9++GFZtGhR0YJsbW2Vc889V5YvXx79XZ+6+spXviIffPBB9MRX4aPd3a460VOmTJF58+a1F592cbXrrN3pQnNMO9SnnHJK+7hafFqEWmD60b+PHDlS5s6d2z5/LWRtvOlc+CCAAAIIIIAAAggggAACCPgpsKy5Tc66baXMfasl8QSGD6mXSaN7SK/G0m8lVTK4fhfVBlbhoZHvfOc7MmzYsKJD6Pda/f6sbzDp99TTTjtNNtxwQ7n//vtFn3gqfDbaaCP5/ve/X/INJD1u/vz5cvXVV7efo+OdeeaZ0q9fv6LX1vh++ctftv9N3646++yzizbbdE6XXXaZaHOu8D1/nXXWaf/eHb+AzkkbWJtttllJNn3L6ze/+U373/WpqxEjRkiPHj2ih2707a/CRxtY2sjik66A2QaWNq6uu+669tkWXqnTfyjVwIp3WPXGP+aYY+Rzn/tcNIb+7de//rX84x//iP77UUcdJV/4whei/xy/1sYbbyzjx49vL7JXX31Vrrnmmui49dZbLyqmUq8A6uODkyZNihpV2rXWzrGeox/92wUXXCD6RFnHopw6dWp7o2zUqFHRI5OFjz7G+dBDD0X/dccdd4xeneSDAAIIIIAAAggggAACCCDgp8AZt66Qv7yWvHlVmPXIzevl50cW3x4niczjjz8ebWmjH91+59hjjy06TPw78gYbbBA1sPQ7cscGln7vnTBhgmgjq9RHG0LaGCp8umpgxb87F84p1WyLN7B0XG109e7dOwlN1E/QN63efPPN6PxiT1n95S9/kdtvvz36u/YDfvrTn0avFvJJT8BsA6vQid18881lzz33lG222ab9hinVwNI9si666CJpaWmJnlQaN27cGlL6pNPFF18c/Zu+EjhmzJjoP99yyy3y7LPPRo2lYk85aSNNm1xdPc6oXdebbropGnPvvfeWfffdd43rx/8HwpFHHik77LCD6NNf559/vugTZ3qTT5w4MXrvt/DRv59zzjlRd7uzJ8/SuyUYCQEEEEAAAQQQQAABBBBAwIXANQ83y21Prkpt6NFf7C7f/XJjKuN1fCCj43fTwkV0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zTbRv5X69cDCQIUxOr4iWPh7fKP4wiuM8X8r9YpgfNz4xvO1uml8ve6HS9rkqF8tqyp83cBdN3Ln47cACyW/80f02QpQL9l6czW/BagXv/NH9LURoG5q485VEfBRIBcNrPhTTronle4/1bEZpb8AqL8EWOrTo0cP+f73vy/rr79+yWOqbWB13Jer3MaYjzderWL++X0r5cHnO/+lyVKxbbVxN7nqOz1rFTrXTVGAhVKKmAwVvAD1EnyKmWCKAtRLipgMlRsB6iY3qWaiCFQtkIsGVnwj9MMPP1x23nnnNeD01/90g/VFixa1//uALJ13VgAAIABJREFUAQOizdjj/6ZNLN2PSp/KKvahgVX1/eh8gLc+bpXjfr080XUmHt4ko7bi6atEeMZOYqFkLCGEY1qAejGdHoIzJkC9GEsI4XghQN14kSaCRMCEQPANLG1CnXvuudEm6J01oB577DGZPXt29GTWscceK/37948S9Pe//12uv/76qJmlnwMPPDB6nZAGlon7N1EQSfbCOmjH7jJ+v8ZE1+MkewIslOzlhIjsClAvdnNDZPYEqBd7OSEi+wLUjf0cESECVgSCb2DFf/mv2C8DlpOIefPmif6CoX6GDx8uRx99NA2scuAMH/PU/Ba5/tFm+fv7rV1GedrXesjXRhR/6q7LkznApAALJZNpISijAtSL0cQQlkkB6sVkWgjKuAB1YzxBhIeAIYGgG1itra0yadIk+de//iX19fXRrwv26tWrYv5Vq1ZFT3E1NzdLqT20dFCrrxAW/pdCxRPPwQnPvddXnnmvr7y8oM8as91sveUyYuMlsuuQhVJXlwMIpogAAggggAACCCCAgCcC+uNXfBBAIH8CQTew4k9OlfqFv0LKtTmle2Hpa4YdP/rvl156qbz//vvSp08fOeuss6KGWMfP1KlTZdasWaK/Qnj66afLBhtssMYh8c3kC09yxf+t1Cbu8XGT/AohDayuC3tVa528vbin6P+/yTorpHdjS9cncQQCCCCAAAIIIIAAAghkLkADK3NyLoiACYFgG1jadLrkkktkwYIFUUPptNNOkw033LAo+quvvirXXHNN9LeTTjpJttxyyzWOW7FihUycODHaB2vo0KFy8sknR2N2/Dz55JNy9913R/9cbLP4eEOtsJeWPiWmT3ctX75cmpqaok3i480xncfFF18sH330Uad7eJm4mwgCAU8EeFTdk0QRpgkB6sVEGgjCEwHqxZNEEaYpAerGVDoIBgHTAsE2sObPny9XX311hK9Np1NOOaVkIl5//XW58soro79vt9120Sbu8c+jjz4avR6on/iTXIsXL47+rW/fvlFDS5tl2jTTppP+iqE+haWbwutH/23y5Mny5ptvRseOHz9eBg0aFP3thhtukBdeeCH6z7q/lj6dVfhUMg/TdxrBIWBIgIWSoWQQinkB6sV8igjQkAD1YigZhOKNAHXjTaoIFIGaCwTZwNJmkTavXnvttQhYn5jafPPNS2LH98rSg7SJ9bWvfS3aL0ubVzNmzIjO1cbT2LFjZciQIRJ/auvII4+UHXbYIWpSXXbZZfLee+9Fx2+66aZyzDHHSENDg9x+++3y0ksvRf/ecR+t+Fh6jSOOOEJGjBgRHX/zzTdLS8unr7N1bG7V/O4hAAQ8FWCh5GniCLsmAtRLTdi5qKcC1IuniSPsmgpQNzXl5+IIeCUQZANLG0i6Z5V+dB8qfX2w8CRUqezEn8IqdcyoUaPk4IMPjv5crIGl/677ZF1++eXtTaeOY2mDSp8G22yzzdr/pI0vbVTNmTOn5M2z1VZbyfHHH9/lPLy6+wgWgRoJsFCqETyX9VKAevEybQRdIwHqpUbwXNZrAerG6/QRPAKZCgTZwJo+fbo89NBDEeRRRx0lX/jCF8pC1VcAb7vttug1v/insbFRDjvssOgpq8In/mpf4Qmswt8WLlwo1157bfRKYfyz7rrryoknnigDBw4sGs8jjzwiDzzwQPQkV/yz++67ywEHHFB0362yJsZBCCCwhgALJW4IBMoXoF7Kt+JIBKgX7gEEKhegbio34wwE8ioQZAOr2mTqLwN+8skn0TD6+l///v3Xah5NmzZNZs6cGf37hAkTZKONNlrrstrIWrZsWfTvukH7+uuv32Vo+rqgPsWlG7nrf9Zz9Fw+CCCQngALpfQsGSl8Aeol/Bwzw/QEqJf0LBkpPwLUTX5yzUwRqFaABlYCwSVLlsiFF14Y/Sqh7md1xhlnrPHLgQmG5BQEEMhQgIVShthcynsB6sX7FDKBDAWolwyxuVQwAtRNMKlkIgg4F6CBlYD47bffliuuuCJ6+mrcuHEyePDgBKNwCgII1EqAhVKt5LmujwLUi49ZI+ZaCVAvtZLnuj4LUDc+Z4/YEchWgAZWQm99PVB/vbCc1wITXoLTEEDAkQALJUewDBukAPUSZFqZlCMB6sURLMMGLUDdBJ1eJodAqgI0sFLlZDAEEPBBgIWSD1kiRisC1IuVTBCHDwLUiw9ZIkZrAtSNtYwQDwJ2BWhg2c0NkSGAgCMBFkqOYBk2SAHqJci0MilHAtSLI1iGDVqAugk6vUwOgVQFaGClyslgCCDggwALJR+yRIxWBKgXK5kgDh8EqBcfskSM1gSoG2sZIR4E7ArQwLKbGyJDAAFHAiyUHMEybJAC1EuQaWVSjgSoF0ewDBu0AHUTdHqZHAKpCtDASpWTwRBAwAcBFko+ZIkYrQhQL1YyQRw+CFAvPmSJGK0JUDfWMkI8CNgVoIFlNzdEhgACjgRYKDmCZdggBaiXINPKpBwJUC+OYBk2aAHqJuj0MjkEUhWggZUqJ4MhgIAPAiyUfMgSMVoRoF6sZII4fBCgXnzIEjFaE6BurGWEeBCwK0ADy25uiAwBBBwJsFByBMuwQQpQL0GmlUk5EqBeHMEybNAC1E3Q6WVyCKQqQAMrVU4GQwABHwRYKPmQJWK0IkC9WMkEcfggQL34kCVitCZA3VjLCPEgYFeABpbd3BAZAgg4EmCh5AiWYYMUoF6CTCuTciRAvTiCZdigBaiboNPL5BBIVYAGVqqcDIYAAj4IsFDyIUvEaEWAerGSCeLwQYB68SFLxGhNgLqxlhHiQcCuAA0su7khMgQQcCTAQskRLMMGKUC9BJlWJuVIgHpxBMuwQQtQN0Gnl8khkKoADaxUORkMAQR8EGCh5EOWiNGKAPViJRPE4YMA9eJDlojRmgB1Yy0jxIOAXQEaWHZzQ2QIIOBIgIWSI1iGDVKAegkyrUzKkQD14giWYYMWoG6CTi+TQyBVARpYqXIyGAII+CDAQsmHLBGjFQHqxUomiMMHAerFhywRozUB6sZaRogHAbsCNLDs5obIEEDAkQALJUewDBukAPUSZFqZlCMB6sURLMMGLUDdBJ1eJodAqgI0sFLlZDAEEPBBgIWSD1kiRisC1IuVTBCHDwLUiw9ZIkZrAtSNtYwQDwJ2BWhg2c0NkSGAgCMBFkqOYBk2SAHqJci0MilHAtSLI1iGDVqAugk6vUwOgVQFaGClyslgCCDggwALJR+yRIxWBKgXK5kgDh8EqBcfskSM1gSoG2sZIR4E7ArQwLKbGyJDAAFHAiyUHMEybJAC1EuQaWVSjgSoF0ewDBu0AHUTdHqZHAKpCtDASpWTwRBAwAcBFko+ZIkYrQhQL1YyQRw+CFAvPmSJGK0JUDfWMkI8CNgVoIFlNzdEhgACjgRYKDmCZdggBaiXINPKpBwJUC+OYBk2aAHqJuj0MjkEUhWggZUqJ4MhgIAPAiyUfMgSMVoRoF6sZII4fBCgXnzIEjFaE6BurGWEeBCwK0ADy25uiAwBBBwJsFByBMuwQQpQL0GmlUk5EqBeHMEybNAC1E3Q6WVyCKQqQAMrVU4GQwABHwRYKPmQJWK0IkC9WMkEcfggQL34kCVitCZA3VjLCPEgYFeABpbd3BAZAgg4EmCh5AiWYYMUoF6CTCuTciRAvTiCZdigBaiboNPL5BBIVYAGVqqcDIYAAj4IsFDyIUvEaEWAerGSCeLwQYB68SFLxGhNgLqxlhHiQcCuAA0su7khMgQQcCTAQskRLMMGKUC9BJlWJuVIgHpxBMuwQQtQN0Gnl8khkKoADaxUORkMAQR8EGCh5EOWiNGKAPViJRPE4YMA9eJDlojRmgB1Yy0jxIOAXQEaWHZzQ2QIIOBIgIWSI1iGDVKAegkyrUzKkQD14giWYYMWoG6CTi+TQyBVARpYqXIyGAII+CDAQsmHLBGjFQHqxUomiMMHAerFhywRozUB6sZaRogHAbsCNLDs5obIEEDAkQALJUewDBukAPUSZFqZlCMB6sURLMMGLUDdBJ1eJodAqgI0sFLlZDAEEPBBgIWSD1kiRisC1IuVTBCHDwLUiw9ZIkZrAtSNtYwQDwJ2BWhg2c0NkSGAgCMBFkqOYBk2SAHqJci0MilHAtSLI1iGDVqAugk6vUwOgVQFaGClyslgCCDggwALJR+yRIxWBKgXK5kgDh8EqBcfskSM1gSoG2sZIR4E7ArQwLKbGyJDAAFHAiyUHMEybJAC1EuQaWVSjgSoF0ewDBu0AHUTdHqZHAKpCtDASpWTwRBAwAcBFko+ZIkYrQhQL1YyQRw+CFAvPmSJGK0JUDfWMkI8CNgVoIFlNzdEhgACjgRYKDmCZdggBaiXINPKpBwJUC+OYBk2aAHqJuj0MjkEUhWggZUqJ4MhgIAPAiyUfMgSMVoRoF6sZII4fBCgXnzIEjFaE6BurGWEeBCwK0ADy25uiAwBBBwJsFByBMuwQQpQL0GmlUk5EqBeHMEybNAC1E3Q6WVyCKQqQAMrVU4GQwABHwRYKPmQJWK0IkC9WMkEcfggQL34kCVitCZA3VjLCPEgYFeABpbd3BAZAgg4EmCh5AiWYYMUoF6CTCuTciRAvTiCZdigBaiboNPL5BBIVYAGVqqcDIYAAj4IsFDyIUvEaEWAerGSCeLwQYB68SFLxGhNgLqxlhHiQcCuAA0su7khMgQQcCTAQskRLMMGKUC9BJlWJuVIgHpxBMuwQQtQN0Gnl8khkKoADaxUORkMAQR8EGCh5EOWiNGKAPViJRPE4YMA9eJDlojRmgB1Yy0jxIOAXQEaWHZzQ2QIIOBIgIWSI1iGDVKAegkyrUzKkQD14giWYYMWoG6CTi+TQyBVARpYqXIyGAII+CDAQsmHLBGjFQHqxUomiMMHAerFhywRozUB6sZaRogHAbsCNLDs5obIEEDAkQALJUewDBukAPUSZFqZlCMB6sURLMMGLUDdBJ1eJodAqgI0sFLlZDAEEPBBgIWSD1kiRisC1IuVTBCHDwLUiw9ZIkZrAtSNtYwQDwJ2BWhg2c0NkSGAgCMBFkqOYBk2SAHqJci0MilHAtSLI1iGDVqAugk6vUwOgVQFaGClyslgCCDggwALJR+yRIxWBKgXK5kgDh8EqBcfskSM1gSoG2sZIR4E7ArQwLKbGyJDAAFHAiyUHMEybJAC1EuQaWVSjgSoF0ewDBu0AHUTdHqZHAKpCtDASpWTwRBAwAcBFko+ZIkYrQhQL1YyQRw+CFAvPmSJGK0JUDfWMkI8CNgVoIFlNzdEhgACjgRYKDmCZdggBaiXINPKpBwJUC+OYBk2aAHqJuj0MjkEUhWggZUqJ4MhgIAPAiyUfMgSMVoRoF6sZII4fBCgXnzIEjFaE6BurGWEeBCwK0ADy25uiAwBBBwJsFByBMuwQQpQL0GmlUk5EqBeHMEybNAC1E3Q6WVyCKQqQAMrVU4GQwABHwRYKPmQJWK0IkC9WMkEcfggQL34kCVitCZA3VjLCPEgYFeABpbd3BAZAgg4EmCh5AiWYYMUoF6CTCuTciRAvTiCZdigBaiboNPL5BBIVYAGVqqcDIYAAj4IsFDyIUvEaEWAerGSCeLwQYB68SFLxGhNgLqxlhHiQcCuAA0su7khMgQQcCTAQskRLMMGKUC9BJlWJuVIgHpxBMuwQQtQN0Gnl8khkKoADaxUORkMAQR8EGCh5EOWiNGKAPViJRPE4YMA9eJDlojRmgB1Yy0jxIOAXQEaWHZzQ2QIIOBIgIWSI1iGDVKAegkyrUzKkQD14giWYYMWoG6CTi+TQyBVARpYqXIyGAII+CDAQsmHLBGjFQHqxUomiMMHAerFhywRozUB6sZaRogHAbsCNLDs5obIEEDAkQALJUewDBukAPUSZFqZlCMB6sURLMMGLUDdBJ1eJodAqgI0sFLlZDAEEPBBgIWSD1kiRisC1IuVTBCHDwLUiw9ZIkZrAtSNtYwQDwJ2BWhg2c0NkSGAgCMBFkqOYBk2SAHqJci0MilHAtSLI1iGDVqAugk6vUwOgVQFaGClyslgCCDggwALJR+yRIxWBKgXK5kgDh8EqBcfskSM1gSoG2sZIR4E7ArQwLKbGyJDAAFHAiyUHMEybJAC1EuQaWVSjgSoF0ewDBu0AHUTdHqZHAKpCtDASpWTwRBAwAcBFko+ZIkYrQhQL1YyQRw+CFAvPmSJGK0JUDfWMkI8CNgVoIFlNzdEhgACjgRYKDmCZdggBaiXINPKpBwJUC+OYBk2aAHqJuj0MjkEUhWggZUqJ4MhgIAPAiyUfMgSMVoRoF6sZII4fBCgXnzIEjFaE6BurGWEeBCwK0ADy25uiAwBBBwJsFByBMuwQQpQL0GmlUk5EqBeHMEybNAC1E3Q6WVyCKQqQAMrVU4GQwABHwRYKPmQJWK0IkC9WMkEcfggQL34kCVitCZA3VjLCPEgYFeABpbd3BAZAgg4EmCh5AiWYYMUoF6CTCuTciRAvTiCZdigBaiboNPL5BBIVYAGVqqcDIYAAj4IsFDyIUvEaEWAerGSCeLwQYB68SFLxGhNgLqxlhHiQcCuAA0su7khMgQQcCTAQskRLMMGKUC9BJlWJuVIgHpxBMuwQQtQN0Gnl8khkKoADaxUORkMAQR8EGCh5EOWiNGKAPViJRPE4YMA9eJDlojRmgB1Yy0jxIOAXQEaWHZzQ2QIIOBIgIWSI1iGDVKAegkyrUzKkQD14giWYYMWoG6CTi+TQyBVARpYqXIyGAII+CDAQsmHLBGjFQHqxUomiMMHAerFhywRozUB6sZaRogHAbsCNLDs5obIEEDAkQALJUewDBukAPUSZFqZlCMB6sURLMMGLUDdBJ1eJodAqgI0sFLlZDAEEPBBgIWSD1kiRisC1IuVTBCHDwLUiw9ZIkZrAtSNtYwQDwJ2BWhg2c0NkSGAgCMBFkqOYBk2SAHqJci0MilHAtSLI1iGDVqAugk6vUwOgVQFaGClyslgCCDggwALJR+yRIxWBKgXK5kgDh8EqBcfskSM1gSoG2sZIR4E7ArQwLKbGyJDAAFHAiyUHMEybJAC1EuQaWVSjgSoF0ewDBu0AHUTdHqZHAKpCtDASpWTwRBAwAcBFko+ZIkYrQhQL1YyQRw+CFAvPmSJGK0JUDfWMkI8CNgVoIFlNzdEhgACjgRYKDmCZdggBaiXINPKpBwJUC+OYBk2aAHqJuj0MjkEUhWggZUqJ4MhgIAPAiyUfMgSMVoRoF6sZII4fBCgXnzIEjFaE6BurGWEeBCwK0ADy25uiAwBBBwJsFByBMuwQQpQL0GmlUk5EqBeHMEybNAC1E3Q6WVyCKQqQAMrVU4GQwABHwRYKPmQJWK0IkC9WMkEcfggQL34kCVitCZA3VjLCPEgYFeABpbd3BAZAgg4EmCh5AiWYYMUoF6CTCuTciRAvTiCZdigBaiboNPL5BBIVYAGVqqcDIYAAj4IsFDyIUvEaEWAerGSCeLwQYB68SFLxGhNgLqxlhHiQcCuAA0su7khMgQQcCTAQskRLMMGKUC9BJlWJuVIgHpxBMuwQQtQN0Gnl8khkKoADaxUORkMAQR8EGCh5EOWiNGKAPViJRPE4YMA9eJDlojRmgB1Yy0jxIOAXQEaWHZzQ2QIIOBIgIWSI1iGDVKAegkyrUzKkQD14giWYYMWoG6CTi+TQyBVARpYqXIyGAII+CDAQsmHLBGjFQHqxUomiMMHAerFhywRozUB6sZaRogHAbsCNLDs5obIEEDAkQALJUewDBukAPUSZFqZlCMB6sURLMMGLUDdBJ1eJodAqgI0sFLlZDAEEPBBgIWSD1kiRisC1IuVTBCHDwLUiw9ZIkZrAtSNtYwQDwJ2BWhg2c0NkSGAgCMBFkqOYBk2SAHqJci0MilHAtSLI1iGDVqAugk6vUwOgVQFaGClyslgCCDggwALJR+yRIxWBKgXK5kgDh8EqBcfskSM1gSoG2sZIR4E7ArQwLKbGyJDAAFHAiyUHMEybJAC1EuQaWVSjgSoF0ewDBu0AHUTdHqZHAKpCtDASpWTwToKPP9Wi8ye3yJz32qV5SvbZMuNu8kOm9XLnts0SEM9XgjURoCFUm3cuaqfAtSLn3kj6toIUC+1ceeqfgtQN37nj+gRyFKABlaW2jm61kPzVsuds1fJ395rLTrrXo11csjIBhkzqlGauucIhqmaEGChZCINBOGJAPXiSaII04QA9WIiDQThmQB141nCCBeBGgrQwKohfoiXXrysTS6+f6U88feWsqbXt2ednP71HjJqKx7HKguMg1IRYKGUCiOD5ESAeslJoplmKgLUSyqMDJIzAeomZwlnughUIUADqwo8Tl1bYOLdK+XRl1dXRFPfTeT67/aUTfp3q+g8DkYgqQALpaRynJdHAeolj1lnzkkFqJekcpyXZwHqJs/ZZ+4IVCZAA6syL47uRODRl1bLxHtWJjL60rYN8tNDeiQ6l5MQqFSAhVKlYhyfZwHqJc/ZZ+6VClAvlYpxPAIi1A13AQIIlCtAA6tcKY7rUmDclBXy4jvlvTpYbLCrju8pW23EU1hdQnNA1QIslKomZIAcCVAvOUo2U61agHqpmpABcihA3eQw6UwZgYQCNLASwnHamgKvvNcq/3n98qpYvrFzd/nPvRurGoOTEShHgIVSOUocg8CnAtQLdwIC5QtQL+VbcSQCBQHqhnsBAQTKFaCBVa4Ux3UqcOOfV8lvZzZXpdSzsU6mnd6rqjE4GYFyBFgolaPEMQjQwOIeQKBSAf73S6ViHI8A/4cS7gEEEChfgAZW+VYc2YnAmbeukKdfS/76YGHoO8f3kn6967BGwKkAXzCc8jJ4YALUS2AJZTpOBagXp7wMHqgAdRNoYpkWAg4EaGA5QM3jkBNuXCFz36q+gXXjKT1lUD/2wcrjPZTlnFkoZanNtXwXoF58zyDxZylAvWSpzbVCEaBuQskk80DAvQANLPfGubjCVX9qljtnr6pqrnV1In/6r95VjcHJCJQjwEKpHCWOQeBTAeqFOwGB8gWol/KtOBKBggB1w72AAALlCtDAKleK4zoVeGp+i/z4thVVKX1luwb58cE9qhqDkxEoR4CFUjlKHIMADSzuAQQqFeB/v1QqxvEI8H8o4R5AAIHyBWhglW/FkV0IHPWrZfLhkrbETucd0SS7blmf+HxORKBcAb5glCvFcQjwxYJ7AIFKBPjfL5VocSwC/B9KuAcQQKAyARpYlXlxdCcCtz25Sq55ONkvEW4zqJtMPq4nvghkIsAXjEyYuUggAtRLIIlkGpkIUC+ZMHORwASom8ASynQQcChAA8shbh6H/vZVy+Wdha0VT/380U2yy2d5+qpiOE5IJMBCKREbJ+VUgHrJaeKZdiIB6iURGyflXIC6yfkNwPQRqECABlYFWBzatcDcN1vk3LtXyqJl5b9KeNSu3eXEvRq7HpwjEEhJgIVSSpAMkwsB6iUXaWaSKQlQLylBMkyuBKibXKWbySJQlQANrKr4OLmYwJLlbfKbR1fJfc90/quEnxtcL8fs1l1Gbs6TV9xJ2QqwUMrWm6v5LUC9+J0/os9WgHrJ1purhSFA3YSRR2aBQBYCNLCyUM7pNd5b1CZ/fGG1PPXqann53U9fK+zVWCd7DquXLw1roHGV0/vCwrRZKFnIAjH4IkC9+JIp4rQgQL1YyAIx+CZA3fiWMeJFoHYCNLBqZ5+rKzevFvlkRZv071OXq3kzWZsCLJRs5oWobApQLzbzQlQ2BagXm3khKtsC1I3t/BAdApYEaGBZygaxIIBAJgIslDJh5iKBCFAvgSSSaWQiQL1kwsxFAhOgbgJLKNNBwKEADSyHuAyNAAI2BVgo2cwLUdkUoF5s5oWobApQLzbzQlS2Bagb2/khOgQsCdDAspQNYkEAgUwEWChlwsxFAhGgXgJJJNPIRIB6yYSZiwQmQN0EllCmg4BDARpYDnEZGgEEbAqwULKZF6KyKUC92MwLUdkUoF5s5oWobAtQN7bzQ3QIWBKggWUpG8SCAAKZCLBQyoSZiwQiQL0EkkimkYkA9ZIJMxcJTIC6CSyhTAcBhwI0sBziMjQCCNgUYKFkMy9EZVOAerGZF6KyKUC92MwLUdkWoG5s54foELAkQAPLUjaIBQEEMhFgoZQJMxcJRIB6CSSRTCMTAeolE2YuEpgAdRNYQpkOAg4FaGA5xGVoBBCwKcBCyWZeiMqmAPViMy9EZVOAerGZF6KyLUDd2M4P0SFgSYAGlqVsEAsCCGQiwEIpE2YuEogA9RJIIplGJgLUSybMXCQwAeomsIQyHQQcCtDAcojL0AggYFOAhZLNvBCVTQHqxWZeiMqmAPViMy9EZVuAurGdH6JDwJIADSxL2SAWBBDIRICFUibMXCQQAeolkEQyjUwEqJdMmLlIYALUTWAJZToIOBSggeUQl6ERQMCmAAslm3khKpsC1IvNvBCVTQHqxWZeiMq2AHVjOz9Eh4AlARpYlrJBLAggkIkAC6VMmLlIIALUSyCJZBqZCFAvmTBzkcAEqJvAEsp0EHAoQAPLIS5DI4CATQEWSjbzQlQ2BagXm3khKpsC1IvNvBCVbQHqxnZ+iA4BSwJBNrCee+45ef7556V79+5FrVtaWmTAgAGy7777Sl1dXfsxK1eulPvuu09efPFFaWtrk9WrV0vfvn1lv/32k+HDh5edNz33sccek5kzZ0Zj6DU0ll122UX22msv6datW9GxFixYIPfee6+88cYb0tDQEJ07ePBgOfDAA2XQoEFlX58DEUCgcwEWStwhCJQvQL2Ub8WRCFAv3AMIVC5A3VRuxhkI5FUgyAbW/fffL48++minOW1qapJzzjlH6uvro+O0eXTppZdGTaNin+23316+9a1vrdHwKnacnj958mR55513io6jjbNTTz1V9Prxjzbdbr755pIxH3roobLrrrvm9T5l3giCCQeVAAAgAElEQVSkKsBCKVVOBgtcgHoJPMFML1UB6iVVTgbLiQB1k5NEM00EUhAIsoF1xx13yNNPPx3xlHoKSxtJ48ePj56Gam1tlXPPPVeWL18enaNPXX3lK1+RDz74QGbNmtXOfMABB8gee+zRKfuUKVNk3rx50TH65NU+++wTPU314IMPtjfHhg4dKqecckr7ONo8u+SSS6KnvvSjfx85cqTMnTtXXnnllfaxxo4dK0OGDEkh7QyBQL4FWCjlO//MvjIB6qUyL47OtwD1ku/8M/tkAtRNMjfOQiCPAsE1sLQJpM0gbQr16dNHfvKTn5R8Za+QcG0SXXfdddF/3XjjjdsbW/rfX331Vbnmmmuiv6233npy5plnlhxv6dKlMmnSpKhRpU92nXHGGdE5+tG/XXDBBdLc3Bw1tnScfv36RX+bOnVqe6Ns1KhRcvDBB7ffi9OnT5eHHnoo+u877rijjB49Oo/3KXNGIFUBFkqpcjJY4ALUS+AJZnqpClAvqXIyWE4EqJucJJppIpCCQJANrMsuu0zee++96Emmk08+ucvX/m655RZ59tlno+OKPeWkzS1tcunftSnVv3//ovRz5syRm266Kfrb3nvvHe2xFf88/vjj0R5X+jnyyCNlhx12iJ7+Ov/882XJkiVR02vixIlrPDWmf9dXHXV/rnIbcincFwyBQNACLJSCTi+TS1mAekkZlOGCFqBegk4vk3MkQN04gmVYBAIUCK6BtWLFCjnvvPOiJ53KeWIp/sSW7kt19tlnR6/8xT/PPPOM3HrrrdE/6T5YI0aMKHorFJ6k0kbXhAkTZKONNlrjuIULF8pFF10kuol8Ibb4U1tbb721nHDCCWuNXWiw6euO2kArPLkV4P3IlBDIRICFUibMXCQQAeolkEQyjUwEqJdMmLlIYALUTWAJZToIOBQIsoGlTzHpa3y6z9WwYcOip7FWrVoVPTm12267rbGPlDawCk9slXpFMP4aYeHJqWI5KWwe3/EVwcKx2lwrxKabwo8ZM0bi/1aq4RYft7MnwBzeJwyNQFACLJSCSieTcSxAvTgGZvigBKiXoNLJZDISoG4yguYyCAQgEFwDK/6UU6n8aBProIMOiv4cb2CVekUvqwZWoanVMe6uGmMB3IdMAYFMBVgoZcrNxTwXoF48TyDhZypAvWTKzcUCEaBuAkkk00AgA4HgGljxDdnVT18H3GCDDeT9999v/5U//fcDDzxQdt99dxpYGdxkXAIBawIslKxlhHgsC1AvlrNDbNYEqBdrGSEeHwSoGx+yRIwI2BAIroGlT2Ddd999Mn/+fNlrr71kzz33jDZf11cKdR+ruXPnRvI9evSINkfXjdMLrxDyBJaNm5IoEHAtwELJtTDjhyRAvYSUTebiWoB6cS3M+CEKUDchZpU5IeBGILgGVmdM+rrgxRdfLB999FH7LwrqhuihN7AK/0vBzS3EqAgggAACCCCAAAIIIIBAdgK6dzAfBBDIn0CuGlia3oceekimT58eZfroo4+Wz3/+82Y2cXe1BxYNrPwVNjNGAAEEEEAAAQQQQCBUARpYoWaWeSHQuUBwDayWlpboFwf1FUF9dbDjJ74h+xFHHCEjR46USy+9NNojS18hPOuss6LXCuOf+L5anf0K4dSpU2XWrFnRdU8//fRo7634Z+nSpTJp0qTodcbhw4dHDbT4v5VqYMXH5VcIKWkEqhfgUfXqDRkhPwLUS35yzUyrF6BeqjdkhPwJUDf5yzkzRiCpQFANLH1FsNCM0ubRaaedJt26dVvDJt4MGjt2rAwZMkSmTJki8+bNixpPes6GG264xjl33nmnzJ49O/r7hAkTZKONNirq/eSTT8rdd98d/e3www+XnXfeeY3j9Bp6Lf0UNpFvbW2Vc889V5YvXy5NTU3t+3IVToy/9ljYt0s3pueDAALJBVgoJbfjzPwJUC/5yzkzTi5AvSS348z8ClA3+c09M0egUoHgGliTJ0+WN998s2gzSp/MmjhxoqxcuTL6uz5t1bdvX3nqqafkrrvuiuz0iaxvfvOb7Y4rVqyQ8847T5qbm9s3fi80kBYvXhwdp2PoeAsWLJBLLrkk+mXDAQMGRE9hFRpo+m/x2MaPHy+DBg2Kzr/hhhvkhRdeiP6zPpWlT2cVProZ/dVXXx3916FDh8opp5xSaY45HgEEOgiwUOKWQKB8AeqlfCuORIB64R5AoHIB6qZyM85AIK8CQTWwNInPPPNM9GuD+mlsbJTDDjtMtt1226i5dOONN8qiRYvWagZpk0obW/pqn3522203+epXvyr//Oc/5frrr28/R9+1Hj16dHRM/FXEwmuF2qQqbAivx2y66aZyzDHHiDa8br/9dnnppZeic9dbbz0588wz25tb8bG0EaavNo4YMSI6/uabbxZ9LVI/HZtbeb1pmTcC1QqwUKpWkPPzJEC95CnbzLVaAeqlWkHOz6MAdZPHrDNnBJIJBNfA0iaSPrH02muvlRTRPa50LyltJBU+8df/ip2or+/9+Mc/lp49e5ZsYOkfdC+tyy+/vL3p1HEsbVDpU1SbbbZZ+580Zm1UzZkzp2TMW221lRx//PFrvRKZLO2chUC+BVgo5Tv/zL4yAeqlMi+OzrcA9ZLv/DP7ZALUTTI3zkIgjwLBNbA0idoQmjFjhjz44INrNZK23nprGTNmTLTfVMePbtaue1QVnsQq/H3zzTeX4447bo1z4q/2ddzYfeHChXLttddGT33FP+uuu66ceOKJMnDgwKL32iOPPCIPPPBAFH/8s/vuu8sBBxxQdFP6PN60zBmBagVYKFUryPl5EqBe8pRt5lqtAPVSrSDn51GAuslj1pkzAskEgmxgFSi0EaTNJN37Sj/aQCrWuOpI9+GHH0ZNJD1Pn9LSXyfs+Jk2bZrMnDmz043d9drLli2LTtXrrr/++l1mSV8X1Ke49Ckx/c96TjkxdzkwByCAQLsACyVuBgTKF6BeyrfiSASoF+4BBCoXoG4qN+MMBPIqEHQDy1VSlyxZIhdeeGH0pJY2uPR1RG048UEAAT8EWCj5kSeitCFAvdjIA1H4IUC9+JEnorQlQN3YygfRIGBZgAZWguy8/fbbcsUVV0RPX40bN04GDx6cYBROQQCBWgmwUKqVPNf1UYB68TFrxFwrAeqlVvJc12cB6sbn7BE7AtkK0MBK6K2vB7a2tpb1WmDCS3AaAgg4EmCh5AiWYYMUoF6CTCuTciRAvTiCZdigBaiboNPL5BBIVYAGVqqcDIYAAj4IsFDyIUvEaEWAerGSCeLwQYB68SFLxGhNgLqxlhHiQcCuAA0su7khMgQQcCTAQskRLMMGKUC9BJlWJuVIgHpxBMuwQQtQN0Gnl8khkKoADaxUORkMAQR8EGCh5EOWiNGKAPViJRPE4YMA9eJDlojRmgB1Yy0jxIOAXQEaWHZzQ2QIIOBIgIWSI1iGDVKAegkyrUzKkQD14giWYYMWoG6CTi+TQyBVARpYqXIyGAII+CDAQsmHLBGjFQHqxUomiMMHAerFhywRozUB6sZaRogHAbsCNLDs5obIEEDAkQALJUewDBukAPUSZFqZlCMB6sURLMMGLUDdBJ1eJodAqgI0sFLlZDAEEPBBgIWSD1kiRisC1IuVTBCHDwLUiw9ZIkZrAtSNtYwQDwJ2BWhg2c0NkSGAgCMBFkqOYBk2SAHqJci0MilHAtSLI1iGDVqAugk6vUwOgVQFaGClyslgCCDggwALJR+yRIxWBKgXK5kgDh8EqBcfskSM1gSoG2sZIR4E7ArQwLKbGyJDAAFHAiyUHMEybJAC1EuQaWVSjgSoF0ewDBu0AHUTdHqZHAKpCtDASpWTwRBAwAcBFko+ZIkYrQhQL1YyQRw+CFAvPmSJGK0JUDfWMkI8CNgVoIFlNzdEhgACjgRYKDmCZdggBaiXINPKpBwJUC+OYBk2aAHqJuj0MjkEUhWggZUqJ4MhgIAPAiyUfMgSMVoRoF6sZII4fBCgXnzIEjFaE6BurGWEeBCwK0ADy25uiAwBBBwJsFByBMuwQQpQL0GmlUk5EqBeHMEybNAC1E3Q6WVyCKQqQAMrVU4GQwABHwRYKPmQJWK0IkC9WMkEcfggQL34kCVitCZA3VjLCPEgYFeABpbd3BAZAgg4EmCh5AiWYYMUoF6CTCuTciRAvTiCZdigBaiboNPL5BBIVYAGVqqcDIYAAj4IsFDyIUvEaEWAerGSCeLwQYB68SFLxGhNgLqxlhHiQcCuAA0su7khMgQQcCTAQskRLMMGKUC9BJlWJuVIgHpxBMuwQQtQN0Gnl8khkKoADaxUORkMAQR8EGCh5EOWiNGKAPViJRPE4YMA9eJDlojRmgB1Yy0jxIOAXQEaWHZzQ2QIIOBIgIWSI1iGDVKAegkyrUzKkQD14giWYYMWoG6CTi+TQyBVARpYqXIyGAII+CDAQsmHLBGjFQHqxUomiMMHAerFhywRozUB6sZaRogHAbsCNLDs5obIEEDAkQALJUewDBukAPUSZFqZlCMB6sURLMMGLUDdBJ1eJodAqgI0sFLlZDAEEPBBgIWSD1kiRisC1IuVTBCHDwLUiw9ZIkZrAtSNtYwQDwJ2BWhg2c0NkSGAgCMBFkqOYBk2SAHqJci0MilHAtSLI1iGDVqAugk6vUwOgVQFaGClyslgCCDggwALJR+yRIxWBKgXK5kgDh8EqBcfskSM1gSoG2sZIR4E7ArQwLKbGyJDAAFHAiyUHMEybJAC1EuQaWVSjgSoF0ewDBu0AHUTdHqZHAKpCtDASpWTwRBAwAcBFko+ZIkYrQhQL1YyQRw+CFAvPmSJGK0JUDfWMkI8CNgVoIFlNzdEhgACjgRYKDmCZdggBaiXINPKpBwJUC+OYBk2aAHqJuj0MjkEUhWggZUqJ4MhgIAPAiyUfMgSMVoRoF6sZII4fBCgXnzIEjFaE6BurGWEeBCwK0ADy25uiAwBBBwJsFByBMuwQQpQL0GmlUk5EqBeHMEybNAC1E3Q6WVyCKQqQAMrVU4GQwABHwRYKPmQJWK0IkC9WMkEcfggQL34kCVitCZA3VjLCPEgYFeABpbd3BAZAgg4EmCh5AiWYYMUoF6CTCuTciRAvTiCZdigBaiboNPL5BBIVYAGVqqcDIYAAj4IsFDyIUvEaEWAerGSCeLwQYB68SFLxGhNgLqxlhHiQcCuAA0su7khMgQQcCTAQskRLMMGKUC9BJlWJuVIgHpxBMuwQQtQN0Gnl8khkKoADaxUORns/7V37zGWV2Xe6BfQSKOc5qpgv6A0eQWv0AKCDuBIFG+B4WC4yeVoFHPsBGSIBAigBJRLpBPAgO/AEUkzAdQRxChGiIjAcNOMXLRFXmFUkAMKclMEGrs5Wb+ZqrO7u4qu2v5W1bPW/ux/pKv2XvtZn2891qqnfnsXAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZqMyAgQKCTgoFYK1bJMC+qXJWG2qkIB+KQRr2aYF9E3T8docgV4FDLB65bQYAQI1CDgo1ZCSGqMI6JcoSaijBgH9UkNKaowmoG+iJaIeAnEFDLDiZjOrlb2UUlprVivw5ATKCTgolbO1cnsC+qW9TO2onIB+KWdr5XYF9E272doZgb4FDLD6Fq14vfseWZFu+tXf0s33LaFmRzAAACAASURBVE//75Mr0rz110oLX79Oeuf/XCft9dY5aS0TrYrTVfqggIOSrwcCUxfQL1O3ck8C+sXXAIHpC+ib6Zt5BIFRFWhygPXSSy+ln/70p+n2229PTz75ZJftuuuum7bddtv0/ve/P82bN2+1vF944YV01VVXpbVeZkqzfPny9L73vS9tvvnmL/v1kp//5ptvTjfddFP629/+1q2Zn3/XXXdNe+65Z1p77bUnfPxjjz2WvvOd76Tf/e53ac6cOd1jt9xyy7TPPvuk+fPnF/saXfr7FemyW5alOx5YPulzbPTKtdKB71w3HfTOdYvVYWECMyXgoDRT0p6nBQH90kKK9jBTAvplpqQ9T0sC+qalNO2FQFmB5gZYzzzzTDr//PPTU089NaFcHiZ99KMfTQsXLlzp888//3w67bTTuqHRy93233//tMsuu0x6l/z4Cy64ID388MMT3mezzTZLn/nMZ9LcuXNX+vxdd92VLr/88knX3W+//dK73vWu3r8aLr35xbTk5mVTXvdN/2Pt9Pn95qbXzHM51pTR3DGcgINSuEgUFFhAvwQOR2nhBPRLuEgUVIGAvqkgJCUSCCLQ1AArX/l09tlnp8cff7zjzcOqPfbYI73qVa9Kt9xyS8rDrXzLV0Adf/zxaeONNx6P4emnn05nnXVWyldZ5aufJroSKw+nPv7xj6c3velNk8a3ZMmStHTp0vHn32uvvbr1rrvuuvHh2IIFC9KiRYvG18hXXi1evDjl+vMtf37nnXdO99xzT7rvvvvG1zryyCPTVltt1duXzm2/Xp5O/rfnp73eP7xhnfSFA1YewE17EQ8gMIsCDkqziO+pqxPQL9VFpuBZFNAvs4jvqasV0DfVRqdwAjMu0NQAKw+O8gAp3zbaaKN03HHHdcOjfMvDoXxl1kMPPdT9O78sLw+3xm55UHTxxRd3/zz44IPTjjvuOO0wnn322XT66ad3g6p11lmnG5LlOvItf+7MM89My5Yt64ZjJ5xwwvgA7eqrr0633nprd7/ddtst7bvvvuPPfe2116brr7+++/dOO+2UDjrooGnXNdkD/u+Ln0v3/2HFUOt9br/10nve9F+2bgRqE3BQqi0x9c6mgH6ZTX3PXZuAfqktMfVGENA3EVJQA4E6BJoaYI0NgvKAKF/htPXWW6+UwiOPPJLOOeec7mPbb799Ouyww8Y//8ADD6QLL7ywGy4Ne6XT3XffnS677LJuzfxeWfn9tgZv+Sqw/B5X+TY2JFuxYkU644wzuqvD8tArv4wxv1/W2C1//pRTTkn5Pbo22GCDdPLJJ0/6HlrT+ZL78b1/S1/49gvTechK933rluuk8/4vV2ENDeiBsyrgoDSr/J68MgH9Ullgyp1VAf0yq/yevFIBfVNpcMomMAsCTQ2w8pVK+Yql/BLBE088cbU3a89v6P6lL32pe5ngqlczjV3plB/7uc99rnvZ4XRvgwO0Y445Jm2xxRYrLTHR8w9etbXddtulT37yk6s97RVXXJHuvPPOCV/6ON0ax+7/+W89n27535O/aftU1v1/jlg/bfOaid+QfiqPdx8CsyXgoDRb8p63RgH9UmNqap4tAf0yW/Ket2YBfVNzemonMLMCTQ2w1kQ3eIXUqi8TvOaaa9KNN97YLZFfWvjEE0+kv/zlL91LEN/4xjd2H5vsrweOPe/YGqu+RHDs84NvFL/DDjukQw89NA1+bLKXCA6um1+WuMkmm6xpq2v8/HvPeHaN91nTHT793lekA3b1VwnX5OTz8QQclOJloqK4AvolbjYqiyegX+JloqL4AvomfkYqJBBFYGQGWC+++GL38rz8UryJBkz5LwDmvwQ42W299dZL//zP/5w23XTTSe/z9w6wxoZaqz7Bmtad7hfT/35kRVp0yXPTfdhq98/vgZXfC8uNQG0CDkq1Jabe2RTQL7Op77lrE9AvtSWm3ggC+iZCCmogUIfASAyw8hu4f+1rXxv/i37vec970oc//OHxhPLn8xusP/XUU+Mf22yzzbo3Yx/8WB5i5fejGntj+OkOmtZ0BdZMDbDyG7fnN3D/e297vnlOOvn/NMD6ex09fuYFHJRm3twz1iugX+rNTuUzL6BfZt7cM9YvoG/qz9AOCMyUwEgMsL797W+n2267rTPNfxUw/wXAVV8OePPNN6ef/OQn3cc/9rGPjb9M79e//nW65JJLumFWvq361wsHg1rTlVKzNcAa+6YwWOtx177x7/4a+6c3/jHt/von/u51LECAAAECBAgQIECAAIGpCuS3XnEjQGD0BJofYP34xz9O3//+97tk81/5O+6449LGG288raSXLl2alixZ0j1m1b9eWOsA61/v+h/p53/4P6blsOqdj93tP9NrNlj2d63hwQQIECBAgAABAgQIEJiOgAHWdLTcl0A7Ak0PsPKVR9/4xje6tPL7Xh111FFpyy23nHZ6+f2zTj311LRs2bJJr+DKi0a9AmuiDf/7fcvTKVc+P22LsQe8/fXrpMWHzh368R5IYDYFXKo+m/qeuzYB/VJbYuqdTQH9Mpv6nrtWAX1Ta3LqJjDzAs0OsO6///500UUXjQ+vjjjiiPSGN7xhUuE8nMrvhZXf52rVW/74Oeeckx599NG0wQYbpJNOOqm7mmvV29VXX51uvfXWblh27LHHple/+tUr3eXZZ59Np59+evdyxLEruQY/Ntl7YA2u29dfIcyFHbnkuXTvwyuG+qo7bf+5abdtVzcYajEPIjDDAg5KMwzu6aoW0C9Vx6f4GRbQLzMM7umaENA3TcRoEwRmRKDJAVYeNOWBUx485dshhxySFi5cOCno4LDrU5/61GqDrsH3rlqwYEH69Kc/3Q2pVr3dfvvt6aqrruo+vP/++6dddtllpbsMvhRx7L20VqxY0V3d9dxzz6W5c+d2bxI/OBzLezj77LPT448/3g3XXu5N5Kf7FfMfv1mejrti+ldhvefNc9LnvHn7dLndP5CAg1KgMJQSXkC/hI9IgYEE9EugMJRSjYC+qSYqhRKYdYHmBljPPPNMOuuss8bfdP2AAw5I73jHO14W+re//W36yle+0t3nLW95S/cm7oO3G2+8sXt5YL7l11sfdNBB3X8//fTT3f/OmzevG2g99thjafHixd3gLP8Vw3wV1tibxeePXXDBBenBBx/s7nv00Uen+fPnd4+/9NJL0y9+8Yvuvw877LDu6qyx2wMPPJAuvPDC7p95eLZo0aJev2i+dceL6X9dP/X3sdpxwTrp5H3XSxu+cvUBXq+FWYxAQQEHpYK4lm5OQL80F6kNFRTQLwVxLd2sgL5pNlobI9C7QFMDrHylVH6J3gsvvNBB5SHSgQceOP7vQb38Mr5tttkmrb/++ilfBZUf9+c//7m7Sx5iffjDH06vfOUrUx5e5TeCz7c8eDryyCPTVlttlQav2jr44IPTjjvu2A2uzj333PTII49093/d616XDj/88DRnzpz0zW9+M917773dx1f9S4irvtwxD93yFWP5/pdffnlavnx597hVh1t9fTX85rEV6bJbXkw3/PK//tLiRLf5G6+dDnznummft8/p62mtQ2DWBByUZo3eE1cooF8qDE3JsyagX2aN3hNXLKBvKg5P6QRmWKCpAdZ9992XLr744ikTDr7Mb/AqrMkW2G233dK+++7bfXqiAVb+eH754nnnnTc+dFp1rTwEy1dRbb311uOfyoOvPKi6++67J6192223TZ/4xCfGr+ia8iancceHnliRbv7V8nTnb5enXz+6Is1bf620w+vXTu/8n3O839U0HN01voCDUvyMVBhHQL/EyUIl8QX0S/yMVBhPQN/Ey0RFBKIKNDXAmsoQajCIfHXU2972tvEP5ZcA5r9amF/mN3h7xStekT7ykY90V1mN3QZf2jd2BdbY55588sn01a9+tXtJ4eBtww03TPnN5DfffPMJvx5uuOGG9IMf/GD8vbvG7rTHHnukvffee8L33Yr6haUuApEFHJQip6O2aAL6JVoi6oksoF8ip6O2qAL6Jmoy6iIQT6CpAVZfvPkvA/7lL3/plssv/9tkk01WGx5973vfSzfddFP38WOOOSZtscUWqz19HmT99a9/7T6e36B90003XWOJ+eWC+Squ/Ebu+b/zY/Jj3QgQ6E/AQak/Syu1L6Bf2s/YDvsT0C/9WVppdAT0zehkbacE/l4BA6whBAff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Z5990h577JFWrFiRTj311PTcc8+luXPnplNOOWWlAdpLL72Uzj777PT444+n9dZbr/v8nDlzphWyOxMgQIAAAQIECBAgQIAAAQIEahYwwEop3XHHHenKK6/scswvtzvwwAPHM33++efTF7/4xbRs2bLVBkhPP/10d7958+Z1w63HHnssLV68OOWh02abbdZdhbX22mt398kfu+CCC9KDDz7Y3ffoo49O8+fP7z536aWXpl/84hfdf+ersvLVWWO3Bx54IF144YXdPxcsWJAWLVpU89eb2gkQIECAAAECBAgQIECAAAEC0xYwwEop5SHVaaed1r20L99233339MEPfjD96U9/Spdcckl66qmnuo/vtNNO6aCDDur++/77708XXXRR999jLyvMQ6pzzz03PfLII93HX/e616XDDz+8u2Lqm9/8Zrr33nu7j2+00UbphBNOGB9uDa6Vh1sHHHBAWrhwYXf/yy+/PC1fvrx73KrDrWmn7QEECBAgQIAAAQIECBAgQIAAgQoFDLD+O7TBl/9NlGN++d6JJ56Y1l9//UkHWPkT+b20zjvvvPGh06pr5QFVvopq6623Hv9UHnzlQdXdd9896ZfQtttumz7xiU+MD70q/FpTMgECBAgQIECAAAECBAgQIEBgKAEDrAG2/Gbt+T2qxq7EGvvUNttskz7+8Y9371E1dht8ad+qb+z+5JNPpq9+9avdSwoHbxtuuGE64ogj0uabbz5hWDfccEP6wQ9+0L3ccPCW3ytr77337l566EaAAAECBAgQIECAAAECBAgQGDUBA6wJEv/jH//YDZFefPHF7uV++a8Trnr73ve+l2666aaXfWP3PMj661//2j00D7823XTTNX595ZcL5qu48l9CzP+dHzM4OFvjAu5AgAABAgQIECBAgAABAgQIEGhMwABriECfeeaZdNZZZ3VXauUB1/HHH7/SXw4cYkkPIUCAAAECBAgQIECAAAECBAgQmETAAGuIL43f//736ctf/nJ39dVRRx2VttxyyyFW8RACBAgQIECAAAECBAgQIECAAIGpCBhgTUVpgvvklweuWLFiSi8LHPIpPIwAAQIECBAgQIAAAQIECBAgQCClZIDly4AAAQIECBAgQIAAAQIECBAgQCC0gAFW6HgUR4AAAQIECBAgQIAAAQIECBAgYIDla4AAgaoE7rrrrvTzn/88rbvuuhPWnf9652abbZbe//73d+9TN3Z74YUX0ne/+930y1/+svsro/mPMMybNy994AMfSNtvv/2kBr/61a/S97///fTEE090z5kf+5a3vCXts88+/kJoVV85o1Ns/hpdunRp+vd///f0oQ99KL3+9a+fdPPD9EVe/+abb+7+Em/uo9xnuTd23XXXtOeee6a11157wud77LHH0ne+8530u9/9Ls2ZM6d7bH4PydxL8+fPH52A7DScQH5biFtvvTX9+c9/TgcddNBK3zsGi/X9J1x0Cpohgfz/+z/96U/T7bffnnK/5Fv+//1tt922O2/l89REt2G+x+R1hjl7DftcM0ToaQgQ6EnAAKsnSMsQIDAzAtdcc0268cYbX/bJ5s6dm0455ZTxvw6af3A+55xzuh+YJ7rtsMMO6ZBDDlnth5arrrqqO6xNdMs/pB955JH+iMPMxO5ZpiDwyCOPpFtuuaX7ISP/sJFvBx98cNpxxx0nfPQwfZF76IILLkgPP/zwhGvm4fFnPvOZ1Ya7+Qf/yy+/fNJd7Lfffuld73rXFHbpLgT6EVi2bFm6++67u2Hso48+2i26wQYbpJNOOmnSvyzt+08/9lapSyD/9fXzzz8/PfXUUxMWnn+J8dGPfjQtXLhwpc8P8z0mLzDM2WvY56orCdUSIJAFDLB8HRAgUJXAv/3bv3U/oOfbZFdh5R+ijz766O5KkPzHFk499dT03HPPdY/JvyV873vfm/7whz90v3Efu+29997p3e9+9/i/77jjjnTllVeO//sd73hH2mqrrdKPfvSj8UPcOuusk77whS90V5O4EZgtgdtuuy398Ic/7K4eWfU22QBr2L5YsmRJd3VXd4BYa6201157dV//11133fiAeMGCBWnRokXjpeQfLBYvXjw+VMuf33nnndM999yT7rvvvvG18kA495gbgZIC+Yfx/H1k7Gtv8LnyAOvkk0+e9CpC339KJmPtiAL5lyFnn312evzxx8f/v3qPPfZIr3rVq7pfmOR+yrd83jr++OPTxhtv3P172O8xw5y9hn2uiN5qIkBgzQIGWGs2cg8CBIII5INU/kE4/0C8ph80xkrOP6RcfPHF3T9f+9rXjg+28r/vv//+dNFFF3Wf22ijjdIJJ5zQHcIGnyf/kH744Yent771rd398uf+5V/+Jf3mN7/p/p1/6/j2t789iJAy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vsq3/MPzRIOrVdf84x//2P0AnR+Xr9LaYIMN1vi0f/3rX9MTTzyR1l133W4A9trXvtaVImtUc4eaBIbpi9x/uTfyLffepptuusYt55cL5qu48pWS+b/zY6bSt2tc2B0IzKCA7z8ziO2pmhAY5nvMsGevYZ6rCWSbIDAiAgZYIxK0bRIgQIAAAQIECBAgQIAAAQIEahUwwKo1OXUTIECAAAECBAgQIECAAAECBEZEwABrRIK2TQIECBAgQIAAAQIECBAgQIBArQIGWLUmp24CBAgQIECAAAECBAgQIECAwIgIGGCNSNC2SYAAAQIECBAgQIAAAQIECBCoVcAAq9bk1E2AAAECBAgQIECAAAECBAgQGBEBA6wRCdo2CRAgQIAAAQIECBAgQIAAAQK1Chhg1ZqcugkQIECAAAECBAgQIECAAAECIyJggDUiQdsmAQIECBAgQIAAAQIECBAgQKBWAQOsWpNTNwECBAgQIECAAAECBAgQIEBgRAQMsEYkaNskQIAAAQIECBAgQIAAAQIECNQqYIBVa3LqJkCAAAECBAgQIECAAAECBAiMiIAB1ogEbZsECBAgQIAAAQIECBAgQIAAgVoFDLBqTU7dBAgQIECAAAECBAgQIECAAIERETDAGpGgbZMAAQIECBAgQIAAAQIECBAgUKuAAVatyambAAECBAgQIECAAAECBAgQIDAiAgZYIxK0bRIgQIAAAQIECBAgQIAAAQIEahUwwKo1OXUTIECAAAECBAgQIECAAAECBEZEwABrRIK2TQIECBAgQIAAAQIECBAgQIBArQIGWLUmp24CBAgQIECAAAECBAgQIECAwIgIGGCNSNC2SYAAAQIECBAgQIAAAQIECBCoVcAAq9bk1E2AAAECBAgQIECAAAECBAgQGBEBA6wRCdo2CRAgQIAAAQIECBAgQIAAAQK1Chhg1ZqcugkQIECAAAECBAgQIECAAAECIyJggDUiQdsmAQIECBAgQIAAAQIECBAgQKBWAQOsWpNTNwECBAgQIECAAAECBAgQIEBgRAQMsEYkaNskQIAAAQIECBAgQIAAAQIECNQqYIBVa3LqJkCAAAECBAgQIECAAAECBAiMiIAB1ogEbZsECBAgQIAAAQIECBAgQIAAgVoFDLBqTU7dBAgQIECAAAECBAgQIECAAIERETDAGpGgbZMAAQIECBAgQIAAAQIECBAgUKuAAVatyambAAECBAgQIECAAAECBAgQIDAiAgZYIxK0bRIgQIAAAQIECBAgQIAAAQIEahUwwKo1OXUTIECAAAECBAgQIECAAAECBEZEwABrRIK2TQIECBAgQIAAAQIECBAgQIBArQIGWLUmp24CBAgQIECAAAECBAgQIECAwIgIGGCNSNC2SYAAAQIECBAgQIAAAQIECBCoVcAAq9bk1E2AAAECBAgQIECAAAECBAgQGBEBA6wRCdo2CRAgQIAAAQIECBAgQIAAAQK1Chhg1ZqcugkQIECAAAECBAgQIECAAAECIyJggDUiQdsmAQIECBAgQIAAAQIECBAgQKBWgf8PAjneLAXmzcYAAAAASUVORK5CYII=&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; width=&quot;640&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;VMAF scores for&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
What we can see in this test is that &lt;b&gt;beyond 600 (or even a little bit lower) the quality improvement is not that high and beyond 1200 it is barely noticeable&lt;/b&gt;.&amp;nbsp; Remember that these results are based on VMAF default model (not tuned for videoconference videos) and for my specific test video but the results don&#39;t look very different that what our experience with real users in production tells us.&lt;br /&gt;
&lt;br /&gt;
This kind of test can help us decide the max bitrate we want to use for our WebRTC conferences, although there are other implications beyond quality like&amp;nbsp;&lt;b&gt;battery consumption &lt;/b&gt;and the results &lt;b&gt;depend on the type of video, use case and how picky your users of your application are&lt;/b&gt;.&amp;nbsp; &amp;nbsp;That&#39;s the reason why we have to be careful when playing with video bitrates in production.&amp;nbsp; &amp;nbsp; As an example &lt;a href=&quot;https://atscaleconference.com/videos/video-scale-2018-li-tal-mashiach-facebook/&quot;&gt;Facebook explained&lt;/a&gt; how increasing the bitrate lead to lower user scores because of the implications in battery consumption. In Houseparty we always do A/B testing to quantify the impact of any relevant change like this and decide the optimal video bitrate for our specific use case.&lt;br /&gt;
&lt;br /&gt;
Google is &lt;a href=&quot;https://bugs.chromium.org/p/webrtc/issues/detail?id=9642&quot;&gt;including VMAF in the WebRTC test suite&lt;/a&gt; and implementing some frame &lt;a href=&quot;https://webrtc.googlesource.com/src.git/+/b2c0e8f60fad10e2786e5e131136a0da1299d883&quot;&gt;alignment&lt;/a&gt;&amp;nbsp;to overcome the limitation of having to compare a specific reference frame with the corresponding distorted one.&amp;nbsp; &amp;nbsp;It would be nice if in the future we could expand the VMAF idea including new metrics in the ML algorithm to account for delays, framerate or video desynchronization.&amp;nbsp; &amp;nbsp;That core idea of multi-method fusion looks very powerful!&lt;br /&gt;
&lt;br /&gt;
&lt;i style=&quot;background-color: white; color: #444444; font-family: roboto, sans-serif; font-size: 15px;&quot;&gt;You can&amp;nbsp;&lt;a href=&quot;https://twitter.com/anarchyco&quot; style=&quot;color: #2196f3;&quot;&gt;follow me in Twitter&lt;/a&gt;&amp;nbsp;if you are interested in Real Time Communications.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/4865487206122658230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2018/10/measuring-webrtc-video-quality-for.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/4865487206122658230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/4865487206122658230'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2018/10/measuring-webrtc-video-quality-for.html' title='Measuring WebRTC video quality for different bitrates - Playing with VMAF'/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-460321274846352896.post-1807445379554806101</id><published>2018-05-08T00:08:00.003-07:00</published><updated>2018-05-08T08:40:15.393-07:00</updated><title type='text'>How are Images/Videos sent in WhatsApp? </title><content type='html'>I&#39;ve been involved in the development on different IM&amp;amp;P services in the past and always one of the core features was the ability to share media files (audio, video, pdf...) with other users or groups.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://www.mobilegazette.com/media/tu-me/tu-me-2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;392&quot; data-original-width=&quot;200&quot; height=&quot;320&quot; src=&quot;https://www.mobilegazette.com/media/tu-me/tu-me-2.jpg&quot; width=&quot;161&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Probably the most popular of these services was &lt;a href=&quot;https://en.wikipedia.org/wiki/TU_Me&quot;&gt;TU Me&lt;/a&gt; that was based on SIP but used HTTP to upload and download the files from a central storage. SIP was used to send the message with the url to the other end so that he can download the media file.&lt;br /&gt;
&lt;br /&gt;
In cases where I had to use XMPP there were typically two approaches at least if you need to provide offline messaging:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Some inefficient inband alternatives where the media files are sent using the XMPP connection.&lt;/li&gt;
&lt;li&gt;Custom (or not widely supported like &lt;a href=&quot;https://xmpp.org/extensions/xep-0363.html&quot;&gt;xep-0363&lt;/a&gt;) extensions based on HTTP Uploads.&lt;/li&gt;
&lt;/ul&gt;
But today I was curious on how this is done in WhatsApp.&amp;nbsp; I found this &lt;a href=&quot;https://github.com/tgalal/yowsup&quot;&gt;opensource python implementation&amp;nbsp;(yowsup)&lt;/a&gt; that looks great and got an idea on how it could be done but I wanted to confirm what is the protocol used by the most recent WA clients and also get some captures of the messages to see how everything looks like.&lt;br /&gt;
&lt;br /&gt;
Obviously the easiest way was to use to WA Web Client because you have the Chrome developer tools in Chrome so I tried sending and receiving some files from the browser.&lt;br /&gt;
&lt;h2&gt;
Sending a file&lt;/h2&gt;
&lt;b&gt;1/ Request a url to upload the media file&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The first thing the client does when it needs to send a media file is to request an upload url from the server.&amp;nbsp; This is done using the signaling channel over WebSockets with a message with the action &quot;encr_upload&quot;, the type of the content (&quot;image&quot; or &quot;video&quot;) and an long id that looks like a hash of the file to be sent.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGpiXC8HJo7oEgOLq1ImBiuqKM-XZTNeBA6w9olEq4L2LpJDcnLD_N1TMo51oN7HXVTVVesXxpNhF-1o3fwDEQRVJK-nT9sKBQ9n_kIrcbHwSXT9dRSsBCq0upUMlNWhhn3rV0ZRtDFz8/s1600/Screen+Shot+2018-05-07+at+23.55.22.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;786&quot; data-original-width=&quot;1600&quot; height=&quot;313&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGpiXC8HJo7oEgOLq1ImBiuqKM-XZTNeBA6w9olEq4L2LpJDcnLD_N1TMo51oN7HXVTVVesXxpNhF-1o3fwDEQRVJK-nT9sKBQ9n_kIrcbHwSXT9dRSsBCq0upUMlNWhhn3rV0ZRtDFz8/s640/Screen+Shot+2018-05-07+at+23.55.22.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The server replies with a &quot;status=200&quot; and a dedicatdd url where the file has to be uploaded.&amp;nbsp; In my case the url was:&amp;nbsp;&lt;span style=&quot;color: #c41a16; font-family: &amp;quot;menlo&amp;quot; , monospace; font-size: 11px; white-space: pre;&quot;&gt;https://mmg.whatsapp.net/u/f/CIX33...._kOA/Ajlc....78Xf&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2/ Upload the media file&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The file is uploaded to the url received in the previous message using a HTTP POST as you can see in the next capture:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheJe7rD4w3jRA7fDUBEShDgmkxQ9L31TGzfY4dKYODzn3hG7OVSdi9sXeDVRtE3JRe3ONpmrO_yfkb9u3ZHhzMqyudhabT8s78JU_tAsoxaOaygFNUb_202ap1VZyeRIxv-8LPy17Jg1o/s1600/Screen+Shot+2018-05-08+at+00.06.52.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;920&quot; data-original-width=&quot;1146&quot; height=&quot;256&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheJe7rD4w3jRA7fDUBEShDgmkxQ9L31TGzfY4dKYODzn3hG7OVSdi9sXeDVRtE3JRe3ONpmrO_yfkb9u3ZHhzMqyudhabT8s78JU_tAsoxaOaygFNUb_202ap1VZyeRIxv-8LPy17Jg1o/s320/Screen+Shot+2018-05-08+at+00.06.52.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
It looks like if the file is uploaded encrypted (appart from using HTTPS) probably as part of the E2E encryption feature in WhatsApp.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3/ Send a message to the recipient of the media file&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
After the file is uploaded to the mmg.whatsapp.net server the client sends a message using the WebSocket connection to send the actual message to the other participant (yellow line in the first capture).&amp;nbsp; This message was bigger than expected (2-10K) so I thought it was very likely to include a thumbnail/preview.&lt;br /&gt;
&lt;br /&gt;
I confirmed that in the receiver side.&amp;nbsp; &amp;nbsp;The size of the preview image in base64 shown in the UI was more or less the size of that signaling message.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.rtcbits.com/feeds/1807445379554806101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.rtcbits.com/2018/05/how-are-imagesvideos-sent-in-whatsapp.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/1807445379554806101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/460321274846352896/posts/default/1807445379554806101'/><link rel='alternate' type='text/html' href='http://www.rtcbits.com/2018/05/how-are-imagesvideos-sent-in-whatsapp.html' title='How are Images/Videos sent in WhatsApp? '/><author><name>Gustavo Garcia</name><uri>http://www.blogger.com/profile/09231386351348682181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGpiXC8HJo7oEgOLq1ImBiuqKM-XZTNeBA6w9olEq4L2LpJDcnLD_N1TMo51oN7HXVTVVesXxpNhF-1o3fwDEQRVJK-nT9sKBQ9n_kIrcbHwSXT9dRSsBCq0upUMlNWhhn3rV0ZRtDFz8/s72-c/Screen+Shot+2018-05-07+at+23.55.22.png" height="72" width="72"/><thr:total>11</thr:total></entry></feed>