Commit Graph
412 Commits
Author SHA1 Message Date
cnderrauber 4bd0646fdc Don't close rtcpreader if downtrack will be resumed (#1632) 2023-04-19 13:57:18 +08:00
Raja Subramanian 10b70c9299 Choose max available layer when current becomes unavailable. (#1631)
When current became unavailable, it was possible for
target to be set to opportunistic. Because of that,
the downgrade did not happen and PLI layer lock was
requested continuously.
2023-04-19 10:40:29 +05:30
Raja Subramanian 93604d2415 A couple of stream allocator tweaks (#1628)
* A coupke of stream allocator tweaks

- Do not overshoot on catch up. It so happens that during probe
  the next higher layer is at some bit rate which is much lower
  than normal bit rate for that layer. But, by the time the probe
  ends, publisher has climbed up to normal bit rate.
  So, the probe goal although achieved is not enough.
  Allowing overshoot latches on the next layer which might be more
  than the channel capacity.
- Use a collapse window to record values in case of a only one
  or two changes in an evaluation window. Some times it happens
  that the estimate falls once or twice and stays there. By collapsing
  repeated values, it could be a long time before that fall in estimate
  is processed. Introduce a collapse window and record duplicate value
  if a value was not recorded for collapse window duration. This allows
  delayed processing of those isolated falls in estimate.

* minor clean up

* add a probe max rate

* fix max

* use max of committed, expected for max limiting

* have to probe at goal
2023-04-18 11:49:51 +05:30
Raja Subramanian 5b34d754e0 Safe access of sequencer (#1625)
* log some NACKs

* split out NACK tracker

* remove debug

* debug

* Sequencer safety

* Clean up
2023-04-17 13:02:24 +05:30
Raja Subramanian 5d187523fa Refactor NACK tracking in stream allocator (#1623)
* log some NACKs

* split out NACK tracker

* remove debug
2023-04-17 10:16:12 +05:30
Raja Subramanian ce33d38b4f Use current bit rate when calculating bandwidth needed. (#1617) 2023-04-15 18:50:18 +05:30
Raja Subramanian e75b73af52 Use last received if lower. (#1616)
When detecting congestion based on loss, it is possible that
the loss based signal triggers earlier and the estimate based
signal is lagging. In those cases, check against last received
estimate and if that is lower than loss based throttling, use that.

Without this, it was possible that the current usage high.
Loss based throttling may not dial things back far enough to pause
the stream. Ideally, congestion should hit again and it should be dialled
down further and eventually pause, but there are situations it never
dials back far enough to pause.
2023-04-15 13:07:47 +05:30
Raja Subramanian f54a103049 Do not let request layer overshoot available. (#1614)
* Do not let request layer overshoot available.

After a layer stopped on publisher side, an optimal allocation side
while initially adjusted to not request the stopped layer, a subsequent
allocation went back to the higher layer although it was stopped.
Prevent that.

* simplify
2023-04-15 11:51:28 +05:30
Raja Subramanian d2bf8f0ba1 Support simulating subscriber bandwidth. (#1609)
* Support simualting subscriber bandwidth.

When non-zero, a full allocation is triggered.
Also, probes are stopped.

When set to zero, normal probing mechanism should catch up.

Adding `allowPause` override which can be a connection option.

* fix log

* allowPause in participant params
2023-04-13 13:59:24 +05:30
Raja Subramanian 69fb5e51a2 Fix stutter in forwarding path when using dependency descriptor (#1600)
* Decode chains

* clean up

* clean up

* decode targets only on publisher side

* comment out supported codecs

* fix test compile

* fix another test compile

* Adding TODO notes

* chainID -> chainIdx

* do not need to check for switch up point when using chains, as long as chain integrity is good, can switch

* more comments

* address comments
2023-04-12 17:30:54 +05:30
Raja Subramanian c56e37f3fe Fix VP9 stutter in non-DD and some other misc changes (#1595)
* WIP commit

* WIP commit

* clean up

* remove todo

* fix test
2023-04-10 12:31:07 +05:30
Raja Subramanian 48b2ea11c1 Forgot to transfer ddBytes (#1592) 2023-04-08 13:41:17 +05:30
Raja Subramanian 4969b57c09 Chaging VideoLayers -> VideoLayer (#1591)
There was mixed used. It is a struct. So, it is a singular.
Change all the places I could find. There may be more, but can be
changed when spotted.
2023-04-08 12:39:02 +05:30
Raja Subramanian e32eaa451f Refactor video layer selector (#1588)
* WIP commit

* WIP commit

* fix test

* FPS for VP9

* WIP commit

* test changes

* WIP commit

* h264

* codec munger

* forwarder state

* clean up a bit

* dd interface

* WIP commit

* WIP commit

* WIP commit

* WIP commit

* more TODO notes

* overshoot interface

* clean up

* clean up isTemporalSupported

* wait for key frame to resume

* clean up VP8 payload descriptor stuff

* temporal layer selector

* comment out vp9 and av1

* space

* fix test compile

* append bytes

* fix tests

* fix test
2023-04-08 10:57:57 +05:30
cnderrauber fb301e6e75 Add vp9 svc support by Dependency Descriptor (#1586)
* Add VP9 SVC support

* Fix preferred fps does not work

* Fix forwarder test
2023-04-06 21:51:33 +08:00
Raja Subramanian 793e61ac14 Use bandwidth requested from last allocation. (#1577)
* Use bandwidth requested from last allocation.

With overshoot/opportunistic forwarding, It is possible that
bitrate at target layers is 0. So, use bandwidth requested
from last allocation which shouold have a correct value.

Still need to think about using the latest bit rates to get
the requested bandwidth. It is possible that bitrates have
changed since last allocation. That was the idea behind using
the latest bitrates, but it could return 0. Accounting for it
runs into a few scenarios. Last allocation has number from
last allocation and is a good indicator of the need.

* race
2023-04-04 09:58:57 +05:30
Paul Wells 1b09fc9721 fix panic in rtpstats (#1570) 2023-04-01 12:39:13 -07:00
Raja Subramanian 59961c1992 Aggregate method for RTPDeltaInfo (#1562) 2023-03-30 13:34:52 +05:30
Raja Subramanian de80f521de Increase sequence number cache to handle higb rate tracks. (#1560)
Hopefully temporary while we can find a better solution.
Adds 36 KB per SSRC. So, if a node can handle 10K SSRCs (roughly 10K
tracks), that will be 360 MB of extra memory.
2023-03-29 22:32:39 +05:30
Raja Subramanian 2c439b3063 Fix sequence number offset on packet drop (#1556) 2023-03-29 07:43:28 +05:30
Raja Subramanian de86ccb3df Calculate stats duration. (#1554) 2023-03-28 07:18:31 +05:30
Raja Subramanian f63962c2cc Pure code movement (#1552) 2023-03-26 23:13:17 +05:30
Raja Subramanian afdae26972 Log timestamp jumps greater than 0.5 seconds. (#1551)
Would be good to check if this happens and if it correlates to any A/V
sync reports.
2023-03-26 12:52:50 +05:30
renovate[bot]andDavid Zhao 2fce780ce8 Update go deps (#1402)
* Update go deps

Generated by renovateBot

* use generics with Deque

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: David Zhao <dz@livekit.io>
2023-03-25 23:17:04 -07:00
Raja Subramanian d7750a60ec Unify the forwarder between dependency descriptor and no DD case. (#1543) 2023-03-23 17:23:14 +05:30
Raja Subramanian db2e9f1f8b Use layer 2 for SVC always. (#1542)
This fixes the case of screen share forwarding. We should probably also
look at proper AddTrack. The problem was that
- AddTrack used two layers for screen share from JS sample app
- Track was published with rid = f. Given that and the track info,
  consistent layer mapping set the layer as 1.
- `getBufferLocked` always uses the highest layer for SVC
- Between the two, when down track was requesting PLI, there was
  no buffer at the requested layer and hence no PLI went out.

A few other notes
- Tried locking SVC to layer 0 (instead of layer 2), but that resulted
  in PLI layer lock spamming. It did not happen in v1.3.0 of the server
  though. Not sure what causes that. Need to investigate later.
  But, that does not happen when using layer 2 buffer as SVC buffer.
- When using layer 2 for SVC, the PLI throttle config will be using that
  of layer 2. Is that okay?
- `buffer` structure should maintain more stats about spatial layers for
  SVC case so that layer stats can be reported to analytics/scoring etc.
- In general, `buffer` may need some more hooks to make it SVC aware so
  that it can handle various spetial layer aware/specific bits.
2023-03-23 13:16:14 +05:30
David Colburn 191a9e8014 update core to 0.0.5 (#1540)
* update core

* sort imports

* fix typos

* redundant types
2023-03-22 16:53:23 -07:00
Raja Subramanian 0ea88e4025 Ensure sequence number continuity (#1539)
* Ensure sequence number continuity

When using Go SDK (livekit-cli or egress) as a client,
SFU sends blank frames when audio track is muted to ensure that
Pion OnTrack fires on GoSDK side. That resulted in a huge sequence
number/time stamp jump when the real stream started.

Ensure continuity by creating random sequence number/time stamp when
starting with a blank frames. And when sequence number/time stamp is
initialized using SetLastSnTs, continue sequence if it was already
initialized.

* remove debug
2023-03-22 23:08:26 +05:30
Raja Subramanian 23c03f6add Fix av1 forwarding. (#1538) 2023-03-22 15:35:24 +05:30
Raja Subramanian e7c5872758 Dependent RTT/jitter control. (#1537) 2023-03-22 11:59:32 +05:30
Raja Subramanian f782c8956d Extend range of GOOD scores. (#1536)
Empirically, the experience is not bad for a larger range.
So, triggering POOR too early causes confusion.
2023-03-22 11:36:30 +05:30
Raja Subramanian c76c35474c Init RTT/jitter in snapshot, else get 0 some times (#1534) 2023-03-21 11:50:47 +05:30
Raja Subramanian 65ad4b2c43 Doing a pass at demoting logs (#1531)
A few more candidates to think about demoting
- Publisher mute changes
- Forwarder -> layer lock/upgrade/downgrade/overshoot adjusting
- StreamAllocator
2023-03-20 12:22:08 +05:30
Raja Subramanian f770f0cb67 Use pointer to struct in logging (#1530) 2023-03-19 21:57:35 +05:30
Raja Subramanian aeefbb080e Account for time before measurement available in connection quality. (#1528) 2023-03-19 18:34:56 +05:30
Raja Subramanian bbba3f8168 With opportunistic forwarding, no need to not remove layer 0 (#1529) 2023-03-19 18:19:15 +05:30
Raja Subramanian 7d857c9557 Discount upstream + processing jitter from down stream jitter. (#1527)
* Discount upstream + processing jitter from down stream jitter.

Jitter in RTCP Receiver Report from down stream tracks includes
jitter from up stream tracks and any processing in forwarding path.
As packets are forwarded without any buffering (i. e. no de-jittering)
in the SFU, any up stream jitter will carry forward.

While taking delta stats (which is used for connection quality and
reporting to analytics), discount the up stream + processing jitter so
that connection quality score of down stream track is not penalized
due to up stream + processing jitter.

NOTE: Not discounting it in RTP stats ToString/ToProto methods as
that information is useful to have for analysis/debugging.

* fix typo
2023-03-18 10:25:20 +05:30
Raja Subramanian 8635b0652f Start bit rate worker only for video tracks (#1523) 2023-03-15 17:40:09 +05:30
Raja Subramanian ed2eaaabb2 Add layer mute notification (#1522)
* Layer mute

* clean up

* clean up

* set max temporal layer seen on down track add
2023-03-15 15:24:17 +05:30
Raja Subramanian 582adda97c Fix connection quality in constrained up stream (#1521)
A few things
1. Have to use expected layer in upstream distance to desired. Using
min(published, expected) means if expected is higher than published, it was not caught as a missed layer.
2. Forgot to remove layer transition update in one place. It was still constrained to screen share.
This caused quality to not pick up after constraint is released.
3. Switching to max layer cannot be marked on max published. Same as point #1 above. Otherwise,
dynacast would kick in and turn off highest layer.
2023-03-15 13:27:27 +05:30
Raja Subramanian 5bef98dc2a Switching to layer based quality for camera tracks also. (#1520)
There are cases where the layer bit rate configuration is such that
the expected bitrate difference is very high. For example,
setting up layer 2 (f) layer for 1.7 Mbps and layer 1 (h) for 180 kbps.
With bitrate based quality, a layer drop results in going to `POOR`
quality rating. With layer based, it will drop one level only.

Also, cleaning up the distance to desired calculation a bit.
2023-03-15 11:51:14 +05:30
Raja Subramanian c2335968de Prevent evaluation over small wkndow. (#1516)
With push model (i. e. connection quality evaluation triggered
by reception of RTCP receiver report), it is possible that a report
is received quickly after a track is started (especially with video).
Those should not trigger a quality evaluation.

Set `lastStatsAt` in `Start` routine and ensure that start has been
called and enough time has passed since last stats time to avoid
small windows.
2023-03-14 16:27:39 +05:30
Raja Subramanian e0495f6cab Do not calculate distance if max layers are not valid (#1515) 2023-03-14 15:19:50 +05:30
Raja Subramanian 75eb0e01ec Missed return after adding layer transition for screen share (#1514) 2023-03-14 15:06:59 +05:30
Raja Subramanian fd27a70fe2 stream allocator <-> down track misc changes/clean up (#1512) 2023-03-13 07:45:59 +05:30
David Zhao 5ff72a99b9 Report publish & subscribe RTPStats as Telemetry events (#1506) 2023-03-10 10:28:54 -08:00
Raja Subramanian e7e8bbe72c Use an interface instead of a lot of callbacks. (#1510) 2023-03-10 23:22:22 +05:30
Raja Subramanian c70aa616a9 Expected vs actual Layer based connection quality. (#1509)
* Expected vs actual Layer based connection quality.

With VBR streams (like screen share), bit rate is not a good indicator
of whether desired layer (spatial/temporal) is achieved due to high
variance.

Using expected vs actual layer (i. e. distance to desired) can capture
any short fall and include it in quality scoring.

This PR uses distance to desired, i. e. how many steps it would take to
go from actual spatial/temporal -> desired spatial/temporal and that
distance is propotionally used (currently it is just linear) to decrease
score.

* wire up layer transitions for screen share tracks
2023-03-10 13:08:36 +05:30
Raja Subramanian e893d30fd0 Use EWMA (Exponentially Weighted Moving Average) for score updates. (#1507)
* Use EWMA (Exponentially Weighted Moving Average) for score updates.

Makes code simpler, but makes it harder to test as the inflection points
are not exact.

Score falls a bit slower to be conservative on dropping quality too
quickly. Still fall factor is higher (i. e. newer scores get more
weight) than rise factor (i. e. newer scores get lower weight).
Slower rise factor to introduce hysteresis on things climibing back too
quickly.

In the extreme case, asympttotic conditions could cause unexpected
results. For example, having 4% loss of video continously will never
drop quality to `POOR`. It will get close to 60, but it will always
stay above 60 forever and hence quality will never drop to POOR.
Maybe, need some sort of variable thresholding to deal with that. But,
that is an extreme case and may not happen in real life.

* remove unused stuff
2023-03-09 13:52:01 +05:30
Raja Subramanian 14b0b48b15 Push/pull for connection stats/quality scoring. (#1505)
* Push/pull for connection stats/quality scoring.

Was not happy with pure pull method missing a window because
of RTCP RR timing is slightly off for audio and using a much
larger window of data in the next update.

That also resulted in RTP stats getting some bits of code.
As that is per-packet processing, was not a good idea.

Switching to push-pull method.
For up track, it is pull, i. e. connection stats worker will pull stats.

For down track, there is a new notification about receiver report
reception. Using this to check for time to run stats. And adding a bit
of tolerance for processing window (currently set so that as long as it
is > 95% of usual processing interval). This allows two things
- for video, RTCP RR are more frequent, but we will still not process
  till enough time has passed
- for audio, RTCP RR could be once in 5 seconds or so. Can process when
  it is available rather than miss a window and use a much larger window
  later.

* uber atomic
2023-03-09 11:51:20 +05:30