1
Fork 0
Commit Graph

223 Commits

Author SHA1 Message Date
Juliusz Chroboczek abed33d654 Fix missing line break in subgroups command. 2021-11-29 17:33:46 +01:00
Juliusz Chroboczek 6af729eeee Reduce delay before sending NACK. 2021-11-27 23:14:42 +01:00
Juliusz Chroboczek c7c3c9c6b0 Export group status in .status.json. 2021-10-30 19:12:06 +02:00
Juliusz Chroboczek c64ec4ccd0 Update dependencies. 2021-10-30 18:54:24 +02:00
Juliusz Chroboczek 019f365981 Remove accessors for group description fields.
Consult the description directly.
2021-10-30 18:34:35 +02:00
Juliusz Chroboczek 869eb9b839 Move password checking into group.go.
It used to be delegated to clients.
2021-10-27 04:15:44 +02:00
Juliusz Chroboczek 09c5ba0d06 Protect against tracks without a stream. 2021-09-16 17:19:19 +02:00
Juliusz Chroboczek e81ee4af5e Remove userId and userName from rtpconn.
They're redundant with the client field.
2021-09-16 16:53:44 +02:00
Juliusz Chroboczek f683675ab4 Use a dedicated error value for anonymous users. 2021-09-09 22:26:08 +02:00
Juliusz Chroboczek 6aa7a9394a More tweaks to layer switching.
I'm not seeing any non-keyframe spatial sync frames, so simplify
the code by only switching spatial layers on keyframes.
2021-08-05 00:03:42 +02:00
Juliusz Chroboczek 9093339b62 Rework handling of buffered keyframes.
Instead of buffering the last keyframe, we merely keep track of its
seqno, and use the main cache for recovering.  We also send the whole
sequence of packets rather than just the keyframe itself.
2021-08-04 02:58:24 +02:00
Juliusz Chroboczek f4aa86a491 Switch spatial layers at the right point. 2021-08-03 23:21:44 +02:00
Juliusz Chroboczek 48a9b10ce8 Use spatial scalability when simulcast is not available.
If the client requested a low-resolution stream and there is none,
switch to SID=0.
2021-08-03 13:14:11 +02:00
Juliusz Chroboczek 4f7be19644 Implement pid and mark rewriting for VP9, fix VP9 sync bits.
The sync bits were incorrect.  In addition, we need to set the
marker at the new end of the frame when doing spatial decimation.
2021-08-03 13:09:43 +02:00
Juliusz Chroboczek 56226a2934 Export the max requested rate in track statistics. 2021-08-03 03:28:36 +02:00
Juliusz Chroboczek 200c0dd68c Refresh layer info after adjusting in down.Write.
Otherwise we might act on outdated info, which could cause a spurious
drop.
2021-08-03 03:15:08 +02:00
Juliusz Chroboczek 3d21a79880 Don't carry up tracks explicitly.
Left over from the old data structure.
2021-08-03 02:51:44 +02:00
Juliusz Chroboczek 51c31ab729 Improve error handling for negotiation failures.
Now that we constrain tracks in offers properly, there is no need
to manually check that the codecs have been matched correctly.
2021-08-02 20:00:23 +02:00
Juliusz Chroboczek 816b7a54df Restrict negotiation of downstream codecs, allow multiple profiles.
We now restrict the allowable codecs in the downstream direction,
which leads to a clean failure instead of a silent track.  We also
allow multiple profiles for a single codec.
2021-08-02 18:08:37 +02:00
Juliusz Chroboczek dd4dbeaee5 Add spatial scalability support.
Only used as a last-resort fallback.
2021-08-01 13:57:14 +02:00
Juliusz Chroboczek efb298f002 Use sendonly transceiver for down tracks, embed receiver in track. 2021-08-01 13:33:01 +02:00
Juliusz Chroboczek 3bdcb8af28 Fix typo in down layer selection. 2021-07-31 23:22:01 +02:00
Juliusz Chroboczek b527c8757a Add chathistory message. 2021-07-31 14:42:26 +02:00
Juliusz Chroboczek 97a5bf60ad Send the locked user-friendly message in the group status. 2021-07-30 19:44:39 +02:00
Juliusz Chroboczek 3b98e123e0 Send a message of kind "kicked" instead of "error". 2021-07-30 19:38:02 +02:00
Juliusz Chroboczek a5c97fd849 Add System permission.
This replaces the OverridePermissions method, and is communicated
to clients that can reliably and safely identify a system user.
2021-07-30 19:26:34 +02:00
Juliusz Chroboczek a8dfc32f9e Fix keyframe tests.
The keyframe detection has been moved into codecs.
2021-07-30 15:26:21 +02:00
Juliusz Chroboczek 89780b866b Move packet parsing code into its own package. 2021-07-29 21:30:39 +02:00
Juliusz Chroboczek 6388f16e87 Fix typos in infinite action stream implementation.
This fixes issues introduced in commit 6ae79f.
2021-07-17 00:05:55 +02:00
Juliusz Chroboczek 52a26327d7 Implement group status.
We now inform clients of the status of a group (locked, etc.).  Also
cleans up the handling of administrative messages, which solves the
issue of receiving "user" before "joined".
2021-07-16 19:51:54 +02:00
Juliusz Chroboczek 6ae79f21d6 Use unbounded buffer for track actions.
Without that, we might deadlock if the reader is blocked in read.
2021-07-16 03:03:45 +02:00
Juliusz Chroboczek c540cad994 Move pushClientConnection into its own function. 2021-07-16 01:40:42 +02:00
Juliusz Chroboczek 053067548a Ensure that replaced down tracks are closed even on failure.
Thanks to Ludovic Rateau.
2021-07-15 23:52:03 +02:00
Juliusz Chroboczek 9b8d868647 Fix a race between delUpConn and addLocal.
We could call addLocal after the remote was closed, which
would cause the local connection to remain forever.

