observers: add a timestamp to on_push_frame()
This commit is contained in:
@@ -20,7 +20,12 @@ class BaseObserver(ABC):
|
|||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
async def on_push_frame(
|
async def on_push_frame(
|
||||||
self, src: FrameProcessor, dst: FrameProcessor, frame: Frame, direction: FrameDirection
|
self,
|
||||||
|
src: FrameProcessor,
|
||||||
|
dst: FrameProcessor,
|
||||||
|
frame: Frame,
|
||||||
|
direction: FrameDirection,
|
||||||
|
timestamp: int,
|
||||||
):
|
):
|
||||||
"""Abstract method to handle the event when a frame is pushed from one
|
"""Abstract method to handle the event when a frame is pushed from one
|
||||||
processor to another.
|
processor to another.
|
||||||
@@ -30,6 +35,7 @@ class BaseObserver(ABC):
|
|||||||
dst (FrameProcessor): The destination frame processor that will receive the frame.
|
dst (FrameProcessor): The destination frame processor that will receive the frame.
|
||||||
frame (Frame): The frame being transferred between processors.
|
frame (Frame): The frame being transferred between processors.
|
||||||
direction (FrameDirection): The direction of the frame transfer.
|
direction (FrameDirection): The direction of the frame transfer.
|
||||||
|
timestamp (int): The timestamp when the frame was pushed (based on the pipeline clock).
|
||||||
|
|
||||||
This method should be implemented by subclasses to define specific behavior
|
This method should be implemented by subclasses to define specific behavior
|
||||||
when a frame is pushed.
|
when a frame is pushed.
|
||||||
|
|||||||
@@ -109,10 +109,15 @@ class Observer(BaseObserver):
|
|||||||
self._observers = observers
|
self._observers = observers
|
||||||
|
|
||||||
async def on_push_frame(
|
async def on_push_frame(
|
||||||
self, src: FrameProcessor, dst: FrameProcessor, frame: Frame, direction: FrameDirection
|
self,
|
||||||
|
src: FrameProcessor,
|
||||||
|
dst: FrameProcessor,
|
||||||
|
frame: Frame,
|
||||||
|
direction: FrameDirection,
|
||||||
|
timestamp: int,
|
||||||
):
|
):
|
||||||
for observer in self._observers:
|
for observer in self._observers:
|
||||||
await observer.on_push_frame(src, dst, frame, direction)
|
await observer.on_push_frame(src, dst, frame, direction, timestamp)
|
||||||
|
|
||||||
|
|
||||||
class PipelineTask:
|
class PipelineTask:
|
||||||
|
|||||||
@@ -258,15 +258,20 @@ class FrameProcessor:
|
|||||||
|
|
||||||
async def __internal_push_frame(self, frame: Frame, direction: FrameDirection):
|
async def __internal_push_frame(self, frame: Frame, direction: FrameDirection):
|
||||||
try:
|
try:
|
||||||
|
timestamp = self._clock.get_time()
|
||||||
if direction == FrameDirection.DOWNSTREAM and self._next:
|
if direction == FrameDirection.DOWNSTREAM and self._next:
|
||||||
logger.trace(f"Pushing {frame} from {self} to {self._next}")
|
logger.trace(f"Pushing {frame} from {self} to {self._next}")
|
||||||
if self._observer:
|
if self._observer:
|
||||||
await self._observer.on_push_frame(self, self._next, frame, direction)
|
await self._observer.on_push_frame(
|
||||||
|
self, self._next, frame, direction, timestamp
|
||||||
|
)
|
||||||
await self._next.queue_frame(frame, direction)
|
await self._next.queue_frame(frame, direction)
|
||||||
elif direction == FrameDirection.UPSTREAM and self._prev:
|
elif direction == FrameDirection.UPSTREAM and self._prev:
|
||||||
logger.trace(f"Pushing {frame} upstream from {self} to {self._prev}")
|
logger.trace(f"Pushing {frame} upstream from {self} to {self._prev}")
|
||||||
if self._observer:
|
if self._observer:
|
||||||
await self._observer.on_push_frame(self, self._prev, frame, direction)
|
await self._observer.on_push_frame(
|
||||||
|
self, self._prev, frame, direction, timestamp
|
||||||
|
)
|
||||||
await self._prev.queue_frame(frame, direction)
|
await self._prev.queue_frame(frame, direction)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception(f"Uncaught exception in {self}: {e}")
|
logger.exception(f"Uncaught exception in {self}: {e}")
|
||||||
|
|||||||
@@ -579,7 +579,12 @@ class RTVIObserver(BaseObserver):
|
|||||||
self._frames_seen = set()
|
self._frames_seen = set()
|
||||||
|
|
||||||
async def on_push_frame(
|
async def on_push_frame(
|
||||||
self, src: FrameProcessor, dst: FrameProcessor, frame: Frame, direction: FrameDirection
|
self,
|
||||||
|
src: FrameProcessor,
|
||||||
|
dst: FrameProcessor,
|
||||||
|
frame: Frame,
|
||||||
|
direction: FrameDirection,
|
||||||
|
timestamp: int,
|
||||||
):
|
):
|
||||||
# If we have already seen this frame, let's skip it.
|
# If we have already seen this frame, let's skip it.
|
||||||
if frame.id in self._frames_seen:
|
if frame.id in self._frames_seen:
|
||||||
|
|||||||
Reference in New Issue
Block a user