Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expected vs actual Layer based connection quality. #1509

Merged
merged 2 commits into from
Mar 10, 2023
Merged

Conversation

boks1971
Copy link
Contributor

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 proportionally used (currently it is just linear) to decrease
score.

This is currently applied only to screen share tracks. It is possible to apply
this to camera tracks also, but bitrate based scoring is a bit more elegant
than layer based.

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.
Copy link
Member

@davidzhao davidzhao left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

awesome work!!

@boks1971 boks1971 merged commit c70aa61 into master Mar 10, 2023
@boks1971 boks1971 deleted the raja_cq_layer branch March 10, 2023 07:38
Comment on lines 195 to 199
w.streamTrackerManager.OnAvailableLayersChanged(w.downTrackLayerChange)
w.streamTrackerManager.OnBitrateAvailabilityChanged(w.downTrackBitrateAvailabilityChange)
w.streamTrackerManager.OnMaxPublishedLayerChanged(w.downTrackMaxPublishedLayerChange)
w.streamTrackerManager.OnMaxTemporalLayerSeenChanged(w.downTrackMaxTemporalLayerSeenChange)
w.streamTrackerManager.OnBitrateReport(w.downTrackBitrateReport)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

all of these are bound to the same object, wouldn't it be easier to use an interface? this callback pattern defeats the go language server and makes it a lot harder to traverse code - with interfaces we can use gopls on the interface and find all the implementations (usually only one or one real + one fake) and view call hierarchies that include these functions. with the callback pattern the only way to figure out what the callback points to is to manually track down the handler binding function and look up where it gets called and what is passed to it. and some of these callbacks are like 5+ indirections deep...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good idea @paulwe . Will look at it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants