Skip to content

MXL — Media Exchange Layer

MXL moves raw frames zero-copy between processes like VDI, but every flow also carries NMOS-style descriptors — format URN, grain rate, colorimetry, components — so MXL streams have standards-grade identity other tooling can see.

  • Library: libplugin-mxl.so (+ runtime libmxl*.so*) · Implementation: C++ wrapping the MXL C library
  • Addressing: mxl://…

The JSON passed to plugin_open is the flow descriptor:

{
"id": "5fbec3b1-1b0f-417d-9059-8b94a47197ef",
"label": "MXL Test Flow, 1080p25",
"format": "urn:x-nmos:format:video",
"media_type": "video/v210",
"grain_rate": { "numerator": 25, "denominator": 1 },
"frame_width": 1920, "frame_height": 1080,
"interlace_mode": "progressive", "colorspace": "BT709",
"components": [
{ "name": "Y", "width": 1920, "height": 1080, "bit_depth": 10 },
{ "name": "Cb", "width": 960, "height": 1080, "bit_depth": 10 },
{ "name": "Cr", "width": 960, "height": 1080, "bit_depth": 10 }
]
}

MXL_DOMAIN (env, or a domain path in the host config) selects the shared-memory domain (default /dev/shm/mxl_domain).

Built by plugins/phrame-make.sh (CMake). Stages libplugin-mxl.so plus the libmxl-common.so* / libmxl.so* runtime libraries — the symlink chain must be preserved when copying into consumer images (the orchestrator uses cp -P). Config is parsed with nlohmann::json, which throws on malformed input, so keep config valid — exceptions at the C-ABI boundary are not safe. Note plugin_read_timeout may not be implemented; check before relying on it.