Galène videoconferencing server discussion list archives
 help / color / mirror / Atom feed
* [Galene] Logging
@ 2021-01-07 21:38 Juliusz Chroboczek
  2021-01-07 22:45 ` [Galene] Logging Michael Ströder
                   ` (2 more replies)
  0 siblings, 3 replies; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-07 21:38 UTC (permalink / raw)
  To: galene

It turns out that Pion's logging is controlled by environment variables.
This is described here:

  https://github.com/pion/webrtc/wiki/Debugging-WebRTC

Galène could potentially:

  - set the environment variables;
  - hook into Pion's internals to redirect the log somewhere (to a web page?).

Opinions?

-- Juliusz

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-07 21:38 [Galene] Logging Juliusz Chroboczek
@ 2021-01-07 22:45 ` Michael Ströder
  2021-01-08  0:35 ` Antonin Décimo
  2021-01-08 12:40 ` Toke Høiland-Jørgensen
  2 siblings, 0 replies; 32+ messages in thread
From: Michael Ströder @ 2021-01-07 22:45 UTC (permalink / raw)
  To: Juliusz Chroboczek, galene

On 1/7/21 10:38 PM, Juliusz Chroboczek wrote:
> It turns out that Pion's logging is controlled by environment variables.
> This is described here:
> 
>   https://github.com/pion/webrtc/wiki/Debugging-WebRTC

Great!

Not so great for you because I will probably ask more questions. ;-)

> Galène could potentially:
>   - set the environment variables;
>   - hook into Pion's internals to redirect the log somewhere (to a web page?).

To me it seems the systemd unit can handle all this. See examples below.

Ciao, Michael.

----- /etc/systemd/system/galene.service -----
[Unit]
Description=Galene Videoconferencing Server
Requires=local-fs.target network.target
After=local-fs.target nss-lookup.target time-sync.target

[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/galene
ExecStart=/usr/sbin/galene $ARGS
User=galene
Group=galene
Restart=on-failure
LimitNOFILE=65536

# redirect stderr and stdout to log file
StandardOutput=append:/var/log/galene/stdout.log
StandardError=append:/var/log/galene/stderr.log

[Install]
WantedBy=multi-user.target

----- /etc/sysconfig/galene -----
# Configure command-line arguments for Galène video conference server
ARGS="-http 0.0.0.0:8444 -data /etc/galene -groups
/var/lib/galene/groups -static /usr/share/galene/static -recordings
/var/lib/galene/recordings"

# pion debug messages set by env vars
#PION_LOG_TRACE="all"
#PION_LOG_DEBUG="all"
PIONS_LOG_INFO="ice"
PIONS_LOG_WARNING="all"

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-07 21:38 [Galene] Logging Juliusz Chroboczek
  2021-01-07 22:45 ` [Galene] Logging Michael Ströder
@ 2021-01-08  0:35 ` Antonin Décimo
  2021-01-08 12:40 ` Toke Høiland-Jørgensen
  2 siblings, 0 replies; 32+ messages in thread
From: Antonin Décimo @ 2021-01-08  0:35 UTC (permalink / raw)
  To: Juliusz Chroboczek, galene

> Galène could potentially:
>
> - set the environment variables;

I think is is better done outside of Galène, in the shell or the
service manager.

> - hook into Pion's internals to redirect the log somewhere

Would there be a need to dissociate Galène's own logs from Pion's,
which could not be achieved by a header in the log format?

> to a web page?

Would you retain the logs for the whole execution of the program, tee
the logs in real-time, re-read the file where the logs would have been
written, get them from the service manager, or something else?

Is there a noticeable performance impact on logging everything and
letting the service manager handle the logging level? there's at least
one big service manager on Linux that supports that if the logs are in
syslog format. A distribution-provided service file could always
enable all the logs from Galène and Pion and let the system
administrator discard unwanted levels of logs.

IMO Galène is fine as-is (it could log more), as all the parameters
can be tuned outside of Galène.

-- Antonin

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-07 21:38 [Galene] Logging Juliusz Chroboczek
  2021-01-07 22:45 ` [Galene] Logging Michael Ströder
  2021-01-08  0:35 ` Antonin Décimo
@ 2021-01-08 12:40 ` Toke Høiland-Jørgensen
  2021-01-08 13:28   ` Juliusz Chroboczek
  2 siblings, 1 reply; 32+ messages in thread
From: Toke Høiland-Jørgensen @ 2021-01-08 12:40 UTC (permalink / raw)
  To: Juliusz Chroboczek, galene

Juliusz Chroboczek <jch@irif.fr> writes:

> It turns out that Pion's logging is controlled by environment variables.
> This is described here:
>
>   https://github.com/pion/webrtc/wiki/Debugging-WebRTC
>
> Galène could potentially:
>
>   - set the environment variables;
>   - hook into Pion's internals to redirect the log somewhere (to a web page?).
>
> Opinions?

I just tried setting PIONS_LOG_INFO=ice and restarting. Which got me
this:

an 08 12:35:14 video galene[532657]: ice INFO: 2021/01/08 12:35:14 Setting new connection state: Checking
Jan 08 12:35:14 video galene[532657]: ice WARNING: 2021/01/08 12:35:14 pingAllCandidates called with no candidate pairs. Connection is not possible yet.
Jan 08 12:35:14 video galene[532657]: ice WARNING: 2021/01/08 12:35:14 pingAllCandidates called with no candidate pairs. Connection is not possible yet.
Jan 08 12:35:14 video galene[532657]: ice WARNING: 2021/01/08 12:35:14 pingAllCandidates called with no candidate pairs. Connection is not possible yet.
Jan 08 12:35:14 video galene[532657]: ice WARNING: 2021/01/08 12:35:14 pingAllCandidates called with no candidate pairs. Connection is not possible yet.
Jan 08 12:35:14 video galene[532657]: ice INFO: 2021/01/08 12:35:14 Ignoring remote candidate with tcpType active: tcp4 host 45.145.xx.xx:9
Jan 08 12:35:14 video galene[532657]: ice INFO: 2021/01/08 12:35:14 Ignoring remote candidate with tcpType active: tcp4 host 10.36.yy.yy:9
Jan 08 12:35:14 video galene[532657]: ice INFO: 2021/01/08 12:35:14 Ignoring remote candidate with tcpType active: tcp6 host 2a0c:4d80:zz:zz::2:9
Jan 08 12:35:14 video galene[532657]: ice INFO: 2021/01/08 12:35:14 Ignoring remote candidate with tcpType active: tcp4 host 45.145.xx.xx:9
Jan 08 12:35:14 video galene[532657]: ice INFO: 2021/01/08 12:35:14 Ignoring remote candidate with tcpType active: tcp4 host 10.36.yy.yy:9
Jan 08 12:35:14 video galene[532657]: ice INFO: 2021/01/08 12:35:14 Ignoring remote candidate with tcpType active: tcp6 host 2a0c:4d80:zz:zz::2:9
Jan 08 12:35:14 video galene[532657]: ice INFO: 2021/01/08 12:35:14 Ignoring remote candidate with tcpType active: tcp4 host 45.145.xx.xx:9
Jan 08 12:35:14 video galene[532657]: ice INFO: 2021/01/08 12:35:14 Ignoring remote candidate with tcpType active: tcp4 host 10.36.yy.yy:9
Jan 08 12:35:14 video galene[532657]: ice INFO: 2021/01/08 12:35:14 Ignoring remote candidate with tcpType active: tcp6 host 2a0c:4d80:zz:zz::2:9
Jan 08 12:35:14 video galene[532657]: ice INFO: 2021/01/08 12:35:14 Ignoring remote candidate with tcpType active: tcp4 host 45.145.xx.xx:9
Jan 08 12:35:14 video galene[532657]: ice INFO: 2021/01/08 12:35:14 Ignoring remote candidate with tcpType active: tcp4 host 10.36.yy.yy:9
Jan 08 12:35:14 video galene[532657]: ice INFO: 2021/01/08 12:35:14 Ignoring remote candidate with tcpType active: tcp6 host 2a0c:4d80:zz:zz::2:9
Jan 08 12:35:14 video galene[532657]: ice INFO: 2021/01/08 12:35:14 Setting new connection state: Connected
Jan 08 12:35:54 video galene[532657]: ice INFO: 2021/01/08 12:35:54 Setting new connection state: Closed

Which doesn't really tell me much. What's happening here, is the Turn
server working? What's with the remote candidates being ignored?

What would be most useful in terms of checking configuration is if
Galene would *on startup* emit something like:

Checking Turn server candidate turn.example.com:443?transport=tcp: success!

for each configured TURN server.

