test sleep zamiast qtimer

This commit is contained in:
2026-05-11 14:39:53 +02:00
parent f317e71899
commit 6f784b4e40
3 changed files with 96 additions and 15 deletions

View File

@@ -27,6 +27,7 @@ class FrameMetrics:
total_start_delta: float = 0.0 # Total accumulated frame read start delta (used for calculating average)
b_fr_time_delta: deque = field(init=False, repr=False) # Buffer for recent frame read time deltas (used for calculating average)
total_frame_time: float = 0.0 # Total accumulated frame read time delta (used for calculating average)
frame_drops: int = 0 # Total number of frames dropped (if frame read time exceeds expected frame interval)
def __post_init__(self):
self.b_fr_start_delta = deque(maxlen=self.buf_size)
@@ -72,11 +73,12 @@ class FrameMetrics:
self.fps_average_1s = 1.0 / self.fr_start_delta_avg if self.fr_start_delta_avg > 0 else 0.0
def update_metrics(self, start_time: float, end_time: float) -> None:
def update_metrics(self, start_time: float, end_time: float, frames_dropped: int) -> None:
self.frame_count += 1
self.calc_start_delta_min_max_avg(start_time)
self.calc_frame_time_min_max_avg(start_time, end_time)
self.calc_fps()
self.frame_drops = frames_dropped
def reset_metrics(self) -> None:
self.fr_start_delta_min = float('inf')
@@ -92,7 +94,8 @@ class FrameMetrics:
self.total_start_delta = 0.0
self.b_fr_time_delta.clear()
self.total_frame_time = 0.0
self.frame_drops = 0
def get_metrics(self) -> "FrameMetrics":
return FrameMetrics(
fr_start_delta_min= round(self.fr_start_delta_min * 1000, 3), # Convert to milliseconds
@@ -102,7 +105,11 @@ class FrameMetrics:
fr_time_max= round(self.fr_time_max * 1000, 3),
fr_time_avg= round(self.fr_time_avg * 1000, 3),
fps_average_1s= round(self.fps_average_1s, 3),
frame_count=self.frame_count
frame_count=self.frame_count,
last_start_time=self.last_start_time,
buf_size=self.buf_size,
total_frame_time=round(self.total_frame_time * 1000, 3),
total_start_delta=round(self.total_start_delta * 1000, 3)
)
@@ -150,6 +157,13 @@ class VideoStreamController(QObject):
"""
return self._metrics.get_metrics() if self._metrics else None
def reset_metrics(self):
"""
Resets the frame metrics to initial state.
"""
if self._metrics:
self._metrics.reset_metrics()
@Slot(object)
def change_source(self, source):
"""
@@ -170,7 +184,7 @@ class VideoStreamController(QObject):
@Slot(float, tuple)
def started(self, fps: float, video_res: tuple):
logger.debug(f"Video stream worker started with FPS: {fps}, Resolution: {video_res[0]}x{video_res[1]}")
self._metrics = FrameMetrics()
self._metrics = FrameMetrics(buf_size=int(fps))
self.status_changed.emit(True)
@Slot()
@@ -229,10 +243,10 @@ class VideoStreamController(QObject):
self.error_occurred.emit(f"Image conversion error: {str(e)}")
return QImage()
@Slot(float, float)
def _handle_frame_time(self, start_time, end_time):
@Slot(float, float, int)
def _handle_frame_time(self, start_time, end_time, frames_dropped):
"""
Optional: Handle frame timing information for performance monitoring.
"""
if self._metrics:
self._metrics.update_metrics(start_time, end_time)
self._metrics.update_metrics(start_time, end_time, frames_dropped)