Record timestamp when adding frames to stream

This commit is contained in:
Julian Stirling 2026-07-10 09:39:09 +01:00
parent d26b93e1be
commit ad7b0d8da8
3 changed files with 63 additions and 11 deletions

View file

@ -216,6 +216,41 @@ class CaptureGalleryInfo(BaseModel):
card_type: Literal["Capture"] = "Capture"
class MJPEGStreamWithTimestamp(lt.outputs.MJPEGStream):
"""An MJPEG stream where the frame time can be recorded with the frame.
This can be used to capture when the image was taken by the sensor if known
rather than take the time it is added into the ring buffer.
"""
def add_frame(self, frame: bytes, timestamp: Optional[datetime]) -> None:
"""Add a JPEG to the MJPEG stream.
Modify the standard function to have an option to send in the capture time.
:param frame: The frame to add
:param timestamp: The time the frame was captured.
:raise ValueError: if the supplied frame does not start with the JPEG
start bytes and end with the end bytes.
"""
if not (
frame[0] == 0xFF
and frame[1] == 0xD8
and frame[-2] == 0xFF
and frame[-1] == 0xD9
):
raise ValueError("Invalid JPEG")
with self._lock:
entry = self._ringbuffer[(self.last_frame_i + 1) % len(self._ringbuffer)]
entry.timestamp = timestamp if timestamp is not None else datetime.now()
entry.frame = frame
entry.index = self.last_frame_i + 1
self._thing_server_interface.start_async_task_soon(
self.notify_new_frame, entry.index
)
class BaseCamera(OFMThing, ABC):
"""The base class for all cameras. All cameras must directly inherit from this class.