Re: [rtcweb] FEC for audio?

"Timothy B. Terriberry" <tterriberry@mozilla.com> Tue, 20 May 2014 01:17 UTC

Return-Path: <tterriberry@mozilla.com>
X-Original-To: rtcweb@ietfa.amsl.com
Delivered-To: rtcweb@ietfa.amsl.com
Received: from localhost (ietfa.amsl.com [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 5AB521A0462 for <rtcweb@ietfa.amsl.com>; Mon, 19 May 2014 18:17:06 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -3.929
X-Spam-Level:
X-Spam-Status: No, score=-3.929 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, HELO_MISMATCH_ORG=0.611, HOST_MISMATCH_COM=0.311, RCVD_IN_DNSWL_MED=-2.3, RP_MATCHES_RCVD=-0.651] autolearn=ham
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 5nLiUT7XKBqb for <rtcweb@ietfa.amsl.com>; Mon, 19 May 2014 18:17:01 -0700 (PDT)
Received: from smtp.mozilla.org (mx2.corp.phx1.mozilla.com [63.245.216.70]) by ietfa.amsl.com (Postfix) with ESMTP id C4B2D1A045E for <rtcweb@ietf.org>; Mon, 19 May 2014 18:17:01 -0700 (PDT)
Received: from [10.252.26.16] (corp.mtv2.mozilla.com [63.245.221.32]) (Authenticated sender: tterriberry@mozilla.com) by mx2.mail.corp.phx1.mozilla.com (Postfix) with ESMTPSA id 2F77AF25E8 for <rtcweb@ietf.org>; Mon, 19 May 2014 18:17:01 -0700 (PDT)
Message-ID: <537AACDA.20603@mozilla.com>
Date: Mon, 19 May 2014 18:16:10 -0700
From: "Timothy B. Terriberry" <tterriberry@mozilla.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 SeaMonkey/2.16.2
MIME-Version: 1.0
To: "rtcweb@ietf.org" <rtcweb@ietf.org>
References: <CAOJ7v-1qEpkWShmw1SQKh4_BLKycF=egu42TS9o9+Smtof36pg@mail.gmail.com> <CAJrXDUESUa-xm9y22OAVKAw5z=WnkY4-X6XFZOoXwvkMoDnaoQ@mail.gmail.com> <537A6190.4060709@mozilla.com> <CAOJ7v-2mb6DkakaEWMxJwqqLSePb7NrOcF-DSycW-CftBGdmcA@mail.gmail.com> <CAOJ7v-1YxHhVm8NE4H3ZkCuOtN4CsUgQoiV1GN3w3NKRWhqWMw@mail.gmail.com>
In-Reply-To: <CAOJ7v-1YxHhVm8NE4H3ZkCuOtN4CsUgQoiV1GN3w3NKRWhqWMw@mail.gmail.com>
Content-Type: text/plain; charset="UTF-8"; format="flowed"
Content-Transfer-Encoding: 7bit
Archived-At: http://mailarchive.ietf.org/arch/msg/rtcweb/w2WS2EF9l0uNiks0Ez1kjrTHur8
Subject: Re: [rtcweb] FEC for audio?
X-BeenThere: rtcweb@ietf.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: Real-Time Communication in WEB-browsers working group list <rtcweb.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/rtcweb>, <mailto:rtcweb-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/rtcweb/>
List-Post: <mailto:rtcweb@ietf.org>
List-Help: <mailto:rtcweb-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/rtcweb>, <mailto:rtcweb-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 20 May 2014 01:17:06 -0000

Justin Uberti wrote:
> Advice on the exact value of XX welcomed.

That is complicated, of course. I think if you're using SILK, you should 
probably always prefer the in-band FEC (if nothing else, it saves you a 
minimum of 54 bytes of header overhead over RFC5109), but that's a 
decision we make on a packet-by-packet basis.

However, libopus will use CELT at rates as low as 12 kbps (and always 
uses CELT for CBR rates below 8 kbps), and will use SILK/Hybrid at rates 
as high as 76 kbps, depending on the application libopus was configured 
with, our estimate of whether or not the content contains voice or 
music, the stereo width (if the signal is stereo), and hysteresis from 
previous mode decisions.

For a simple application, I'd probably enable 5109 for a mono voice 
stream encoded in VOIP mode at around 48-56 kbps (but I have not done 
any testing around these numbers). A more complex application could 
negotiate 5109 always, and then only transmit FEC for the packets that 
do not contain a SILK layer.

If you are using 5109, be careful to pass in the post-FEC recovery 
packet loss percentage to libopus when encoding, instead of the raw 
packet loss percentage. Above a certain loss rate (8% if I'm reading the 
current code correctly), libopus will force SILK usage in order to be 
able to use the built-in FEC.

When protecting CELT, you may also want to experiment with using ULP to 
protect only the beginning of the CELT payloads. We intentionally 
organized the packet so the most important information was at the front. 
The first 64-bits or so are enough to get the pitch filter and basic 
energy levels correct (though you'll probably want to send a little more 
to justify all the bitrate you spent on IP+UDP+RTP+FEC headers). As long 
as you get the energy levels correct, you cannot mess things up _too_ 
badly, even if the rest of the packet is random garbage. Make sure you 
pass the decoder a packet with the same size as the original, even if 
you only recover some of the data, as otherwise even the recovered data 
will not decode correctly.