Blog: v7.42.0 released
You can download it from GitHub.
The highlights of this version are a new placebo GPU module based on libplacebo,
a 32-bit float default audio sample format, and Adjustment Clips (fx_cut) that
filter only the tracks below them.
Framework
- Added a list-based dispatch for image-conversion callbacks on
mlt_frame. Usemlt_frame_append_convert_image()to register a converter instead of settingframe->convert_imagedirectly. Multiple converters are tried in registration order; the first that succeeds wins. New public API:mlt_frame_prepend_convert_image()mlt_frame_append_convert_image()mlt_frame_convert_image()mlt_frame_next_convert_image()mlt_frame_has_convert_image()mlt_frame_copy_convert_image()
- API behavior change:
mlt_frame_s::convert_imageis now read-only after init and is permanently set to the dispatchermlt_frame_convert_image(). A custom function written directly to this field is no longer called. If you really need that (I have never heard of anyone who does), clear the frame’s_convert_image_callbacksproperty and usemlt_frame_append_convert_image()instead. fx_cut(Adjustment Clip) now applies its filters only to tracks below it. Higher tracks composite on top of the filtered result. New image-stack helpers are used by tractor stacking and byfx_cut:mlt_frame_prepend_image_from_service()mlt_frame_push_image_with_fx_cut()
- Fixed a crash when applying a Movit (OpenGL) filter to an
fx_cut(Adjustment Clip). Cross-producer image sharing (including the reversefx_cutshare) finalizes an in-progress Movit chain asrgba64and does not copy producer-keyed_movitchain state. Same-producer prepends keep the GPU chain. Playlistfx_cutframes now set_producerso Movit can key the chain. meta.andset.properties are now copied from the producer ontofx_cutframes so producer annotations reach tractor output. New public API:mlt_producer_pass_frame_properties()Mlt::Producer::pass_frame_properties()
- Changed the default audio sample format to
float32(mlt_audio_f32le). Addedmlt_audio_format_id()and anmlt_audio_formatproperty on themulticonsumer. Conversion between integer and float is lossless and symmetric (s16 and u8 round-trip exactly). - Deprecated the
soxfilter, which only supports 32-bit integer samples. - Deprecated the
volumefilter’snormalizeparameter because it forces 16-bit integer audio. Usedynamic_loudnessinstead. Thevolumefilter itself still supports float samples. - Per-track audio-level metadata is now propagated to output frames (
meta.audio.*). - Improved
mlt_property_is_anim()so strings that merely contain=(for example URLs) are not treated as animation. mlt_properties_get_data()no longer returns a data pointer for rect properties.- Fixed a signed integer overflow in
mlt_luma_map_from_pgm. - Fixed
fx_cutin-point handling inmlt_transition. - Fixed Android
mlt++builds by disabling ELF symbol versioning. - Fixed a macOS crash in numeric property conversion caused by
setlocale. Parsing and formatting no longer change the processLC_NUMERIC.
Modules
- Image converters (
movit.convert,avcolor_space,imageconvert) are now attached from data inloader.ini, using theimage_convertkey. - Movit
rgba64is now a valid input as well as an output:FlatInputis created withGL_UNSIGNED_SHORTandset_pixel_data()uses the 16-bit overload. Previously,rgba64was uploaded as 8-bit, which distorted the image when an OpenGL filter ran on anfx_cut. - Added
placeboGPU module (placebo.render,placebo.shader) using libplacebo for scaling, debanding, dithering, tonemapping, and mpv-style.hookshaders (D3D11 / Vulkan / OpenGL). - Fixed a deadlock in the
decklinkconsumer when pausing, seeking, and resuming playback. - Added ducking to the
mixtransition (duck_threshold,duck_attenuation,duck_level,duck_fade_in,duck_fade_out, and an optionalprefixthat records the level on the frame as<prefix>duck_level). - Added
#frame+1#keyword indynamictext(1-based frame number). - Added more audio formats to the
audiolevelfilter. - Added FFmpeg 9 support in
avformat. - Fixed 10-bit
hevc_vaapiencoding. - The
avformatconsumer now logs when it finishes. - Fixed
rnnoiseso it works at sample rates other than 48 kHz by resampling. frei0r.kaleid0sc0peandfrei0r.squigglevisionnow report internal threading.- Fixed
frei0r.camerashake(and its blur) with preview scaling. - The OpenFX module now skips duplicate plugins.
USE_LV2andUSE_VST2requireUSE_LADSPA. The LADSPAblacklist.txtis installed even without JACK, andLV2_PATHis expanded correctly on Windows.- Fixed
affineandqtblendinsidemask_apply. - Fixed the
qtblendtransition so it does not apply pixel-aspect normalization twice. - Fixed alpha scaling in the luma transition, including when a luma file is
used, and documented the
invertproperty. - Fixed
shapefilter alpha subtraction forrgba. - Fixed motion-tracker shapes clipping outside the frame.
- Fixed colorspace and range of cached images in
qimageandpixbuf. - Fixed
cropwhen hardware decode and scale are combined with preview scaling. - Fixed the subtitle filter rendering one frame past its end time, and fixed
the
subtitle_feedend-frame calculation. - Fixed filename buffer overflows in
gpsgraphicandgpstext. - Fixed the
sdl2consumer so it no longer freezes on Windows after a few seconds. - Fixed
sdl2_audioso it no longer hangs inconsumer_stop()when stopped while paused. - Added
s32,float,s32le,f32le, andu8to thenoiseproducer, ands16,s32,s32le,f32le, andu8totone. Fixedtoneinteger conversion to matchaudioconvert. - Fixed a double-free in the
xmlproducer when a filter, transition, link, or producer fails to load. - Fixed
movit.convertleaking a Movit input on every frame when an effect chain is reused. - Fixed the heart-rate keyword in
gpstext(#gps_hr#). gpsgraphicno longer setstime_offsetwhen a GPS file is first loaded.
Other
meltprints its progress when it finishes and exits with a non-zero status when interrupted by a signal.- Fixed
melton Windows so it no longer ignores window resizing and keyboard transport. - Fixed
melt-jackoption not working with PipeWire.