-Toke

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-08 12:40 ` Toke Høiland-Jørgensen
@ 2021-01-08 13:28   ` Juliusz Chroboczek
  2021-01-08 13:52     ` Toke Høiland-Jørgensen
  0 siblings, 1 reply; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-08 13:28 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: galene

> Which doesn't really tell me much. What's happening here, is the Turn
> server working?

The direct connection was successful, so the TURN server was never contacted.

> What's with the remote candidates being ignored?

They're active TCP candidates, and I've disabled support for ICE-TCP in Galène:

  https://github.com/pion/webrtc/issues/1356

ICE-TCP has the potential to make TURN redundant, so it would greatly
simplify the deployment of Galène.  Unfortunately, I've found it to be
unreliable in Pion, so I've disabled it until I can find the time to work
out what the issue is.

> What would be most useful in terms of checking configuration is if
> Galene would *on startup* emit something like:

> Checking Turn server candidate turn.example.com:443?transport=tcp: success!

Ah.  What you want is not logging, but active monitoring.  Could you
please file an issue?

-- Juliusz

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-08 13:28   ` Juliusz Chroboczek
@ 2021-01-08 13:52     ` Toke Høiland-Jørgensen
  2021-01-08 14:33       ` Michael Ströder
  2021-01-08 15:34       ` Juliusz Chroboczek
  0 siblings, 2 replies; 32+ messages in thread
From: Toke Høiland-Jørgensen @ 2021-01-08 13:52 UTC (permalink / raw)
  To: Juliusz Chroboczek; +Cc: galene

Juliusz Chroboczek <jch@irif.fr> writes:

>> Which doesn't really tell me much. What's happening here, is the Turn
>> server working?
>
> The direct connection was successful, so the TURN server was never
> contacted.

Right, I see. What are the conditions where a direct connection fails?
Is it just when the client is behind a NAT?

>> What's with the remote candidates being ignored?
>
> They're active TCP candidates, and I've disabled support for ICE-TCP in Galène:
>
>   https://github.com/pion/webrtc/issues/1356
>
> ICE-TCP has the potential to make TURN redundant, so it would greatly
> simplify the deployment of Galène.  Unfortunately, I've found it to be
> unreliable in Pion, so I've disabled it until I can find the time to work
> out what the issue is.

Right, gotcha.

>> What would be most useful in terms of checking configuration is if
>> Galene would *on startup* emit something like:
>
>> Checking Turn server candidate turn.example.com:443?transport=tcp: success!
>
> Ah. What you want is not logging, but active monitoring.

Well, both, ideally :)
As for just logging, Galene does propagate JSON parsing errors from the
Go JSON parser, but because the files are not read on startup you can
start up the daemon and everything looks fine until someone tries to
connect...

> Could you please file an issue?

Sure: https://github.com/jech/galene/issues/30

-Toke

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-08 13:52     ` Toke Høiland-Jørgensen
@ 2021-01-08 14:33       ` Michael Ströder
  2021-01-08 15:13         ` Juliusz Chroboczek
  2021-01-08 15:34       ` Juliusz Chroboczek
  1 sibling, 1 reply; 32+ messages in thread
From: Michael Ströder @ 2021-01-08 14:33 UTC (permalink / raw)
  To: galene

On 1/8/21 2:52 PM, Toke Høiland-Jørgensen wrote:
> Juliusz Chroboczek <jch@irif.fr> writes:
>> Ah. What you want is not logging, but active monitoring.
> 
> Well, both, ideally :)

Me too.

I'd love to see more connection meta data in /stats so I can tell which
user has which problem:

- connection's IP address
- nick name / user name
- browser's user agent header
- maybe SDP

Or have thus connection meta data logged but with the connection/channel ID.

I suspect most of the users' minor or major issues are caused by
problems with their  local setup. And more information would help
tracking down those.

FWIW: Did anyone look at admin/monitor page of Janus gateway?
Unfortunately that's one of the non-functional use-cases on their public
demo page [1], for very good reasons I guess. I could try to give Galène
devs access to demo pages of my own Janus installation if useful.

Ciao, Michael.

[1] https://janus.conf.meetecho.com/demos.html

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-08 14:33       ` Michael Ströder
@ 2021-01-08 15:13         ` Juliusz Chroboczek
  2021-01-08 17:34           ` Michael Ströder
  0 siblings, 1 reply; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-08 15:13 UTC (permalink / raw)
  To: Michael Ströder; +Cc: galene

> I'd love to see more connection meta data in /stats so I can tell which
> user has which problem:

> - connection's IP address
> - nick name / user name

The stats page is deliberately anonymised.  Also, you cannot spy on
a conversation without appearing in the user list even if you have op
privileges, just like you cannot unmute a user.

> I suspect most of the users' minor or major issues are caused by
> problems with their  local setup. And more information would help
> tracking down those.

Be assured that I am well aware that it complicates troubleshooting -- you
can imagine how difficult it was in the early days, when Galène would
misbehave during a department meeting with important people.  But that's
a price well worth paying in exchange for respecting the users' privacy.

> FWIW: Did anyone look at admin/monitor page of Janus gateway?

Perhaps you could publish a screenshot?

-- Juliusz

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-08 13:52     ` Toke Høiland-Jørgensen
  2021-01-08 14:33       ` Michael Ströder
@ 2021-01-08 15:34       ` Juliusz Chroboczek
  2021-01-08 19:34         ` Toke Høiland-Jørgensen
  1 sibling, 1 reply; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-08 15:34 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: galene

>> The direct connection was successful, so the TURN server was never
>> contacted.

> Right, I see. What are the conditions where a direct connection fails?
> Is it just when the client is behind a NAT?

If only one side is behind NAT, you should get a direct connection with no
outside help.

