From a5fc48daa61b37d37706c2badbf16aaa5c947f13 Mon Sep 17 00:00:00 2001 From: wangguangyue <896659682@qq.com> Date: Wed, 11 Dec 2024 13:49:21 +0800 Subject: [PATCH] try-fix: https://github.com/mltframework/mlt/issues/1058 --- src/framework/mlt_field.c | 12 +++++++++++- src/framework/mlt_service.c | 21 +++++++++++++++++++++ src/framework/mlt_service.h | 1 + 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/framework/mlt_field.c b/src/framework/mlt_field.c index d468c70e6..d040c38f7 100644 --- a/src/framework/mlt_field.c +++ b/src/framework/mlt_field.c @@ -240,7 +240,17 @@ void mlt_field_close(mlt_field self) void mlt_field_disconnect_service(mlt_field self, mlt_service service) { - mlt_service p = mlt_service_producer(service); + mlt_service p = NULL; + if(mlt_service_filter_type == mlt_service_identify(service)) + { + mlt_filter filter = MLT_FILTER(service); + int track = mlt_filter_get_track(filter); + p = mlt_service_peek_producer(service, track); + } + else + { + p = mlt_service_producer(service); + } mlt_service c = mlt_service_consumer(service); int i; switch (mlt_service_identify(c)) { diff --git a/src/framework/mlt_service.c b/src/framework/mlt_service.c index f9d65a27d..895d73ff9 100644 --- a/src/framework/mlt_service.c +++ b/src/framework/mlt_service.c @@ -421,6 +421,27 @@ mlt_service mlt_service_producer(mlt_service self) return self; } +/** Get the N-th connected producer. + * + * \public \memberof mlt_service_s + * \param self a service + * \param index which of potentially multiple producers to this service (0 based) + * \return the N-th producer + */ + +mlt_service mlt_service_peek_producer(mlt_service self, int index) +{ + mlt_service producer = NULL; + + // Get the service base + mlt_service_base *base = self->local; + + if (base->in != NULL && index < base->count) + producer = base->in[index]; + + return producer; +} + /** Associate a service to a consumer. * * Overwrites connection to any existing consumer. diff --git a/src/framework/mlt_service.h b/src/framework/mlt_service.h index 157f3c893..f3bc202a0 100644 --- a/src/framework/mlt_service.h +++ b/src/framework/mlt_service.h @@ -90,6 +90,7 @@ extern int mlt_service_get_frame(mlt_service self, mlt_frame_ptr frame, int inde extern mlt_properties mlt_service_properties(mlt_service self); extern mlt_service mlt_service_consumer(mlt_service self); extern mlt_service mlt_service_producer(mlt_service self); +extern mlt_service mlt_service_peek_producer(mlt_service self, int index); extern int mlt_service_attach(mlt_service self, mlt_filter filter); extern int mlt_service_detach(mlt_service self, mlt_filter filter); extern void mlt_service_apply_filters(mlt_service self, mlt_frame frame, int index);