Selkies

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) -> None
Source 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] = None
paramacknowledgeCallable[[int], None]

Returns

None
funcjoin(page) -> None

page 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)
parampageAny

Returns

None
funchold(page, frame_id, key=False) -> None

page 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)
parampageAny
paramframe_idint
paramkeybool
= False

Returns

None
funcleave(page) -> None

page 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)
parampageAny

Returns

None