diff --git a/web/src/components/player/HlsVideoPlayer.tsx b/web/src/components/player/HlsVideoPlayer.tsx index b91efd84b..5d6b2d170 100644 --- a/web/src/components/player/HlsVideoPlayer.tsx +++ b/web/src/components/player/HlsVideoPlayer.tsx @@ -59,6 +59,7 @@ type HlsVideoPlayerProps = { camera?: string; currentTimeOverride?: number; transformedOverlay?: ReactNode; + rotate?: boolean; }; export default function HlsVideoPlayer({ @@ -84,6 +85,7 @@ export default function HlsVideoPlayer({ camera, currentTimeOverride, transformedOverlay, + rotate, }: HlsVideoPlayerProps) { const { t } = useTranslation("components/player"); const { data: config } = useSWR("config"); @@ -99,6 +101,33 @@ export default function HlsVideoPlayer({ const [loadedMetadata, setLoadedMetadata] = useState(false); const [bufferTimeout, setBufferTimeout] = useState(); + // rotation support + const rotateContainerRef = useRef(null); + const [rotateContainerSize, setRotateContainerSize] = useState({ + width: 0, + height: 0, + }); + + useEffect(() => { + if (!rotate) return; + + const container = rotateContainerRef.current; + if (!container) return; + + const updateSize = () => { + setRotateContainerSize({ + width: container.clientWidth, + height: container.clientHeight, + }); + }; + + updateSize(); + const resizeObserver = new ResizeObserver(updateSize); + resizeObserver.observe(container); + + return () => resizeObserver.disconnect(); + }, [rotate]); + const applyVideoDimensions = useCallback( (width: number, height: number) => { if (setFullResolution) { @@ -388,9 +417,42 @@ export default function HlsVideoPlayer({ /> )} +
+
+
diff --git a/web/src/components/player/dynamic/DynamicVideoPlayer.tsx b/web/src/components/player/dynamic/DynamicVideoPlayer.tsx index c8d95090d..e77897ee8 100644 --- a/web/src/components/player/dynamic/DynamicVideoPlayer.tsx +++ b/web/src/components/player/dynamic/DynamicVideoPlayer.tsx @@ -48,6 +48,7 @@ type DynamicVideoPlayerProps = { toggleFullscreen: () => void; containerRef?: React.MutableRefObject; transformedOverlay?: ReactNode; + rotate?: boolean; }; export default function DynamicVideoPlayer({ className, @@ -67,6 +68,7 @@ export default function DynamicVideoPlayer({ toggleFullscreen, containerRef, transformedOverlay, + rotate, }: DynamicVideoPlayerProps) { const { t } = useTranslation(["components/player"]); const apiHost = useApiHost(); @@ -322,6 +324,7 @@ export default function DynamicVideoPlayer({ camera={contextCamera || camera} currentTimeOverride={currentTime} transformedOverlay={transformedOverlay} + rotate={rotate} /> )}