]> git.sesse.net Git - mlt/commitdiff
Merge https://github.com/pez4brian/mlt_2 into pez
authorDan Dennedy <dan@dennedy.org>
Sun, 22 Jan 2012 00:40:20 +0000 (16:40 -0800)
committerDan Dennedy <dan@dennedy.org>
Sun, 22 Jan 2012 00:40:20 +0000 (16:40 -0800)
src/framework/mlt_producer.h
src/framework/mlt_service.c
src/framework/mlt_service.h
src/modules/kdenlive/filter_freeze.c
src/modules/videostab/filter_videostab2.c

index 9a0400e0a7d494c34e404a286a43a8c6d2b95ff7..3ba4cacf6860f3fbaa28e809d13c8f85e6de8c76 100644 (file)
@@ -36,7 +36,7 @@
  * service network - that could be through synthesis or reading a stream.
  *
  * \extends mlt_service
- * \event \em producer-changed
+ * \event \em producer-changed either service-changed was fired or the timing of the producer changed
  * \properties \em mlt_type the name of the service subclass, e.g. mlt_producer
  * \properties \em mlt_service the name of a producer subclass
  * \properties \em _position the current position of the play head, relative to the in point
index dfaad57294ffbaccce771a0b2e119686ca8aefd4..3e6aa1a104831b0712105c97ac8edfd42d7f2dab 100644 (file)
@@ -521,6 +521,19 @@ static void mlt_service_filter_changed( mlt_service owner, mlt_service self )
        mlt_events_fire( MLT_SERVICE_PROPERTIES( self ), "service-changed", NULL );
 }
 
+/** The property-changed event handler.
+ *
+ * \private \memberof mlt_service_s
+ * \param owner ignored
+ * \param self the service on which the "property-changed" event is fired
+ * \param name the name of the property that changed
+ */
+
+static void mlt_service_filter_property_changed( mlt_service owner, mlt_service self, char *name )
+{
+    mlt_events_fire( MLT_SERVICE_PROPERTIES( self ), "property-changed", name, NULL );
+}
+
 /** Attach a filter.
  *
  * \public \memberof mlt_service_s
@@ -559,7 +572,7 @@ int mlt_service_attach( mlt_service self, mlt_filter filter )
                                mlt_events_fire( properties, "service-changed", NULL );
                                mlt_events_fire( props, "service-changed", NULL );
                                mlt_events_listen( props, self, "service-changed", ( mlt_listener )mlt_service_filter_changed );
-                               mlt_events_listen( props, self, "property-changed", ( mlt_listener )mlt_service_filter_changed );
+                               mlt_events_listen( props, self, "property-changed", ( mlt_listener )mlt_service_filter_property_changed );
                        }
                        else
                        {
index 0ba168608be699799cc58d7852571cb6270f96cc..6a29d59abbc18815f8c0d278ad1ce7cc21d6b27e 100644 (file)
@@ -39,7 +39,7 @@
  * connections a "service network," which is similar to what DirectShow calls
  * a filter graph or what gstreamer calls an element pipeline.
  *
- * \event \em service-changed
+ * \event \em service-changed a filter was attached or detached or a transition was connected or disconnected
  * \event \em property-changed
  * \properties \em mlt_type identifies the subclass
  * \properties \em _mlt_service_hidden a flag that indicates whether to hide the mlt_service
index 375205794da54301be3b78de65b8e366ddaf4b9c..e853c9040eae244f4e8e98152d234614d6a2c9a0 100755 (executable)
@@ -56,6 +56,12 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format
                {
                        // freeze_frame has not been fetched yet or is not useful, so fetch it and cache it.
                        mlt_producer producer = mlt_frame_get_original_producer(frame);
+
+                       // If requested freeze frame is out of the cutted producer, get parent
+                       if ( pos < mlt_producer_get_in( producer ) || pos > mlt_producer_get_out( producer ) )
+                       {
+                               producer = mlt_producer_cut_parent( producer );
+                       }
                        mlt_producer_seek( producer, pos );
 
                        // Get the frame
index b57d001d689717ff481ddfb43141b4c8a3451a74..a71e6064a76e2d60a3004e4d020894e9578d45f8 100644 (file)
@@ -76,8 +76,8 @@ static void serialize_vectors( videostab2_data* self, mlt_position length )
                mlt_geometry_close( g );
        }
 }
-
-Transform* deserialize_vectors( char *vectors, mlt_position length )
+// scale zoom implements the factor that the vetcors must be scaled since the vector is calulated for real with, now we need it for (scaled)width
+Transform* deserialize_vectors( char *vectors, mlt_position length ,float scale_zoom )
 {
        mlt_geometry g = mlt_geometry_init();
        Transform* tx=NULL;
@@ -92,10 +92,10 @@ Transform* deserialize_vectors( char *vectors, mlt_position length )
                {
                        mlt_geometry_fetch( g, &item, i );
                        Transform t;
-                       t.x=item.x;
-                       t.y=item.y;
+                       t.x=scale_zoom*item.x;
+                       t.y=scale_zoom*item.y;
                        t.alpha=item.w;
-                       t.zoom=item.h;
+                       t.zoom=scale_zoom*item.h;
                        t.extra=0;
                        tx[i]=t;
                }
@@ -173,6 +173,9 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format
                                        data->initialized = 2;
 
                                        int interp = 2;
+                                       float scale_zoom=1.0;
+                                       if (*width!=mlt_properties_get_int( MLT_FRAME_PROPERTIES( frame ), "real_width" ))
+                                               scale_zoom=(float)*width/(float)mlt_properties_get_int( MLT_FRAME_PROPERTIES( frame ), "real_width" );
                                        if ( strcmp( interps, "nearest" ) == 0 || strcmp( interps, "neighbor" ) == 0 )
                                                interp = 0;
                                        else if ( strcmp( interps, "tiles" ) == 0 || strcmp( interps, "fast_bilinear" ) == 0 )
@@ -195,7 +198,7 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format
                                        data->trans->optzoom = mlt_properties_get_int( MLT_FILTER_PROPERTIES(filter), "optzoom" );
                                        data->trans->sharpen = mlt_properties_get_double( MLT_FILTER_PROPERTIES(filter), "sharpen" );
 
-                                       transform_configure(data->trans,w,h,*format ,*image, deserialize_vectors(  vectors, length ),length);
+                                       transform_configure(data->trans,w,h,*format ,*image, deserialize_vectors(  vectors, length , scale_zoom ),length);
 
                                }
                                if ( data->initialized == 2 )