@@ -7,28 +7,6 @@ import {
77} from '../types' ;
88import 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-
3210class 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