Commit graph

51 commits

Author SHA1 Message Date
Raphael Dürscheid
b66db922d8 Remove erranous unwrap() on use_clock 2022-04-22 20:01:56 +03:00
Raphael Dürscheid
3e5fa04379 Consumer pipeline should use_clock 2022-04-22 18:37:46 +03:00
Thibault Saunier
f11260aeb5 webrtcsink: Fix a race starting the signaller
1. Working scenario:

T1 -> Caps event (all caps have been received)
T1     -> Start discovering
T2 -> Change state to Playing
T2        -> The signaller is not started as:
                - Sink current_state() == Paused as it will be set to
                  playing after the change_state vmethod returns
                - Discovery is not done anyway
T1 -> Discovery is done
        => The signaller is started, and **everything works well**.

2. Failing scenario:

T1 -> Caps event (all caps have been received)
T1     -> Start discovering
T1 -> Discovery is done
T1        -> The signaller is not started as:
                - Current state == Paused (it will be set to playing
                  after the change_state vmethod returns)
                - Discovery is not done anyway
T2 -> Change state to Playing
T2        -> The signaller is not started as:
                - Sink current_state == Paused  as it will be set to
                  playing after the we return from the change_state
                  vmethod

In that case the signaller never starts.
2022-04-20 18:47:24 +02:00
Thibault Saunier
03430a9571 sink: Force data channel priority to high
Low latency is very important for user interaction
2022-04-14 23:21:01 +02:00
Thibault Saunier
9285798210 Do not reset caps when they do not change
Otherwise a useless renegotiation will be triggered by capsfilter
2022-04-14 23:13:17 +02:00
Raphael Dürscheid
55d30db53b Add property to specify certificate authority
Under certain circumstances one would like to use a self signed
certificate without the obstacles many browsers implement to
safeguard their users. One approach is to create a certificate
authority. One can now add this to the OS certificate store, or simply
add it to the browser. In the latter case one also needs to specify the
new authority on the webrtcsink. This commit enables this.
2022-03-31 15:23:11 +02:00
Mathieu Duponchelle
f6eb967cbe webrtcsink: address Sebastian's latest comments
+ refactor encoder-setup signal emission
+ document unused fields in navigation event handler
2022-03-26 00:16:29 +01:00
Mathieu Duponchelle
b80cf1fb8e webrtcsink: turn NavigationEventHandler into a tuple wrapper
More elegant way of not bumping into the unused fields warning
than prefixing with _
2022-03-25 02:46:45 +01:00
Mathieu Duponchelle
983fcf2fbd webrtcsink: expose signal for initial encoder configuration
+ Update README
2022-03-25 02:34:53 +01:00
Mathieu Duponchelle
b5443c5966 webrtcsink: don't set msid-appdata on transceivers
The change was merged inadvertently alongside the display-name
API extension, we will probably eventually expose API on webrtcsink
pads to control that, but we won't just set it to pad.name() anyway.

Fixes #33
2022-03-24 17:46:51 +01:00
Mathieu Duponchelle
70e6227c9a webrtcsink: reduce latency with vpx encoders
The lag-in-frames property needs to be explicitly set to 0
2022-03-23 02:44:25 +01:00
Mathieu Duponchelle
bd560fa9f9 protocol: allow registering with a display name
While the signalling server will allocate unique identifiers for
each peer, users may want to also pass their own identifiers.
2022-03-23 01:35:10 +01:00
Mathieu Duponchelle
bd88395859 signalling: update protocol, reimplement in rust 2022-03-17 18:31:54 +01:00
Mathieu Duponchelle
7f000ea42b webrtcsink: trigger negotiation manually
We no longer connect to on-negotiation-needed, this in order to call the
consumer-added signal without holding the state lock:

Going to Ready triggers synchronous emission of the on-negotiation-needed
signal, during which time the application may add a data channel, causing
renegotiation, which we do not support at this time.

