import { h, Fragment } from 'preact'; import { usePersistence } from '../context'; import ActivityIndicator from '../components/ActivityIndicator'; import JSMpegPlayer from '../components/JSMpegPlayer'; import Heading from '../components/Heading'; import WebRtcPlayer from '../components/WebRtcPlayer'; import MsePlayer from '../components/MsePlayer'; import useSWR from 'swr'; import { useMemo } from 'preact/hooks'; import CameraControlPanel from '../components/CameraControlPanel'; export default function Birdseye() { const { data: config } = useSWR('config'); const [viewSource, setViewSource, sourceIsLoaded] = usePersistence( 'birdseye-source', getDefaultLiveMode(config) ); const sourceValues = ['mse', 'webrtc', 'jsmpeg']; const ptzCameras = useMemo(() => { if (!config) { return []; } return Object.entries(config.cameras) .filter(([_, conf]) => conf.onvif?.host) .map(([_, camera]) => camera.name); }, [config]); if (!config || !sourceIsLoaded) { return ; } let player; if (viewSource == 'mse' && config.birdseye.restream) { if ('MediaSource' in window) { player = (
); } else { player = (
MSE is not supported on iOS devices. You'll need to use jsmpeg or webRTC. See the docs for more info.
); } } else if (viewSource == 'webrtc' && config.birdseye.restream) { player = (
); } else { player = (
); } return (
Birdseye {config.birdseye.restream && ( )}
{player} {ptzCameras && (
Control Panel {ptzCameras.map((camera) => (
{camera.replaceAll('_', ' ')}
))}
)}
); } function getDefaultLiveMode(config) { if (config) { if (config.birdseye.restream) { return config.ui.live_mode; } return 'jsmpeg'; } return undefined; }