Thanks to Ludovic Rateau.
2021-07-15 16:03:06 +02:00
Juliusz Chroboczek 3d2089f40f Merge GetRTP and Nack into GetPacket.
The two function were always called together.  This factors out
the NACKing logic into the track.
2021-07-14 14:22:22 +02:00
Juliusz Chroboczek 36d31f0db8 Maintain a reference to the connection associated to each track.
This avoids carrying an extra parameter in many places.
2021-07-14 14:05:23 +02:00
Juliusz Chroboczek f3b73263c8 Fix handling of NACKed packets when dropping.
We were not rewriting in this case.
2021-05-17 20:06:08 +02:00
Juliusz Chroboczek 22585e9d10 Handle spatial scalability.
Maintain spatial layer information, and drop lower layers when
possible.  Yields a 20% saving with VP9.
2021-05-17 18:17:43 +02:00
Juliusz Chroboczek 91fa693709 Display max layer in stats. 2021-05-17 13:51:29 +02:00
Juliusz Chroboczek fd76abb61d Send up actions synchronously. 2021-05-17 03:54:58 +02:00
Juliusz Chroboczek c00a21995e Move PLI rate-limiting into the reader loop. 2021-05-17 03:54:20 +02:00
Juliusz Chroboczek d94e5583cd Rewrite AV1 keyframe detection.
Metadata OBUs can appear between the sequence header and the first
frame header.
2021-05-16 14:51:09 +02:00
Juliusz Chroboczek 4435a30a53 Use sequence parameter sets for h.264 keyframe detection.
RFC 6184 Section 8.5.1 implies that the sender will send a
a sequence parameter set in response to PLI.  Since a keyframe is
useless without parameters, use the SPS to detect keyframes.
2021-05-15 23:50:32 +02:00
Juliusz Chroboczek 3e00bb4293 AV1 support. 2021-05-15 19:54:07 +02:00
Juliusz Chroboczek c0da658b9f Send sender report more often.
Now that we start at 200kbps, we need to increase our rate faster.
2021-05-14 23:21:14 +02:00
Juliusz Chroboczek 2da8faa8cf Implement per-stream requests. 2021-05-14 23:21:14 +02:00
Juliusz Chroboczek 515c4a5cd0 Rename pushConns to requestConns, move into Client interface.
Also allow selecting just a single connection.
2021-05-14 23:21:14 +02:00
Juliusz Chroboczek 435f46c520 Add tests for codec manipulation and rtpconn data stuctures. 2021-05-14 23:21:14 +02:00
Juliusz Chroboczek 6f9d7fc306 Scalable video coding (SVC). 2021-05-14 23:21:14 +02:00
Juliusz Chroboczek 7590588a54 Don't renegotiate if nothing changed during a request. 2021-05-14 18:19:44 +02:00
Juliusz Chroboczek d236f4c6df Work around empty track id and msid. 2021-05-13 03:45:32 +02:00
Juliusz Chroboczek 5ad0244267 Allow the loss-based congestion controller to yield higher values. 2021-05-12 17:06:26 +02:00
Juliusz Chroboczek 1130295e0b Use strings.EqualFold for comparing codec names. 2021-05-12 16:18:23 +02:00
Juliusz Chroboczek c53cc20d26 Use Write instead of WriteRTP in the downTrack interface. 2021-05-11 23:48:17 +02:00
Juliusz Chroboczek b09dba0e26 Remove FIR sending code.
We no longer send FIRs.
2021-05-11 23:46:57 +02:00
Juliusz Chroboczek d3f53e6ada Move rate estimation into rtpDownTrack.WriteRTP. 2021-05-11 22:45:33 +02:00
Juliusz Chroboczek c52e1f4ce0 Move keyframe handling to the sender side.
This is simpler and gets rid of ErrKeyframeNeeded.
2021-05-11 22:36:56 +02:00
Juliusz Chroboczek b2ea8e8533 Move isKeyframe into its own file. 2021-05-11 19:59:24 +02:00
Juliusz Chroboczek 26bf8a341a Don't send client parameters in delete message.
This avoids a race condition since the delete messages are sent
asynchronously.
2021-05-10 16:58:28 +02:00
Juliusz Chroboczek 795a40ceaf Simulcast. 2021-05-08 21:12:29 +02:00
Juliusz Chroboczek ed88a7a4b5 Fix typo in REMB sending. 2021-05-08 18:51:15 +02:00
Juliusz Chroboczek 65972fabe8 Remove dead code. 2021-05-08 16:03:32 +02:00
Juliusz Chroboczek 86b6c71ca0 Reformat stats display, protect against division by zero. 2021-05-07 02:23:10 +02:00
Juliusz Chroboczek 3a6ade988d Export stats as JSON. 2021-04-30 20:17:10 +02:00
Juliusz Chroboczek 9b1d814b58 Rework packetcache loss statistics.
Don't maintain loss, which is too error-prone.  Instead, maintain
expected and received packet counts, and compute loss from that.
2021-04-30 16:26:17 +02:00
Juliusz Chroboczek cd6920d7e2 Allow group.API() to fail. 2021-04-29 21:10:04 +02:00
Juliusz Chroboczek be73380f9f Label streams, not tracks.
We used to label tracks individually, in a view to using the labelling
for simulcast.  Since then, the WebRTC community has converged on a
different strategy, where multiple tracks share a single mid and
are labelled with the rid extension.

