Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libmlt for openSUSE:Factory checked in at 2021-12-20 21:06:22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libmlt (Old) and /work/SRC/openSUSE:Factory/.libmlt.new.2520 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libmlt" Mon Dec 20 21:06:22 2021 rev:58 rq:941643 version:7.4.0 Changes: -------- --- /work/SRC/openSUSE:Factory/libmlt/libmlt.changes 2021-11-02 19:19:25.223095731 +0100 +++ /work/SRC/openSUSE:Factory/.libmlt.new.2520/libmlt.changes 2021-12-20 21:06:57.338963235 +0100 @@ -1,0 +2,38 @@ +Mon Dec 20 09:43:23 UTC 2021 - Luigi Baldoni <aloi...@gmx.com> + +- Update to version 7.4.0 + Framework: + * Added more constructors and assignment operators in C++ + wrapper: + + Mlt::Filter::Filter(Mlt::Filter*) + + Mlt::Link::Link(Mlt::Link*) + + Mlt::Link::Link(Mlt::Service&) + + Mlt::Link::Link(Mlt::Link&) + + Mlt::Link::Link(Mlt::Link const&) + + Mlt::Link::operator=(Mlt::Link const&) + + Mlt::Service::Service(Mlt::Service*) + * Fixed serialized animation in + mlt_animation_serialize_cut_tf() and + mlt_animation_serialize_cut() to include a trailing keyframe + value. + Modules: + * Added property animation for avfilter filters. + * This only works for numeric parameters, but many libavfilter + options that have a type string are actually numeric in + nature but accept a string expression. + * Added rotate property to avformat producer to override + orientation. + * Changed jackrack module to silence false LADSPA plugin + loading errors. + * Fixed a crash in the oldfilm filter when using preview + scaling. + * Fixed timeremap link distorts audio when speed is zero. + * Added nautical mile and knot units of measure to the gpstext + filter. + * Fixed full range color handling with embedded tractor (e.g. + same track transition). + * Fixed device capture in avformat producer regression in + version 7.2.0. + * Fixed a crash in the matte transition. + +------------------------------------------------------------------- Old: ---- mlt-7.2.0.tar.gz New: ---- mlt-7.4.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libmlt.spec ++++++ --- /var/tmp/diff_new_pack.I6QcWj/_old 2021-12-20 21:06:57.806963574 +0100 +++ /var/tmp/diff_new_pack.I6QcWj/_new 2021-12-20 21:06:57.810963577 +0100 @@ -18,16 +18,16 @@ %define _name mlt %define libname lib%{_name} -%define lversion 7.2.0 +%define lversion 7.4.0 %define sover 7 %define lib_pkgname %{libname}-%{sover}-%{sover} %define _name_pp %{_name}++ %define libname_pp lib%{_name_pp} %define sover_pp 7 -%define lversion_pp 7.2.0 +%define lversion_pp 7.4.0 %define libpp_pkgname %{libname_pp}-%{sover_pp}-%{sover_pp} Name: %{libname} -Version: 7.2.0 +Version: 7.4.0 Release: 0 Summary: Multimedia framework for television broadcasting License: GPL-3.0-or-later @@ -39,6 +39,7 @@ BuildRequires: gcc-c++ BuildRequires: ladspa-devel BuildRequires: pkgconfig +BuildRequires: python-rpm-macros BuildRequires: cmake(Qt5Core) >= 5.10 BuildRequires: cmake(Qt5Gui) BuildRequires: cmake(Qt5Svg) ++++++ mlt-7.2.0.tar.gz -> mlt-7.4.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/CMakeLists.txt new/mlt-7.4.0/CMakeLists.txt --- old/mlt-7.2.0/CMakeLists.txt 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/CMakeLists.txt 2021-12-19 22:07:55.000000000 +0100 @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.14) project(MLT - VERSION 7.2.0 + VERSION 7.4.0 DESCRIPTION "Multimedia Framework" HOMEPAGE_URL "https://www.mltframework.org" LANGUAGES C CXX diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/Doxyfile new/mlt-7.4.0/Doxyfile --- old/mlt-7.2.0/Doxyfile 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/Doxyfile 2021-12-19 22:07:55.000000000 +0100 @@ -31,7 +31,7 @@ # This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = 7.2.0 +PROJECT_NUMBER = 7.4.0 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/NEWS new/mlt-7.4.0/NEWS --- old/mlt-7.2.0/NEWS 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/NEWS 2021-12-19 22:07:55.000000000 +0100 @@ -1,6 +1,38 @@ MLT Release Notes ----------------- +Version 7.4.0 + +This main highlight of this version is property animation for avfilter! + +Framework + * Added more constructors and assignment operators in C++ wrapper: + - `Mlt::Filter::Filter(Mlt::Filter*)` + - `Mlt::Link::Link(Mlt::Link*)` + - `Mlt::Link::Link(Mlt::Service&)` + - `Mlt::Link::Link(Mlt::Link&)` + - `Mlt::Link::Link(Mlt::Link const&)` + - `Mlt::Link::operator=(Mlt::Link const&)` + - `Mlt::Service::Service(Mlt::Service*)` + * Fixed serialized animation in `mlt_animation_serialize_cut_tf()` and + `mlt_animation_serialize_cut()` to include a trailing keyframe value. + +Modules + * Added property animation for `avfilter` filters. + This only works for numeric parameters, but many libavfilter options that + have a type string are actually numeric in nature but accept a string + expression. + * Added `rotate` property to `avformat` producer to override orientation. + * Changed `jackrack` module to silence false LADSPA plugin loading errors. + * Fixed a crash in the `oldfilm` filter when using preview scaling. + * Fixed `timeremap` link distorts audio when speed is zero. + * Added nautical mile and knot units of measure to the `gpstext` filter. + * Fixed full range color handling with embedded tractor (e.g. same track + transition). + * Fixed device capture in `avformat` producer regression in version 7.2.0. + * Fixed a crash in the `matte` transition. + + Version 7.2.0 This is the first major maintenance release for the new major version 7 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/docs/melt.1 new/mlt-7.4.0/docs/melt.1 --- old/mlt-7.2.0/docs/melt.1 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/docs/melt.1 2021-12-19 22:07:55.000000000 +0100 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.38.4. -.TH MELT "1" "November 2021" "melt 7.2.0" "User Commands" +.TH MELT "1" "December 2021" "melt 7.4.0" "User Commands" .SH NAME melt \- author, play, and encode multitrack audio/video compositions .SH SYNOPSIS @@ -143,7 +143,7 @@ .PP For more help: <https://www.mltframework.org/> .SH COPYRIGHT -Copyright \(co 2002\-2020 Meltytech, LLC +Copyright \(co 2002\-2021 Meltytech, LLC <https://www.mltframework.org/> .br This is free software; see the source for copying conditions. There is NO diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/framework/mlt.vers new/mlt-7.4.0/src/framework/mlt.vers --- old/mlt-7.2.0/src/framework/mlt.vers 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/framework/mlt.vers 2021-12-19 22:07:55.000000000 +0100 @@ -624,3 +624,9 @@ mlt_properties_get_properties; mlt_properties_get_properties_at; } MLT_7.0.0; + +MLT_7.4.0 { + global: + mlt_property_is_anim; + mlt_properties_is_anim; +} MLT_7.1.0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/framework/mlt_animation.c new/mlt-7.4.0/src/framework/mlt_animation.c --- old/mlt-7.2.0/src/framework/mlt_animation.c 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/framework/mlt_animation.c 2021-12-19 22:07:55.000000000 +0100 @@ -674,8 +674,11 @@ break; // Special case - crop at the out point - if ( item.frame > out ) + if ( item.frame > out ) { mlt_animation_get_item( self, &item, out ); + // To ensure correct seeding + item.is_key = 1; + } } // We've handled the last keyframe else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/framework/mlt_properties.c new/mlt-7.4.0/src/framework/mlt_properties.c --- old/mlt-7.2.0/src/framework/mlt_properties.c 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/framework/mlt_properties.c 2021-12-19 22:07:55.000000000 +0100 @@ -2438,6 +2438,12 @@ * * Do not free the returned string. It's lifetime is controlled by the property * and this properties object. + * Enclose a string property value in double quotation marks to prevent + * mlt_properties_anim_get() from interpreting the string as animation. The + * double-quotes are removed when retrieved through mlt_properties_anim_get(). + * The same rule applies to string keyframe values: to protect a keyframed-string + * value containing a semicolon or equal sign, enclose it in double-quotes. + * * \public \memberof mlt_properties_s * \param self a properties list * \param name the property to get @@ -2758,6 +2764,15 @@ #endif +/** Set a property to a nested properties object. + * + * \public \memberof mlt_properties_s + * \param self a properties list + * \param name the property to get + * \param properties the properties list to nest into \p self with \p name + * \return true if error + */ + int mlt_properties_set_properties( mlt_properties self, const char *name, mlt_properties properties ) { int error = 1; @@ -2779,13 +2794,28 @@ return error; } +/** Get a nested properties object by name. + * + * \public \memberof mlt_properties_s + * \param self a properties list + * \param name the property to get + * \return the nested properties list + */ + mlt_properties mlt_properties_get_properties( mlt_properties self, const char *name ) { - property_list *list = self->local; mlt_property value = mlt_properties_find( self, name ); return value == NULL ? NULL : mlt_property_get_properties( value ); } +/** Get a nested properties object by index. + * + * \public \memberof mlt_properties_s + * \param self a properties list + * \param index the 0-based index value of the list item + * \return the nested properties list + */ + mlt_properties mlt_properties_get_properties_at( mlt_properties self, int index ) { if ( !self ) return NULL; @@ -2794,3 +2824,22 @@ return mlt_property_get_properties( list->value[ index ] ); return NULL; } + +/** Check if a property is animated. + * + * \public \memberof mlt_properties_s + * \param self a properties list + * \param name the property to get + * \return true if the property is animated + */ + +int mlt_properties_is_anim(mlt_properties self, const char *name) +{ + mlt_property property = mlt_properties_find(self, name); + if (!property) return 0; + property_list *list = self->local; + pthread_mutex_lock(&list->mutex); + int result = mlt_property_is_anim(property); + pthread_mutex_unlock(&list->mutex); + return result; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/framework/mlt_properties.h new/mlt-7.4.0/src/framework/mlt_properties.h --- old/mlt-7.2.0/src/framework/mlt_properties.h 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/framework/mlt_properties.h 2021-12-19 22:07:55.000000000 +0100 @@ -3,7 +3,7 @@ * \brief Properties class declaration * \see mlt_properties_s * - * Copyright (C) 2003-2020 Meltytech, LLC + * Copyright (C) 2003-2021 Meltytech, LLC * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -108,6 +108,7 @@ extern double mlt_properties_anim_get_double( mlt_properties self, const char *name, int position, int length ); extern int mlt_properties_anim_set_double( mlt_properties self, const char *name, double value, int position, int length, mlt_keyframe_type keyframe_type ); extern mlt_animation mlt_properties_get_animation( mlt_properties self, const char *name ); +extern int mlt_properties_is_anim(mlt_properties self, const char *name); extern int mlt_properties_set_rect( mlt_properties self, const char *name, mlt_rect value ); extern mlt_rect mlt_properties_get_rect( mlt_properties self, const char *name ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/framework/mlt_property.c new/mlt-7.4.0/src/framework/mlt_property.c --- old/mlt-7.2.0/src/framework/mlt_property.c 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/framework/mlt_property.c 2021-12-19 22:07:55.000000000 +0100 @@ -1383,7 +1383,7 @@ { double result; pthread_mutex_lock( &self->mutex ); - if ( self->animation || ( self->prop_string && strchr( self->prop_string, '=' ) ) ) + if (mlt_property_is_anim(self)) { struct mlt_animation_item_s item; item.property = mlt_property_init(); @@ -1419,7 +1419,7 @@ { int result; pthread_mutex_lock( &self->mutex ); - if ( self->animation || ( self->prop_string && strchr( self->prop_string, '=' ) ) ) + if (mlt_property_is_anim(self)) { struct mlt_animation_item_s item; item.property = mlt_property_init(); @@ -1455,7 +1455,7 @@ { char *result; pthread_mutex_lock( &self->mutex ); - if ( self->animation || ( self->prop_string && strchr( self->prop_string, '=' ) ) ) + if (mlt_property_is_anim(self)) { struct mlt_animation_item_s item; item.property = mlt_property_init(); @@ -1803,7 +1803,7 @@ { mlt_rect result; pthread_mutex_lock( &self->mutex ); - if ( self->animation || ( self->prop_string && strchr( self->prop_string, '=' ) ) ) + if (mlt_property_is_anim(self)) { struct mlt_animation_item_s item; item.property = mlt_property_init(); @@ -1824,6 +1824,14 @@ return result; } +/** Set a nested properties object. + * + * \public \memberof mlt_property_s + * \param self a property + * \param properties the properties list to nest into \p self with \p name + * \return true if error + */ + int mlt_property_set_properties( mlt_property self, mlt_properties properties ) { pthread_mutex_lock( &self->mutex ); @@ -1834,6 +1842,13 @@ return 0; } +/** Get a nested properties object. + * + * \public \memberof mlt_property_s + * \param self a property + * \return the nested properties list + */ + mlt_properties mlt_property_get_properties( mlt_property self ) { mlt_properties properties = NULL; @@ -1842,3 +1857,17 @@ pthread_mutex_unlock( &self->mutex ); return properties; } + +/** Check if a property is animated. + * + * This is not a thread-safe function because it is used internally by + * mlt_property_s under a lock. However, external callers should protect it. + * \public \memberof mlt_property_s + * \param self a property + * \return true if the property is animated + */ + +int mlt_property_is_anim(mlt_property self) +{ + return self->animation || (self->prop_string && strchr(self->prop_string, '=')); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/framework/mlt_property.h new/mlt-7.4.0/src/framework/mlt_property.h --- old/mlt-7.2.0/src/framework/mlt_property.h 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/framework/mlt_property.h 2021-12-19 22:07:55.000000000 +0100 @@ -3,7 +3,7 @@ * \brief Property class declaration * \see mlt_property_s * - * Copyright (C) 2003-2018 Meltytech, LLC + * Copyright (C) 2003-2021 Meltytech, LLC * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -71,6 +71,7 @@ extern int mlt_property_anim_set_int( mlt_property self, int value, double fps, locale_t locale, int position, int length, mlt_keyframe_type keyframe_type ); extern int mlt_property_anim_set_string( mlt_property self, const char *value, double fps, locale_t locale, int position, int length ); extern mlt_animation mlt_property_get_animation( mlt_property self ); +extern int mlt_property_is_anim(mlt_property self); extern int mlt_property_set_rect( mlt_property self, mlt_rect value ); extern mlt_rect mlt_property_get_rect( mlt_property self, locale_t locale ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/framework/mlt_tractor.c new/mlt-7.4.0/src/framework/mlt_tractor.c --- old/mlt-7.2.0/src/framework/mlt_tractor.c 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/framework/mlt_tractor.c 2021-12-19 22:07:55.000000000 +0100 @@ -3,7 +3,7 @@ * \brief tractor service class * \see mlt_tractor_s * - * Copyright (C) 2003-2018 Meltytech, LLC + * Copyright (C) 2003-2021 Meltytech, LLC * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -378,6 +378,7 @@ mlt_properties_set_int( properties, "progressive", mlt_properties_get_int( frame_properties, "progressive" ) ); mlt_properties_set_int( properties, "distort", mlt_properties_get_int( frame_properties, "distort" ) ); mlt_properties_set_int( properties, "colorspace", mlt_properties_get_int( frame_properties, "colorspace" ) ); + mlt_properties_set_int( properties, "full_luma", mlt_properties_get_int( frame_properties, "full_luma" ) ); mlt_properties_set_int( properties, "force_full_luma", mlt_properties_get_int( frame_properties, "force_full_luma" ) ); mlt_properties_set_int( properties, "top_field_first", mlt_properties_get_int( frame_properties, "top_field_first" ) ); mlt_properties_set( properties, "color_trc", mlt_properties_get( frame_properties, "color_trc" ) ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/framework/mlt_version.h new/mlt-7.4.0/src/framework/mlt_version.h --- old/mlt-7.2.0/src/framework/mlt_version.h 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/framework/mlt_version.h 2021-12-19 22:07:55.000000000 +0100 @@ -27,7 +27,7 @@ #define MLT_STRINGIZE(s) MLT_STRINGIZE2(s) #define LIBMLT_VERSION_MAJOR 7 -#define LIBMLT_VERSION_MINOR 2 +#define LIBMLT_VERSION_MINOR 4 #define LIBMLT_VERSION_REVISION 0 #define LIBMLT_VERSION_INT ((LIBMLT_VERSION_MAJOR<<16)+(LIBMLT_VERSION_MINOR<<8)+LIBMLT_VERSION_REVISION) #define LIBMLT_VERSION MLT_STRINGIZE(LIBMLT_VERSION_MAJOR.LIBMLT_VERSION_MINOR.LIBMLT_VERSION_REVISION) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/mlt++/MltFilter.cpp new/mlt-7.4.0/src/mlt++/MltFilter.cpp --- old/mlt-7.2.0/src/mlt++/MltFilter.cpp 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/mlt++/MltFilter.cpp 2021-12-19 22:07:55.000000000 +0100 @@ -1,6 +1,6 @@ /** * MltFilter.cpp - MLT Wrapper - * Copyright (C) 2004-2019 Meltytech, LLC + * Copyright (C) 2004-2021 Meltytech, LLC * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -86,6 +86,11 @@ inc_ref( ); } +Filter::Filter(Filter *filter) + : Filter(filter? filter->get_filter() : nullptr) +{ +} + Filter::~Filter( ) { mlt_filter_close( instance ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/mlt++/MltFilter.h new/mlt-7.4.0/src/mlt++/MltFilter.h --- old/mlt-7.2.0/src/mlt++/MltFilter.h 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/mlt++/MltFilter.h 2021-12-19 22:07:55.000000000 +0100 @@ -1,6 +1,6 @@ /** * MltFilter.h - MLT Wrapper - * Copyright (C) 2004-2019 Meltytech, LLC + * Copyright (C) 2004-2021 Meltytech, LLC * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -44,6 +44,7 @@ Filter( Filter &filter ); Filter( const Filter &filter ); Filter( mlt_filter filter ); + Filter( Filter *filter ); virtual ~Filter( ); Filter& operator=( const Filter &filter ); virtual mlt_filter get_filter( ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/mlt++/MltFilteredConsumer.cpp new/mlt-7.4.0/src/mlt++/MltFilteredConsumer.cpp --- old/mlt-7.2.0/src/mlt++/MltFilteredConsumer.cpp 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/mlt++/MltFilteredConsumer.cpp 2021-12-19 22:07:55.000000000 +0100 @@ -103,7 +103,7 @@ Service *producer = it->producer( ); Service *consumer = it->consumer( ); consumer->connect_producer( *producer ); - Service dummy( NULL ); + Service dummy; it->connect_producer( dummy ); if ( first->get_service( ) == it->get_service( ) ) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/mlt++/MltLink.cpp new/mlt-7.4.0/src/mlt++/MltLink.cpp --- old/mlt-7.2.0/src/mlt++/MltLink.cpp 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/mlt++/MltLink.cpp 2021-12-19 22:07:55.000000000 +0100 @@ -1,6 +1,6 @@ /** * MltLink.cpp - MLT Wrapper - * Copyright (C) 2020 Meltytech, LLC + * Copyright (C) 2020-2021 Meltytech, LLC * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -60,6 +60,43 @@ } } +Link::Link(Link *link) + : Link(link? link->get_link() : nullptr) +{ +} + +Link::Link(Service &link) + : instance(nullptr) +{ + if (link.type() == mlt_service_link_type) { + instance = (mlt_link) link.get_service(); + inc_ref(); + } +} + +Link::Link(Link &link) +{ + if (link.type() == mlt_service_link_type) { + instance = (mlt_link) link.get_service(); + inc_ref(); + } +} + +Link::Link(const Link &link) + : Link(const_cast<Link&>(link)) +{ +} + +Link &Link::operator=(const Link &link) +{ + if (this != &link) { + mlt_link_close(instance); + instance = link.instance; + inc_ref(); + } + return *this; +} + Link::~Link( ) { mlt_link_close( instance ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/mlt++/MltLink.h new/mlt-7.4.0/src/mlt++/MltLink.h --- old/mlt-7.2.0/src/mlt++/MltLink.h 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/mlt++/MltLink.h 2021-12-19 22:07:55.000000000 +0100 @@ -1,6 +1,6 @@ /** * MltLink.h - MLT Wrapper - * Copyright (C) 2020 Meltytech, LLC + * Copyright (C) 2020-2021 Meltytech, LLC * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -39,6 +39,11 @@ Link( ); Link( mlt_link link ); Link( const char* id, const char* service = NULL ); + Link( Link *link ); + Link( Service &link ); + Link( Link &link ); + Link( const Link &link ); + Link& operator=( const Link &link ); virtual ~Link( ); virtual mlt_link get_link( ); mlt_producer get_producer( ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/mlt++/MltProperties.cpp new/mlt-7.4.0/src/mlt++/MltProperties.cpp --- old/mlt-7.2.0/src/mlt++/MltProperties.cpp 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/mlt++/MltProperties.cpp 2021-12-19 22:07:55.000000000 +0100 @@ -432,6 +432,11 @@ return new Animation( mlt_properties_get_animation( get_properties(), name ) ); } +bool Properties::is_anim(const char *name) +{ + return mlt_properties_is_anim(get_properties(), name); +} + int Properties::set( const char *name, Properties& properties ) { return mlt_properties_set_properties( get_properties(), name, properties.get_properties() ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/mlt++/MltProperties.h new/mlt-7.4.0/src/mlt++/MltProperties.h --- old/mlt-7.2.0/src/mlt++/MltProperties.h 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/mlt++/MltProperties.h 2021-12-19 22:07:55.000000000 +0100 @@ -123,6 +123,7 @@ mlt_rect anim_get_rect( const char *name, int position, int length = 0 ); mlt_animation get_animation( const char *name ); Animation* get_anim( const char *name ); + bool is_anim(const char *name); int set( const char *name, Properties& properties ); Properties* get_props( const char *name ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/mlt++/MltService.cpp new/mlt-7.4.0/src/mlt++/MltService.cpp --- old/mlt-7.2.0/src/mlt++/MltService.cpp 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/mlt++/MltService.cpp 2021-12-19 22:07:55.000000000 +0100 @@ -48,6 +48,11 @@ inc_ref( ); } +Service::Service(Service *service) + : Service(service? service->get_service() : nullptr) +{ +} + Service::~Service( ) { mlt_service_close( instance ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/mlt++/MltService.h new/mlt-7.4.0/src/mlt++/MltService.h --- old/mlt-7.2.0/src/mlt++/MltService.h 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/mlt++/MltService.h 2021-12-19 22:07:55.000000000 +0100 @@ -1,6 +1,6 @@ /** * MltService.h - MLT Wrapper - * Copyright (C) 2004-2019 Meltytech, LLC + * Copyright (C) 2004-2021 Meltytech, LLC * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -43,6 +43,7 @@ Service( Service &service ); Service( const Service &service ); Service( mlt_service service ); + Service( Service *service ); virtual ~Service( ); Service& operator=( const Service &service ); virtual mlt_service get_service( ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/mlt++/mlt++.vers new/mlt-7.4.0/src/mlt++/mlt++.vers --- old/mlt-7.2.0/src/mlt++/mlt++.vers 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/mlt++/mlt++.vers 2021-12-19 22:07:55.000000000 +0100 @@ -694,3 +694,17 @@ "Mlt::Properties::get_props_at(int)"; }; } MLTPP_7.0.0; + +MLT_7.4.0 { + global: + extern "C++" { + "Mlt::Properties::is_anim(char const*)"; + "Mlt::Filter::Filter(Mlt::Filter*)"; + "Mlt::Link::Link(Mlt::Link*)"; + "Mlt::Link::Link(Mlt::Service&)"; + "Mlt::Link::Link(Mlt::Link&)"; + "Mlt::Link::Link(Mlt::Link const&)"; + "Mlt::Link::operator=(Mlt::Link const&)"; + "Mlt::Service::Service(Mlt::Service*)"; + }; +} MLTPP_7.1.0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/modules/avformat/factory.c new/mlt-7.4.0/src/modules/avformat/factory.c --- old/mlt-7.2.0/src/modules/avformat/factory.c 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/modules/avformat/factory.c 2021-12-19 22:07:55.000000000 +0100 @@ -225,6 +225,15 @@ mlt_properties_set( p, "type", "integer" ); mlt_properties_set( p, "format", "constant" ); break; + case AV_OPT_TYPE_COLOR: + mlt_properties_set( p, "type", "color" ); + if ( opt->default_val.str ) { + size_t len = strlen( opt->default_val.str ) + 3; + char* quoted = malloc( len ); + snprintf( quoted, len, "'%s'", opt->default_val.str ); + mlt_properties_set( p, "default", quoted ); + free( quoted ); + } default: mlt_properties_set( p, "type", "string" ); break; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/modules/avformat/filter_avfilter.c new/mlt-7.4.0/src/modules/avformat/filter_avfilter.c --- old/mlt-7.2.0/src/modules/avformat/filter_avfilter.c 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/modules/avformat/filter_avfilter.c 2021-12-19 22:07:55.000000000 +0100 @@ -58,22 +58,27 @@ int reset; } private_data; -static void property_changed( mlt_service owner, mlt_filter filter, mlt_event_data event_data ) +#if LIBAVUTIL_VERSION_INT >= ((56<<16)+(35<<8)+101) +static int animatable_avoption(const AVOption *opt) +{ + return opt && (opt->flags & AV_OPT_FLAG_RUNTIME_PARAM) && opt->type != AV_OPT_TYPE_COLOR; +} +#endif + +static void property_changed(mlt_service owner, mlt_filter filter, mlt_event_data event_data) { const char *name = mlt_event_data_to_string(event_data); - if( name && strncmp( PARAM_PREFIX, name, PARAM_PREFIX_LEN ) == 0 ) { + if (name && strncmp(PARAM_PREFIX, name, PARAM_PREFIX_LEN) == 0) { private_data* pdata = (private_data*)filter->child; - if( pdata->avfilter ) - { - const AVOption *opt = NULL; - while( ( opt = av_opt_next( &pdata->avfilter->priv_class, opt ) ) ) - { - if( !strcmp( opt->name, name + PARAM_PREFIX_LEN ) ) - { - pdata->reset = 1; - break; - } - } + if (pdata->avfilter_ctx) { + mlt_service_lock(MLT_FILTER_SERVICE(filter)); + const AVOption *opt = av_opt_find( pdata->avfilter_ctx->priv, name + PARAM_PREFIX_LEN, 0, 0, 0 ); +#if LIBAVUTIL_VERSION_INT >= ((56<<16)+(35<<8)+101) + pdata->reset = opt && !(animatable_avoption(opt) && mlt_properties_is_anim(MLT_FILTER_PROPERTIES(filter), name)); +#else + pdata->reset = opt && !mlt_properties_is_anim(MLT_FILTER_PROPERTIES(filter), name); +#endif + mlt_service_unlock(MLT_FILTER_SERVICE(filter)); } } } @@ -133,7 +138,11 @@ { const AVOption *opt = av_opt_find( pdata->avfilter_ctx->priv, param_name + PARAM_PREFIX_LEN, 0, 0, 0 ); const char* value = mlt_properties_get_value( filter_properties, i ); - if( opt && value ) +#if LIBAVUTIL_VERSION_INT >= ((56<<16)+(35<<8)+101) + if (opt && !(animatable_avoption(opt) && mlt_properties_is_anim(filter_properties, param_name))) +#else + if (opt && !mlt_properties_is_anim(filter_properties, param_name)) +#endif { if (scale != 1.0) { double scale2 = mlt_properties_get_double(scale_map, opt->name); @@ -150,6 +159,44 @@ } } +static void send_avformat_commands(mlt_filter filter, mlt_frame frame, private_data* pdata, double scale) +{ +#if LIBAVUTIL_VERSION_INT >= ((56<<16)+(35<<8)+101) + mlt_properties prop = MLT_FILTER_PROPERTIES(filter); + mlt_position position = mlt_filter_get_position( filter, frame ); + int length = mlt_filter_get_length2( filter, frame ); + mlt_properties scale_map = mlt_properties_get_data(prop, "_resolution_scale", NULL); + int count = mlt_properties_count(prop); + int i; + + for (i = 0; i < count; i++) + { + char *name = mlt_properties_get_name(prop, i); + if (!strncmp(name, PARAM_PREFIX, PARAM_PREFIX_LEN)) + { + const AVOption *opt = av_opt_find( pdata->avfilter_ctx->priv, name + PARAM_PREFIX_LEN, 0, 0, 0 ); + if (animatable_avoption(opt) && mlt_properties_is_anim(prop, name)) { + double x = mlt_properties_anim_get_double(prop, name, position, length); + if (scale != 1.0) { + double scale2 = mlt_properties_get_double(scale_map, opt->name); + if (scale2 != 0.0) { + x *= scale * scale2; + } + } + mlt_properties_set_double(prop, "_avfilter_temp", x); + char *new_val = mlt_properties_get(prop, "_avfilter_temp"); + char *cur_val = NULL; + av_opt_get(pdata->avfilter_ctx->priv, name + PARAM_PREFIX_LEN, AV_OPT_SEARCH_CHILDREN, (uint8_t **)&cur_val); + if (new_val && cur_val && strcmp(new_val, cur_val)) { + avfilter_graph_send_command(pdata->avfilter_graph, pdata->avfilter->name, name + PARAM_PREFIX_LEN, new_val, NULL, 0, 0); + } + av_free(cur_val); + } + } + } +#endif +} + static void init_audio_filtergraph( mlt_filter filter, mlt_audio_format format, int frequency, int channels ) { private_data* pdata = (private_data*)filter->child; @@ -625,6 +672,7 @@ (uint8_t*)*buffer, bufsize ); } + send_avformat_commands(filter, frame, pdata, 1.0); // Run the frame through the filter graph ret = av_buffersrc_add_frame( pdata->avbuffsrc_ctx, pdata->avinframe ); @@ -692,9 +740,10 @@ mlt_service_lock( MLT_FILTER_SERVICE( filter ) ); + double scale = mlt_profile_scale_width(profile, *width); + if( pdata->reset || pdata->format != *format || pdata->width != *width || pdata->height != *height ) { - double scale = mlt_profile_scale_width(profile, *width); init_image_filtergraph( filter, *format, *width, *height, scale ); pdata->reset = 0; } @@ -769,6 +818,7 @@ dst += pdata->avinframe->linesize[0]; } } + send_avformat_commands(filter, frame, pdata, scale); // Run the frame through the filter graph ret = av_buffersrc_add_frame( pdata->avbuffsrc_ctx, pdata->avinframe ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/modules/avformat/producer_avformat.c new/mlt-7.4.0/src/modules/avformat/producer_avformat.c --- old/mlt-7.2.0/src/modules/avformat/producer_avformat.c 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/modules/avformat/producer_avformat.c 2021-12-19 22:07:55.000000000 +0100 @@ -305,23 +305,27 @@ #include <libavutil/display.h> -static double get_rotation(AVStream *st) +static double get_rotation(mlt_properties properties, AVStream *st) { - AVDictionaryEntry *rotate_tag = av_dict_get( st->metadata, "rotate", NULL, 0 ); - uint8_t* displaymatrix = av_stream_get_side_data( st, AV_PKT_DATA_DISPLAYMATRIX, NULL); - double theta = 0; + AVDictionaryEntry *rotate_tag = av_dict_get(st->metadata, "rotate", NULL, 0); + int has_rotate_metadata = rotate_tag && *rotate_tag->value && strcmp(rotate_tag->value, "0"); + uint8_t* displaymatrix = av_stream_get_side_data(st, AV_PKT_DATA_DISPLAYMATRIX, NULL); + double theta = mlt_properties_get_double(properties, "rotate"); + int has_mlt_rotate = !!mlt_properties_get(properties, "rotate"); - if ( rotate_tag && *rotate_tag->value && strcmp( rotate_tag->value, "0" ) ) - { + if (has_rotate_metadata && !has_mlt_rotate) { char *tail; - theta = strtod( rotate_tag->value, &tail ); - if ( *tail ) + theta = strtod(rotate_tag->value, &tail); + if (*tail) { // invalid theta = 0; + has_rotate_metadata = 0; + } + } + if (displaymatrix && !has_rotate_metadata && !has_mlt_rotate) { + theta = -av_display_rotation_get((int32_t*) displaymatrix); } - if ( displaymatrix && !theta ) - theta = -av_display_rotation_get( (int32_t*) displaymatrix ); - theta -= 360 * floor( theta/360 + 0.9/360 ); + theta -= 360 * floor(theta/360 + 0.9/360); return theta; } @@ -413,7 +417,7 @@ snprintf( key, sizeof(key), "meta.media.%u.codec.height", i ); mlt_properties_set_int( meta_media, key, codec_params->height ); snprintf( key, sizeof(key), "meta.media.%u.codec.rotate", i ); - mlt_properties_set_int( meta_media, key, get_rotation(context->streams[i]) ); + mlt_properties_set_int( meta_media, key, get_rotation(NULL, context->streams[i]) ); // snprintf( key, sizeof(key), "meta.media.%u.codec.frame_rate", i ); // AVRational frame_rate = { codec_context->time_base.den, codec_context->time_base.num * codec_context->ticks_per_frame }; // mlt_properties_set_double( meta_media, key, av_q2d( frame_rate ) ); @@ -933,7 +937,7 @@ if (self->video_index != -1) { self->autorotate = !mlt_properties_get(properties, "autorotate") || mlt_properties_get_int(properties, "autorotate"); if (!test_open && self->autorotate && !self->vfilter_graph) { - double theta = get_rotation(self->video_format->streams[self->video_index]); + double theta = get_rotation(properties, self->video_format->streams[self->video_index]); if (fabs(theta - 90) < 1.0) { error = ( setup_video_filters(self) < 0 ); @@ -1548,7 +1552,7 @@ static void set_image_size( producer_avformat self, int *width, int *height ) { double dar = mlt_profile_dar( mlt_service_profile( MLT_PRODUCER_SERVICE(self->parent) ) ); - double theta = self->autorotate? get_rotation( self->video_format->streams[self->video_index] ) : 0.0; + double theta = self->autorotate? get_rotation( MLT_PRODUCER_PROPERTIES(self->parent), self->video_format->streams[self->video_index] ) : 0.0; if ( fabs(theta - 90.0) < 1.0 || fabs(theta - 270.0) < 1.0 ) { *height = self->video_codec->width; @@ -1772,12 +1776,12 @@ else { int ret = av_read_frame( context, &self->pkt ); - if ( ret >= 0 && !self->video_seekable && self->pkt.stream_index == self->audio_index ) - { + if ( ret >= 0 && !self->video_seekable && self->pkt.stream_index == self->audio_index ) { mlt_deque_push_back( self->apackets, av_packet_clone( &self->pkt ) ); - } - else if ( ret < 0 ) - { + } else if (ret == AVERROR(EAGAIN)) { + pthread_mutex_unlock( &self->packets_mutex ); + continue; + } else if ( ret < 0 && ret != AVERROR(EAGAIN) ) { if ( ret == AVERROR_EOF ) { self->pkt.stream_index = self->video_index; @@ -2380,7 +2384,7 @@ // Set the width and height double dar = mlt_profile_dar( mlt_service_profile( MLT_PRODUCER_SERVICE( producer ) ) ); - double theta = self->autorotate? get_rotation( self->video_format->streams[index] ) : 0.0; + double theta = self->autorotate? get_rotation( properties, self->video_format->streams[index] ) : 0.0; if ( fabs(theta - 90.0) < 1.0 || fabs(theta - 270.0) < 1.0 ) { // Workaround 1088 encodings missing cropping info. @@ -2732,12 +2736,13 @@ else { ret = av_read_frame( context, &pkt ); - if ( ret >= 0 && !self->seekable && pkt.stream_index == self->video_index ) - { + if ( ret >= 0 && !self->seekable && pkt.stream_index == self->video_index ) { mlt_deque_push_back( self->vpackets, av_packet_clone(&pkt) ); - } - else if ( ret < 0 ) - { + } else if (ret == AVERROR(EAGAIN)) { + ret = 0; + pthread_mutex_unlock( &self->packets_mutex ); + continue; + } else if ( ret < 0 ) { mlt_producer producer = self->parent; mlt_properties properties = MLT_PRODUCER_PROPERTIES( producer ); if ( ret != AVERROR_EOF ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/modules/avformat/producer_avformat.yml new/mlt-7.4.0/src/modules/avformat/producer_avformat.yml --- old/mlt-7.2.0/src/modules/avformat/producer_avformat.yml 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/modules/avformat/producer_avformat.yml 2021-12-19 22:07:55.000000000 +0100 @@ -235,3 +235,12 @@ Whether to automatically compensate image orientation if the file is tagged with appropriate metadata and this resource has video/images. default: 1 + + - identifier: rotate + title: Rotation Override + description: > + While there is automatic rotation for orientation, some files are missing + the metadata for it. This provides an override. It can only rotate by a + multiple of 90 degrees. + type: integer + unit: degrees diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/modules/core/link_timeremap.c new/mlt-7.4.0/src/modules/core/link_timeremap.c --- old/mlt-7.2.0/src/modules/core/link_timeremap.c 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/modules/core/link_timeremap.c 2021-12-19 22:07:55.000000000 +0100 @@ -62,15 +62,7 @@ // Validate the request *channels = *channels <= 0 ? 2 : *channels; - int src_frequency = mlt_properties_get_int( MLT_FRAME_PROPERTIES( frame ), "audio_frequency" ); - if ( src_frequency > 0 ) - { - *frequency = src_frequency; - } - else if ( *frequency <= 0 ) - { - *frequency = 48000; - } + *frequency = *frequency <= 0 ? 48000 : *frequency; if ( source_speed < 0.1 || source_speed > 10 ) { @@ -84,6 +76,12 @@ return 0; } + int src_frequency = mlt_properties_get_int( MLT_FRAME_PROPERTIES( frame ), "audio_frequency" ); + if ( src_frequency > 0 ) + { + *frequency = src_frequency; + } + // Calculate the samples to get from the input frames int link_sample_count = mlt_audio_calculate_frame_samples( link_fps, *frequency, mlt_frame_get_position( frame ) ); int sample_count = lrint( (double)link_sample_count * source_speed ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/modules/core/transition_matte.c new/mlt-7.4.0/src/modules/core/transition_matte.c --- old/mlt-7.2.0/src/modules/core/transition_matte.c 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/modules/core/transition_matte.c 2021-12-19 22:07:55.000000000 +0100 @@ -180,22 +180,17 @@ // Get the image from the a frame mlt_frame_get_image( b_frame, &image_b, format, &width_b, &height_b, 1 ); - alpha_a = mlt_frame_get_alpha( a_frame ); - if ( !alpha_a ) - { - int size = width_a * height_a; - alpha_a = mlt_pool_alloc( size ); - memset( alpha_a, 255, size ); - mlt_frame_set_alpha( a_frame, alpha_a, size, mlt_pool_release ); - } - // copy data - copy_Y_to_A_scaled_luma - ( - alpha_a, width_a, image_b, width_b * 2, - (width_a > width_b)?width_b:width_a, - (height_a > height_b)?height_b:height_a - ); + // Create the alpha channel based on the b_image dimensions + int alpha_width = MIN(width_a, width_b); + int alpha_height = MIN(height_a, height_b); + int size = alpha_width * alpha_height; + alpha_a = mlt_pool_alloc( size ); + memset( alpha_a, 255, size ); + mlt_frame_set_alpha( a_frame, alpha_a, size, mlt_pool_release ); + + // Copy luma from image_b to a_frame's new alpha channel + copy_Y_to_A_scaled_luma(alpha_a, width_a, image_b, width_b * 2, alpha_width, alpha_height); // Extract the a_frame image info *width = mlt_properties_get_int( a_props, "width" ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/modules/decklink/consumer_decklink.yml new/mlt-7.4.0/src/modules/decklink/consumer_decklink.yml --- old/mlt-7.2.0/src/modules/decklink/consumer_decklink.yml 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/modules/decklink/consumer_decklink.yml 2021-12-19 22:07:55.000000000 +0100 @@ -1,4 +1,4 @@ -schema_version: 0.1 +schema_version: 0.2 type: consumer identifier: decklink title: Blackmagic Design DeckLink Output @@ -101,3 +101,12 @@ maximum: 1 default: 0 widget: checkbox + + - identifier: terminate_on_pause + title: Stop automatically + type: boolean + description: > + Whether to stop playback at the end of the producer or when playback + is paused. + default: 0 + widget: checkbox diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/modules/jackrack/plugin_mgr.c new/mlt-7.4.0/src/modules/jackrack/plugin_mgr.c --- old/mlt-7.2.0/src/modules/jackrack/plugin_mgr.c 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/modules/jackrack/plugin_mgr.c 2021-12-19 22:07:55.000000000 +0100 @@ -201,7 +201,13 @@ if (S_ISDIR (info.st_mode)) plugin_mgr_get_dir_plugins (plugin_mgr, file_name); else - plugin_mgr_get_object_file_plugins (plugin_mgr, file_name); + { + char * ext = strrchr(file_name, '.'); + if (ext && (strcmp(ext, ".so") == 0 || strcmp(ext, ".dll") == 0 || strcmp(ext, ".dylib") == 0)) + { + plugin_mgr_get_object_file_plugins (plugin_mgr, file_name); + } + } g_free (file_name); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/modules/oldfilm/filter_oldfilm.c new/mlt-7.4.0/src/modules/oldfilm/filter_oldfilm.c --- old/mlt-7.2.0/src/modules/oldfilm/filter_oldfilm.c 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/modules/oldfilm/filter_oldfilm.c 2021-12-19 22:07:55.000000000 +0100 @@ -81,7 +81,7 @@ if ( delta ) { mlt_profile profile = mlt_service_profile(MLT_FILTER_SERVICE(filter)); delta *= mlt_profile_scale_width(profile, *width); - diffpic = rand() % delta * 2 - delta; + diffpic = rand() % MAX(delta, 1) * 2 - delta; } int brightdelta = 0; if (( bdu + bdd ) != 0 ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/modules/sdl/CMakeLists.txt new/mlt-7.4.0/src/modules/sdl/CMakeLists.txt --- old/mlt-7.2.0/src/modules/sdl/CMakeLists.txt 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/modules/sdl/CMakeLists.txt 2021-12-19 22:07:55.000000000 +0100 @@ -10,6 +10,12 @@ target_link_libraries(mltsdl PRIVATE mlt m Threads::Threads PkgConfig::sdl) +if(APPLE) + target_link_libraries(mltsdl PRIVATE objc "-framework Foundation") +elseif(UNIX) + target_link_libraries(mltsdl PRIVATE X11) +endif() + set_target_properties(mltsdl PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${MLT_MODULE_OUTPUT_DIRECTORY}") install(TARGETS mltsdl LIBRARY DESTINATION ${MLT_INSTALL_MODULE_DIR}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/modules/sdl/consumer_sdl.yml new/mlt-7.4.0/src/modules/sdl/consumer_sdl.yml --- old/mlt-7.2.0/src/modules/sdl/consumer_sdl.yml 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/modules/sdl/consumer_sdl.yml 2021-12-19 22:07:55.000000000 +0100 @@ -1,4 +1,4 @@ -schema_version: 0.1 +schema_version: 7.0 type: consumer identifier: sdl title: SDL Fast YUV @@ -13,48 +13,56 @@ description: > Simple DirectMedia Layer audio and video output module. parameters: - - identifier: argument - title: Video Standard + - identifier: resolution + title: Resolution type: string description: The size of the window as WxH pixels. + argument: yes required: no + - identifier: volume title: Volume type: float description: Audio level factor. mutable: yes + - identifier: video_off title: Video off - type: integer - description: If 1, disable video output + type: boolean + description: Disable video output mutable: yes - minimum: 0 - maximum: 1 default: 0 widget: checkbox + - identifier: audio_off title: Audio off - type: integer - description: If 1, disable audio output + type: boolean + description: Disable audio output mutable: yes - minimum: 0 - maximum: 1 default: 0 widget: checkbox + - identifier: audio_buffer title: Audio buffer type: integer - description: Size of the sdl audio buffer. + description: Size of the SDL audio buffer. mutable: yes default: 2048 minimum: 128 + - identifier: scrub_audio title: Audio scrubbing - type: integer - description: If enabled, sound is played even when the speed is not normal. + type: boolean + description: Play sound even when the speed is not normal. mutable: yes - minimum: 0 - maximum: 1 default: 1 widget: checkbox + - identifier: terminate_on_pause + title: Stop automatically + type: boolean + description: > + Whether to stop playback at the end of the producer or when playback + is paused. + default: 0 + widget: checkbox diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/modules/sdl2/consumer_sdl2.yml new/mlt-7.4.0/src/modules/sdl2/consumer_sdl2.yml --- old/mlt-7.2.0/src/modules/sdl2/consumer_sdl2.yml 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/modules/sdl2/consumer_sdl2.yml 2021-12-19 22:07:55.000000000 +0100 @@ -57,3 +57,12 @@ mutable: yes default: 1 widget: checkbox + + - identifier: terminate_on_pause + title: Stop automatically + type: boolean + description: > + Whether to stop playback at the end of the producer or when playback + is paused. + default: 0 + widget: checkbox diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/modules/xml/filter_gpstext.c new/mlt-7.4.0/src/modules/xml/filter_gpstext.c --- old/mlt-7.2.0/src/modules/xml/filter_gpstext.c 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/modules/xml/filter_gpstext.c 2021-12-19 22:07:55.000000000 +0100 @@ -144,6 +144,8 @@ return x/1000.0; else if (strstr(format, "mi") || strstr(format, "mile")) return x*0.00062137; + else if (strstr(format, "nm") || strstr(format, "nautical")) + return x*0.0005399568; else if (strstr(format, "ft") || strstr(format, "feet")) return x*3.2808399; return x; @@ -160,6 +162,8 @@ return x; else if (strstr(format, "mi") || strstr(format, "mi/h") || strstr(format, "mile")) return x*2.23693629; + else if (strstr(format, "kn") || strstr(format, "nm/h") || strstr(format, "knots")) + return x*1.94384449; else if (strstr(format, "ft") || strstr(format, "ft/s") || strstr(format, "feet")) return x*3.2808399; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/modules/xml/filter_gpstext.yml new/mlt-7.4.0/src/modules/xml/filter_gpstext.yml --- old/mlt-7.2.0/src/modules/xml/filter_gpstext.yml 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/modules/xml/filter_gpstext.yml 2021-12-19 22:07:55.000000000 +0100 @@ -46,8 +46,8 @@ only the time in 12-hour format, offset by 1 hour. Speed and distance keywords may include an extra format keyword to convert the value to metric/imperial units. Default is meters and km/h respectively. - Supported formats, distance: m|meter, km|kilometer*, mi|mile*, ft|feet; - speed: ms|m/s|meter, km|km/h|kilo, mi|mi/h|mile, ft|ft/s|feet. + Supported formats, distance: m|meter, km|kilometer*, mi|mile*, ft|feet, nm|nautical*; + speed: ms|m/s|meter, km|km/h|kilo, mi|mi/h|mile, ft|ft/s|feet, kn|nm/h|knots. Computed values are calculated since begining of GPS file or since "gps_processing_start_time" property, if set. The # may be escaped with "\". @@ -118,7 +118,7 @@ - identifier: speed_multiplier title: Speed multiplier - type: double + type: float description: > If the video file is a timelapse (or slow motion), use this value to set the speed up/slow down ratio. @@ -131,7 +131,7 @@ - identifier: updates_per_second title: Updates per second - type: double + type: float description: > Controls how many times per second is the GPS text updated on video (interpolated). A value of 0 will only update text when a real gps point has been recorded. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mlt-7.2.0/src/tests/common.pri new/mlt-7.4.0/src/tests/common.pri --- old/mlt-7.2.0/src/tests/common.pri 2021-11-01 20:27:51.000000000 +0100 +++ new/mlt-7.4.0/src/tests/common.pri 2021-12-19 22:07:55.000000000 +0100 @@ -20,5 +20,5 @@ INSTALLS += target } else { CONFIG += link_pkgconfig - PKGCONFIG += mlt++ + PKGCONFIG += mlt++-7 }