github savonet/liquidsoap v2.3.0-rc1
Liquidsoap 2.3.0-rc1

one month ago

This is the first Release Candidate of release 2.3.0 of liquisoap! 🎉

The release has been maturing for a while and tested by multiple users. At this point we consider that the code is very close to being releasable.

We are providing this release to encourage our users to start testing and report issues. For the most part, we consider this release to be safe to use in production, after testing it in your staging environment.

Migration notes for this release are here: https://www.liquidsoap.info/doc-dev/migrating.html

Some of the key features for this release are:

  • An optimized caching mechanism that should both reduce runtime memory usage and startup time!
  • Fully rewritten streaming and content API. While this is an internal change that should mostly not affect users, we expect this change to vastly improve issues related to clock and track marks (or what used to be called breaks).
  • A new video canvas API that allows to construct video streams that are independent of the rendered size. See: https://www.liquidsoap.info/blog/2024-02-10-video-canvas-and-ai/
  • The ability to set the frame size to as little as needed. See: #3607

The full changelog is below. As usual, we wish to send a very warm thank you to all our users, contributors and testers without whom this release would not be possible!

2.3.0-rc1 (2024-09-23)

New:

  • Rewrote the streaming API to work with immutable frame content. This
    should greatly impact impredictable side-effect of the previous models w.r.t.
    track marks, content sharing and more. This also impacts multiple operators
    behavior. Mostly, things should be roughly the same with differences around
    behaviors related to track marks (source.on_track and etc). (#3577)
  • Added script caching layer for faster script startup time. See: https://www.liquidsoap.info/blog/2024-06-13-a-faster-liquidsoap/ for details (#3924, #3949, #3959 and #3977)
  • Rewrote the clock/streaming loop layer. This prepares our streaming system to
    support multicore when the OCaml compiler is mature enough to allow it. Clocks
    are now attached to sources via their clock methods. Returned value is a stripped
    down clock variable. Users can use the clock function to retrieve the full
    methods, e.g. s = sine(); c = clock(s.clock). This value has advanced functions
    for clock control such as start/stop, ticks and self_sync to check for
    self-sync. (#3781)
  • Allow frames duration shorter than one video frames, typically values under 0.04s.
    Smaller frames means less latency and memory consumption at the expense of
    a higher CPU usage. (#3607)
  • Change default frame duration to 0.02s (#4033)
  • Optimized runtime (#3927, #3928, #3919)
  • Added finally to execute code regardless of whether or not an exception is raised
    (see: #3895 for more details).
  • Removed gstreamer support. Gstreamer's architecture was never a good fit for us
    and created a huge maintenance and debugging burden and it had been marked as
    deprecated for a while. Most, if not all of its features should be available using
    ffmpeg. (#4036)
  • Removed taglib support. It is superseded by the internal ocaml-metadata module
    and taglib, with its dependency on the C++ runtime library, has been causing issues
    with binary builds portability and crashes with the (not yet supported) OCaml 5
    compiler. (#4087)
  • Added video.canvas to make it possible to position video elements independently
    of the rendered video size (#3656, blog post)
  • Added cover manager from an original code by @vitoyucepi (#3651)
  • Added non-interleaved API to %ffmpeg encoder, enabled by default when only
    one stream is encoded.
  • Allow trailing commas in record definition (#3300).
  • Added metadata.getter.source.float (#3356).
  • BREAKING: Added duration and ticks to metadata available when computing HLS segment names (#4135)
  • Added optional main_playlist_writer to output.file.hls and
    derivated operator (#3484)
  • Added is_nan, is_infinite, ceil, floor, sign and round (#3407)
  • Added %track.drop to the %ffmpeg encoder to allow partial encoding
    of a source's available tracks (#3480)
  • Added let { foo? } = ... pattern matching (#3481)
  • Added metadata.replaygain method to extract unified replay gain value from metadata (#3438).
  • Added metadata.parse.amplify to manually parse amplify override metadata.
  • Added compute parameter to file.replaygain to control gain calculation (#3438).
  • Added compute parameter to enable_replaygain_metadata to control replay gain calculation (#3438).
  • Added copy: protocol (#3506)
  • Added file.touch.
  • Added support for sqlite databases (#3575).
  • Added string.of_int and string.spaces.
  • Added list.assoc.nullable.
  • Added source.cue (#3620).
  • Added string.chars (#4111)
  • Added atomic file write operations.

Changed:

  • Mute SDL startup messages (#2913).
  • int can optionally raises an error when passing nan or infinity, int(infinity)
    now returns max_int and int(-infinity) returns min_int. (#3407)
  • Made default font a setting (#3507)
  • Changed internal metadata format to be immutable (#3297).
  • Allow a getter for the offset of on_offset and dropped the metadata
    mechanism for updating it (#3355).
  • string.length and string.sub now default to utf8 encoding (#4109)
  • Disable output paging when TERM environment variable is not set.
  • Allow running as root user inside docker container by default (#3406).
  • Run check_next before playlist's requests resolutions (#3625)
  • Set force to true by default in file.copy to make operator behave
    as expected.
  • BREAKING: Float comparison now follows the expected specs, in particular: nan == x is always false and
    nan != x is always true. Use float.is_nan to test if a float is nan.
  • BREAKING: replaygain no longer takes ebu_r128 parameter (#3438).
  • BREAKING: assume replaygain_track_gain always stores volume in dB (#3438).
  • Added parents option of file.mkdir (#3600, #3601).
  • Added forced_major_collections record field to the result of runtime.gc.stat() and
    runtime.gc.quick_stat() (#3783).
  • Changed the port for the built-in Prometheus exporter to 9599 (#3801).
  • Set segments_overheader in HLS outputs to disable segments cleanup altogether.
  • Added support for caching LV2 and LADSPA plugins (#3959).

Fixed:

  • Fixed type generalization on values returned from function applications. Most notably,
    this should help with HTTP endpoint registration (#3303, fixed in #4030)

Don't miss a new liquidsoap release

NewReleases is sending notifications on new releases.