Changelog
Added
- Allow passing
projectIDfor URL requests (#429) - Introduce linter configuration shared with egress, fixing a wide range of issues including unused params, deprecated APIs, unexported return types, typos, a
TrimLeftbug, and a mutex-copy bug in a proto message (#425) - Add segment start to adjusted buffer PTS; simplify event probe (#398)
- Log segment events to help diagnose non-~0s segments that could push buffer PTSs outside the segment range (#397)
- Observe buffer processing latency and expose it as a Prometheus metric (#392)
- Gate excess pre-roll buffered media to reduce end-to-end latency (#386)
- Ingress metrics (#383)
- Pass WHIP through to the SFU directly, with a config option to choose between SFU and native paths; includes WHIP HTTP header handling and RTC closing notify support (#372)
IngressIDandResourceIDattributes on ingress participants (#344)- Custom
HandlerLoggerimplementation (#339) - Media watchdog at the tail of the pipeline (input of the Go SDK) to close the ingress if no media is received on any track for 1 minute — needed for cases like SRT where GStreamer may retry connecting forever without emitting any failure event (#334)
- Backpressure-aware synchronizer: monitor a queue between the appsink and the Go SDK; if it grows past 2 buffers, reduce the synchronizer wait time in 10ms steps until the queue shortens. Addresses a deadlock case in SRT where the reference/wait time was only ever increased, causing the input buffer to fill to its max. Disabled for HLS, where back pressure at the output is expected. (#337)
- Announce out-of-network splice events as participant attributes (derived from SCTE-35 tables in MPEG-TS streams, e.g. SRT). Implemented by monitoring SCTE-35-related GStreamer events pushed down the pipeline — message-bus-based events lack pipeline-timebase timing and the MPEG-TS demuxer doesn't expose the needed info to regenerate timestamps. Relies on a forked
go-gstfor now. (#326) - Reject ingress if the
Enabledflag is false (#319)
Changed
- Log caps existence when connecting to caps notifier (#431)
- Replace deprecated
io/ioutil.ReadFilewithos.ReadFilefor config loading (#424) - Refactor ingress handler RPC server: remove PSRPC support from the ingress handler and move the full PSRPC server implementation into the server process; introduce a
StateNotifierfamily of objects for injecting state-update behavior; add an (initially empty)ProjectIDfield toStateNotifiercalls (#413) - Only report packet loss if
trackStatsis set (#401) - Update GStreamer to 1.26.7 (#396)
- Update Go to 1.25 (#388)
- Use
FeatureFlagsfromGetIngressInfoResponseorStartIngressRequest; rename theSFUTranscodingBypassedWHIPconfig option toWHIPProxyEnabled(#382) - Fix the format of the logging field in the sample config (#377)
- Delay deregistering the WHIP RPC handler to avoid SFU notify warnings (#373)
- Switch to the
livekit/gst-gofork ofgo-gst(#367) - Update CLI to
urfave/cli/v3(#364) - Set logging parameters on Pion; ignore Pion ICE candidate warning (#348)
- Throttle "too slow" logs (#340)
- Disable output queue-length monitoring for RTMP and WHIP (#338)
- Disable max-buffer limit on URL input queue; log SRT stats every minute (#335)
- Initialize URL ingress state with
BUFFERINGwhen created directly by the Ingress server (#333) - Use logger utilities in ingress (#332)
- Remove
actions/cachefromworkflows/build.yaml— the cloud-ingress build uses Docker, so caching Go modules from the host is pointless (#325)
Fixed
- Fix
intcast flagged by Copilot (#416) - Ensure the logger is initialized before the output registers for EOS, preventing a race that could cause a panic if EOS arrived during creation (#415)
- Ignore all errors from
writeSampleonce the output is already closed — not just EOF — so hitting the shutdown timeout no longer setspipelineErrorand flips the pipeline to a failed state (#412) - Do not treat
io.EOFas a pipeline error during shutdown;handleSample()keeps returningFlowOKwhile samples are dropped so GStreamer can drain its queues without interpreting earlyFlowEOSas a mid-stream failure (#411) - Make sure EOS reaches sinks: signal "EOS seen on source" out-of-band so the output can decide to wait briefly for remaining data (or cancel), preventing the pipeline from freezing when the appsink thread is stuck on a blocking push (#408)
- Safer fallback logic for latency reduction: if A/V arrival rates don't stabilize, skip applying offsets entirely instead of taking the current max of calculated offsets (#406)
- Initialize logger before the handler starts (#399)
- Fix superfluous
response.WriteHeadercall: only send a status code if data hasn't already been written (an implicit 200) (#395) - Make sure an ingress session is terminated when sending on the app source doesn't cause the pipeline to emit an EOS event (#379)
- Propagate sink errors when the input error is (generic, consequential)
context.Canceled(#381) - Fix "disonnected" → "disconnected" typo in error messages (#360)
- Fix flaky/broken tests (#378, #374)
Security
- Bump
golang.org/x/imageto v0.38.0 (#426) - Bump
golang.org/x/netfrom 0.35.0 to 0.38.0 (#358) - Bump
golang.org/x/cryptofrom 0.32.0 to 0.35.0 (#355) - Bump
golang.org/x/netfrom 0.31.0 to 0.33.0 (#321)
