diff options
author | Théo de la Hogue | 2022-04-11 12:01:12 +0200 |
---|---|---|
committer | Théo de la Hogue | 2022-04-11 12:01:12 +0200 |
commit | 8539f4fddff5ff212b49579130b5c0a8a639b139 (patch) | |
tree | 1e0ece59c8898f861c2625fb481f81b7dc5587e0 /src/argaze/TobiiGlassesPro2/TobiiVideo.py | |
parent | 3a45608841aadb5a7b363df55d523592389ad8c0 (diff) | |
download | argaze-8539f4fddff5ff212b49579130b5c0a8a639b139.zip argaze-8539f4fddff5ff212b49579130b5c0a8a639b139.tar.gz argaze-8539f4fddff5ff212b49579130b5c0a8a639b139.tar.bz2 argaze-8539f4fddff5ff212b49579130b5c0a8a639b139.tar.xz |
Adding video/data synchronisation feature
Diffstat (limited to 'src/argaze/TobiiGlassesPro2/TobiiVideo.py')
-rw-r--r-- | src/argaze/TobiiGlassesPro2/TobiiVideo.py | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/src/argaze/TobiiGlassesPro2/TobiiVideo.py b/src/argaze/TobiiGlassesPro2/TobiiVideo.py index 57d64d0..daa562e 100644 --- a/src/argaze/TobiiGlassesPro2/TobiiVideo.py +++ b/src/argaze/TobiiGlassesPro2/TobiiVideo.py @@ -8,15 +8,16 @@ import copy from argaze import DataStructures from argaze.TobiiGlassesPro2 import TobiiNetworkInterface +import cv2 as cv import av import numpy class TobiiVideoFrame(DataStructures.DictObject): """Define tobii video frame""" - def __init__(self, matrix, width, height, pts): + def __init__(self, matrix, width, height): - super().__init__(type(self).__name__, **{'matrix': matrix, 'width': width, 'height': height, 'pts': pts}) + super().__init__(type(self).__name__, **{'matrix': matrix, 'width': width, 'height': height}) class TobiiVideoSegment(): """Handle Tobii Glasses Pro 2 segment video file.""" @@ -30,6 +31,8 @@ class TobiiVideoSegment(): self.__width = int(cv.VideoCapture(self.__segment_video_path).get(cv.CAP_PROP_FRAME_WIDTH)) self.__height = int(cv.VideoCapture(self.__segment_video_path).get(cv.CAP_PROP_FRAME_HEIGHT)) + + self.__vts_data_buffer = None def get_path(self): return self.__segment_video_path @@ -46,7 +49,17 @@ class TobiiVideoSegment(): def get_height(self): return self.__height - def frames(self): + def frames(self, vts_data_buffer = None): + """Access to frame iterator and optionnaly setup vide / data timestamp synchronisation through vts data buffer.""" + + self.__vts_data_buffer = vts_data_buffer + + # Enable video / data timestamp synchronisation + if self.__vts_data_buffer != None: + + self.__vts_ts, self.__vts = self.__vts_data_buffer.pop_first() + self.__vts_offset = (self.__vts_ts - self.__vts.vts) + return self.__iter__() def __iter__(self): @@ -60,8 +73,22 @@ class TobiiVideoSegment(): frame = self.__container.decode(self.__stream).__next__() + video_ts = int(frame.time * 1000000) + + # If video / data synchronisation is active + if self.__vts_data_buffer != None: + + if video_ts > self.__vts.vts: + + if len(self.__vts_data_buffer) > 0: + + self.__vts_ts, self.__vts = self.__vts_data_buffer.pop_first() + self.__vts_offset = (self.__vts_ts - self.__vts.vts) + + video_ts += self.__vts_offset + # return micro second timestamp and frame data - return frame.time * 1000000, TobiiVideoFrame(frame.to_ndarray(format='bgr24'), frame.width, frame.height, frame.pts) + return video_ts, TobiiVideoFrame(frame.to_ndarray(format='bgr24'), frame.width, frame.height) class TobiiVideoStream(threading.Thread): """Capture Tobii Glasses Pro 2 video camera stream.""" @@ -131,7 +158,7 @@ class TobiiVideoStream(threading.Thread): self.__read_lock.acquire() # store frame time, matrix, width, height and pts into a tuple - self.__frame_tuple = (frame.time, frame.to_ndarray(format='bgr24'), frame.width, frame.height, frame.pts) + self.__frame_tuple = (frame.time, frame.to_ndarray(format='bgr24'), frame.width, frame.height) # unlock frame access self.__read_lock.release() @@ -151,4 +178,4 @@ class TobiiVideoStream(threading.Thread): # unlock frame access self.__read_lock.release() - return frame_tuple[0] * 1000000, TobiiVideoFrame(frame_tuple[1], frame_tuple[2], frame_tuple[3], frame_tuple[4]) + return int(frame_tuple[0] * 1000000), TobiiVideoFrame(frame_tuple[1], frame_tuple[2], frame_tuple[3]) |