import React, { useState } from 'react' import { useAppSelector } from '@/app/hooks' import type { RTCMediaStreamTrackStats } from '@/types' import { ConnectionStatusBar } from './ConnectionStatusBar' import { JitterButter } from './JitterBuffer' import { RequestRtpStreamBySendConnectionIdButton } from './RequestRtpStreamBySendConnectionIdButton' import { RequestSpotlightRidBySendConnectionIdButton } from './RequestSpotlightRidBySendConnectionIdButton' import { ResetRtpStreamBySendConnectionIdButton } from './ResetRtpStreamBySendConnectionIdButton' import { ResetSpotlightRidBySendConnectionIdButton } from './ResetSpotlightRidBySendConnectionIdButton' import { Video } from './Video' import { VolumeVisualizer } from './VolumeVisualizer' function mediaStreamStatsReportFilter( statsReport: RTCStats[], mediaStream: MediaStream | null, ): RTCMediaStreamTrackStats[] { if (mediaStream === null) { return [] } const trackIds = mediaStream.getTracks().map((t) => { return t.id }) const result: RTCMediaStreamTrackStats[] = [] for (const stats of statsReport) { if (stats.id && !stats.id.match(/^RTCMediaStreamTrack/)) { continue } if ('trackIdentifier' in stats) { const mediaStreamStats = stats as RTCMediaStreamTrackStats if (mediaStreamStats.trackIdentifier && trackIds.includes(mediaStreamStats.trackIdentifier)) { result.push(mediaStreamStats) } } } return result } const MediaStreamStatsReport: React.FC<{ stream: MediaStream }> = (props) => { const showStats = useAppSelector((state) => state.showStats) const statsReport = useAppSelector((state) => state.soraContents.statsReport) const prevStatsReport = useAppSelector((state) => state.soraContents.prevStatsReport) if (!showStats) { return null } const currentMediaStreamTrackStatsReport = mediaStreamStatsReportFilter( statsReport, props.stream, ) as RTCMediaStreamTrackStats[] const prevMediaStreamTrackStatsReport = mediaStreamStatsReportFilter( prevStatsReport, props.stream, ) as RTCMediaStreamTrackStats[] return ( <> {currentMediaStreamTrackStatsReport.map((s) => { let jitterBufferDelay = 0 let jitterBufferEmittedCount = 0 const prevStats = prevMediaStreamTrackStatsReport.find((p) => s.id === p.id) if (prevStats) { jitterBufferDelay = s.jitterBufferDelay - prevStats.jitterBufferDelay jitterBufferEmittedCount = s.jitterBufferEmittedCount - prevStats.jitterBufferEmittedCount } return (