]> git.sesse.net Git - mlt/commitdiff
Add mlt_property_set_double_pos() and mlt_property_set_int_pos().
authorDan Dennedy <dan@dennedy.org>
Mon, 20 May 2013 03:09:30 +0000 (20:09 -0700)
committerDan Dennedy <dan@dennedy.org>
Fri, 31 May 2013 23:58:12 +0000 (16:58 -0700)
src/framework/mlt_property.c
src/framework/mlt_property.h
src/framework/mlt_types.h
src/tests/test_properties/test_properties.cpp

index e09959f36a88139d1f20558032680c612263fa05..fd1659dbf07cb90dffbcbd540cadf8ceb6b39f7b 100644 (file)
@@ -1046,3 +1046,67 @@ int mlt_property_get_int_pos( mlt_property self, double fps, locale_t locale, in
        }
        return result;
 }
+
+/** Set a property animation keyframe to a real number.
+ *
+ * \public \memberof mlt_property_s
+ * \param self a property
+ * \param value a double precision floating point value
+ * \return false if successful, true to indicate error
+ */
+
+int mlt_property_set_double_pos( mlt_property self, double value, double fps, locale_t locale,
+       mlt_keyframe_type keyframe_type, int position, int length )
+{
+       int result;
+       if ( ( self->types & mlt_prop_string ) && self->prop_string )
+       {
+               struct mlt_animation_item_s item;
+               item.property = mlt_property_init();
+               item.frame = position;
+               item.keyframe_type = keyframe_type;
+               mlt_property_set_double( item.property, value );
+
+               refresh_animation( self, fps, locale, length );
+               result = mlt_animation_insert( self->animation, &item );
+               mlt_animation_interpolate( self->animation );
+               mlt_property_close( item.property );
+       }
+       else
+       {
+               result = mlt_property_set_double( self, value );
+       }
+       return result;
+}
+
+/** Set a property animation keyframe to an integer value.
+ *
+ * \public \memberof mlt_property_s
+ * \param self a property
+ * \param value a double precision floating point value
+ * \return false if successful, true to indicate error
+ */
+
+int mlt_property_set_int_pos( mlt_property self, int value, double fps, locale_t locale,
+       mlt_keyframe_type keyframe_type, int position, int length )
+{
+       int result;
+       if ( ( self->types & mlt_prop_string ) && self->prop_string )
+       {
+               struct mlt_animation_item_s item;
+               item.property = mlt_property_init();
+               item.frame = position;
+               item.keyframe_type = keyframe_type;
+               mlt_property_set_int( item.property, value );
+
+               refresh_animation( self, fps, locale, length );
+               result = mlt_animation_insert( self->animation, &item );
+               mlt_animation_interpolate( self->animation );
+               mlt_property_close( item.property );
+       }
+       else
+       {
+               result = mlt_property_set_int( self, value );
+       }
+       return result;
+}
index 8df1d16530feadd42df420c38aa43a7d7cbb5273..07fe6631b3a5268e0db1e59b391183637e05ffc9 100644 (file)
@@ -54,9 +54,13 @@ extern void *mlt_property_get_data( mlt_property self, int *length );
 extern void mlt_property_close( mlt_property self );
 extern void mlt_property_pass( mlt_property self, mlt_property that );
 extern char *mlt_property_get_time( mlt_property self, mlt_time_format, double fps, locale_t );
-extern int mlt_property_interpolate(mlt_property self, mlt_property points[],
-                                     double progress, double fps, locale_t locale  , mlt_keyframe_type interp);
-extern double mlt_property_get_double_pos(mlt_property self, double fps, locale_t locale, int position, int length );
-extern int mlt_property_get_int_pos(mlt_property self, double fps, locale_t locale, int position, int length );
+extern int mlt_property_interpolate( mlt_property self, mlt_property points[],
+                                     double progress, double fps, locale_t locale, mlt_keyframe_type interp );
+extern double mlt_property_get_double_pos( mlt_property self, double fps, locale_t locale, int position, int length );
+extern int mlt_property_get_int_pos( mlt_property self, double fps, locale_t locale, int position, int length );
+extern int mlt_property_set_double_pos( mlt_property self, double value, double fps, locale_t locale,
+                                        mlt_keyframe_type keyframe_type, int position, int length );
+extern int mlt_property_set_int_pos( mlt_property self, int value, double fps, locale_t locale,
+                                     mlt_keyframe_type keyframe_type, int position, int length );
 
 #endif
