]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts: another fix for linked inputs
authorJaroslav Kysela <perex@perex.cz>
Wed, 27 May 2015 14:43:32 +0000 (16:43 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 27 May 2015 14:43:32 +0000 (16:43 +0200)
src/input/mpegts.h
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_service.c

index f3c4378806bce31e9bca2a4c9a725ebc6ff4e9ef..011dc5948b32d203ee68b7c22d44cdf3db6794da 100644 (file)
@@ -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 );
 
index 58d0d8556e52e791006a8c3b69c80985df256f86..cbb5d94be38de1aef68826557cbe9cd1cdf7146c 100644 (file)
@@ -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);
index 6e6805709ace24f33a3264642b12d19e69b62fc7..b41445391af7bcab7e7bc27b19cbae0251247b87 100644 (file)
@@ -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) {
index cc3e6963b8ddb8bfc7ea1c36df2a9343a208d2e6..35f2653a0d7f26566fbf2141a12e9f7b6f564bd6 100644 (file)
@@ -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) {