From: Jaroslav Kysela Date: Wed, 27 May 2015 14:43:32 +0000 (+0200) Subject: mpegts: another fix for linked inputs X-Git-Tag: v4.2.1~2442 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0b9cbdb54eea7b1811a7c5d1551a462f38e4626a;p=thirdparty%2Ftvheadend.git mpegts: another fix for linked inputs --- diff --git a/src/input/mpegts.h b/src/input/mpegts.h index f3c437880..011dc5948 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -830,7 +830,7 @@ mpegts_service_t *mpegts_mux_find_service(mpegts_mux_t *ms, uint16_t sid); void mpegts_mux_instance_delete ( tvh_input_instance_t *tii ); int mpegts_mux_instance_start - ( mpegts_mux_instance_t **mmiptr ); + ( mpegts_mux_instance_t **mmiptr, service_t *t ); int mpegts_mux_instance_weight ( mpegts_mux_instance_t *mmi ); @@ -847,7 +847,7 @@ int mpegts_mux_subscribe(mpegts_mux_t *mm, mpegts_input_t *mi, const char *name, int weight, int flags); void mpegts_mux_unsubscribe_by_name(mpegts_mux_t *mm, const char *name); -void mpegts_mux_unsubscribe_linked(mpegts_input_t *mi); +void mpegts_mux_unsubscribe_linked(mpegts_input_t *mi, service_t *t); void mpegts_mux_scan_done ( mpegts_mux_t *mm, const char *buf, int res ); diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index 58d0d8556..cbb5d94be 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -152,9 +152,9 @@ mpegts_input_class_linked_set ( void *self, const void *val ) if (mi2) { free(mi2->mi_linked); mi2->mi_linked = NULL; - mpegts_mux_unsubscribe_linked(mi2); + mpegts_mux_unsubscribe_linked(mi2, NULL); } - mpegts_mux_unsubscribe_linked(mi); + mpegts_mux_unsubscribe_linked(mi, NULL); if (val && ((char *)val)[0]) { mi->mi_linked = strdup((char *)val); mi2 = mpegts_input_find((char *)val); diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 6e6805709..b41445391 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -200,7 +200,7 @@ fatal: void mpegts_mux_unsubscribe_linked - ( mpegts_input_t *mi ) + ( mpegts_input_t *mi, service_t *t ) { th_subscription_t *ths, *ths_next; @@ -209,7 +209,8 @@ mpegts_mux_unsubscribe_linked for (ths = LIST_FIRST(&subscriptions); ths; ths = ths_next) { ths_next = LIST_NEXT(ths, ths_global_link); - if (ths->ths_source == (tvh_input_t *)mi && !strcmp(ths->ths_title, "keep")) + if (ths->ths_source == (tvh_input_t *)mi && !strcmp(ths->ths_title, "keep") && + ths->ths_service != t) subscription_unsubscribe(ths, 0); } } @@ -217,7 +218,7 @@ mpegts_mux_unsubscribe_linked int mpegts_mux_instance_start - ( mpegts_mux_instance_t **mmiptr ) + ( mpegts_mux_instance_t **mmiptr, service_t *t ) { int r; char buf[256], buf2[256]; @@ -244,7 +245,7 @@ mpegts_mux_instance_start tvhinfo("mpegts", "%s - tuning on %s", buf, buf2); if (mi->mi_linked) - mpegts_mux_unsubscribe_linked(mi); + mpegts_mux_unsubscribe_linked(mi, t); r = mi->mi_warm_mux(mi, mmi); if (r) return r; @@ -719,7 +720,7 @@ mpegts_mux_stop ( mpegts_mux_t *mm, int force, int reason ) if (mmi2 && !mpegts_mux_has_subscribers(mmi2->mmi_mux, buf2)) { s = mi2->mi_linked; mi2->mi_linked = NULL; - mpegts_mux_unsubscribe_linked(mi2); + mpegts_mux_unsubscribe_linked(mi2, NULL); mi2->mi_linked = s; } else { if (!force) { diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index cc3e6963b..35f2653a0 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -319,7 +319,7 @@ mpegts_service_start(service_t *t, int instance, int flags) return SM_CODE_UNDEFINED_ERROR; /* Start Mux */ - r = mpegts_mux_instance_start(&mmi); + r = mpegts_mux_instance_start(&mmi, t); /* Start */ if (!r) {