aboutsummaryrefslogtreecommitdiff
path: root/src/argaze/TobiiGlassesPro2/TobiiVideo.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/argaze/TobiiGlassesPro2/TobiiVideo.py')
-rw-r--r--src/argaze/TobiiGlassesPro2/TobiiVideo.py39
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])