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 theirclock
methods. Returned value is a stripped
downclock
variable. Users can use theclock
function to retrieve the full
methods, e.g.s = sine(); c = clock(s.clock)
. This value has advanced functions
for clock control such asstart
/stop
,ticks
andself_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 internalocaml-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
andticks
to metadata available when computing HLS segment names (#4135) - Added optional
main_playlist_writer
tooutput.file.hls
and
derivated operator (#3484) - Added
is_nan
,is_infinite
,ceil
,floor
,sign
andround
(#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 tofile.replaygain
to control gain calculation (#3438). - Added
compute
parameter toenable_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
andstring.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 passingnan
orinfinity
,int(infinity)
now returnsmax_int
andint(-infinity)
returnsmin_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
andstring.sub
now default toutf8
encoding (#4109)- Disable output paging when
TERM
environment variable is not set. - Allow running as
root
user insidedocker
container by default (#3406). - Run
check_next
before playlist's requests resolutions (#3625) - Set
force
totrue
by default infile.copy
to make operator behave
as expected. - BREAKING: Float comparison now follows the expected specs, in particular:
nan == x
is alwaysfalse
and
nan != x
is alwaystrue
. Usefloat.is_nan
to test if a float isnan
. - BREAKING:
replaygain
no longer takesebu_r128
parameter (#3438). - BREAKING: assume
replaygain_track_gain
always stores volume in dB (#3438). - Added
parents
option offile.mkdir
(#3600, #3601). - Added
forced_major_collections
record field to the result ofruntime.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: