mirror of
https://github.com/EyeTrackVR/EyeTrackVR.git
synced 2025-11-04 14:39:42 +08:00
No wait UDP. not worth it
This commit is contained in:
parent
a29da9f922
commit
b6044d2276
@ -64,6 +64,7 @@ class ICameraSource:
|
|||||||
print(
|
print(
|
||||||
f"{Fore.YELLOW}[WARN] CAPTURE QUEUE BACKPRESSURE OF {qsize}. CHECK FOR CRASH OR TIMING ISSUES IN ALGORITHM.{Fore.RESET}"
|
f"{Fore.YELLOW}[WARN] CAPTURE QUEUE BACKPRESSURE OF {qsize}. CHECK FOR CRASH OR TIMING ISSUES IN ALGORITHM.{Fore.RESET}"
|
||||||
)
|
)
|
||||||
|
pass
|
||||||
self.camera_output_outgoing.put((image, frame_number, fps))
|
self.camera_output_outgoing.put((image, frame_number, fps))
|
||||||
self.capture_event.clear()
|
self.capture_event.clear()
|
||||||
|
|
||||||
@ -73,3 +74,6 @@ class ICameraSource:
|
|||||||
|
|
||||||
def extraInit(self):
|
def extraInit(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def set_output_queue(self, camera_output_outgoing: "queue.Queue"):
|
||||||
|
self.camera_output_outgoing = camera_output_outgoing
|
||||||
@ -7,5 +7,6 @@ class PacketHeader:
|
|||||||
self.frame_num: int|None = None
|
self.frame_num: int|None = None
|
||||||
self.id: int|None = None
|
self.id: int|None = None
|
||||||
self.image_buf_size: int|None = None
|
self.image_buf_size: int|None = None
|
||||||
|
self.totalPackets: int|None = None
|
||||||
|
|
||||||
self.frame_num, self.id, self.image_buf_size = struct.unpack_from(headerFormat, dataView, 0)
|
self.frame_num, self.id, self.image_buf_size, self.totalPackets = struct.unpack_from(headerFormat, dataView, 0)
|
||||||
|
|||||||
@ -18,9 +18,9 @@ from .DataPacket import PacketHeader # Python imports stupid. missed a single ".
|
|||||||
|
|
||||||
WAIT_TIME = 0.1
|
WAIT_TIME = 0.1
|
||||||
|
|
||||||
BUFFER_SIZE = 1024
|
IMAGE_BUFFER_SIZE = 1024
|
||||||
NUM_FRAGMENTS = 8
|
NUM_FRAGMENTS = 12
|
||||||
HEADER_FORMAT = "iii"
|
HEADER_FORMAT = "iiii"
|
||||||
|
|
||||||
RED = "\033[91m"
|
RED = "\033[91m"
|
||||||
GREEN = "\033[92m"
|
GREEN = "\033[92m"
|
||||||
@ -51,10 +51,12 @@ class UDP_Camera(ICameraSource):
|
|||||||
self.port = 3333
|
self.port = 3333
|
||||||
self.num_loaded = 0
|
self.num_loaded = 0
|
||||||
self.packets = [None] * NUM_FRAGMENTS
|
self.packets = [None] * NUM_FRAGMENTS
|
||||||
self.rawDataBuffer = np.zeros(BUFFER_SIZE, dtype=np.uint8)
|
self.headerSize = struct.calcsize(HEADER_FORMAT)
|
||||||
self.rawFullDataBuffer = np.zeros(BUFFER_SIZE*NUM_FRAGMENTS, dtype=np.uint8)
|
self.rawDataBuffer = np.zeros(IMAGE_BUFFER_SIZE + self.headerSize, dtype=np.uint8)
|
||||||
|
self.rawFullDataBuffer = np.zeros(IMAGE_BUFFER_SIZE*NUM_FRAGMENTS, dtype=np.uint8)
|
||||||
self.imageBuffView = memoryview(self.rawFullDataBuffer)
|
self.imageBuffView = memoryview(self.rawFullDataBuffer)
|
||||||
self.currentFrameNum = 0
|
self.currentFrameNum = 0
|
||||||
|
self.totalDataSize = 0
|
||||||
|
|
||||||
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
self.sock.bind((self.host, self.port))
|
self.sock.bind((self.host, self.port))
|
||||||
@ -68,25 +70,23 @@ class UDP_Camera(ICameraSource):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
bufferView = memoryview(self.rawDataBuffer)
|
bufferView = memoryview(self.rawDataBuffer)
|
||||||
n, senderAddr = self.sock.recvfrom_into(bufferView)
|
n, senderAddr = self.sock.recvfrom_into(bufferView)
|
||||||
self.handle_packet(n, senderAddr)
|
self.handle_packet(n, senderAddr)
|
||||||
|
|
||||||
def saveDataToBuff(self, dataView: memoryview, packet: PacketHeader):
|
def saveDataToBuff(self, dataView: memoryview, packet: PacketHeader):
|
||||||
header_size = struct.calcsize(HEADER_FORMAT)
|
payload_start = self.headerSize
|
||||||
payload_start = header_size
|
payload_end = self.headerSize + packet.image_buf_size
|
||||||
payload_end = header_size + packet.image_buf_size
|
|
||||||
payload = dataView[payload_start:payload_end]
|
payload = dataView[payload_start:payload_end]
|
||||||
|
|
||||||
#time.sleep(0.05)
|
#time.sleep(0.05)
|
||||||
|
|
||||||
offset = self.packets[0].image_buf_size * packet.id # Adjust offset based on payload size
|
offset = IMAGE_BUFFER_SIZE * packet.id # Adjust offset based on payload size
|
||||||
self.imageBuffView[offset: offset + packet.image_buf_size] = payload
|
self.imageBuffView[offset: offset + packet.image_buf_size] = payload
|
||||||
# print(f"Packet {packet.id}: {offset}->{offset + packet.image_buf_size}")
|
# print(f"Packet {packet.id}: {offset}->{offset + packet.image_buf_size}")
|
||||||
|
|
||||||
def resetImageBuffer(self):
|
def resetImageBuffer(self):
|
||||||
self.rawFullDataBuffer = np.zeros(BUFFER_SIZE*NUM_FRAGMENTS, dtype=np.uint8)
|
self.rawFullDataBuffer = np.zeros(IMAGE_BUFFER_SIZE*NUM_FRAGMENTS, dtype=np.uint8)
|
||||||
|
|
||||||
def handle_packet(self, dataSize, senderAddr):
|
def handle_packet(self, dataSize, senderAddr):
|
||||||
bufferView = memoryview(self.rawDataBuffer)
|
bufferView = memoryview(self.rawDataBuffer)
|
||||||
@ -95,42 +95,38 @@ class UDP_Camera(ICameraSource):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# Send acknowledgment
|
# Send acknowledgment
|
||||||
self.sock.sendto(f"{packet.id}:{packet.frame_num}:ACK".encode(), senderAddr)
|
# self.sock.sendto(f"{packet.id}:{packet.frame_num}:ACK".encode(), senderAddr)
|
||||||
# print(packet.id)
|
# print(packet.id)
|
||||||
|
|
||||||
if self.num_loaded > 0 and packet.id != 0:
|
# if self.num_loaded > 0 and packet.id != 0:
|
||||||
self.sock.sendto(f"ERR".encode(), senderAddr)
|
# self.sock.sendto(f"ERR".encode(), senderAddr)
|
||||||
|
|
||||||
if packet.id == 0 or packet.frame_num != self.currentFrameNum:
|
if (packet.id == 0 or packet.frame_num != self.currentFrameNum):
|
||||||
self.packets: list[PacketHeader|None] = [None] * NUM_FRAGMENTS # Reset packets
|
self.packets: list[PacketHeader|None] = [None] * packet.totalPackets # Reset packets
|
||||||
self.num_loaded = 0
|
self.num_loaded = 0
|
||||||
self.currentFrameNum = packet.frame_num
|
self.currentFrameNum = packet.frame_num
|
||||||
self.rawFullDataBuffer[:] = 0
|
self.rawFullDataBuffer[:] = 0
|
||||||
# print("Reset frame capture")
|
# print(f"Reset frame capture. total packets: {packet.totalPackets}")
|
||||||
|
|
||||||
if (self.packets[packet.id] is None
|
if (packet.id < len(self.packets)
|
||||||
|
and self.packets[packet.id] is None
|
||||||
and self.packets[0] is not None
|
and self.packets[0] is not None
|
||||||
|
and self.currentFrameNum == packet.frame_num
|
||||||
or packet.id == 0 ):
|
or packet.id == 0 ):
|
||||||
self.num_loaded += 1
|
self.num_loaded += 1
|
||||||
self.packets[packet.id] = packet
|
self.packets[packet.id] = packet
|
||||||
self.saveDataToBuff(bufferView, packet)
|
self.saveDataToBuff(bufferView, packet)
|
||||||
|
|
||||||
# print(f"Got packet id: {packet.id} (total: )")
|
# if self.packets[0] is not None:
|
||||||
|
# print(f"Got packet id: {packet.id} (total: {self.packets[0].totalPackets} loaded: {self.num_loaded})")
|
||||||
# if (self.num_loaded > NUM_FRAGMENTS * 0.75):
|
# if self.packets[0] is not None:
|
||||||
# formatted_list = "[" + ", ".join(f"{RED}x{RESET}" if item is None else f"{GREEN}x{RESET}" for item in self.packets) + "]"
|
# formatted_list = "[" + ", ".join(f"{RED}x{RESET}" if item is None else f"{GREEN}x{RESET}" for item in self.packets[:self.packets[0].totalPackets]) + "]"
|
||||||
# print(formatted_list)
|
# print(formatted_list)
|
||||||
|
|
||||||
if self.num_loaded >= NUM_FRAGMENTS:
|
|
||||||
if self.packets[0] is None:
|
|
||||||
return
|
|
||||||
current_frame = self.packets[0].frame_num
|
|
||||||
|
|
||||||
if any(p is None or p.frame_num != current_frame for p in self.packets):
|
if (self.packets[0] is not None and self.num_loaded >= self.packets[0].totalPackets
|
||||||
print("Packet loss detected.")
|
or self.num_loaded >= NUM_FRAGMENTS):
|
||||||
pass
|
|
||||||
else:
|
|
||||||
#print("Whole data received. Processing...")
|
|
||||||
self.process_and_push_image()
|
self.process_and_push_image()
|
||||||
|
|
||||||
self.num_loaded = 0
|
self.num_loaded = 0
|
||||||
@ -144,6 +140,8 @@ class UDP_Camera(ICameraSource):
|
|||||||
print(f"{Fore.YELLOW}[WARN] Frame drop. Corrupted JPEG.{Fore.RESET}")
|
print(f"{Fore.YELLOW}[WARN] Frame drop. Corrupted JPEG.{Fore.RESET}")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# print("Frame")
|
||||||
|
|
||||||
self.camera_status = CameraState.CONNECTED
|
self.camera_status = CameraState.CONNECTED
|
||||||
|
|
||||||
current_frame_time = time.time()
|
current_frame_time = time.time()
|
||||||
|
|||||||
@ -78,8 +78,6 @@ def is_udp(addr: str) -> bool:
|
|||||||
|
|
||||||
|
|
||||||
class Camera(ICameraSource):
|
class Camera(ICameraSource):
|
||||||
def set_output_queue(self, camera_output_outgoing: "queue.Queue"):
|
|
||||||
self.camera_output_outgoing = camera_output_outgoing
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
OPENCV_PARAMS = [
|
OPENCV_PARAMS = [
|
||||||
@ -118,9 +116,6 @@ class Camera(ICameraSource):
|
|||||||
port = self.config.capture_source
|
port = self.config.capture_source
|
||||||
self.current_capture_source = port
|
self.current_capture_source = port
|
||||||
self.start_serial_connection(port)
|
self.start_serial_connection(port)
|
||||||
elif (is_udp(addr)):
|
|
||||||
# print("UDP selected!")
|
|
||||||
setup_udp(self)
|
|
||||||
else:
|
else:
|
||||||
if (
|
if (
|
||||||
self.cv2_camera is None
|
self.cv2_camera is None
|
||||||
@ -155,8 +150,6 @@ class Camera(ICameraSource):
|
|||||||
addr = str(self.current_capture_source)
|
addr = str(self.current_capture_source)
|
||||||
if is_serial_capture_source(addr):
|
if is_serial_capture_source(addr):
|
||||||
self.get_serial_camera_picture(should_push)
|
self.get_serial_camera_picture(should_push)
|
||||||
elif is_udp(addr):
|
|
||||||
udp_get_image(self)
|
|
||||||
else:
|
else:
|
||||||
self.get_cv2_camera_picture(should_push)
|
self.get_cv2_camera_picture(should_push)
|
||||||
if not should_push:
|
if not should_push:
|
||||||
|
|||||||
BIN
EyeTrackApp/EBPD_LEFT.png
Normal file
BIN
EyeTrackApp/EBPD_LEFT.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.5 KiB |
Loading…
Reference in New Issue
Block a user