If both sides are behind NAT, they will attempt to establish a paired set
of NAT mappings by synchronising through a STUN server, and then establish
a direct connection (TURN is a superset of STUN, no need to set up
a dedicated STUN server if you've got TURN).  This is usually successful,
but might occasionally fail due to packet loss.

If there is a firewall in the way that drops UDP traffic, or traffic to
high-numbered ports, then the peers will fall back to TURN.  TURN supports
both UDP and TCP proxying, since some networks allow outgoing UDP only to
some ports (typically 1194 for OpenVPN and 10000 for the Cisco VPN client).

ICE-TCP adds an additional step by allowing direct connections over TCP.
It is not designed for peer-to-peer communication, only for client-server
communication, so it should be a perfect fit for Galène.

Once a functioning pair is found, ICE will stick to it.  In Galène, we
restart ICE whenever the connection fails, and also when the user types
"/renegotiate".  (I'd like to detect client-side network changes and restart
ICE automatically, but current browsers don't give me a suitable event
handler.)

All of this happens in parallel, with arbitrary timeouts, so the actual
behaviour tends to be non-deterministic and next to impossible to debug.
See for example

  https://github.com/pion/ice/issues/305

> As for just logging, Galene does propagate JSON parsing errors from the
> Go JSON parser, but because the files are not read on startup you can
> start up the daemon and everything looks fine until someone tries to
> connect...

Hmm... I'm actually using the current behaviour, by using undefined fields
in my JSON files ("contact" and "comment").

But I think you're right.  This will happen in background, so you'll only
get warnings in the log.  After 0.2 is out, though, since Galène is frozen
right now.

-- Juliusz

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-08 15:13         ` Juliusz Chroboczek
@ 2021-01-08 17:34           ` Michael Ströder
  2021-01-08 18:00             ` Juliusz Chroboczek
  0 siblings, 1 reply; 32+ messages in thread
From: Michael Ströder @ 2021-01-08 17:34 UTC (permalink / raw)
  To: galene

On 1/8/21 4:13 PM, Juliusz Chroboczek wrote:
> Michael Ströder wrote:
>> I'd love to see more connection meta data in /stats so I can tell which
>> user has which problem:
>> - connection's IP address
>> - nick name / user name
> 
> The stats page is deliberately anonymised.

Hmm, is the /stats page meant to be publicly available? It's definitely
not at my site and never will be (limited by IP addresses and
password-protected).

So I'd argue that in my case the IP addresses, user agent info and user
names are already visible in the logs for the same personnel like the
/stats page.

Could this be made configurable?

> Also, you cannot spy on a conversation without appearing in the user
> list even if you have op privileges, just like you cannot unmute a
> user.
Good.

>> I suspect most of the users' minor or major issues are caused by
>> problems with their  local setup. And more information would help
>> tracking down those.
> 
> Be assured that I am well aware that it complicates troubleshooting -- you
> can imagine how difficult it was in the early days, when Galène would
> misbehave during a department meeting with important people.

And the result clearly shows the advantage of this eat-your-own-dogfood
approach. :-)

>> FWIW: Did anyone look at admin/monitor page of Janus gateway?
> 
> Perhaps you could publish a screenshot?

Too big/long for a screenshot. Also you can click into the connection
information.

Ciao, Michael.

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-08 17:34           ` Michael Ströder
@ 2021-01-08 18:00             ` Juliusz Chroboczek
  0 siblings, 0 replies; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-08 18:00 UTC (permalink / raw)
  To: Michael Ströder; +Cc: galene

>> The stats page is deliberately anonymised.

> Could this be made configurable?

Sorry.  You're welcome to patch your own copy, you're welcome to log by
using a reverse proxy, but I don't feel comfortable adding code upstream
that makes it easy to spy upon the users.

-- Juliusz

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-08 15:34       ` Juliusz Chroboczek
@ 2021-01-08 19:34         ` Toke Høiland-Jørgensen
  2021-01-08 19:56           ` Juliusz Chroboczek
  0 siblings, 1 reply; 32+ messages in thread
From: Toke Høiland-Jørgensen @ 2021-01-08 19:34 UTC (permalink / raw)
  To: Juliusz Chroboczek; +Cc: galene

Juliusz Chroboczek <jch@irif.fr> writes:

>>> The direct connection was successful, so the TURN server was never
>>> contacted.
>
>> Right, I see. What are the conditions where a direct connection fails?
>> Is it just when the client is behind a NAT?
>
> If only one side is behind NAT, you should get a direct connection with no
> outside help.

And one of these sides is always the Galene server, right? So if that
has public IPs, TURN is only used as an alternative port if the client
is behind a firewall blocking UDP? Or am I missing something?

-Toke

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-08 19:34         ` Toke Høiland-Jørgensen
@ 2021-01-08 19:56           ` Juliusz Chroboczek
  2021-01-09  0:18             ` Toke Høiland-Jørgensen
  0 siblings, 1 reply; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-08 19:56 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: galene

> And one of these sides is always the Galene server, right? So if that
> has public IPs, TURN is only used as an alternative port if the client
> is behind a firewall blocking UDP?

Assuming no firewall, that's correct, except for the case of repeated UDP
packet losses causing ICE fallback to TURN.

Like you, I was hoping I could get away without using a TURN server.  In
practice, I have found that there are just too many networks that block
outgoing traffic.  For example, the university's WiFi network is as
restrictive as it can possibly get away with without violating the Eduroam
service definition (see page 32 of [1]), while the network in the computer
rooms allows no outgoing traffic whatsoever (I need to go over WiFi when
I do so-called "hybrid" taching, where part of the students are at home).

(And now you know why I implemented the "Blackboard mode".)

[1] https://www.eduroam.org/wp-content/uploads/2016/05/GN3-12-192_eduroam-policy-service-definition_ver28_26072012.pdf

-- Juliusz

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-08 19:56           ` Juliusz Chroboczek
@ 2021-01-09  0:18             ` Toke Høiland-Jørgensen
  2021-01-09 13:34               ` Juliusz Chroboczek
  0 siblings, 1 reply; 32+ messages in thread
From: Toke Høiland-Jørgensen @ 2021-01-09  0:18 UTC (permalink / raw)
  To: Juliusz Chroboczek; +Cc: galene

Juliusz Chroboczek <jch@irif.fr> writes:

>> And one of these sides is always the Galene server, right? So if that
>> has public IPs, TURN is only used as an alternative port if the client
>> is behind a firewall blocking UDP?
>
> Assuming no firewall, that's correct, except for the case of repeated UDP
> packet losses causing ICE fallback to TURN.
>
> Like you, I was hoping I could get away without using a TURN server.  In
> practice, I have found that there are just too many networks that block
> outgoing traffic.

So in this case, how is using a TURN server different than just having
Galene itself listen on a bunch of UDP ports and offer each of those?

-Toke

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-09  0:18             ` Toke Høiland-Jørgensen
@ 2021-01-09 13:34               ` Juliusz Chroboczek
  2021-01-10 13:47                 ` Toke Høiland-Jørgensen
  0 siblings, 1 reply; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-09 13:34 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: galene

> So in this case, how is using a TURN server different than just having
> Galene itself listen on a bunch of UDP ports and offer each of those?

Short answer: Galène needs hundreds or even thousands of ports.  TURN can
use a single port, which you can pick such that it's accessible from your
clients.

Long answer.  Galène uses WebRTC.  WebRTC uses RTP.  RTP transmits
a collection of tracks.  RTP can work in two modes:

  - port multiplexing: use the UDP port to associate packets with tracks;
  - SSID multiplexing: multiplex over a single UDP 5-uple, and use data in
    the RTP header to associate packets with tracks (this is called
   "bundling" in WebRTC).

Now, there are two limitations:

  1. Pion is unable to use a single local UDP port for multiple RTP
     sessions: it uses a distinct UDP port for every RTP session, even if
     sessions have dinstinct remote addresses;

  2. Galène uses a distinct RTP session for every stream (pair of audio
     and video tracks); in other words, Galène ony bundles at most one
     video and one audio track.

Fixing (2) is not a high priority, since it would make the code way more
complex (bundling is fragile, there are some limitations to what you can
do when bundling streams with different configurations and some limitations
to how you can mutate a bundle without tearing it down).  It might
cause issues with AQMs (is it a good idea to use the same 5-uple for
different videos?), but you're the specialist here.

-- Juliusz

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-09 13:34               ` Juliusz Chroboczek
@ 2021-01-10 13:47                 ` Toke Høiland-Jørgensen
  2021-01-10 15:14                   ` [Galene] Congestion control and WebRTC [was: Logging] Juliusz Chroboczek
  2021-01-10 15:17                   ` [Galene] Re: Logging Juliusz Chroboczek
  0 siblings, 2 replies; 32+ messages in thread
From: Toke Høiland-Jørgensen @ 2021-01-10 13:47 UTC (permalink / raw)
  To: Juliusz Chroboczek; +Cc: galene

Juliusz Chroboczek <jch@irif.fr> writes:

>> So in this case, how is using a TURN server different than just having
>> Galene itself listen on a bunch of UDP ports and offer each of those?
>
> Short answer: Galène needs hundreds or even thousands of ports.  TURN can
> use a single port, which you can pick such that it's accessible from your
> clients.
>
> Long answer.  Galène uses WebRTC.  WebRTC uses RTP.  RTP transmits
> a collection of tracks.  RTP can work in two modes:
>
>   - port multiplexing: use the UDP port to associate packets with tracks;
>   - SSID multiplexing: multiplex over a single UDP 5-uple, and use data in
>     the RTP header to associate packets with tracks (this is called
>    "bundling" in WebRTC).

Ah, I see. I think I was mentally assuming SSID multiplexing, so that's
what I was missing. Thanks for the clarification!

> Now, there are two limitations:
>
>   1. Pion is unable to use a single local UDP port for multiple RTP
>      sessions: it uses a distinct UDP port for every RTP session, even if
>      sessions have dinstinct remote addresses;
>
>   2. Galène uses a distinct RTP session for every stream (pair of audio
>      and video tracks); in other words, Galène ony bundles at most one
>      video and one audio track.
>
> Fixing (2) is not a high priority, since it would make the code way more
> complex (bundling is fragile, there are some limitations to what you can
> do when bundling streams with different configurations and some limitations
> to how you can mutate a bundle without tearing it down).  It might
> cause issues with AQMs (is it a good idea to use the same 5-uple for
> different videos?), but you're the specialist here.

No, I don't think multiplexing more streams over the same five-tuple is
a good idea if it can be avoided. If the bottleneck does per-flow
queueing (like FQ-CoDel), you'd want each video flow to be scheduled
separately I think.

Another couple of ideas for packet-level optimisations that may be worth
trying (both originally articulated by Dave Taht):

In the presence of an FQ-CoDel'ed bottleneck it may be better to put
audio and video on two separate 5-tuples: That would cause the audio
stream to be treated as a 'sparse flow' with queueing priority and fewer
drops when congested.

(As an aside, is there a reference for the codec constraints in
browsers? And is it possible to tweak codec parameters, say to burn some
bandwidth to enable really high-fidelity audio for special use cases? Or
is Opus so good that it doesn't matter?)

Another packet-based optimisation that could be interesting to try out
is to mark packets containing video key frames as ECN-capable. If the
bottleneck AQM respects ECN, that would prevent key frames from being
dropped. Ideally you'd also actually respond to CE markings, of course,
but just doing selective marking of the ECN-capable bit inside the
stream would theoretically make it possible to protect key frames while
still reacting normally to drops of other data packets...

-Toke

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Congestion control and WebRTC [was: Logging]
  2021-01-10 13:47                 ` Toke Høiland-Jørgensen
@ 2021-01-10 15:14                   ` Juliusz Chroboczek
  2021-01-10 15:23                     ` [Galene] " Juliusz Chroboczek
  2021-01-10 22:23                     ` Toke Høiland-Jørgensen
  2021-01-10 15:17                   ` [Galene] Re: Logging Juliusz Chroboczek
  1 sibling, 2 replies; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-10 15:14 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: galene

> No, I don't think multiplexing more streams over the same five-tuple is
> a good idea if it can be avoided. If the bottleneck does per-flow
> queueing (like FQ-CoDel), you'd want each video flow to be scheduled
> separately I think.

Tere's a tradeoff here.  Using port multiplexing gives more information to
middleboxes, but using SSID multiplexing reduces the amount of ICE
negotation -- adding a new track to an already established flow requires
zero packet exchanges after negotiation (you just start sending data with
a fresh SSID), while adding a new flow for port multiplexing requires
a new set of ICE probes, which might take a few seconds in the TURN case.

> Another couple of ideas for packet-level optimisations that may be worth
> trying (both originally articulated by Dave Taht):

Why is Dave not here?

> In the presence of an FQ-CoDel'ed bottleneck it may be better to put
> audio and video on two separate 5-tuples: That would cause the audio
> stream to be treated as a 'sparse flow' with queueing priority and fewer
> drops when congested.

Uh-huh.  I'll send you a patch to do that, in case you find the time to
test it.

> (As an aside, is there a reference for the codec constraints in
> browsers? And is it possible to tweak codec parameters, say to burn some
> bandwidth to enable really high-fidelity audio for special use cases? Or
> is Opus so good that it doesn't matter?)

A typical laptop microphone has rather poor frequency response, so Opus at
48kbit/s is as good as the original.  It's just not worth reducing the
audio rate upon congestion, it's the video rate that gets reduced.

As to the video rate, you've got plenty of exciting knobs.

1. Congestion control.  As implemented in modern browsers, WebRTC uses two
congestion controllers: a fairly traditional loss-based controller, and an
interesting delay-based one.  This is described here:

  https://tools.ietf.org/html/draft-ietf-rmcat-gcc-02

Unlike some other video servers, that mere forward congestion indictions
from the receivers to the sender, Galène terminates congestion control on
both legs.  currently obeys congestion indication from the receivers, and
implements the loss-based congestion controller for data received from the
sender.

  https://github.com/jech/galene/blob/master/rtpconn/rtpconn.go#L956

We do not currently implement the delay-based controller, which causes
collapse if the sender is on a low-rate bufferbloated network.  That is
why Galène's client limits the rate to 700kbit/s by default (in the
« Send » entry in the side menu).

Implementing the delay-based controller is number 1 on my wishlist.  Your
help would be greatly appreciated.

2. Sender-side tweaks.  The sender has a number of knobs they can tweak,
notably maximum bitrate (separately for each track), and hints about
whether to prefer framerate or image quality upon congestion.  The sender
can also pick the webcam resolution, and they can request downscaling
before encoding.

3. SVC.  The technology that excites me right now is scalable video coding
(SVC), which I believe will make simulcast obsolete.  With VP8, the
sender can request that some frames should not be used as reference for
intra prediction; these « discardable » frames can be dropped by the
server without causing corruption.  VP9 implements full scalability:
temporal scalability, as in VP8, spatial scalability, where the codec
generates a low resolution flow and a high resolution flow that uses the
low resolution flow for intra prediction, and quality scalability, where
the codec generates frames with varying quality.

  https://en.wikipedia.org/wiki/Scalable_Video_Coding

I'm currently planning to skip simulcasting, which I feel is an
obsolescent technology, and experiment with SVC instead.  Implementing the
delay-based controller is a higher prioerity, though.

> Another packet-based optimisation that could be interesting to try out
> is to mark packets containing video key frames as ECN-capable.

Keyframes can be huge (120 packets is not unusual), it wouldn't be
resonable to mark such a burst as ECN-capable without actually reacting to
CE.  And if we drop part of the keyframe, we'll NACK the missing packets
and recover 20ms + 1RTT later.

> Ideally you'd also actually respond to CE markings,

RFC 6679.  I don't know if it's implemented in browsers.

-- Juliusz

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Logging
  2021-01-10 13:47                 ` Toke Høiland-Jørgensen
  2021-01-10 15:14                   ` [Galene] Congestion control and WebRTC [was: Logging] Juliusz Chroboczek
@ 2021-01-10 15:17                   ` Juliusz Chroboczek
  1 sibling, 0 replies; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-10 15:17 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: galene

Another note: NACKs are only used for video, not for audio.  For audio, it
would be great to do FEC, but the FEC protocol that is useful for
a server, flexfec, is not implemented for audio in the browsers, while the
one that is, Opus FEC, is not something that the server can control.

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Congestion control and WebRTC [was: Logging]
  2021-01-10 15:14                   ` [Galene] Congestion control and WebRTC [was: Logging] Juliusz Chroboczek
@ 2021-01-10 15:23                     ` Juliusz Chroboczek
  2021-01-10 22:23                     ` Toke Høiland-Jørgensen
  1 sibling, 0 replies; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-10 15:23 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: galene

>> Ideally you'd also actually respond to CE markings,

> RFC 6679.  I don't know if it's implemented in browsers.

It is not.

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Congestion control and WebRTC [was: Logging]
  2021-01-10 15:14                   ` [Galene] Congestion control and WebRTC [was: Logging] Juliusz Chroboczek
  2021-01-10 15:23                     ` [Galene] " Juliusz Chroboczek
@ 2021-01-10 22:23                     ` Toke Høiland-Jørgensen
  2021-01-10 22:44                       ` Dave Taht
                                         ` (3 more replies)
  1 sibling, 4 replies; 32+ messages in thread
From: Toke Høiland-Jørgensen @ 2021-01-10 22:23 UTC (permalink / raw)
  To: Juliusz Chroboczek, Dave Taht; +Cc: galene

Juliusz Chroboczek <jch@irif.fr> writes:

>> No, I don't think multiplexing more streams over the same five-tuple is
>> a good idea if it can be avoided. If the bottleneck does per-flow
>> queueing (like FQ-CoDel), you'd want each video flow to be scheduled
>> separately I think.
>
> Tere's a tradeoff here.  Using port multiplexing gives more information to
> middleboxes, but using SSID multiplexing reduces the amount of ICE
> negotation -- adding a new track to an already established flow requires
> zero packet exchanges after negotiation (you just start sending data with
> a fresh SSID), while adding a new flow for port multiplexing requires
> a new set of ICE probes, which might take a few seconds in the TURN case.

So in this instance a new flow happens when a new user joins and their
video flow has to be established to every peer?

>> Another couple of ideas for packet-level optimisations that may be worth
>> trying (both originally articulated by Dave Taht):
>
> Why is Dave not here?

I dunno; why aren't you here, Dave? :)

>> In the presence of an FQ-CoDel'ed bottleneck it may be better to put
>> audio and video on two separate 5-tuples: That would cause the audio
>> stream to be treated as a 'sparse flow' with queueing priority and fewer
>> drops when congested.
>
> Uh-huh.  I'll send you a patch to do that, in case you find the time to
> test it.

Sounds good, thanks!

>> (As an aside, is there a reference for the codec constraints in
>> browsers? And is it possible to tweak codec parameters, say to burn some
>> bandwidth to enable really high-fidelity audio for special use cases? Or
>> is Opus so good that it doesn't matter?)
>
> A typical laptop microphone has rather poor frequency response, so Opus at
> 48kbit/s is as good as the original.  It's just not worth reducing the
> audio rate upon congestion, it's the video rate that gets reduced.

Right, I see. Looking at the commit that introduced codec support, it
looks pretty straight-forward to crank up the bitrate; maybe I'll
experiment with that a bit (but not using my laptop's microphone).

> As to the video rate, you've got plenty of exciting knobs.
>
> 1. Congestion control.  As implemented in modern browsers, WebRTC uses two
> congestion controllers: a fairly traditional loss-based controller, and an
> interesting delay-based one.  This is described here:
>
>   https://tools.ietf.org/html/draft-ietf-rmcat-gcc-02
>
> Unlike some other video servers, that mere forward congestion indictions
> from the receivers to the sender, Galène terminates congestion control on
> both legs.  currently obeys congestion indication from the receivers, and
> implements the loss-based congestion controller for data received from the
> sender.
>
>   https://github.com/jech/galene/blob/master/rtpconn/rtpconn.go#L956
>
> We do not currently implement the delay-based controller, which causes
> collapse if the sender is on a low-rate bufferbloated network.  That is
> why Galène's client limits the rate to 700kbit/s by default (in the
> « Send » entry in the side menu).

Right, but the browsers do?

> Implementing the delay-based controller is number 1 on my wishlist.  Your
> help would be greatly appreciated.

Can't promise any hacking time, unfortunately, at least not short-term.
Happy to test out stuff, though :)

> 2. Sender-side tweaks.  The sender has a number of knobs they can tweak,
> notably maximum bitrate (separately for each track), and hints about
> whether to prefer framerate or image quality upon congestion.  The sender
> can also pick the webcam resolution, and they can request downscaling
> before encoding.

Ah, hence the "blackboard mode" - gotcha!

> 3. SVC.  The technology that excites me right now is scalable video coding
> (SVC), which I believe will make simulcast obsolete.  With VP8, the
> sender can request that some frames should not be used as reference for
> intra prediction; these « discardable » frames can be dropped by the
> server without causing corruption.  VP9 implements full scalability:
> temporal scalability, as in VP8, spatial scalability, where the codec
> generates a low resolution flow and a high resolution flow that uses the
> low resolution flow for intra prediction, and quality scalability, where
> the codec generates frames with varying quality.
>
>   https://en.wikipedia.org/wiki/Scalable_Video_Coding
>
> I'm currently planning to skip simulcasting, which I feel is an
> obsolescent technology, and experiment with SVC instead.  Implementing the
> delay-based controller is a higher prioerity, though.

Uh, hadn't heard about that before; neat!

>> Another packet-based optimisation that could be interesting to try out
>> is to mark packets containing video key frames as ECN-capable.
>
> Keyframes can be huge (120 packets is not unusual), it wouldn't be
> resonable to mark such a burst as ECN-capable without actually reacting to
> CE.  And if we drop part of the keyframe, we'll NACK the missing packets
> and recover 20ms + 1RTT later.

Hmm, right, okay I see what you mean...

>>> Ideally you'd also actually respond to CE markings,
>> RFC 6679.  I don't know if it's implemented in browsers.
>
> It is not.

Ah, too bad :(

-Toke

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Congestion control and WebRTC [was: Logging]
  2021-01-10 22:23                     ` Toke Høiland-Jørgensen
@ 2021-01-10 22:44                       ` Dave Taht
  2021-01-11  0:07                       ` Juliusz Chroboczek
                                         ` (2 subsequent siblings)
  3 siblings, 0 replies; 32+ messages in thread
From: Dave Taht @ 2021-01-10 22:44 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: Juliusz Chroboczek, galene

On Sun, Jan 10, 2021 at 2:23 PM Toke Høiland-Jørgensen <toke@toke.dk> wrote:
>
> Juliusz Chroboczek <jch@irif.fr> writes:
>
> >> No, I don't think multiplexing more streams over the same five-tuple is
> >> a good idea if it can be avoided. If the bottleneck does per-flow
> >> queueing (like FQ-CoDel), you'd want each video flow to be scheduled
> >> separately I think.
> >
> > Tere's a tradeoff here.  Using port multiplexing gives more information to
> > middleboxes, but using SSID multiplexing reduces the amount of ICE
> > negotation -- adding a new track to an already established flow requires
> > zero packet exchanges after negotiation (you just start sending data with
> > a fresh SSID), while adding a new flow for port multiplexing requires
> > a new set of ICE probes, which might take a few seconds in the TURN case.
>
> So in this instance a new flow happens when a new user joins and their
> video flow has to be established to every peer?
>
> >> Another couple of ideas for packet-level optimisations that may be worth
> >> trying (both originally articulated by Dave Taht):
> >
> > Why is Dave not here?
>
> I dunno; why aren't you here, Dave? :)
>
> >> In the presence of an FQ-CoDel'ed bottleneck it may be better to put
> >> audio and video on two separate 5-tuples: That would cause the audio
> >> stream to be treated as a 'sparse flow' with queueing priority and fewer
> >> drops when congested.
> >
> > Uh-huh.  I'll send you a patch to do that, in case you find the time to
> > test it.
>
> Sounds good, thanks!

This is what we did in a videoconferencing app... in the 90s... with
sfq... it gives
a "clock" from the audio that should with fq_codel or especially cake give very
fastr congestion feedback....

awesome. I am really liking galene...

>
> >> (As an aside, is there a reference for the codec constraints in
> >> browsers? And is it possible to tweak codec parameters, say to burn some
> >> bandwidth to enable really high-fidelity audio for special use cases? Or
> >> is Opus so good that it doesn't matter?)
> >
> > A typical laptop microphone has rather poor frequency response, so Opus at
> > 48kbit/s is as good as the original.  It's just not worth reducing the
> > audio rate upon congestion, it's the video rate that gets reduced.
>
> Right, I see. Looking at the commit that introduced codec support, it
> looks pretty straight-forward to crank up the bitrate; maybe I'll
> experiment with that a bit (but not using my laptop's microphone).
>
> > As to the video rate, you've got plenty of exciting knobs.
> >
> > 1. Congestion control.  As implemented in modern browsers, WebRTC uses two
> > congestion controllers: a fairly traditional loss-based controller, and an
> > interesting delay-based one.  This is described here:
> >
> >   https://tools.ietf.org/html/draft-ietf-rmcat-gcc-02
> >
> > Unlike some other video servers, that mere forward congestion indictions
> > from the receivers to the sender, Galène terminates congestion control on
> > both legs.  currently obeys congestion indication from the receivers, and
> > implements the loss-based congestion controller for data received from the
> > sender.
> >
> >   https://github.com/jech/galene/blob/master/rtpconn/rtpconn.go#L956
> >
> > We do not currently implement the delay-based controller, which causes
> > collapse if the sender is on a low-rate bufferbloated network.  That is
> > why Galène's client limits the rate to 700kbit/s by default (in the
> > « Send » entry in the side menu).
>
> Right, but the browsers do?
>
> > Implementing the delay-based controller is number 1 on my wishlist.  Your
> > help would be greatly appreciated.
>
> Can't promise any hacking time, unfortunately, at least not short-term.
> Happy to test out stuff, though :)
>
> > 2. Sender-side tweaks.  The sender has a number of knobs they can tweak,
> > notably maximum bitrate (separately for each track), and hints about
> > whether to prefer framerate or image quality upon congestion.  The sender
> > can also pick the webcam resolution, and they can request downscaling
> > before encoding.
>
> Ah, hence the "blackboard mode" - gotcha!
>
> > 3. SVC.  The technology that excites me right now is scalable video coding
> > (SVC), which I believe will make simulcast obsolete.  With VP8, the
> > sender can request that some frames should not be used as reference for
> > intra prediction; these « discardable » frames can be dropped by the
> > server without causing corruption.  VP9 implements full scalability:
> > temporal scalability, as in VP8, spatial scalability, where the codec
> > generates a low resolution flow and a high resolution flow that uses the
> > low resolution flow for intra prediction, and quality scalability, where
> > the codec generates frames with varying quality.
> >
> >   https://en.wikipedia.org/wiki/Scalable_Video_Coding
> >
> > I'm currently planning to skip simulcasting, which I feel is an
> > obsolescent technology, and experiment with SVC instead.  Implementing the
> > delay-based controller is a higher prioerity, though.
>
> Uh, hadn't heard about that before; neat!
>
> >> Another packet-based optimisation that could be interesting to try out
> >> is to mark packets containing video key frames as ECN-capable.
> >
> > Keyframes can be huge (120 packets is not unusual), it wouldn't be
> > resonable to mark such a burst as ECN-capable without actually reacting to
> > CE.  And if we drop part of the keyframe, we'll NACK the missing packets
> > and recover 20ms + 1RTT later.
>
> Hmm, right, okay I see what you mean...
>
> >>> Ideally you'd also actually respond to CE markings,
> >> RFC 6679.  I don't know if it's implemented in browsers.
> >
> > It is not.
>
> Ah, too bad :(
>
> -Toke



-- 
"For a successful technology, reality must take precedence over public
relations, for Mother Nature cannot be fooled" - Richard Feynman

dave@taht.net <Dave Täht> CTO, TekLibre, LLC Tel: 1-831-435-0729

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Congestion control and WebRTC [was: Logging]
  2021-01-10 22:23                     ` Toke Høiland-Jørgensen
  2021-01-10 22:44                       ` Dave Taht
@ 2021-01-11  0:07                       ` Juliusz Chroboczek
  2021-01-11  0:20                         ` Toke Høiland-Jørgensen
  2021-01-11  0:30                       ` Dave Taht
  2021-01-11 13:38                       ` [Galene] Re: Congestion control and WebRTC [was: Logging] Juliusz Chroboczek
  3 siblings, 1 reply; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-11  0:07 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: Dave Taht, galene

> So in this instance a new flow happens when a new user joins and their
> video flow has to be established to every peer?

When a user joins, nothing much happens: remember that Galène is meant to
be usable for lectures with hundred of students.  When a user clicks
« Ready », a stream with up to two tracks is established in the client->server
direction.  Galène then determines the set of clients that have expressed
interest in this flow (through the "request" message), and establishes n -
1 streams in the server->client direction.

In the bundle case (which is what we currently do), each of the flows is
an RTP session (a UDP flow).  In the non-bundle case, each of the flows is
one or two RTP sessions, one per track.

>> We do not currently implement the delay-based controller, which causes
>> collapse if the sender is on a low-rate bufferbloated network.  That is
>> why Galène's client limits the rate to 700kbit/s by default (in the
>> « Send » entry in the side menu).

> Right, but the browsers do?

They do, and Galène provides them with all the data they need to do their
job.  So currently you have state-of-the-art congestion control in the
server->client direction, but only basic loss-based congestion control in
the client->server direction.  Which is good enough for lecturing (you
usually try to give your lecture over an uncongested link) but sometimes
suboptimal during departmental meetings (some people need to lock
themselves in the attic in order to get away from their children).

-- Juliusz

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Congestion control and WebRTC [was: Logging]
  2021-01-11  0:07                       ` Juliusz Chroboczek
@ 2021-01-11  0:20                         ` Toke Høiland-Jørgensen
  2021-01-11  0:28                           ` Juliusz Chroboczek
  0 siblings, 1 reply; 32+ messages in thread
From: Toke Høiland-Jørgensen @ 2021-01-11  0:20 UTC (permalink / raw)
  To: Juliusz Chroboczek; +Cc: Dave Taht, galene

Juliusz Chroboczek <jch@irif.fr> writes:

>> So in this instance a new flow happens when a new user joins and their
>> video flow has to be established to every peer?
>
> When a user joins, nothing much happens: remember that Galène is meant to
> be usable for lectures with hundred of students.  When a user clicks
> « Ready », a stream with up to two tracks is established in the client->server
> direction.  Galène then determines the set of clients that have expressed
> interest in this flow (through the "request" message), and establishes n -
> 1 streams in the server->client direction.
>
> In the bundle case (which is what we currently do), each of the flows is
> an RTP session (a UDP flow).  In the non-bundle case, each of the flows is
> one or two RTP sessions, one per track.

OK. So in the current case, the latency for each other user to see a new
video flow when someone clicks "enable video" is a bit longer because
there's a handshake for each peer. Whereas in SSID multiplexing you
could skip the handshake?

>>> We do not currently implement the delay-based controller, which causes
>>> collapse if the sender is on a low-rate bufferbloated network.  That is
>>> why Galène's client limits the rate to 700kbit/s by default (in the
>>> « Send » entry in the side menu).
>
>> Right, but the browsers do?
>
> They do, and Galène provides them with all the data they need to do their
> job.  So currently you have state-of-the-art congestion control in the
> server->client direction, but only basic loss-based congestion control in
> the client->server direction.  Which is good enough for lecturing (you
> usually try to give your lecture over an uncongested link) but sometimes
> suboptimal during departmental meetings (some people need to lock
> themselves in the attic in order to get away from their children).