We now label whole streams, which is simpler, and use the track's
kind (and, in the future, the rid) to disambiguate.  This changes the
protocol in two ways:

  * in offers, the "labels" dictionary is replaced by a single "label"
    field; and
  * the syntax of the "request" message has changed.
2021-04-29 18:28:16 +02:00
Juliusz Chroboczek 3ba2394be7 Implement user statuses.
The server now maintains a set of statuses for each user that are not
interpreted by the server but communicated to the other members of the
group using 'user' messages.
2021-04-28 17:01:05 +02:00
Juliusz Chroboczek f0a39fca48 Send user permissions to client.
We now maintain the user list in the serverConnection.
2021-04-28 00:07:19 +02:00
Juliusz Chroboczek fef38bc53f Protect against requesting when no group is joined.
Thanks to gregfr.
2021-04-15 12:07:05 +02:00
Juliusz Chroboczek ea321be17a Make Kick part of the Client interface.
All clients implement Kick, no need for a separate interface.
2021-02-26 16:20:13 +01:00
Juliusz Chroboczek ddb6039fa6 Fix error handling in client actions.
Thanks to Yacine.
2021-02-17 20:55:11 +01:00
Juliusz Chroboczek 260597d595 Ensure actions happen in order. 2021-02-15 00:35:09 +01:00
Juliusz Chroboczek 183ab4fed7 Use an unbounded buffer for client actions.
We no longer risk deadlocking when sending actions, which in turn
enables pushing connections synchronously.
2021-02-14 17:24:42 +01:00
Juliusz Chroboczek 3b505a89fe Factor out handling actions. 2021-02-14 16:47:36 +01:00
Juliusz Chroboczek 3c7b32056b Reduce writer timeout, increase amount of buffering.
If the writer gets congested, the whole group might be delayed.  Better
to drop the slow client in that case.
2021-02-14 16:26:56 +01:00
Juliusz Chroboczek fe83f61998 Don't complain about ErrClosedPipe in RTCP receiver.
This simply indicates that the server closed the connection
before we received the close indication from the client.
2021-02-11 16:19:36 +01:00
Juliusz Chroboczek 0261558e07 Protect against empty ids. 2021-02-05 16:07:58 +01:00
Juliusz Chroboczek c3a19c9128 Avoid race between closing connections and terminating client.
We need to terminate all down connections synchronously, otherwise
we risk leaving open connections lying around.
2021-02-05 12:20:33 +01:00
Juliusz Chroboczek 66de0d16e7 Fix closing of replaced connections. 2021-02-04 23:51:51 +01:00
Juliusz Chroboczek 0ce509c62c Revert "Log client errors."
We're already logging in the caller.

