Skip to content

Commit

Permalink
change default score calculation for audio
Browse files Browse the repository at this point in the history
  • Loading branch information
balazskreith committed Feb 22, 2025
1 parent 92a9732 commit 344d1d3
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 39 deletions.
6 changes: 3 additions & 3 deletions src/adapters/Firefox94StatsAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ export class Firefox94StatsAdapter {
}
}
// firefox put the track identifier inside brackets ({})
if (rawValue.trackIdentifier) {
rawValue.trackIdentifier = rawValue.trackIdentifier.replace("{", "").replace("}", "");
}
// if (rawValue.trackIdentifier) {
// rawValue.trackIdentifier = rawValue.trackIdentifier.replace("{", "").replace("}", "");
// }
}

return rtcStats;
Expand Down
80 changes: 44 additions & 36 deletions src/scores/DefaultScoreCalculator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ export class DefaultScoreCalculator {
public static readonly TARGET_AUDIO_BITRATE = 32000; // 64 kbps is a good quality for Opus
// public static readonly MAX_AUDIO_BITRATE = 510000; // 510 kbps is a good quality for Opus
public static readonly MIN_AUDIO_BITRATE = 6000; // 6 kbps is the lowest usable bitrate
private static readonly NORMALIZATION_FACTOR = Math.log10(this.TARGET_AUDIO_BITRATE / this.MIN_AUDIO_BITRATE);
private static readonly NORMALIZATION_FACTOR = Math.log10(this.TARGET_AUDIO_BITRATE / this.MIN_AUDIO_BITRATE);

public currentReasons: DefaultScoreCalculatorSubtractions = {};
public totalReasons: DefaultScoreCalculatorSubtractions = {};
Expand Down Expand Up @@ -283,41 +283,6 @@ export class DefaultScoreCalculator {
trackMonitor.calculatedScore.value = finalScore ? this._getRoundedScore(finalScore) : undefined;
}

private _calculateInboundAudioTrackScore(trackMonitor: InboundTrackMonitor) {
if (!trackMonitor.track.enabled || trackMonitor.track.muted) {
if (trackMonitor.calculatedScore.appData) {
trackMonitor.calculatedScore.appData = undefined;
}

return trackMonitor.calculatedScore.value = undefined;
}

const pcMonitor = trackMonitor.getPeerConnection();
const bitrate = trackMonitor.bitrate;
const packetLoss = trackMonitor.getInboundRtp().deltaPacketsLost ?? 0;
const bufferDelayInMs = trackMonitor.getInboundRtp().deltaJitterBufferDelay ?? 10;
const roundTripTimeInMs = (pcMonitor.avgRttInSec ?? 0.05) * 1000;
const dtxMode = trackMonitor.dtxMode;
const fec = (trackMonitor.getInboundRtp().fecBytesReceived ?? 0) > 0;

if (!bitrate) {
trackMonitor.calculatedScore.value = undefined;

return;
}

trackMonitor.calculatedScore.value = this._getRoundedScore(
calculateAudioMOS(
bitrate,
packetLoss,
bufferDelayInMs,
roundTripTimeInMs,
dtxMode,
fec,
)
);
}

private _calculateOutboundVideoTrackScore(trackMonitor: OutboundTrackMonitor) {
if (!trackMonitor.track.enabled || trackMonitor.track.muted) {
if (trackMonitor.calculatedScore.appData) {
Expand Down Expand Up @@ -420,6 +385,49 @@ export class DefaultScoreCalculator {
score.value = this._calculateFinalScore(appData.lastNScores);
}

private _calculateInboundAudioTrackScore(trackMonitor: InboundTrackMonitor) {
if (!trackMonitor.track.enabled || trackMonitor.track.muted) {
if (trackMonitor.calculatedScore.appData) {
trackMonitor.calculatedScore.appData = undefined;
}

return trackMonitor.calculatedScore.value = undefined;
}

// const pcMonitor = trackMonitor.getPeerConnection();
const bitrate = trackMonitor.bitrate;
const packetLoss = trackMonitor.getInboundRtp().deltaPacketsLost ?? 0;
// const bufferDelayInMs = trackMonitor.getInboundRtp().deltaJitterBufferDelay ?? 10;
// const roundTripTimeInMs = (pcMonitor.avgRttInSec ?? 0.05) * 1000;
// const dtxMode = trackMonitor.dtxMode;
// const fec = (trackMonitor.getInboundRtp().fecBytesReceived ?? 0) > 0;

if (!bitrate) {
trackMonitor.calculatedScore.value = undefined;

return;
}

const normalizedBitrate = Math.log10(
Math.max(
bitrate,
DefaultScoreCalculator.MIN_AUDIO_BITRATE
) / DefaultScoreCalculator.MIN_AUDIO_BITRATE
) / DefaultScoreCalculator.NORMALIZATION_FACTOR

console.warn('normalizedBitrate', normalizedBitrate, 'bitrate', bitrate, 'packetLoss', packetLoss);

const lossPenalty = Math.exp(-(packetLoss) / 2); // Exponential decay for packet loss impact
const score = Math.max(
DefaultScoreCalculator.MIN_SCORE,
Math.min(
DefaultScoreCalculator.MAX_SCORE,
5 * normalizedBitrate * lossPenalty
)
);
trackMonitor.calculatedScore.value = this._getRoundedScore(score);
}

private _calculateOutboundAudioTrackScore(trackMonitor: OutboundTrackMonitor) {
if (!trackMonitor.track.enabled || trackMonitor.track.muted) {
if (trackMonitor.calculatedScore.appData) {
Expand Down

0 comments on commit 344d1d3

Please sign in to comment.