diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 23d6ad4a..13a325df 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -575,9 +575,15 @@ function App() { const { thumbnailsSorted, setThumbnails } = useThumbnails({ filePath, zoomedDuration, zoomWindowStartTime, showThumbnails }); - const { neighbouringKeyFrames, findNearestKeyFrameTime } = useKeyframes({ keyframesEnabled, filePath, commandedTime, videoStream: activeVideoStream, detectedFps, ffmpegExtractWindow }); + const { neighbouringKeyFrames, findNearestKeyFrameTime, keyframeByNumber } = useKeyframes({ keyframesEnabled, filePath, commandedTime, videoStream: activeVideoStream, detectedFps, ffmpegExtractWindow }); const { waveforms, overviewWaveform, renderOverviewWaveform } = useWaveform({ filePath, relevantTime, waveformEnabled, audioStream: activeAudioStreams[0], ffmpegExtractWindow, fileDuration }); + const currentFrame = useMemo(() => { + const frameNum = getFrameCount(commandedTime); + if (frameNum == null) return undefined; + return keyframeByNumber[frameNum]; + }, [commandedTime, getFrameCount, keyframeByNumber]); + const onGenerateOverviewWaveformClick = useCallback(async () => { if (working) return; try { @@ -2734,6 +2740,7 @@ function App() { formatTimecode={formatTimecode} parseTimecode={parseTimecode} playbackRate={playbackRate} + currentFrame={currentFrame} /> diff --git a/src/renderer/src/BottomBar.tsx b/src/renderer/src/BottomBar.tsx index 89288dd9..f92513b1 100644 --- a/src/renderer/src/BottomBar.tsx +++ b/src/renderer/src/BottomBar.tsx @@ -26,6 +26,7 @@ import useUserSettings from './hooks/useUserSettings'; import { askForPlaybackRate } from './dialogs'; import { FormatTimecode, ParseTimecode, SegmentColorIndex, SegmentToExport, StateSegment } from './types'; import { WaveformMode } from '../../../types'; +import { Frame } from './ffmpeg'; const { clipboard } = window.require('electron'); @@ -150,10 +151,10 @@ const CutTimeInput = memo(({ darkMode, cutTime, setCutTime, startTimeOffset, see trySetTime(timeWithOffset); }, [isEmptyEndTime, parseTimecode, trySetTime]); - function handleCutTimeInput(text: string) { + const handleCutTimeInput = useCallback((text: string) => { if (isExactDurationMatch(text) || isEmptyEndTime(text)) parseAndSetCutTime(text); else setCutTimeManual(text); - } + }, [isEmptyEndTime, parseAndSetCutTime]); const tryPaste = useCallback((clipboardText: string) => { try { @@ -190,7 +191,7 @@ const CutTimeInput = memo(({ darkMode, cutTime, setCutTime, startTimeOffset, see return (