2929
3030import numpy
3131
32+ from scenedetect .common import FrameTimecode , _USE_PTS_IN_DEVELOPMENT
3233from scenedetect .stats_manager import StatsManager
3334
3435
@@ -46,6 +47,7 @@ class SceneDetector:
4647
4748 # TODO(v0.7): Make this a proper abstract base class.
4849
50+ # TODO(v0.7): This should be a property.
4951 stats_manager : ty .Optional [StatsManager ] = None
5052 """Optional :class:`StatsManager <scenedetect.stats_manager.StatsManager>` to
5153 use for caching frame metrics to and from."""
@@ -67,7 +69,9 @@ def get_metrics(self) -> ty.List[str]:
6769 """
6870 return []
6971
70- def process_frame (self , frame_num : int , frame_img : numpy .ndarray ) -> ty .List [int ]:
72+ def process_frame (
73+ self , timecode : FrameTimecode , frame_img : numpy .ndarray
74+ ) -> ty .List [FrameTimecode ]:
7175 """Process the next frame. `frame_num` is assumed to be sequential.
7276
7377 Args:
@@ -84,7 +88,7 @@ def process_frame(self, frame_num: int, frame_img: numpy.ndarray) -> ty.List[int
8488 """
8589 return []
8690
87- def post_process (self , frame_num : int ) -> ty .List [int ]:
91+ def post_process (self , timecode : int ) -> ty .List [FrameTimecode ]:
8892 """Post Process: Performs any processing after the last frame has been read.
8993
9094 Prototype method, no actual detection.
@@ -130,15 +134,17 @@ def __init__(self, mode: Mode, length: int):
130134 def max_behind (self ) -> int :
131135 return 0 if self ._mode == FlashFilter .Mode .SUPPRESS else self ._filter_length
132136
133- def filter (self , frame_num : int , above_threshold : bool ) -> ty .List [int ]:
137+ def filter (self , timecode : FrameTimecode , above_threshold : bool ) -> ty .List [FrameTimecode ]:
134138 if not self ._filter_length > 0 :
135- return [frame_num ] if above_threshold else []
139+ return [timecode ] if above_threshold else []
140+ if _USE_PTS_IN_DEVELOPMENT :
141+ raise NotImplementedError ("TODO: Change filter to use units of time instead of frames." )
136142 if self ._last_above is None :
137- self ._last_above = frame_num
143+ self ._last_above = timecode
138144 if self ._mode == FlashFilter .Mode .MERGE :
139- return self ._filter_merge (frame_num = frame_num , above_threshold = above_threshold )
145+ return self ._filter_merge (frame_num = timecode , above_threshold = above_threshold )
140146 elif self ._mode == FlashFilter .Mode .SUPPRESS :
141- return self ._filter_suppress (frame_num = frame_num , above_threshold = above_threshold )
147+ return self ._filter_suppress (frame_num = timecode , above_threshold = above_threshold )
142148 raise RuntimeError ("Unhandled FlashFilter mode." )
143149
144150 def _filter_suppress (self , frame_num : int , above_threshold : bool ) -> ty .List [int ]:
0 commit comments