Oh, right, so the server will also respond to the delay signals from the
clients' receiver-side? I.e., the only thing you haven't implemented is
the delay processing on the receiver side (from the last paragraph of
section 3 of draft-ietf-rmcat-gcc-02)?

-Toke

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Congestion control and WebRTC [was: Logging]
  2021-01-11  0:20                         ` Toke Høiland-Jørgensen
@ 2021-01-11  0:28                           ` Juliusz Chroboczek
  0 siblings, 0 replies; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-11  0:28 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: Dave Taht, galene

> OK. So in the current case, the latency for each other user to see a new
> video flow when someone clicks "enable video" is a bit longer because
> there's a handshake for each peer. Whereas in SSID multiplexing you
> could skip the handshake?

Establishing a new RTP session requires:

 1. SDP negotation (1 RTT);
 2. ICE probing (1 RTT best case, 2-3s in the TURN case).

Adding a track to an existing RTP session requires just an SDP
renegotation (1 RTT).

> Oh, right, so the server will also respond to the delay signals from the
> clients' receiver-side? I.e., the only thing you haven't implemented is
> the delay processing on the receiver side (from the last paragraph of
> section 3 of draft-ietf-rmcat-gcc-02)?

Exactly.

-- Juliusz

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Congestion control and WebRTC [was: Logging]
  2021-01-10 22:23                     ` Toke Høiland-Jørgensen
  2021-01-10 22:44                       ` Dave Taht
  2021-01-11  0:07                       ` Juliusz Chroboczek
@ 2021-01-11  0:30                       ` Dave Taht
  2021-01-11  6:23                         ` Dave Taht
  2021-01-11 13:38                       ` [Galene] Re: Congestion control and WebRTC [was: Logging] Juliusz Chroboczek
  3 siblings, 1 reply; 32+ messages in thread