This is completely safe, as we know that at that point all conditions are
gathered: webrtcbin is in the Ready state, and all its transceivers have
codec_preferences.
2022-03-01 02:32:50 +01:00
Mathieu Duponchelle
3a5e05f2ab webrtcsink: emit consumer-added with webrtcbin in the Ready state
In order for applications to potentially create data channels at
the correct moment
2022-03-01 02:32:50 +01:00
machenmusik
9e7406cec0 change x264enc default bitrate to match nvh264enc
Assume default bitrate should be the same for a given codec (here, H264 is 2048u32) regardless of which encoder is used (x264enc, nvh264enc).
2022-02-09 01:37:13 +01:00
Thibault Saunier
51c2f35909 Reformat code with 'cargo fmt' 2022-02-08 15:12:45 +01:00
Thibault Saunier
22205c235d Release 'state' lock before emitting signals 2022-02-08 15:12:45 +01:00
Thibault Saunier
794df19122 Add a new 'get-consumers' action signal
So user can get the list of currently avalaible consumers (by ID).
2022-02-08 15:12:45 +01:00
Thibault Saunier
4e0e8d1cc3 Rename the new-webrtcbin signal to consumer-added
For symmetry with the new  `consumer-removed` signal.
2022-02-08 15:12:45 +01:00
Thibault Saunier
36eb00121c Add a consumer-removed signal to notify the application 2022-02-08 15:12:45 +01:00
Sebastian Dröge
1983041770 Update to gstreamer-rs 0.18 instead of using it from git
And update all other dependencies.
2022-01-25 20:12:23 +01:00
Mathieu Duponchelle
b185819140 webrtcsink: don't add video elements to audio discovery pipeline 2022-01-20 20:37:27 +01:00
Thibault Saunier
689bd93055 Implement the GstNavigation interface using a dedicated DataChannel protocol
This allows interacting with the source element from within the browser
very easily
2022-01-03 22:30:44 +01:00
Thibault Saunier
cf176bdd93 Update plugins/src/webrtcsink/imp.rs
Co-authored-by: Sebastian Dröge <slomo@coaxion.net>
2022-01-03 18:29:45 +01:00
Thibault Saunier
300adda41b Dot 'caps inspection' pipelines 2022-01-03 18:29:45 +01:00
Thibault Saunier
85fd7175de Add support for cuda and GL memory
This way we don't need to download/upload when unnecessary
2022-01-03 18:29:45 +01:00
Sebastian Dröge
d6ba009742 Fix various clippy warnings 2021-12-28 18:28:09 +01:00
Thibault Saunier
d15c32e3e6 stat-frontend: Allow passing a URL to the stat producer 2021-12-28 17:09:52 +01:00
Thibault Saunier
da0a934307 nvh264enc: Do not wrongly set vbv-buffer-size and use the cbr-ld-hq rc-mode
vbv-buffer-size which is in kbits can't be set while playing so we
can't really use it for our use case.
2021-12-23 17:02:50 +01:00
Mathieu Duponchelle
8128c14fa9 API: refactor error signalling
* Expect Box<dyn Error> from custom signaller

* Use thiserror to define the error codes returned to custom
  signallers
2021-12-21 23:37:29 +01:00
Mathieu Duponchelle
a4df10b112 webrtcsink: reset default values when disabling congestion control 2021-12-10 03:33:02 +01:00
Mathieu Duponchelle
d230345d90 webrtcsink: make sure we always scale to multiple of 2 dimensions
Some encoders do not like odd widths or heights
2021-12-10 01:16:10 +01:00
Mathieu Duponchelle
1826111278 Implement support for FEC / retransmission 2021-12-10 01:12:19 +01:00
Mathieu Duponchelle
7bd7c4e960 webrtcsink: tune homegrown CC algorithm
Make control decisions based on packet loss closer in intent to
the algorithm described in gcc section 6., and raise the threshold
for decreasing the bitrate based on delay_factor
2021-12-08 22:31:03 +01:00
Thibault Saunier
b12d91775d Respect user provided max-bitrate when congestion controler is disabled 2021-12-08 22:30:37 +01:00
Thibault Saunier
5904e1ccb4 Allow changeing Congestion control algorithm at runtime 2021-12-08 22:30:37 +01:00
Thibault Saunier
57f459f43b Dot consumer pipelines when finalizing the pipeline 2021-12-03 16:22:11 +01:00
Mathieu Duponchelle
f9fb18ae1b examples: implement stats client 2021-11-30 22:55:28 +01:00
Mathieu Duponchelle
5f98e61c91 examples: implement webrtcsink-stat-server 2021-11-30 22:55:28 +01:00
Mathieu Duponchelle
921ca7fbab webrtcsink: expose stats property 2021-11-30 22:55:28 +01:00
Thibault Saunier
40a4b745e3 Add properties to configure min/max bitrate values 2021-11-24 15:27:06 +01:00
Thibault Saunier
ee64d53cf4 Update dependencies 2021-11-24 15:27:06 +01:00
Mathieu Duponchelle
7ce0ef5b88 webrtcsink: change method for constraining final caps
See discussion at:

https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1278#note_1154282
2021-11-23 14:52:40 +01:00
Sebastian Dröge
e7a9c2b054 Update dependencies
This involves removing lots of unnecessary `unwrap()`s and simplifies
the `lookup_codecs()` function a bit.
2021-11-21 18:44:00 +01:00
Sebastian Dröge
ac60e7b101 Remove needless to_value() calls 2021-11-20 14:56:34 +02:00
Thibault Saunier
63337c7df1 sink: Add a new-webrtcbin signal
Allowing user to add a data channel for example
2021-11-19 12:58:57 +01:00
Thibault Saunier
444ee40f09 sink: Dot comsumer pipeline on state changes 2021-11-19 12:57:39 +01:00
Thibault Saunier
ac0f9f41df sink: Add properties to set stun and turn servers 2021-11-19 12:57:39 +01:00
Mathieu Duponchelle
8c6ff24052 webrtcsink: Initial congestion control implementation
Naive heuristic lifted from an earlier proof of concept,
augmented with logic from
https://datatracker.ietf.org/doc/html/draft-ietf-rmcat-gcc-02#section-5.5

A property is exposed to disable congestion control for
testing purposes, it can be extended in the future to allow
selecting a different congestion control scheme.

+ Update the documentation
2021-11-10 02:55:46 +01:00