From 44f257740fbe8fec01d29b676c9485b0cbdf5790 Mon Sep 17 00:00:00 2001 From: Breakthrough Date: Sat, 7 Sep 2024 21:50:11 -0400 Subject: [PATCH] [detectors] Fix not compensating for filter buffer length With the new flash filter, cuts may be placed behind the current frame. This is similar to AdaptiveDetector, but when the new filter was landed, the max look behind property of the detector wasn't updated. Fixes #416. --- scenedetect/detectors/content_detector.py | 4 ++++ scenedetect/scene_detector.py | 7 ++++++- website/pages/changelog.md | 3 ++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/scenedetect/detectors/content_detector.py b/scenedetect/detectors/content_detector.py index bfa99ac4..75c06ae9 100644 --- a/scenedetect/detectors/content_detector.py +++ b/scenedetect/detectors/content_detector.py @@ -234,3 +234,7 @@ def _detect_edges(self, lum: numpy.ndarray) -> numpy.ndarray: # camera movement. Note that very large kernel sizes can negatively affect accuracy. edges = cv2.Canny(lum, low, high) return cv2.dilate(edges, self._kernel) + + @property + def event_buffer_length(self) -> int: + return self._flash_filter.max_behind diff --git a/scenedetect/scene_detector.py b/scenedetect/scene_detector.py index 6ce50993..4352d1c5 100644 --- a/scenedetect/scene_detector.py +++ b/scenedetect/scene_detector.py @@ -172,7 +172,12 @@ def __init__(self, mode: Mode, length: int): self._last_above = None # Last frame above threshold. self._merge_enabled = False # Used to disable merging until at least one cut was found. self._merge_triggered = False # True when the merge filter is active. - self._merge_start = None # Frame number where we started the merge filte. + self._merge_start = None # Frame number where we started the merge filter. + + @property + def max_behind(self) -> int: + """Maximum number of frames a filtered cut can be behind the current frame.""" + return 0 if self._mode == FlashFilter.Mode.SUPPRESS else self._filter_length def filter(self, frame_num: int, above_threshold: bool) -> ty.List[int]: if not self._filter_length > 0: diff --git a/website/pages/changelog.md b/website/pages/changelog.md index e4348b7e..31a472ef 100644 --- a/website/pages/changelog.md +++ b/website/pages/changelog.md @@ -589,4 +589,5 @@ Development ## PySceneDetect 0.6.5 (TBD) - [bugfix] Fix new detectors not working with `default-detector` config option - - [bugfix] Fix SyntaxWarning due to incorrect escaping [#400](https://github.com/Breakthrough/PySceneDetect/issues/400) + - [bugfix] Fix `SyntaxWarning` due to incorrect escaping [#400](https://github.com/Breakthrough/PySceneDetect/issues/400) + - [bugfix] Fix `ContentDetector` crash when using callbacks [#416](https://github.com/Breakthrough/PySceneDetect/issues/416)