index 5261051f21d0dac048a95354ef84a3e5963d398f..41e42c8d83e6b6bd477027a54e0559f3a1d48860 100644 (file)
@@ -78,9 +78,9 @@ mlt_time_format;
 /** Interpolation methods for animation keyframes */
 
 typedef enum {
-       mlt_keyframe_discrete, //< non-interpolated; value changes instantaneously at the key frame
-       mlt_keyframe_linear,   //< simple, constant pace from this key frame to the next
-       mlt_keyframe_smooth    //< eased pacing from this keyframe to the next using a Catmull-Rom spline
+       mlt_keyframe_discrete = 0, /**< non-interpolated; value changes instantaneously at the key frame */
+       mlt_keyframe_linear,       /**< simple, constant pace from this key frame to the next */
+       mlt_keyframe_smooth        /**< eased pacing from this keyframe to the next using a Catmull-Rom spline */
 }
 mlt_keyframe_type;
 
@@ -88,9 +88,9 @@ mlt_keyframe_type;
 
 typedef enum
 {
-       mlt_whence_relative_start /**< relative to the beginning */
-       mlt_whence_relative_current,/**< relative to the current position */
-       mlt_whence_relative_end     /**< relative to the end */
+       mlt_whence_relative_start = 0, /**< relative to the beginning */
+       mlt_whence_relative_current,   /**< relative to the current position */
+       mlt_whence_relative_end        /**< relative to the end */
 }
 mlt_whence;
 
@@ -98,7 +98,7 @@ mlt_whence;
 
 typedef enum
 {
-       invalid_type,               /**< invalid service */
+       invalid_type = 0,           /**< invalid service */
        unknown_type,               /**< unknown class */
        producer_type,              /**< Producer class */
        tractor_type,               /**< Tractor class */
index 1aac05cf9133bb476aaaee56f3eb3683f08ae561..d496e4c84cc35986a82d85b52277f6ee5d180372 100644 (file)
@@ -611,6 +611,44 @@ private Q_SLOTS:
         mlt_property_close(item.property);
         mlt_animation_close(a);
     }
+
+    void test_property_set_double_pos()
+    {
+        locale_t locale;
+#if defined(__linux__) || defined(__DARWIN__)
+        locale = newlocale( LC_NUMERIC_MASK, "POSIX", NULL );
+#endif
+        double fps = 25.0;
+        mlt_property p = mlt_property_init();
+        mlt_property_set_string(p, "10=100; 20=200");
+        mlt_property_set_double_pos(p, 1.5, fps, locale, mlt_keyframe_linear, 30, 100);
+        QCOMPARE(mlt_property_get_double(p, fps, locale), 10.0);
+        QCOMPARE(mlt_property_get_double_pos(p, fps, locale, 0, 100), 100.0);
+        QCOMPARE(mlt_property_get_double_pos(p, fps, locale, 15, 100), 150.0);
+        QCOMPARE(mlt_property_get_double_pos(p, fps, locale, 20, 100), 200.0);
+        QCOMPARE(mlt_property_get_double_pos(p, fps, locale, 25, 100), 100.75);
+        QCOMPARE(mlt_property_get_double_pos(p, fps, locale, 30, 100), 1.5);
+        mlt_property_close(p);
+    }
+
+    void test_property_set_int_pos()
+    {
+        locale_t locale;
+#if defined(__linux__) || defined(__DARWIN__)
+        locale = newlocale( LC_NUMERIC_MASK, "POSIX", NULL );
+#endif
+        double fps = 25.0;
+        mlt_property p = mlt_property_init();
+        mlt_property_set_string(p, "10=100; 20=200");
+        mlt_property_set_int_pos(p, 300, fps, locale, mlt_keyframe_linear, 30, 100);
+        QCOMPARE(mlt_property_get_int(p, fps, locale), 10);
+        QCOMPARE(mlt_property_get_int_pos(p, fps, locale, 0, 100), 100);
+        QCOMPARE(mlt_property_get_int_pos(p, fps, locale, 15, 100), 150);
+        QCOMPARE(mlt_property_get_int_pos(p, fps, locale, 20, 100), 200);
+        QCOMPARE(mlt_property_get_int_pos(p, fps, locale, 25, 100), 250);
+        QCOMPARE(mlt_property_get_int_pos(p, fps, locale, 30, 100), 300);
+        mlt_property_close(p);
+    }
 };
 
 QTEST_APPLESS_MAIN(TestProperties)