[package] name = "joule-moq-ingest" version = "0.1.0" description = "An ingest and egress gateway for WAI rooms: WHIP (RFC 9725) and Enhanced RTMP v2 into MoQ room tracks, where it is the tracks' publisher and signs every group's receipts as the first hop; WHEP (draft-ietf-wish-whep-05) out of them, verifying every object's receipt before it forwards it; and SCTE 104 automation translated to SCTE 35 and signed as the room's cues." edition = "2024" license = "Apache-2.0" repository = "https://github.com/transaction-science/open-standards" [lib] path = "src/lib.rs" # The binary is `wai-ingest`; the crate keeps its name (WAI toolchain decision 11). [[bin]] name = "wai-ingest" path = "src/main.rs" # The link records' conformance corpus, wai/live-conformance/links/. [[bin]] name = "joule-moq-ingest-link-vectors" path = "src/bin/link_vectors.rs" # The corpus of uncompressed essence over RTP, wai/live-conformance/st2110/. [[bin]] name = "joule-moq-ingest-st2110-vectors" path = "src/bin/st2110_vectors.rs" # The telephony bridge's corpus, wai/live-conformance/telephony/. [[bin]] name = "joule-moq-ingest-telephony-vectors" path = "src/bin/telephony_vectors.rs" [features] default = [] # RIST (VSF TR-06-1, TR-06-2) contribution, from joule-contrib. Off by default: see # joule-contrib's README, "Patents". rist = ["joule-contrib/rist"] # Uncompressed essence over RTP (SMPTE ST 2110) into a room's tracks: the session and its # encode stage onto the video floor. Off by default: the readers of `st2110` and their corpus # are built without it, and only the session brings the stage and the encoder it links. st2110 = ["dep:rav1e", "dep:libc"] # A telephony bridge (SIP and RTP, extensions/telephony-bridge.md): callers on a SIP trunk or a # PBX into a room as audio participants, and the room's mix back to them. Off by default: the # readers of `telephony` and their corpus are built without it; only the bridge needs it. telephony = [] [dependencies] joule-moq = { path = "../joule-moq" } joule-moq-relay = { path = "../joule-moq-relay" } # SRT and RIST, and the MPEG-TS demultiplexer (this workspace, Apache-2.0). joule-contrib = { path = "../joule-contrib" } # AV1 encode for the video floor, pure Rust without its assembly (BSD-2-Clause): the same # crate and features wai-rs writes AV1 with. Only the `st2110` feature compiles it. It is the # essence session's fallback encoder: the real-time ones are loaded at run time, not linked. rav1e = { version = "0.8", default-features = false, features = ["threading"], optional = true } # WebRTC, sans-IO (MIT OR Apache-2.0), with its pure-Rust crypto backend: DTLS by its own # `dimpl`, SRTP and the rest on RustCrypto. No C library is linked. str0m = { version = "=0.25.0", default-features = false, features = ["rust-crypto"] } # The WHIP and WHEP resources (MIT). hyper = { version = "=1.11.1", features = ["server", "http1"] } hyper-util = { version = "=0.1.20", default-features = false, features = ["tokio"] } http-body-util = "=0.1.5" quinn = "0.11" rustls = { version = "0.23", default-features = false, features = ["ring", "std"] } # RTMPS: the Enhanced RTMP listener over TLS, on the same rustls and ring (MIT OR Apache-2.0). tokio-rustls = { version = "0.26", default-features = false, features = ["ring"] } tokio = { version = "1", features = ["rt-multi-thread", "macros", "sync", "time", "net", "io-util", "signal"] } bytes = "1" futures = "0.3" tracing = "0.1" tracing-subscriber = "0.3" serde = { version = "1", features = ["derive"] } serde_json = "1" toml = "1.2" ed25519-dalek = { version = "3", features = ["alloc", "rand_core"] } rand_core_06 = { package = "rand_core", version = "0.6", features = ["getrandom"] } sha2 = "0.11" blake3 = "1" hex = "0.4" base64 = "0.23" thiserror = "2" # GET /metrics, in the text exposition format (no dependencies of its own). wai-metrics = { path = "../../../../wai/wai-metrics" } [dev-dependencies] # `process`: tests/ertmp_ffmpeg.rs runs a local encoder as a test client. tokio = { version = "1", features = ["rt-multi-thread", "macros", "process"] } # The tests' HTTP client. hyper = { version = "=1.11.1", features = ["client", "http1"] } # The video floor's own decoder (this repository's, Apache-2.0, no dependencies), written # from the specification's text: the second decoder tests/essence_rt.rs holds an encoder's # stream to, beside the host's libdav1d. wai-av1 = { path = "../../../../wai/wai-av1" } # The telephony tests' callers read each packet's arrival as the kernel stamped it # (`SO_TIMESTAMPNS`), not when their task next ran (MIT OR Apache-2.0; already a dependency). [target.'cfg(target_os = "linux")'.dev-dependencies] libc = "0.2" # The essence session's receive path and its test sender's writes (`st2110::sock`): the # system calls that read and write several datagrams a call, with their kernels' structures # (MIT OR Apache-2.0; already in the tree through joule-moq-relay). Only `st2110` compiles it. [target.'cfg(unix)'.dependencies] libc = { version = "0.2", optional = true } # Uncompressed essence into a room needs the feature that carries its session. [[test]] name = "essence_st2110" path = "tests/essence_st2110.rs" required-features = ["st2110"] # A session held to its frame rate at broadcast sizes with the real-time encoders the host # has: ignored unless asked for, on a quiet host. [[test]] name = "essence_rt" path = "tests/essence_rt.rs" required-features = ["st2110"] # The essence session's way in held to broadcast datagram rates: ignored unless asked for. [[test]] name = "essence_rx" path = "tests/essence_rx.rs" required-features = ["st2110"] # What the DTV caption channel's decoder costs a caption channel packet, on the host it is run on. [[example]] name = "dtvcc_cost" path = "examples/dtvcc_cost.rs" # Where a frame's time goes in the essence path, on the host it is run on. [[example]] name = "st2110_profile" path = "examples/st2110_profile.rs" required-features = ["st2110"] # The telephony bridge on loopback needs the feature that carries it. [[test]] name = "telephony_bridge" path = "tests/telephony_bridge.rs" required-features = ["telephony"] # The telephony bridge held to real time: ignored unless asked for, on a quiet host. [[test]] name = "telephony_rt" path = "tests/telephony_rt.rs" required-features = ["telephony"] # The telephony bridge with an outside SIP user agent: ignored unless asked for, run with # loopback alone and the agent named by TELEPHONY_BARESIP. [[test]] name = "telephony_interop" path = "tests/telephony_interop.rs" required-features = ["telephony"] # Contribution over RIST needs the feature that carries it. [[test]] name = "contrib_rist" path = "tests/contrib_rist.rs" required-features = ["rist"]