Skip to content

Commit a28ba24

Browse files
fix: LD-6968 use trackId as iceCandidate
1 parent ccbd5f2 commit a28ba24

File tree

1 file changed

+40
-44
lines changed

1 file changed

+40
-44
lines changed

src/detectors/DeadVideoTrackDetector.ts

Lines changed: 40 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,6 @@ import {
77
} from '../types';
88
import BaseIssueDetector from './BaseIssueDetector';
99

10-
const sumStats = (
11-
accessor: (stat: ParsedInboundVideoStreamStats) => number,
12-
stats: ParsedInboundVideoStreamStats[],
13-
) => stats.reduce((sum, stat) => sum + accessor(stat), 0);
14-
15-
const sumPacketsReceived = sumStats.bind(null, (stat) => stat.packetsReceived);
16-
const sumDecodedFrames = sumStats.bind(null, (stat) => stat.framesDecoded);
17-
18-
const hasNewInboundTraffic = (data: WebRTCStatsParsed, prevData: WebRTCStatsParsed): boolean => {
19-
const { video: { inbound: newInbound } } = data;
20-
const { video: { inbound: prevInbound } } = prevData;
21-
22-
return sumPacketsReceived(newInbound) > sumPacketsReceived(prevInbound);
23-
};
24-
25-
const hasNewDecodedFrames = (data: WebRTCStatsParsed, prevData: WebRTCStatsParsed): boolean => {
26-
const { video: { inbound: newInbound } } = data;
27-
const { video: { inbound: prevInbound } } = prevData;
28-
29-
return sumDecodedFrames(newInbound) > sumDecodedFrames(prevInbound);
30-
};
31-
3210
class DeadVideoTrackDetector extends BaseIssueDetector {
3311
#lastMarkedAt: number | undefined;
3412

@@ -55,30 +33,48 @@ class DeadVideoTrackDetector extends BaseIssueDetector {
5533
return issues;
5634
}
5735

58-
if (hasNewInboundTraffic(data, previousStats)) {
59-
if (hasNewDecodedFrames(data, previousStats)) {
60-
this.removeMarkIssue();
61-
} else {
62-
const hasIssue = this.markIssue();
63-
64-
if (hasIssue) {
65-
const statsSample = {
66-
packetsReceived: sumPacketsReceived(data.video.inbound),
67-
framesDecoded: sumDecodedFrames(data.video.inbound),
68-
deltaFramesDecoded: sumDecodedFrames(data.video.inbound) - sumDecodedFrames(previousStats.video.inbound),
69-
deltaPacketsReceived:
70-
sumPacketsReceived(data.video.inbound) - sumPacketsReceived(previousStats.video.inbound),
71-
};
72-
73-
issues.push({
74-
statsSample,
75-
type: IssueType.Stream,
76-
reason: IssueReason.DeadVideoTrack,
77-
iceCandidate: data.connection.local.id,
78-
});
36+
const { video: { inbound: newInbound } } = data;
37+
const { video: { inbound: prevInbound } } = previousStats;
38+
39+
const mapByTrackId = (items: ParsedInboundVideoStreamStats[]) => new Map<string, ParsedInboundVideoStreamStats>(
40+
items.map((item) => [item.track.trackIdentifier, item] as const),
41+
);
42+
43+
const newInboundByTrackId = mapByTrackId(newInbound);
44+
const prevInboundByTrackId = mapByTrackId(prevInbound);
45+
46+
Array.from(newInboundByTrackId.entries()).forEach(([trackId, newInboundItem]) => {
47+
const prevInboundItem = prevInboundByTrackId.get(trackId);
48+
if (!prevInboundItem) {
49+
return;
50+
}
51+
52+
if (
53+
newInboundItem.packetsReceived > prevInboundItem.packetsReceived
54+
) {
55+
if (newInboundItem.framesDecoded > prevInboundItem.framesDecoded) {
56+
this.removeMarkIssue();
57+
} else {
58+
const hasIssue = this.markIssue();
59+
60+
if (hasIssue) {
61+
const statsSample = {
62+
packetsReceived: newInboundItem.packetsReceived,
63+
framesDecoded: newInboundItem.framesDecoded,
64+
deltaFramesDecoded: newInboundItem.framesDecoded - prevInboundItem.framesDecoded,
65+
deltaPacketsReceived: newInboundItem.packetsReceived - prevInboundItem.packetsReceived,
66+
};
67+
68+
issues.push({
69+
statsSample,
70+
type: IssueType.Stream,
71+
reason: IssueReason.DeadVideoTrack,
72+
iceCandidate: trackId,
73+
});
74+
}
7975
}
8076
}
81-
}
77+
});
8278

8379
return issues;
8480
}

0 commit comments

Comments
 (0)