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
Juliusz Chroboczek
0ec9f92dad
Make 'clearchat' into a user message.
2021-01-03 17:47:56 +01:00
Juliusz Chroboczek
e393819eda
Carry raw SDP in the protocol.
2021-01-03 17:00:58 +01:00
Juliusz Chroboczek
f53276b89e
Simplify the protocol and the protocol interface.
...
Split the id field into id and source, where source indicates the sender
of the message and id the entity being sent. Remove the label request,
just use the offerer's username. Maintain the username within the
ServerConnection, this removes a parameter from some methods.
2021-01-03 12:17:30 +01:00
Juliusz Chroboczek
450601f0e8
Move ICE code into own module, add tests.
2021-01-02 00:21:17 +01:00
Juliusz Chroboczek
dbec9df288
Use Pion's JSON support for ICE configuration.
2021-01-01 22:28:38 +01:00
Juliusz Chroboczek
a0418d26ec
Send RTC configuration with joined message.
...
This avoids one HTTP request, and is potentially more flexible.
2020-12-28 02:55:19 +01:00
Juliusz Chroboczek
d09c0f0a80
Make the value field of client messages carry arbitrary types.
2020-12-28 01:49:27 +01:00
Juliusz Chroboczek
9e4aede72a
Fix issues with unaligned atomic operations.
...
This could be solved by simply reordering the fields, but it
is more robust to move the atomics into their own structure,
and the extra indirection should not cost much.
2020-12-27 01:31:31 +01:00
Juliusz Chroboczek
e88942c9a9
Reduce the NACK delay.
...
We bound the NACK delay to 2 packets, which is what TCP does.
Thus, reducing the delay should be safe.
2020-12-26 22:09:26 +01:00
Juliusz Chroboczek
5d38b0a231
Allow various codecs.
...
It is now possible to specify codecs other than VP8 and Opus. This
turns out not to be very useful, since VP8 is the only codec supported
by all browsers (in violation of the WebRTC spec, which mandates support
for H.264), and there is no good reason to use anything other than Opus
for audio.
2020-12-26 19:46:37 +01:00
Juliusz Chroboczek
2785fa9f77
Store labels early.
...
This avoids spurious up.complete indications.
2020-12-25 22:32:30 +01:00
Juliusz Chroboczek
f4379f7a8c
Protect against negotiation inconsistencies.
...
This is not an issue in the current code, assuming that clients
negotiate correctly, but will become one once we implement codec
flexibility.
2020-12-25 20:50:33 +01:00
Juliusz Chroboczek
3c04d48b85
Push a connection even if all tracks didn't arrive.
...
We used to push a connection when we got all tracks. However, it may
happen that some tracks fail; in that case, the connection would never
get pushed.
2020-12-25 20:23:46 +01:00
Juliusz Chroboczek
e5fec68acf
Start RTCP up sender early.
2020-12-25 20:10:12 +01:00
Juliusz Chroboczek
d5c7a13aae
Implement abort in the client->server direction.
2020-12-25 18:51:17 +01:00
Juliusz Chroboczek
cc35931ad1
Make isKeyframe codec-agnostic.
2020-12-25 16:40:38 +01:00
Juliusz Chroboczek
d43a2b0104
Implement WallOps to send a warning to all operators.
2020-12-23 23:15:36 +01:00
Juliusz Chroboczek
4c07953ee0
Update dependencies.
2020-12-19 19:03:14 +01:00