Use us not ns for picamera timestamp and fix descriptor typing

This commit is contained in:
Julian Stirling 2026-07-10 10:09:17 +01:00
parent f85361ae67
commit 7ba2c03f61
2 changed files with 17 additions and 6 deletions

View file

@ -16,7 +16,7 @@ from abc import ABC, abstractmethod
from copy import deepcopy from copy import deepcopy
from datetime import datetime from datetime import datetime
from types import TracebackType from types import TracebackType
from typing import Any, Literal, Mapping, Optional, Self from typing import Any, Literal, Mapping, Optional, Self, Union, overload
import numpy as np import numpy as np
import piexif import piexif
@ -223,7 +223,7 @@ class MJPEGStreamWithTimestamp(lt.outputs.MJPEGStream):
rather than take the time it is added into the ring buffer. rather than take the time it is added into the ring buffer.
""" """
def add_frame(self, frame: bytes, timestamp: Optional[datetime]) -> None: def add_frame(self, frame: bytes, timestamp: Optional[datetime] = None) -> None:
"""Add a JPEG to the MJPEG stream. """Add a JPEG to the MJPEG stream.
Modify the standard function to have an option to send in the capture time. Modify the standard function to have an option to send in the capture time.
@ -250,12 +250,23 @@ class MJPEGStreamWithTimestamp(lt.outputs.MJPEGStream):
self.notify_new_frame, entry.index self.notify_new_frame, entry.index
) )
class MJPEGStreamDescriptorWithTimestamp(lt.outputs.MJPEGStreamDescriptor): class MJPEGStreamDescriptorWithTimestamp(lt.outputs.MJPEGStreamDescriptor):
"""Subclass the Labthings descriptor to return our own class.""" """Subclass the Labthings descriptor to return our own class."""
@overload
def __get__(self, obj: Literal[None], type: type | None = None) -> Self: ...
@overload
def __get__( def __get__(
self, obj: Optional[lt.Thing], type: type[lt.Thing] | None = None # noqa: A002 self, obj: lt.Thing, type: type | None = None
) -> MJPEGStreamWithTimestamp | Self: ) -> MJPEGStreamWithTimestamp: ...
def __get__(
self,
obj: Optional[lt.Thing],
type: type[lt.Thing] | None = None, # noqa: A002
) -> Union[MJPEGStreamWithTimestamp | Self]:
"""Return our own MJPEG Stream with timestamp.""" """Return our own MJPEG Stream with timestamp."""
if obj is None: if obj is None:
return self return self

View file

@ -101,10 +101,10 @@ class PicameraStreamOutput(Output):
if timestamp is None or self.encoder.firsttimestamp is None: if timestamp is None or self.encoder.firsttimestamp is None:
frame_timestamp = None frame_timestamp = None
else: else:
# Reconstruct full CPU time of the frame in ns # Reconstruct full CPU time of the frame in us
timestamp += self.encoder.firsttimestamp timestamp += self.encoder.firsttimestamp
# Convert to datetime # Convert to datetime
frame_timestamp = datetime.fromtimestamp(self.cpu_dt + timestamp / 1e9) frame_timestamp = datetime.fromtimestamp(self.cpu_dt + timestamp / 1e6)
self.stream.add_frame(frame, frame_timestamp) self.stream.add_frame(frame, frame_timestamp)