CommonFrames
The frames every page streaming one display holds, each told to the
display's encoder once (acknowledge_reference).
A page joins as its transport takes a key frame for it (join), holding
nothing until it holds that one, and holds each later frame it is sent,
which predicts from one it holds (a transport sends no other): over
WebSockets once its relay writes the frame, over WebRTC once transport-cc
reported every packet of it received. It leaves when it waits for a key
frame again, and when it goes. An encoder told which frames every page holds
keeps the newest such long-term reference while it marks another, and
predicts the next from a frame every page holds (FRAME_ANCHOR), so each page
recovers from a loss of any depth on its own and the stream carries no key
frame for it.
A second set counts the frames every page was handed, which it may yet lose: over WebSockets once its relay queues the frame, over WebRTC once its packets leave the pacer. The encoder predicts each anchor from one of those, so a page whose link holds frames for a while costs no anchor reaching back to the last.
Attributes
attribute__slots__= ('_acknowledge', '_pages', '_told', '_key')Functions
constructor__init__(acknowledge) -> NoneSource Code
def __init__(self, acknowledge: Callable[[int], None]) -> None:
self._acknowledge = acknowledge
self._pages: Dict[Any, deque] = {}
self._told: deque = deque(maxlen=LOST_FRAME_MEMORY)
self._key: Optional[int] = NoneparamacknowledgeCallable[[int], None]Returns
Nonefuncjoin(page) -> Nonepage is sent a key frame: no frame is common until it holds that.
Source Code
def join(self, page: Any) -> None:
"""`page` is sent a key frame: no frame is common until it holds that."""
self._pages[page] = deque(maxlen=LOST_FRAME_MEMORY)parampageAnyReturns
Nonefunchold(page, frame_id, key=False) -> Nonepage holds frame_id, a key frame starting its holdings afresh; a
frame every page now holds is told to the encoder.
Source Code
def hold(self, page: Any, frame_id: int, key: bool = False) -> None:
"""`page` holds `frame_id`, a key frame starting its holdings afresh; a
frame every page now holds is told to the encoder."""
if key:
held = self._pages[page] = deque(maxlen=LOST_FRAME_MEMORY)
if frame_id != self._key:
self._key = frame_id
self._told.clear()
else:
held = self._pages.get(page)
if held is None:
return
held.append(frame_id)
if frame_id not in self._told and all(frame_id in other for other in self._pages.values()):
self._told.append(frame_id)
self._acknowledge(frame_id)parampageAnyparamframe_idintparamkeybool= FalseReturns
Nonefuncleave(page) -> Nonepage waits for a key frame, or is gone.
Source Code
def leave(self, page: Any) -> None:
"""`page` waits for a key frame, or is gone."""
self._pages.pop(page, None)parampageAnyReturns
None