* 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
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
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
{
* 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
{
// 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
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;
{
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;
}
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 )
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 )