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
 }

Reply via email to