diff --git a/tsmark/video_annotator.py b/tsmark/video_annotator.py index eab1ddb..fcb1cce 100755 --- a/tsmark/video_annotator.py +++ b/tsmark/video_annotator.py @@ -21,7 +21,7 @@ PLUGIN_FOLDER = os.path.expanduser("~/.config/tsmark/plugins") COLOR_PREPOST = (0, 128, 128) COLOR_KEY = (60, 205, 60) -COLOR_KEY_OCCLUDED = (60, 96, 60) +COLOR_KEY_OCCLUDED = (50, 128, 50) COLOR_INTERP = (192, 0, 192) COLOR_INTERP_OCCLUDED = (128, 0, 128) COLOR_HIDDEN = (60, 60, 60) @@ -656,6 +656,11 @@ class World: post: after any keyframes """ + process = threading.Thread(target=self.interpolate_points_in_thread, args=(point_index,)) + process.start() + + def interpolate_points_in_thread(self, point_index=None): + if point_index is None: point_index = self.point_index @@ -671,15 +676,18 @@ class World: if not point_index in self.points_interpolated: self.points_interpolated[point_index] = {key: {} for key in range(self.frames)} + new_points = {k: v for k, v in self.points_interpolated[point_index].items()} + if len(self.points[point_index]) == 1: # only one point added key = list(self.points[point_index].keys())[0] vals = self.points[point_index][key] for key in range(self.frames): - self.points_interpolated[point_index][key] = i_point() - self.points_interpolated[point_index][key].update(vals) - self.points_interpolated[point_index][key]["type"] = "pre" + new_points[key] = i_point() + new_points[key].update(vals) + new_points[key]["type"] = "pre" if key < self.nr else "post" - self.points_interpolated[point_index][self.nr]["type"] = "key" + new_points[self.nr]["type"] = "key" + self.points_interpolated[point_index] = new_points else: # more points point_keys = list(sorted(list(self.points[point_index].keys()))) @@ -691,14 +699,14 @@ class World: t2 = np.arange(start_key, end_key) # Pre points for key in range(0, start_key): - self.points_interpolated[point_index][key]["type"] = "pre" - self.points_interpolated[point_index][key].update(self.points[point_index][start_key]) + new_points[key]["type"] = "pre" + new_points[key].update(self.points[point_index][start_key]) # interpolated points visible = self.points[point_index][start_key]["visible"] for row in np.vstack((t2, spline(t2))).T: if row[0] in point_keys: visible = self.points[point_index][row[0]]["visible"] - self.points_interpolated[point_index][row[0]] = { + new_points[row[0]] = { "type": "interp", "x0": int(row[1]), "y0": int(row[2]), @@ -709,7 +717,7 @@ class World: # post points for key in range(end_key, self.frames + 1): - self.points_interpolated[point_index][key] = { + new_points[key] = { "type": "post", "x0": int(row[1]), "y0": int(row[2]), @@ -719,14 +727,16 @@ class World: } # clicked points (not necessary, could determine at draw time!) for key in point_keys: - self.points_interpolated[point_index][key]["type"] = "key" + new_points[key]["type"] = "key" age = 0 - for key in self.points_interpolated[point_index]: - if self.points_interpolated[point_index][key]["type"] == "key": + for key in new_points: + if new_points[key]["type"] == "key": age = 0 - if self.points_interpolated[point_index][key]["type"] == "interp": + if new_points[key]["type"] == "interp": age += 1 - self.points_interpolated[point_index][key]["age"] = age + new_points[key]["age"] = age + + self.points_interpolated[point_index] = new_points def draw_help(self, frame):