Skip to content

v7.42.0

Latest

Choose a tag to compare

@ddennedy ddennedy released this 03 Oct 18:34

What's Changed

Framework

  • Added list-based image-conversion callback dispatch on mlt_frame.
    Use mlt_frame_append_convert_image() to register a converter instead of
    setting frame->convert_image directly. 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_image is now read-only after
    init and is permanently set to the dispatcher mlt_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 use mlt_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
    _movit chain state. Same-producer prepends keep the GPU chain. Playlist
    fx_cut frames now set _producer so Movit can key the chain.
  • Copy meta. and set. properties from the producer onto fx_cut frames
    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).
    Added mlt_audio_format_id() and an mlt_audio_format property on the
    multi consumer. 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_cut in-point handling in mlt_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 process LC_NUMERIC.

Modules

  • Image converters (movit.convert, avcolor_space, imageconvert) are
    now attached data-driven via loader.ini key image_convert.
  • Movit rgba64 is now a valid input as well as output: FlatInput is
    created with GL_UNSIGNED_SHORT and set_pixel_data() uses the 16-bit
    overload. Previously rgba64 was uploaded as 8-bit, which distorted the
    image when an OpenGL filter ran on an fx_cut.
  • Added placebo GPU module (placebo.render, placebo.shader) using
    libplacebo for scaling, debanding, dithering, tonemapping, and mpv-style
    .hook shaders (D3D11 / Vulkan / OpenGL).
  • Fixed deadlock in the decklink consumer when pausing, seeking, and
    resuming playback.
  • Added ducking to the mix transition (duck_threshold, duck_attenuation,
    duck_level, duck_fade_in, duck_fade_out, and an optional prefix for
    duck_level on the frame).
  • Added #frame+1# keyword in dynamictext (1-based frame number).
  • Added more audio formats to the audiolevel filter.
  • FFmpeg 9 support in avformat.
  • Fixed 10-bit hevc_vaapi encoding.
  • Log when the avformat consumer finishes.
  • Fixed rnnoise only working with 48 kHz audio.
  • frei0r.kaleid0sc0pe and frei0r.squigglevision report internal threading.
  • Fixed frei0r.camerashake (and its blur) with preview scaling.
  • Skip duplicate OpenFX plugins.
  • USE_LV2 and USE_VST2 require USE_LADSPA; install LADSPA
    blacklist.txt without JACK; expand LV2_PATH correctly on Windows.
  • Fixed affine and qtblend inside mask_apply.
  • qtblend: flag to avoid double PAR normalization.
  • Fixed luma transition alpha scaling, alpha when using a luma file, and
    documented the invert property.
  • Fixed shape filter alpha subtraction for rgba.
  • Fixed motion-tracker shapes clipping outside the frame.
  • Fixed colorspace and range of cached images in qimage and pixbuf.
  • Fixed crop with hardware decode+scale plus preview scale.
  • Fixed subtitle filter rendering one frame past the end time, and
    subtitle_feed end-frame calculation.
  • Fixed file-name buffer overflows in gpsgraphic and gpstext.
  • Fixed the sdl2 consumer freezing on Windows after a few seconds.
  • Fixed sdl2_audio hanging in consumer_stop() when stopped while paused.
  • Added s32, float, s32le, f32le, and u8 to the noise producer,
    and s16, s32, s32le, f32le, and u8 to tone. Fixed tone
    integer conversion to match audioconvert.
  • Fixed a double-free in the xml producer when a filter, transition,
    link, or producer fails to load.
  • Fixed movit.convert leaking a Movit input on every frame when an
    effect chain is reused.
  • Fixed the heart-rate keyword in gpstext (#gps_hr#).
  • gpsgraphic no longer sets time_offset when a GPS file is first loaded.

Other

  • melt prints progress at the end and exits non-zero when interrupted
    by a signal.
  • Fixed melt on Windows ignoring window resize and keyboard transport.
  • Fixed melt -jack option not working with PipeWire.

New Contributors

Full Changelog: v7.40.0...v7.42.0