What's Changed
Framework
- Added list-based image-conversion callback dispatch 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().
External code that set this field directly to a custom function will no
longer have that function called. If you really need that (never heard of
someone who does), clear the frame's "_convert_image_callbacks" property
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 used by tractor stacking and this path:mlt_frame_prepend_image_from_service()mlt_frame_push_image_with_fx_cut()
- Fixed crash applying a Movit (OpenGL) filter to an
fx_cut(Adjustment Clip).
Cross-producer image sharing (including the reverse fx_cut share) finalizes
an in-progress Movit chain to rgba64 and does not copy producer-keyed
_movitchain state. Same-producer prepends keep the GPU chain. Playlist
fx_cutframes now set_producerso Movit can key the chain. - Copy
meta.andset.properties 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 the
multiconsumer. Integer/float conversion is lossless and symmetric
(s16 and u8 round-trips are exact). - Deprecated audio services that only support integer samples.
- Propagate per-track audio-level metadata 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 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 data-driven vialoader.inikeyimage_convert. - Movit
rgba64is now a valid input as well as output:FlatInputis
created withGL_UNSIGNED_SHORTandset_pixel_data()uses the 16-bit
overload. Previously rgba64 was 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 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 optional prefix for
duck_levelon the frame). - Added
#frame+1#keyword indynamictext(1-based frame number). - Added more audio formats to the
audiolevelfilter. - FFmpeg 9 support in
avformat. - Fixed 10-bit
hevc_vaapiencoding. - Log when the
avformatconsumer finishes. - Fixed
rnnoiseonly working with 48 kHz audio. frei0r.kaleid0sc0peandfrei0r.squigglevisionreport internal threading.- Fixed
frei0r.camerashake(and its blur) with preview scaling. - Skip duplicate OpenFX plugins.
USE_LV2andUSE_VST2requireUSE_LADSPA; install LADSPA
blacklist.txtwithout JACK; expandLV2_PATHcorrectly on Windows.- Fixed
affineandqtblendinsidemask_apply. qtblend: flag to avoid double PAR normalization.- Fixed luma transition alpha scaling, alpha when using a luma file, and
documented theinvertproperty. - Fixed
shapefilter alpha subtraction for rgba. - Fixed motion-tracker shapes clipping outside the frame.
- Fixed colorspace and range of cached images in
qimageandpixbuf. - Fixed
cropwith hardware decode+scale plus preview scale. - Fixed subtitle filter rendering one frame past the end time, and
subtitle_feedend-frame calculation. - Fixed file-name buffer overflows in
gpsgraphicandgpstext. - Fixed the
sdl2consumer freezing on Windows after a few seconds. - Fixed
sdl2_audiohanging inconsumer_stop()when stopped while paused. - Added
s32,float,s32le,f32le, andu8to thenoiseproducer,
ands16,s32,s32le,f32le, andu8totone. Fixedtone
integer 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 progress at the end and exits non-zero when interrupted
by a signal.- Fixed
melton Windows ignoring window resize and keyboard transport. - Fixed melt
-jackoption not working with PipeWire.
New Contributors
- @Magnussmari made their first contribution in #1270
- @doruphin made their first contribution in #1279
- @michaeljtbrooks made their first contribution in #1286
- @zhuowei made their first contribution in #1293
- @klg90 made their first contribution in #1307
- @darkdi made their first contribution in #1309
- @iDoMeteor made their first contribution in #1323
Full Changelog: v7.40.0...v7.42.0