From: Dave Taht @ 2021-01-11  0:30 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: Juliusz Chroboczek, galene

On Sun, Jan 10, 2021 at 2:23 PM Toke Høiland-Jørgensen <toke@toke.dk> wrote:

> >> In the presence of an FQ-CoDel'ed bottleneck it may be better to put
> >> audio and video on two separate 5-tuples: That would cause the audio
> >> stream to be treated as a 'sparse flow' with queueing priority and fewer
> >> drops when congested.
> >
> > Uh-huh.  I'll send you a patch to do that, in case you find the time to
> > test it.
>
> Sounds good, thanks!
>
> >> (As an aside, is there a reference for the codec constraints in
> >> browsers? And is it possible to tweak codec parameters, say to burn some
> >> bandwidth to enable really high-fidelity audio for special use cases? Or
> >> is Opus so good that it doesn't matter?)
> >
> > A typical laptop microphone has rather poor frequency response, so Opus at
> > 48kbit/s is as good as the original.  It's just not worth reducing the
> > audio rate upon congestion, it's the video rate that gets reduced.

There have been some good work (across town) on jacktrip, for
multi-party collaborative audio.

https://www.npr.org/2020/11/21/937043051/musicians-turn-to-new-software-to-play-together-online

but zoom and google etc simply don't cut it.

I am personally extremely interested in high quality, positional
collaborative 3D audio, with the video component highly secondary.

Here's the low end device I've been using of late, mounted to the roof
of my boat.

https://zoomcorp.com/en/us/handheld-recorders/handheld-recorders/h3-vr-360-audio-recorder/

An example of what can be achieved with it, mixed down to binaural,
instead of 5:1
http://www.taht.net/~d/circle/wish_youwerehere_Binaural.mp3

You can clearly hear the airplane go *overhead*, totally
coincidentally. in the outro. I note that I'm not in best voice on
that recording, and one of the big songs I've mostly been recording
this year is over here: https://www.youtube.com/watch?v=tUun-jFFoU4



>
> Right, I see. Looking at the commit that introduced codec support, it
> looks pretty straight-forward to crank up the bitrate; maybe I'll
> experiment with that a bit (but not using my laptop's microphone).

Cool. What comes out of that device is 4 channels of various
ambisonics encodings. Whether opus can feed that into a decoder on the
other side (imagine trying to sit next to the drummer, or piano
player) dunno.

> > As to the video rate, you've got plenty of exciting knobs.
> >
> > 1. Congestion control.  As implemented in modern browsers, WebRTC uses two
> > congestion controllers: a fairly traditional loss-based controller, and an
> > interesting delay-based one.  This is described here:
> >
> >   https://tools.ietf.org/html/draft-ietf-rmcat-gcc-02

I liked this one. Except that I wanted to add either classic or SCE
based ecn to the whole thing.

> > Unlike some other video servers, that mere forward congestion indictions
> > from the receivers to the sender, Galène terminates congestion control on
> > both legs.  currently obeys congestion indication from the receivers, and
> > implements the loss-based congestion controller for data received from the
> > sender.
> >
> >   https://github.com/jech/galene/blob/master/rtpconn/rtpconn.go#L956
> >
> > We do not currently implement the delay-based controller, which causes
> > collapse if the sender is on a low-rate bufferbloated network.  That is
> > why Galène's client limits the rate to 700kbit/s by default (in the
> > « Send » entry in the side menu).
>
> Right, but the browsers do?
>
> > Implementing the delay-based controller is number 1 on my wishlist.  Your
> > help would be greatly appreciated.
>
> Can't promise any hacking time, unfortunately, at least not short-term.
> Happy to test out stuff, though :)
>
> > 2. Sender-side tweaks.  The sender has a number of knobs they can tweak,
> > notably maximum bitrate (separately for each track), and hints about
> > whether to prefer framerate or image quality upon congestion.  The sender
> > can also pick the webcam resolution, and they can request downscaling
> > before encoding.
>
> Ah, hence the "blackboard mode" - gotcha!
>
> > 3. SVC.  The technology that excites me right now is scalable video coding
> > (SVC), which I believe will make simulcast obsolete.  With VP8, the
> > sender can request that some frames should not be used as reference for
> > intra prediction; these « discardable » frames can be dropped by the
> > server without causing corruption.  VP9 implements full scalability:
> > temporal scalability, as in VP8, spatial scalability, where the codec
> > generates a low resolution flow and a high resolution flow that uses the
> > low resolution flow for intra prediction, and quality scalability, where
> > the codec generates frames with varying quality.
> >
> >   https://en.wikipedia.org/wiki/Scalable_Video_Coding
> >
> > I'm currently planning to skip simulcasting, which I feel is an
> > obsolescent technology, and experiment with SVC instead.  Implementing the
> > delay-based controller is a higher prioerity, though.
>
> Uh, hadn't heard about that before; neat!
>
> >> Another packet-based optimisation that could be interesting to try out
> >> is to mark packets containing video key frames as ECN-capable.
> >
> > Keyframes can be huge (120 packets is not unusual), it wouldn't be
> > resonable to mark such a burst as ECN-capable without actually reacting to
> > CE.  And if we drop part of the keyframe, we'll NACK the missing packets
> > and recover 20ms + 1RTT later.
>
> Hmm, right, okay I see what you mean...
>
> >>> Ideally you'd also actually respond to CE markings,
> >> RFC 6679.  I don't know if it's implemented in browsers.
> >
> > It is not.
>
> Ah, too bad :(
>
> -Toke



-- 
"For a successful technology, reality must take precedence over public
relations, for Mother Nature cannot be fooled" - Richard Feynman

dave@taht.net <Dave Täht> CTO, TekLibre, LLC Tel: 1-831-435-0729

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Congestion control and WebRTC [was: Logging]
  2021-01-11  0:30                       ` Dave Taht
@ 2021-01-11  6:23                         ` Dave Taht
  2021-01-11 12:55                           ` [Galene] Multichannel audio [was: Congestion control...] Juliusz Chroboczek
  0 siblings, 1 reply; 32+ messages in thread
From: Dave Taht @ 2021-01-11  6:23 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: Juliusz Chroboczek, galene

On Sun, Jan 10, 2021 at 4:30 PM Dave Taht <dave.taht@gmail.com> wrote:
>
> On Sun, Jan 10, 2021 at 2:23 PM Toke Høiland-Jørgensen <toke@toke.dk> wrote:
>
> > >> In the presence of an FQ-CoDel'ed bottleneck it may be better to put
> > >> audio and video on two separate 5-tuples: That would cause the audio
> > >> stream to be treated as a 'sparse flow' with queueing priority and fewer
> > >> drops when congested.
> > >
> > > Uh-huh.  I'll send you a patch to do that, in case you find the time to
> > > test it.
> >
> > Sounds good, thanks!
> >
> > >> (As an aside, is there a reference for the codec constraints in
> > >> browsers? And is it possible to tweak codec parameters, say to burn some
> > >> bandwidth to enable really high-fidelity audio for special use cases? Or
> > >> is Opus so good that it doesn't matter?)
> > >
> > > A typical laptop microphone has rather poor frequency response, so Opus at
> > > 48kbit/s is as good as the original.  It's just not worth reducing the
> > > audio rate upon congestion, it's the video rate that gets reduced.
>
> There have been some good work (across town) on jacktrip, for
> multi-party collaborative audio.
>
> https://www.npr.org/2020/11/21/937043051/musicians-turn-to-new-software-to-play-together-online
>
> but zoom and google etc simply don't cut it.
>
> I am personally extremely interested in high quality, positional
> collaborative 3D audio, with the video component highly secondary.
>
> Here's the low end device I've been using of late, mounted to the roof
> of my boat.
>
> https://zoomcorp.com/en/us/handheld-recorders/handheld-recorders/h3-vr-360-audio-recorder/
>
> An example of what can be achieved with it, mixed down to binaural,
> instead of 5:1
> http://www.taht.net/~d/circle/wish_youwerehere_Binaural.mp3
>
> You can clearly hear the airplane go *overhead*, totally
> coincidentally. in the outro. I note that I'm not in best voice on
> that recording, and one of the big songs I've mostly been recording
> this year is over here: https://www.youtube.com/watch?v=tUun-jFFoU4
>
>
>
> >
> > Right, I see. Looking at the commit that introduced codec support, it
> > looks pretty straight-forward to crank up the bitrate; maybe I'll
> > experiment with that a bit (but not using my laptop's microphone).
>
> Cool. What comes out of that device is 4 channels of various
> ambisonics encodings. Whether opus can feed that into a decoder on the
> other side (imagine trying to sit next to the drummer, or piano
> player) dunno.

Can galene, or a web browser, carry multichannel opus audio?
>
> > > As to the video rate, you've got plenty of exciting knobs.
> > >
> > > 1. Congestion control.  As implemented in modern browsers, WebRTC uses two
> > > congestion controllers: a fairly traditional loss-based controller, and an
> > > interesting delay-based one.  This is described here:
> > >
> > >   https://tools.ietf.org/html/draft-ietf-rmcat-gcc-02
>
> I liked this one. Except that I wanted to add either classic or SCE
> based ecn to the whole thing.
>
> > > Unlike some other video servers, that mere forward congestion indictions
> > > from the receivers to the sender, Galène terminates congestion control on
> > > both legs.  currently obeys congestion indication from the receivers, and
> > > implements the loss-based congestion controller for data received from the
> > > sender.
> > >
> > >   https://github.com/jech/galene/blob/master/rtpconn/rtpconn.go#L956
> > >
> > > We do not currently implement the delay-based controller, which causes
> > > collapse if the sender is on a low-rate bufferbloated network.  That is
> > > why Galène's client limits the rate to 700kbit/s by default (in the
> > > « Send » entry in the side menu).
> >
> > Right, but the browsers do?
> >
> > > Implementing the delay-based controller is number 1 on my wishlist.  Your
> > > help would be greatly appreciated.
> >
> > Can't promise any hacking time, unfortunately, at least not short-term.
> > Happy to test out stuff, though :)
> >
> > > 2. Sender-side tweaks.  The sender has a number of knobs they can tweak,
> > > notably maximum bitrate (separately for each track), and hints about
> > > whether to prefer framerate or image quality upon congestion.  The sender
> > > can also pick the webcam resolution, and they can request downscaling
> > > before encoding.
> >
> > Ah, hence the "blackboard mode" - gotcha!
> >
> > > 3. SVC.  The technology that excites me right now is scalable video coding
> > > (SVC), which I believe will make simulcast obsolete.  With VP8, the
> > > sender can request that some frames should not be used as reference for
> > > intra prediction; these « discardable » frames can be dropped by the
> > > server without causing corruption.  VP9 implements full scalability:
> > > temporal scalability, as in VP8, spatial scalability, where the codec
> > > generates a low resolution flow and a high resolution flow that uses the
> > > low resolution flow for intra prediction, and quality scalability, where
> > > the codec generates frames with varying quality.
> > >
> > >   https://en.wikipedia.org/wiki/Scalable_Video_Coding
> > >
> > > I'm currently planning to skip simulcasting, which I feel is an
> > > obsolescent technology, and experiment with SVC instead.  Implementing the
> > > delay-based controller is a higher prioerity, though.
> >
> > Uh, hadn't heard about that before; neat!
> >
> > >> Another packet-based optimisation that could be interesting to try out
> > >> is to mark packets containing video key frames as ECN-capable.
> > >
> > > Keyframes can be huge (120 packets is not unusual), it wouldn't be
> > > resonable to mark such a burst as ECN-capable without actually reacting to
> > > CE.  And if we drop part of the keyframe, we'll NACK the missing packets
> > > and recover 20ms + 1RTT later.
> >
> > Hmm, right, okay I see what you mean...
> >
> > >>> Ideally you'd also actually respond to CE markings,
> > >> RFC 6679.  I don't know if it's implemented in browsers.
> > >
> > > It is not.
> >
> > Ah, too bad :(
> >
> > -Toke
>
>
>
> --
> "For a successful technology, reality must take precedence over public
> relations, for Mother Nature cannot be fooled" - Richard Feynman
>
> dave@taht.net <Dave Täht> CTO, TekLibre, LLC Tel: 1-831-435-0729



-- 
"For a successful technology, reality must take precedence over public
relations, for Mother Nature cannot be fooled" - Richard Feynman

dave@taht.net <Dave Täht> CTO, TekLibre, LLC Tel: 1-831-435-0729

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Multichannel audio [was: Congestion control...]
  2021-01-11  6:23                         ` Dave Taht
@ 2021-01-11 12:55                           ` Juliusz Chroboczek
  2021-01-11 17:25                             ` [Galene] " Dave Taht
  0 siblings, 1 reply; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-11 12:55 UTC (permalink / raw)
  To: Dave Taht; +Cc: galene

> Can galene, or a web browser, carry multichannel opus audio?

It's apparently possible under Chrome, but they use a non-standard payload
format, so it'd require some hacking.  I'll see what I can do.

-- Juliusz

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Congestion control and WebRTC [was: Logging]
  2021-01-10 22:23                     ` Toke Høiland-Jørgensen
                                         ` (2 preceding siblings ...)
  2021-01-11  0:30                       ` Dave Taht
@ 2021-01-11 13:38                       ` Juliusz Chroboczek
  2021-01-11 15:17                         ` Toke Høiland-Jørgensen
  2021-01-12  1:38                         ` Juliusz Chroboczek
  3 siblings, 2 replies; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-11 13:38 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: galene

>>> In the presence of an FQ-CoDel'ed bottleneck it may be better to put
>>> audio and video on two separate 5-tuples:

>> Uh-huh.  I'll send you a patch to do that, in case you find the time to
>> test it.

> Sounds good, thanks!

It turns out that there's no API to disable bundling, and it's not
immediately obvious how to achieve that through SDP munging, so doing that
would require somewhat more hacking than I'm willing to do right now.

-- Juliusz

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Congestion control and WebRTC [was: Logging]
  2021-01-11 13:38                       ` [Galene] Re: Congestion control and WebRTC [was: Logging] Juliusz Chroboczek
@ 2021-01-11 15:17                         ` Toke Høiland-Jørgensen
  2021-01-11 17:20                           ` Dave Taht
  2021-01-12  1:38                         ` Juliusz Chroboczek
  1 sibling, 1 reply; 32+ messages in thread
From: Toke Høiland-Jørgensen @ 2021-01-11 15:17 UTC (permalink / raw)
  To: Juliusz Chroboczek; +Cc: galene

Juliusz Chroboczek <jch@irif.fr> writes:

>>>> In the presence of an FQ-CoDel'ed bottleneck it may be better to put
>>>> audio and video on two separate 5-tuples:
>
>>> Uh-huh.  I'll send you a patch to do that, in case you find the time to
>>> test it.
>
>> Sounds good, thanks!
>
> It turns out that there's no API to disable bundling, and it's not
> immediately obvious how to achieve that through SDP munging, so doing that
> would require somewhat more hacking than I'm willing to do right now.

Alright, fair enough. Let's leave this in the mental "things it would be
nice to do at some point" pile, then :)

-Toke

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Congestion control and WebRTC [was: Logging]
  2021-01-11 15:17                         ` Toke Høiland-Jørgensen
@ 2021-01-11 17:20                           ` Dave Taht
  0 siblings, 0 replies; 32+ messages in thread
From: Dave Taht @ 2021-01-11 17:20 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: Juliusz Chroboczek, galene

On Mon, Jan 11, 2021 at 7:17 AM Toke Høiland-Jørgensen <toke@toke.dk> wrote:
>
> Juliusz Chroboczek <jch@irif.fr> writes:
>
> >>>> In the presence of an FQ-CoDel'ed bottleneck it may be better to put
> >>>> audio and video on two separate 5-tuples:
> >
> >>> Uh-huh.  I'll send you a patch to do that, in case you find the time to
> >>> test it.
> >
> >> Sounds good, thanks!
> >
> > It turns out that there's no API to disable bundling, and it's not
> > immediately obvious how to achieve that through SDP munging, so doing that
> > would require somewhat more hacking than I'm willing to do right now.
>
> Alright, fair enough. Let's leave this in the mental "things it would be
> nice to do at some point" pile, then :)

Grump. That's where we left it 5+ years back.
>
> -Toke
> _______________________________________________
> Galene mailing list -- galene@lists.galene.org
> To unsubscribe send an email to galene-leave@lists.galene.org



-- 
"For a successful technology, reality must take precedence over public
relations, for Mother Nature cannot be fooled" - Richard Feynman

dave@taht.net <Dave Täht> CTO, TekLibre, LLC Tel: 1-831-435-0729

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Multichannel audio [was: Congestion control...]
  2021-01-11 12:55                           ` [Galene] Multichannel audio [was: Congestion control...] Juliusz Chroboczek
@ 2021-01-11 17:25                             ` Dave Taht
  0 siblings, 0 replies; 32+ messages in thread
From: Dave Taht @ 2021-01-11 17:25 UTC (permalink / raw)
  To: Juliusz Chroboczek; +Cc: galene

On Mon, Jan 11, 2021 at 4:55 AM Juliusz Chroboczek <jch@irif.fr> wrote:
>
> > Can galene, or a web browser, carry multichannel opus audio?
>
> It's apparently possible under Chrome, but they use a non-standard payload
> format, so it'd require some hacking.  I'll see what I can do.

Thx!

I keep hoping to find a killer app for not just multiparty audio but
better congestion control,
and I have to confess that back in march, a zillion companies called
me up and asked what
they could do to make for better videoconferencing, and I told 'em
"Encourage replacement of all the home routers in the world"... and
none of them called me back. Or did anything.

I decided I'd done enough to fix the internet, and just made music
with my friends outdoors every weekend. made a lot of people happier
that way.

Here, have a smile: http://www.taht.net/~d/circle/smile.mp3 with april
on vocals and darin on bass, playing together for the first time.

While I'm trying to get back into it this year, trying to find
something genuinely useful and profitable to do has been on my mind.
Wifi 6 is a disaster so far... and certainly there's a lot of top
level interest
in better videoconferencing, and I love the relative simplicity of
galene vs, for example, jitsi.

> -- Juliusz



-- 
"For a successful technology, reality must take precedence over public
relations, for Mother Nature cannot be fooled" - Richard Feynman

dave@taht.net <Dave Täht> CTO, TekLibre, LLC Tel: 1-831-435-0729

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Galene] Re: Congestion control and WebRTC [was: Logging]
  2021-01-11 13:38                       ` [Galene] Re: Congestion control and WebRTC [was: Logging] Juliusz Chroboczek
  2021-01-11 15:17                         ` Toke Høiland-Jørgensen