This reverts commit f4811e8cf5.
2021-02-04 22:44:14 +01:00
Juliusz Chroboczek 263258a0c1 Implement renegotiation of down streams.
We used to destroy and recreate down streams whenever something changed,
which turned out to be racy.  We now properly implement renegotiation,
as well as atomic replacement of a stream by another one.
2021-02-03 19:15:40 +01:00
Juliusz Chroboczek 6c4a71fda0 Increase timeout for connection completion. 2021-02-02 23:12:52 +01:00
Juliusz Chroboczek f34ec0ab66 Don't hide mismatches in the PeerConnection state automaton.
The previous behaviour led to silent failures, which was confusing.
2021-02-02 22:57:56 +01:00
Juliusz Chroboczek f4811e8cf5 Log client errors. 2021-02-02 22:46:54 +01:00
Juliusz Chroboczek d9e72f4fd0 Return an error when adding a duplicate down track. 2021-02-02 22:46:48 +01:00
Juliusz Chroboczek 73f72c45fc Fix race in pushConn. 2021-02-02 22:46:40 +01:00
Juliusz Chroboczek 36d6845dc1 Fix closing of replaced connections. 2021-02-01 14:08:54 +01:00
Juliusz Chroboczek 14a4303664 Rework connection replacement.
We used to signal connection replacement by reusing the same connection
id.  This turned out to be racy, as we couldn't reliably discard old
answers after a connection id was refused.

We now use a new id for every new connection, and explicitly signal
stream replacement in the offer message.  This requires maintaining a
local id on the client side.
2021-01-31 23:59:17 +01:00
Juliusz Chroboczek fb17778ba6 Increase receiver report timeout. 2021-01-21 21:19:07 +01:00
Juliusz Chroboczek f0dcd0b1d9 Rework locking of tracks.
We now add tracks after the stream has been pushed, so we need a lock
on down streams.  Also rework sendUpRTCP to reduce locking.
2021-01-19 23:55:33 +01:00
Juliusz Chroboczek 9a5c8b6b43 Handle answers in stable state.
Don't break the stream, just ignore the SDP.
2021-01-19 23:30:01 +01:00
Juliusz Chroboczek 6098d4af9d Implement autolock. 2021-01-14 03:56:37 +01:00
Juliusz Chroboczek 49bcc342ed Queue negotiation if not in stable state.
If we send two offers back to back, the second answer will arive in
stable state, which will confuse us.  Instead, queue the second offer.
2021-01-12 20:44:48 +01:00
Juliusz Chroboczek 820b303e84 Send localDescription instead of original SDP. 2021-01-11 20:41:34 +01:00
Juliusz Chroboczek dad113c1f9 Generate transceivers from incoming SDP. 2021-01-11 20:24:09 +01:00
Juliusz Chroboczek 63e2b5a4c4 Implement 'noecho' field in client messages. 2021-01-11 16:30:07 +01:00
Juliusz Chroboczek 617aee325f Reduce ping timetout to 45 to 55s.
Thanks to Jeroen van Veen for the debugging.
2021-01-08 14:05:02 +01:00
Juliusz Chroboczek 7f4306ab3b Optimise broadcast messages.
Avoid formatting JSON multiple times.
2021-01-04 18:28:54 +01:00
Juliusz Chroboczek 80cb0a2f30 Simplify VP9 keyframe detection. 2021-01-03 20:55:35 +01:00