Skip to content

Commit 463b1d0

Browse files
authored
feat(dogfood): Extend stats report with audio statistics (#2033)
### 💡 Overview Update dogfood `CallStats` with audio statistics publish/subscribe jitter and bitrate.
1 parent e242d35 commit 463b1d0

File tree

1 file changed

+98
-7
lines changed

1 file changed

+98
-7
lines changed

sample-apps/react-native/dogfood/src/components/CallStats.tsx

Lines changed: 98 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,31 @@ enum Status {
2020
export type CallStatsProps = {
2121
latencyLowBound?: number;
2222
latencyHighBound?: number;
23+
audioJitterLowBound?: number;
24+
audioJitterHighBound?: number;
25+
videoJitterLowBound?: number;
26+
videoJitterHighBound?: number;
2327
showCodecInfo?: boolean;
2428
};
2529

2630
export const CallStats = (props: CallStatsProps) => {
2731
const {
2832
latencyLowBound = 75,
2933
latencyHighBound = 400,
34+
audioJitterLowBound = 10,
35+
audioJitterHighBound = 30,
36+
videoJitterLowBound = 20,
37+
videoJitterHighBound = 50,
3038
showCodecInfo = false,
3139
} = props;
3240
const styles = useStyles();
3341
const { t } = useI18n();
3442
const call = useCall();
3543
const [publishBitrate, setPublishBitrate] = useState('-');
3644
const [subscribeBitrate, setSubscribeBitrate] = useState('-');
45+
46+
const [publishAudioBitrate, setPublishAudioBitrate] = useState('-');
47+
const [subscribeAudioBitrate, setSubscribeAudioBitrate] = useState('-');
3748
const previousStats = useRef<CallStatsReport | undefined>(undefined);
3849

3950
const { useCallStatsReport } = useCallStateHooks();
@@ -58,7 +69,18 @@ export const CallStats = (props: CallStatsProps) => {
5869
callStatsReport,
5970
);
6071
});
61-
72+
setPublishAudioBitrate(() => {
73+
return calculatePublishAudioBitrate(
74+
previousCallStatsReport,
75+
callStatsReport,
76+
);
77+
});
78+
setSubscribeAudioBitrate(() => {
79+
return calculateSubscribeAudioBitrate(
80+
previousCallStatsReport,
81+
callStatsReport,
82+
);
83+
});
6284
previousStats.current = callStatsReport;
6385
}, [callStatsReport]);
6486

@@ -68,6 +90,16 @@ export const CallStats = (props: CallStatsProps) => {
6890
value: callStatsReport?.publisherStats.averageRoundTripTimeInMs,
6991
};
7092

93+
const audioJitterComparison = {
94+
lowBound: audioJitterLowBound,
95+
highBound: audioJitterHighBound,
96+
};
97+
98+
const videoJitterComparison = {
99+
lowBound: videoJitterLowBound,
100+
highBound: videoJitterHighBound,
101+
};
102+
71103
return (
72104
<View style={styles.container}>
73105
<View style={styles.titleContainer}>
@@ -93,18 +125,36 @@ export const CallStats = (props: CallStatsProps) => {
93125
</View>
94126
<View style={styles.row}>
95127
<StatCard
96-
label={t('Receive jitter')}
128+
label={t('Receive video jitter')}
97129
value={`${callStatsReport.subscriberStats.averageJitterInMs} ms.`}
98130
comparison={{
99-
...latencyComparison,
131+
...videoJitterComparison,
100132
value: callStatsReport.subscriberStats.averageJitterInMs,
101133
}}
102134
/>
103135
<StatCard
104-
label={t('Publish jitter')}
136+
label={t('Publish video jitter')}
137+
value={`${callStatsReport.publisherStats.averageJitterInMs} ms.`}
138+
comparison={{
139+
...videoJitterComparison,
140+
value: callStatsReport.publisherStats.averageJitterInMs,
141+
}}
142+
/>
143+
</View>
144+
<View style={styles.row}>
145+
<StatCard
146+
label={t('Receive audio jitter')}
147+
value={`${callStatsReport.subscriberAudioStats.averageJitterInMs} ms.`}
148+
comparison={{
149+
...audioJitterComparison,
150+
value: callStatsReport.subscriberAudioStats.averageJitterInMs,
151+
}}
152+
/>
153+
<StatCard
154+
label={t('Publish audio jitter')}
105155
value={`${callStatsReport.publisherStats.averageJitterInMs} ms.`}
106156
comparison={{
107-
...latencyComparison,
157+
...audioJitterComparison,
108158
value: callStatsReport.publisherStats.averageJitterInMs,
109159
}}
110160
/>
@@ -132,8 +182,21 @@ export const CallStats = (props: CallStatsProps) => {
132182
</>
133183
)}
134184
<View style={styles.row}>
135-
<StatCard label={t('Publish bitrate')} value={publishBitrate} />
136-
<StatCard label={t('Receiving bitrate')} value={subscribeBitrate} />
185+
<StatCard label={t('Publish video bitrate')} value={publishBitrate} />
186+
<StatCard
187+
label={t('Receiving video bitrate')}
188+
value={subscribeBitrate}
189+
/>
190+
</View>
191+
<View style={styles.row}>
192+
<StatCard
193+
label={t('Publish audio bitrate')}
194+
value={publishAudioBitrate}
195+
/>
196+
<StatCard
197+
label={t('Receiving audio bitrate')}
198+
value={subscribeAudioBitrate}
199+
/>
137200
</View>
138201
</View>
139202
);
@@ -282,6 +345,34 @@ const calculateSubscribeBitrate = (
282345
return `${((bytesReceived * 8) / timeElapsed).toFixed(2)} kbps`;
283346
};
284347

348+
const calculatePublishAudioBitrate = (
349+
previousCallStatsReport: CallStatsReport,
350+
callStatsReport: CallStatsReport,
351+
) => {
352+
const previousAudioStats = previousCallStatsReport.publisherAudioStats;
353+
const audioStats = callStatsReport.publisherAudioStats;
354+
355+
const bytesSent =
356+
audioStats.totalBytesSent - previousAudioStats.totalBytesSent;
357+
const timeElapsed = audioStats.timestamp - previousAudioStats.timestamp;
358+
359+
return `${((bytesSent * 8) / timeElapsed).toFixed(2)} kbps`;
360+
};
361+
362+
const calculateSubscribeAudioBitrate = (
363+
previousCallStatsReport: CallStatsReport,
364+
callStatsReport: CallStatsReport,
365+
) => {
366+
const previousAudioStats = previousCallStatsReport.subscriberAudioStats;
367+
const audioStats = callStatsReport.subscriberAudioStats;
368+
369+
const bytesReceived =
370+
audioStats.totalBytesReceived - previousAudioStats.totalBytesReceived;
371+
const timeElapsed = audioStats.timestamp - previousAudioStats.timestamp;
372+
373+
return `${((bytesReceived * 8) / timeElapsed).toFixed(2)} kbps`;
374+
};
375+
285376
const useStyles = () => {
286377
const {
287378
theme: { colors, variants },

0 commit comments

Comments
 (0)