W3C home > Mailing lists > Public > public-webrtc@w3.org > June 2018

Re: Low latency video in WebRTC

From: Randell Jesup <randell-ietf@jesup.org>
Date: Wed, 20 Jun 2018 17:24:51 -0400
To: public-webrtc@w3.org
Message-ID: <09289957-8d4b-6702-0ab3-96973538df4f@jesup.org>
On 6/20/2018 2:25 PM, Mondain wrote:
> Yeah Chrome and all browsers in-general have been "fun" to keep 
> compatible; been in the WebRTC game since 2013; fondly remember the 
> weekly moving targets for support during development. Sub half second 
> is quite good and probably qualifies as ultra-low, in our case we put 
> a server in the middle, no P2P. I find your means of glass to glass 
> testing interesting!

P2P video latency (and audio latency!) *should* be <150ms mouth-to-ear 
for maximum conversational quality.  Of course, a major component of 
this in WAN cases is the network delay (and resultant jitter buffer 
delay due to network jitter).  <250ms should be the case as often as 
possible.

If there's a TURN server (or an SFU), you really want it near (in 
network terms) one end of the conversation.  Total delay in an SFU case 
may be longer as it's impossible to ensure that an SFU is near all (or 
all-but-one) person in a conference.  In that case, you may have 1 extra 
network delay added and maybe some jitter.

That said: if it's not meeting these, file a bug!

On Wed, Jun 20, 2018 at 1:26 PM, Sergio Garcia Murillo 
<sergio.garcia.murillo@gmail.com 
<mailto:sergio.garcia.murillo@gmail.com>> wrote:
 > in terms of implementation what would that imply?
 >
 > I would think that this could help to remove latency at the cost of 
reducing reliability/quality:
 >
 > -enable slice mode on codecs that support it so video decoding can 
happen before full frame is received.

This will gain at most a fraction of a frame-time.  Better would be to 
run higher frame rates, and lower resolution, by limiting the capture size.

 > -turn off lip sync

That's trivial; just don't put the audio and video tracks in the same 
stream.

 > -turn off packet buffers and rtx/FEC

rtx may be a (big) win if it avoids an keyframe on loss:
loss -> FIR -> network delay -> frame-delay -> send keyframe (large, may 
require a number of frametimes to send - perhaps 5 or 10 even) -> 
network delay -> jitter buffer delay
vs:
loss -> NACK -> network delay -> retransmit 1 packet normally -> network 
delay

 > some of them are easier than others

Even better for remote control: allow telling the UA to decode-on-errors 
instead of the (prettier) stall-on-errors. Decode with a missing packet 
(or skip the entire frame), which produces a stream with errors, then 
when the missing packet shows up, re-decode and catch up (which you'd do 
anyways if you stall-on-errors).  You just have to keep the decoded 
packets (and decoder state!!) around - the second part being trickier 
than the first.  Of course, this helps more in cases with longish 
network delays where RTX might require a total of a couple of hundred ms 
-- if NACK->network->retransmit(quick)->network delay is short (a few 
frame times?), it's not worth speculatively decoding.

If driving a rover on the moon -- speculatively decode!  If network 
delay is <50ms, it's probably not a win or much of one.   And it is 
complex (though the webrtc.org codebase has some support for such 
things, but not enabled anywhere so far as I know -- and it may require 
support in the codec).  It can be done simply if you use FIR instead of 
NACK, though the amount of time spent decoding with errors would be 
longer.  However, the recovery is totally straightforward and 
automatic.  You can crank up the quantization on the keyframe to reduce 
size (and latency) at the cost of temporary quality reduction.


Other things off the top of my head: use low resolution/high frame 
rate.  Cap the encode bitrate (allows for faster packet bursts on errors 
or motion spikes or on keyframes) if there's "headroom". (Perhaps) use 
simulcast.  Use temporal scaling which also gives possible error 
resilience at a drop in frame rate.  If lots-of-bits-available and 
worried about skips on loss, use two streams in parallel (not 
traditional simulcast) at lower bitrates/resolutions, and if one skips 
(or runs a longer jitter buffer) show the other.  (Costs CPU too for 
encoding twice).  Sort of poor man's FEC; real FEC may be preferable, 
though perhaps not in this usecase.

-- 
Randell Jesup -- rjesup a t mozilla d o t com
Please please please don't email randell-ietf@jesup.org!  Way too much spam
Received on Wednesday, 20 June 2018 21:28:04 UTC

This archive was generated by hypermail 2.4.0 : Friday, 17 January 2020 19:18:42 UTC