"""Packing a frame as std/media/v1/Image. The struct is respelled here rather than imported from the viewer: node repositories share no source package, so the manifest and this schema are the whole contract between them. """ import numpy as np import pyarrow as pa IMAGE_TYPE = pa.struct([ ("width", pa.uint32()), ("height", pa.uint32()), ("encoding", pa.utf8()), ("data", pa.large_binary()), ]) def pack(frame: np.ndarray, encoding: str, width: int, height: int) -> pa.Array: """Pack encoded frame bytes as a single-row std/media/v1/Image array. Parameters ---------- frame : np.ndarray The bytes to send. Either a raw pixel buffer or the output of an encoder; either way only its bytes are read. encoding : str Name of the encoding the bytes are in, e.g. ``bgr8`` or ``jpeg``. width, height : int Dimensions of the *image*, which for a compressed encoding are not the shape of ``frame``. They are recorded so a receiver can size a buffer without decoding first. Returns ------- pa.Array One-row struct array matching ``IMAGE_TYPE``. """ return pa.array( [{ "width": width, "height": height, "encoding": encoding, "data": frame.tobytes(), }], type=IMAGE_TYPE, )