]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts mux: fix the active mux check for IPTV - introduce warm mux callback
authorJaroslav Kysela <perex@perex.cz>
Mon, 18 Aug 2014 12:06:20 +0000 (14:06 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 18 Aug 2014 12:06:20 +0000 (14:06 +0200)
src/input/mpegts.h
src/input/mpegts/iptv/iptv.c
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_mux.c

index 720dca47af0787e679f4aa2d582cd7c29d849e08..5c942e14646fb4b102c9f3a5a595f008ba4def4f 100644 (file)
@@ -580,6 +580,7 @@ struct mpegts_input
   int  (*mi_get_weight)     (mpegts_input_t*, int flags);
   int  (*mi_get_priority)   (mpegts_input_t*, mpegts_mux_t *mm, int flags);
   int  (*mi_get_grace)      (mpegts_input_t*, mpegts_mux_t *mm);
+  int  (*mi_warm_mux)       (mpegts_input_t*,mpegts_mux_instance_t*);
   int  (*mi_start_mux)      (mpegts_input_t*,mpegts_mux_instance_t*);
   void (*mi_stop_mux)       (mpegts_input_t*,mpegts_mux_instance_t*);
   void (*mi_open_service)   (mpegts_input_t*,mpegts_service_t*,int first);
index b828d99e63db16dd0f4cd543c0f987ab48ca6135..53b616e54f50c95900b6f0957c72cd8c221657cd 100644 (file)
@@ -184,13 +184,9 @@ iptv_input_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
 }
 
 static int
-iptv_input_start_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi )
+iptv_input_warm_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi )
 {
-  int ret = SM_CODE_TUNING_FAILED;
   iptv_mux_t *im = (iptv_mux_t*)mmi->mmi_mux;
-  iptv_handler_t *ih;
-  char buf[256];
-  url_t url;
 
   /* Already active */
   if (im->mm_active)
@@ -214,6 +210,21 @@ iptv_input_start_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi )
     if (s)
       s->mmi_mux->mm_stop(s->mmi_mux, 1);
   }
+  return 0;
+}
+
+static int
+iptv_input_start_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi )
+{
+  int ret = SM_CODE_TUNING_FAILED;
+  iptv_mux_t *im = (iptv_mux_t*)mmi->mmi_mux;
+  iptv_handler_t *ih;
+  char buf[256];
+  url_t url;
+
+  /* Already active */
+  if (im->mm_active)
+    return 0;
 
   /* Parse URL */
   mpegts_mux_nice_name((mpegts_mux_t*)im, buf, sizeof(buf));
@@ -572,6 +583,7 @@ void iptv_init ( void )
   /* Init Input */
   mpegts_input_create0((mpegts_input_t*)iptv_input,
                        &iptv_input_class, NULL, NULL);
+  iptv_input->mi_warm_mux       = iptv_input_warm_mux;
   iptv_input->mi_start_mux      = iptv_input_start_mux;
   iptv_input->mi_stop_mux       = iptv_input_stop_mux;
   iptv_input->mi_is_free        = iptv_input_is_free;
index 2599cc473dbdfeac29b389dcb3736fe9cdf33885..f949063f01c150b8767e893e39c53242f75866ad 100644 (file)
@@ -266,6 +266,25 @@ mpegts_input_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
   return mi->mi_priority;
 }
 
+static int
+mpegts_input_warm_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi )
+{
+  mpegts_mux_instance_t *cur;
+
+  cur = LIST_FIRST(&mi->mi_mux_active);
+  if (cur != NULL) {
+    /* Already tuned */
+    if (mmi == cur)
+      return 0;
+
+    /* Stop current */
+    cur->mmi_mux->mm_stop(cur->mmi_mux, 1);
+  }
+  if (LIST_FIRST(&mi->mi_mux_active))
+    return SM_CODE_TUNING_FAILED;
+  return 0;
+}
+
 static int
 mpegts_input_start_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi )
 {
@@ -1033,6 +1052,7 @@ mpegts_input_create0
   mi->mi_is_free              = mpegts_input_is_free;
   mi->mi_get_weight           = mpegts_input_get_weight;
   mi->mi_get_priority         = mpegts_input_get_priority;
+  mi->mi_warm_mux             = mpegts_input_warm_mux;
   mi->mi_start_mux            = mpegts_input_start_mux;
   mi->mi_stop_mux             = mpegts_input_stop_mux;
   mi->mi_open_service         = mpegts_input_open_service;
index 9a6cb2b9e6fc992ddd3a511df64e9bd2da891ed3..ae8f7bb8fed3a3aea89e3d631726734827b30e7f 100644 (file)
@@ -96,7 +96,6 @@ mpegts_mux_instance_start
   int r;
   char buf[256], buf2[256];
   mpegts_mux_instance_t *mmi = *mmiptr;
-  mpegts_mux_instance_t *cur;
   mpegts_mux_t          * mm = mmi->mmi_mux;
   mpegts_input_t        * mi = mmi->mmi_input;
   mpegts_mux_nice_name(mm, buf, sizeof(buf));
@@ -109,20 +108,11 @@ mpegts_mux_instance_start
     return 0;
   }
 
-  cur = LIST_FIRST(&mi->mi_mux_active);
-  if (cur != NULL) {
-    /* Already tuned */
-    if (mmi == cur)
-      return 0;
-
-    /* Stop current */
-    cur->mmi_mux->mm_stop(cur->mmi_mux, 1);
-  }
-  assert(LIST_FIRST(&mi->mi_mux_active) == NULL);
-
   /* Start */
   mi->mi_display_name(mi, buf2, sizeof(buf2));
   tvhinfo("mpegts", "%s - tuning on %s", buf, buf2);
+  r = mi->mi_warm_mux(mi, mmi);
+  if (r) return r;
   r = mi->mi_start_mux(mi, mmi);
   if (r) return r;