@ 2021-01-12  1:38                         ` Juliusz Chroboczek
  1 sibling, 0 replies; 32+ messages in thread
From: Juliusz Chroboczek @ 2021-01-12  1:38 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen; +Cc: galene

> It turns out that there's no API to disable bundling, and it's not
> immediately obvious how to achieve that through SDP munging, so doing that
> would require somewhat more hacking than I'm willing to do right now.

It turns out that this is not supported at least by Chrome.

  https://bugs.chromium.org/p/webrtc/issues/detail?id=4260

^ permalink raw reply	[flat|nested] 32+ messages in thread

end of thread, other threads:[~2021-01-12  1:38 UTC | newest]

Thread overview: 32+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-07 21:38 [Galene] Logging Juliusz Chroboczek
2021-01-07 22:45 ` [Galene] Logging Michael Ströder
2021-01-08  0:35 ` Antonin Décimo
2021-01-08 12:40 ` Toke Høiland-Jørgensen
2021-01-08 13:28   ` Juliusz Chroboczek
2021-01-08 13:52     ` Toke Høiland-Jørgensen
2021-01-08 14:33       ` Michael Ströder
2021-01-08 15:13         ` Juliusz Chroboczek
2021-01-08 17:34           ` Michael Ströder
2021-01-08 18:00             ` Juliusz Chroboczek
2021-01-08 15:34       ` Juliusz Chroboczek
2021-01-08 19:34         ` Toke Høiland-Jørgensen
2021-01-08 19:56           ` Juliusz Chroboczek
2021-01-09  0:18             ` Toke Høiland-Jørgensen
2021-01-09 13:34               ` Juliusz Chroboczek
2021-01-10 13:47                 ` Toke Høiland-Jørgensen
2021-01-10 15:14                   ` [Galene] Congestion control and WebRTC [was: Logging] Juliusz Chroboczek
2021-01-10 15:23                     ` [Galene] " Juliusz Chroboczek
2021-01-10 22:23                     ` Toke Høiland-Jørgensen
2021-01-10 22:44                       ` Dave Taht
2021-01-11  0:07                       ` Juliusz Chroboczek
2021-01-11  0:20                         ` Toke Høiland-Jørgensen
2021-01-11  0:28                           ` Juliusz Chroboczek
2021-01-11  0:30                       ` Dave Taht
2021-01-11  6:23                         ` Dave Taht
2021-01-11 12:55                           ` [Galene] Multichannel audio [was: Congestion control...] Juliusz Chroboczek
2021-01-11 17:25                             ` [Galene] " Dave Taht
2021-01-11 13:38                       ` [Galene] Re: Congestion control and WebRTC [was: Logging] Juliusz Chroboczek
2021-01-11 15:17                         ` Toke Høiland-Jørgensen
2021-01-11 17:20                           ` Dave Taht
2021-01-12  1:38                         ` Juliusz Chroboczek
2021-01-10 15:17                   ` [Galene] Re: Logging Juliusz Chroboczek

Galène videoconferencing server discussion list archives

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://lists.galene.org/galene

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V1 galene galene/ https://lists.galene.org/galene \
		galene@lists.galene.org
	public-inbox-index galene

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git