mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-12-08 06:15:43 +03:00
Compare commits
No commits in common. "130dc76a01bc5685ed6ba3924f7437d78f8ca72c" and "f25f1f689b68642098295ab629752463a9df4515" have entirely different histories.
130dc76a01
...
f25f1f689b
@ -6,10 +6,6 @@ import { ReactNode } from "react";
|
|||||||
|
|
||||||
axios.defaults.baseURL = `${baseUrl}api/`;
|
axios.defaults.baseURL = `${baseUrl}api/`;
|
||||||
|
|
||||||
// Module-level flag to prevent multiple simultaneous redirects
|
|
||||||
// (eg, when multiple SWR queries fail with 401 at once)
|
|
||||||
let isRedirectingToLogin = false;
|
|
||||||
|
|
||||||
type ApiProviderType = {
|
type ApiProviderType = {
|
||||||
children?: ReactNode;
|
children?: ReactNode;
|
||||||
options?: Record<string, unknown>;
|
options?: Record<string, unknown>;
|
||||||
@ -35,8 +31,7 @@ export function ApiProvider({ children, options }: ApiProviderType) {
|
|||||||
) {
|
) {
|
||||||
// redirect to the login page if not already there
|
// redirect to the login page if not already there
|
||||||
const loginPage = error.response.headers.get("location") ?? "login";
|
const loginPage = error.response.headers.get("location") ?? "login";
|
||||||
if (window.location.href !== loginPage && !isRedirectingToLogin) {
|
if (window.location.href !== loginPage) {
|
||||||
isRedirectingToLogin = true;
|
|
||||||
window.location.href = loginPage;
|
window.location.href = loginPage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -559,7 +559,6 @@ export function TrackingDetails({
|
|||||||
isDetailMode={true}
|
isDetailMode={true}
|
||||||
camera={event.camera}
|
camera={event.camera}
|
||||||
currentTimeOverride={currentTime}
|
currentTimeOverride={currentTime}
|
||||||
enableGapControllerRecovery={true}
|
|
||||||
/>
|
/>
|
||||||
{isVideoLoading && (
|
{isVideoLoading && (
|
||||||
<ActivityIndicator className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2" />
|
<ActivityIndicator className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2" />
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import {
|
|||||||
useRef,
|
useRef,
|
||||||
useState,
|
useState,
|
||||||
} from "react";
|
} from "react";
|
||||||
import Hls, { HlsConfig } from "hls.js";
|
import Hls from "hls.js";
|
||||||
import { isDesktop, isMobile } from "react-device-detect";
|
import { isDesktop, isMobile } from "react-device-detect";
|
||||||
import { TransformComponent, TransformWrapper } from "react-zoom-pan-pinch";
|
import { TransformComponent, TransformWrapper } from "react-zoom-pan-pinch";
|
||||||
import VideoControls from "./VideoControls";
|
import VideoControls from "./VideoControls";
|
||||||
@ -57,7 +57,6 @@ type HlsVideoPlayerProps = {
|
|||||||
isDetailMode?: boolean;
|
isDetailMode?: boolean;
|
||||||
camera?: string;
|
camera?: string;
|
||||||
currentTimeOverride?: number;
|
currentTimeOverride?: number;
|
||||||
enableGapControllerRecovery?: boolean;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function HlsVideoPlayer({
|
export default function HlsVideoPlayer({
|
||||||
@ -82,7 +81,6 @@ export default function HlsVideoPlayer({
|
|||||||
isDetailMode = false,
|
isDetailMode = false,
|
||||||
camera,
|
camera,
|
||||||
currentTimeOverride,
|
currentTimeOverride,
|
||||||
enableGapControllerRecovery = false,
|
|
||||||
}: HlsVideoPlayerProps) {
|
}: HlsVideoPlayerProps) {
|
||||||
const { t } = useTranslation("components/player");
|
const { t } = useTranslation("components/player");
|
||||||
const { data: config } = useSWR<FrigateConfig>("config");
|
const { data: config } = useSWR<FrigateConfig>("config");
|
||||||
@ -172,23 +170,11 @@ export default function HlsVideoPlayer({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Base HLS configuration
|
hlsRef.current = new Hls({
|
||||||
const baseConfig: Partial<HlsConfig> = {
|
|
||||||
maxBufferLength: 10,
|
maxBufferLength: 10,
|
||||||
maxBufferSize: 20 * 1000 * 1000,
|
maxBufferSize: 20 * 1000 * 1000,
|
||||||
startPosition: currentSource.startPosition,
|
startPosition: currentSource.startPosition,
|
||||||
};
|
});
|
||||||
|
|
||||||
const hlsConfig = { ...baseConfig };
|
|
||||||
|
|
||||||
if (enableGapControllerRecovery) {
|
|
||||||
hlsConfig.highBufferWatchdogPeriod = 1; // Check for stalls every 1 second (default: 3)
|
|
||||||
hlsConfig.nudgeOffset = 0.2; // Nudge playhead forward 0.2s when stalled (default: 0.1)
|
|
||||||
hlsConfig.nudgeMaxRetry = 5; // Try up to 5 nudges before giving up (default: 3)
|
|
||||||
hlsConfig.maxBufferHole = 0.5; // Tolerate up to 0.5s gaps between fragments (default: 0.1)
|
|
||||||
}
|
|
||||||
|
|
||||||
hlsRef.current = new Hls(hlsConfig);
|
|
||||||
hlsRef.current.attachMedia(videoRef.current);
|
hlsRef.current.attachMedia(videoRef.current);
|
||||||
hlsRef.current.loadSource(currentSource.playlist);
|
hlsRef.current.loadSource(currentSource.playlist);
|
||||||
videoRef.current.playbackRate = currentPlaybackRate;
|
videoRef.current.playbackRate = currentPlaybackRate;
|
||||||
@ -201,13 +187,7 @@ export default function HlsVideoPlayer({
|
|||||||
hlsRef.current.destroy();
|
hlsRef.current.destroy();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}, [
|
}, [videoRef, hlsRef, useHlsCompat, currentSource]);
|
||||||
videoRef,
|
|
||||||
hlsRef,
|
|
||||||
useHlsCompat,
|
|
||||||
currentSource,
|
|
||||||
enableGapControllerRecovery,
|
|
||||||
]);
|
|
||||||
|
|
||||||
// state handling
|
// state handling
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user