Files
frigate/web/src/components/player/BirdseyeLivePlayer.tsx
T

83 lines
2.3 KiB
TypeScript
Raw Normal View History

import WebRtcPlayer from "./WebRTCPlayer";
import { BirdseyeConfig } from "@/types/frigateConfig";
2024-03-03 10:32:47 -06:00
import ActivityIndicator from "../indicators/activity-indicator";
import JSMpegPlayer from "./JSMpegPlayer";
2024-01-03 17:38:52 -06:00
import MSEPlayer from "./MsePlayer";
2024-03-15 17:28:32 -06:00
import { LivePlayerMode } from "@/types/live";
import { cn } from "@/lib/utils";
import React from "react";
type LivePlayerProps = {
2024-03-15 17:28:32 -06:00
className?: string;
birdseyeConfig: BirdseyeConfig;
2024-03-15 17:28:32 -06:00
liveMode: LivePlayerMode;
2024-07-23 08:34:38 -06:00
pip?: boolean;
2024-06-29 10:02:30 -05:00
containerRef: React.MutableRefObject<HTMLDivElement | null>;
2024-07-23 08:34:38 -06:00
onClick?: () => void;
};
export default function BirdseyeLivePlayer({
2024-03-15 17:28:32 -06:00
className,
birdseyeConfig,
liveMode,
2024-07-23 08:34:38 -06:00
pip,
containerRef,
2024-07-23 08:34:38 -06:00
onClick,
}: LivePlayerProps) {
let player;
if (liveMode == "webrtc") {
player = (
<WebRtcPlayer
2024-05-14 10:06:44 -05:00
className={`size-full rounded-lg md:rounded-2xl`}
camera="birdseye"
2024-07-23 08:34:38 -06:00
pip={pip}
/>
);
} else if (liveMode == "mse") {
2024-01-03 17:38:52 -06:00
if ("MediaSource" in window || "ManagedMediaSource" in window) {
player = (
<MSEPlayer
2024-05-14 10:06:44 -05:00
className={`size-full rounded-lg md:rounded-2xl`}
camera="birdseye"
2024-07-23 08:34:38 -06:00
pip={pip}
/>
2024-01-03 17:38:52 -06:00
);
} else {
player = (
2024-01-03 17:38:52 -06:00
<div className="w-5xl text-center text-sm">
iOS 17.1 or greater is required for this live stream type.
2024-01-03 17:38:52 -06:00
</div>
);
}
} else if (liveMode == "jsmpeg") {
player = (
<JSMpegPlayer
2024-05-14 10:06:44 -05:00
className="flex size-full justify-center overflow-hidden rounded-lg md:rounded-2xl"
camera="birdseye"
width={birdseyeConfig.width}
height={birdseyeConfig.height}
containerRef={containerRef}
2024-06-29 10:02:30 -05:00
playbackEnabled={true}
2025-02-10 10:42:35 -06:00
useWebGL={true}
/>
);
} else {
player = <ActivityIndicator />;
}
return (
2024-03-15 17:28:32 -06:00
<div
2024-06-29 10:02:30 -05:00
ref={containerRef}
className={cn(
2024-05-14 10:06:44 -05:00
"relative flex w-full cursor-pointer justify-center",
className,
)}
2024-03-15 17:28:32 -06:00
onClick={onClick}
>
2024-05-14 10:06:44 -05:00
<div className="pointer-events-none absolute inset-x-0 top-0 z-10 h-[30%] w-full rounded-lg bg-gradient-to-b from-black/20 to-transparent md:rounded-2xl"></div>
<div className="pointer-events-none absolute inset-x-0 bottom-0 z-10 h-[10%] w-full rounded-lg bg-gradient-to-t from-black/20 to-transparent md:rounded-2xl"></div>
<div className="size-full">{player}</div>
</div>
);
}