@@ -7,28 +7,6 @@ import {
7
7
} from '../types' ;
8
8
import BaseIssueDetector from './BaseIssueDetector' ;
9
9
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
-
32
10
class DeadVideoTrackDetector extends BaseIssueDetector {
33
11
#lastMarkedAt: number | undefined ;
34
12
@@ -55,30 +33,48 @@ class DeadVideoTrackDetector extends BaseIssueDetector {
55
33
return issues ;
56
34
}
57
35
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
+ }
79
75
}
80
76
}
81
- }
77
+ } ) ;
82
78
83
79
return issues ;
84
80
}
0 commit comments