@@ -20,20 +20,31 @@ enum Status {
2020export 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
2630export 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+
285376const useStyles = ( ) => {
286377 const {
287378 theme : { colors, variants } ,
0 commit comments