diff --git a/web/src/components/player/LivePlayer.tsx b/web/src/components/player/LivePlayer.tsx index c5f29e62f..8fba27bda 100644 --- a/web/src/components/player/LivePlayer.tsx +++ b/web/src/components/player/LivePlayer.tsx @@ -94,7 +94,6 @@ export default function LivePlayer({ const shouldRotateClockwise = applyDashboardTransforms && rotateClockwise; const mediaViewportRef = useRef(null); - const mediaContentRef = useRef(null); const [{ width: viewportWidth, height: viewportHeight }] = useResizeObserver(mediaViewportRef); @@ -105,54 +104,17 @@ export default function LivePlayer({ transforms.push("rotate(90deg)"); } - if (!shouldRotateClockwise || !viewportWidth || !viewportHeight) { - return { - transform: transforms.join(" "), - width: "100%", - height: "100%", - }; - } - - const sourceWidth = cameraConfig.detect.width || 1; - const sourceHeight = cameraConfig.detect.height || 1; - const rotatedAspect = sourceHeight / sourceWidth; - const containerAspect = viewportWidth / viewportHeight; - - let renderedWidth = viewportWidth; - let renderedHeight = viewportHeight; - - if (shouldFillContainer) { - if (rotatedAspect > containerAspect) { - renderedHeight = viewportHeight; - renderedWidth = renderedHeight * rotatedAspect; - } else { - renderedWidth = viewportWidth; - renderedHeight = renderedWidth / rotatedAspect; - } - } else if (rotatedAspect > containerAspect) { - renderedWidth = viewportWidth; - renderedHeight = renderedWidth / rotatedAspect; - } else { - renderedHeight = viewportHeight; - renderedWidth = renderedHeight * rotatedAspect; - } - - const rotatedWidth = `${Math.ceil(renderedHeight)}px`; - const rotatedHeight = `${Math.ceil(renderedWidth)}px`; + // For a 90° rotation, the media box must use swapped viewport dimensions + // before rotating, otherwise the rotated content can under-fill one axis. + const rotatedWidth = viewportHeight ? `${viewportHeight}px` : "100%"; + const rotatedHeight = viewportWidth ? `${viewportWidth}px` : "100%"; return { transform: transforms.join(" "), width: shouldRotateClockwise ? rotatedWidth : "100%", height: shouldRotateClockwise ? rotatedHeight : "100%", }; - }, [ - cameraConfig.detect.height, - cameraConfig.detect.width, - shouldFillContainer, - shouldRotateClockwise, - viewportHeight, - viewportWidth, - ]); + }, [shouldRotateClockwise, viewportHeight, viewportWidth]); // stats const [stats, setStats] = useState({ @@ -348,7 +310,7 @@ export default function LivePlayer({ className={cn( "size-full rounded-lg md:rounded-2xl", shouldFillContainer && "object-cover", - liveReady ? "opacity-100" : "opacity-0", + liveReady ? "" : "hidden", )} camera={streamName} playbackEnabled={cameraActive || liveReady} @@ -371,7 +333,7 @@ export default function LivePlayer({ className={cn( "size-full rounded-lg md:rounded-2xl", shouldFillContainer && "object-cover", - liveReady ? "opacity-100" : "opacity-0", + liveReady ? "" : "hidden", )} camera={streamName} playbackEnabled={cameraActive || liveReady} @@ -411,11 +373,7 @@ export default function LivePlayer({ } useWebGL={useWebGL} setStats={setStats} - containerRef={ - applyDashboardTransforms - ? mediaContentRef - : (containerRef ?? internalContainerRef) - } + containerRef={containerRef ?? internalContainerRef} onPlaying={playerIsPlaying} fit={shouldFillContainer ? "cover" : "contain"} /> @@ -463,7 +421,6 @@ export default function LivePlayer({ )} >