]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts mux: add 'accept zero value for TSID' option, fixes #3877
authorJaroslav Kysela <perex@perex.cz>
Mon, 27 Jun 2016 12:51:51 +0000 (14:51 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 27 Jun 2016 12:51:51 +0000 (14:51 +0200)
src/input/mpegts.h
src/input/mpegts/dvb_psi.c
src/input/mpegts/iptv/iptv.c
src/input/mpegts/iptv/iptv_auto.c
src/input/mpegts/iptv/iptv_private.h
src/input/mpegts/mpegts_mux.c
src/input/mpegts/tsfile/tsfile.c

index 9062d50b850304370f82f57412c4d655ff9e5d4d..a12bafc279a813ea58363438a4e7d53569dc050a 100644 (file)
@@ -430,6 +430,8 @@ struct mpegts_mux
   uint16_t                mm_onid;
   uint16_t                mm_tsid;
   int                     mm_tsid_checks;
+  int                     mm_tsid_accept_zero_value;
+  tvhlog_limit_t          mm_tsid_loglimit;
 
   int                     mm_update_pids_flag;
   mtimer_t                mm_update_pids_timer;
index 28b1ecd42f0680688cd98c11cd691d6368bc4d36..0b8f64add25121d91c7a3b4fd838d098ba2f0896 100644 (file)
@@ -865,6 +865,7 @@ dvb_pat_callback
   mpegts_mux_t             *mm  = mt->mt_mux;
   mpegts_psi_table_state_t *st  = NULL;
   mpegts_service_t *s;
+  char buf[256];
 
   /* Begin */
   if (tableid != 0) return -1;
@@ -872,13 +873,18 @@ dvb_pat_callback
   r    = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
                          tableid, tsid, 5, &st, &sect, &last, &ver);
   if (r != 1) return r;
-  if (tsid == 0) goto end;
+  if (tsid == 0 && !mm->mm_tsid_accept_zero_value) {
+    if (tvhlog_limit(&mm->mm_tsid_loglimit, 2)) {
+      mpegts_mux_nice_name(mm, buf, sizeof(buf));
+      tvhwarn("pat", "%s: TSID zero value detected, ignoring", buf);
+    }
+    goto end;
+  }
 
   /* Multiplex */
   tvhdebug("pat", "%p: tsid %04X (%d)", mm, tsid, tsid);
   if (mm->mm_tsid != MPEGTS_TSID_NONE) {
     if (mm->mm_tsid && mm->mm_tsid != tsid) {
-      char buf[256];
       if (++mm->mm_tsid_checks > 12) {
         mpegts_mux_nice_name(mm, buf, sizeof(buf));
         tvhwarn("pat", "%s: TSID change detected - old %04x (%d), new %04x (%d)",
index 5b0f73099f8fb77d2e4e3b9709a8b7141a3e670e..1ff3db061e39e3f8766991b80e140429bcfc1b3a 100644 (file)
@@ -866,6 +866,12 @@ const idclass_t iptv_auto_network_class = {
       .off      = offsetof(iptv_network_t, in_ssl_peer_verify),
       .opts     = PO_EXPERT
     },
+    {
+      .type     = PT_BOOL,
+      .id       = "tsid_zero",
+      .name     = N_("Accept zero value for TSID"),
+      .off      = offsetof(iptv_network_t, in_tsid_accept_zero_value),
+    },
     {
       .type     = PT_STR,
       .id       = "remove_args",
index edca3342f57cd124fa6779d03817be3c25f276c7..f193c3765f2af78fb1fa0b76d293bb9ca0b59761 100644 (file)
@@ -273,6 +273,8 @@ skip_url:
     htsmsg_add_str(conf, "iptv_hdr", custom);
   if (epgcfg >= 0)
     htsmsg_add_s32(conf, "epg", epgcfg);
+  if (in->in_tsid_accept_zero_value)
+    htsmsg_add_s32(conf, "tsid_zero", 1);
   im = iptv_mux_create0(in, NULL, conf);
   htsmsg_destroy(conf);
 
index d2c5a61c8c505b5fe70bf763410e6ecdf503a304..78f93999370e4ba6e0e0115060c76c70937cf383 100644 (file)
@@ -101,6 +101,7 @@ struct iptv_network
   char    *in_icon_url_sane;
   int      in_ssl_peer_verify;
   char    *in_remove_args;
+  int      in_tsid_accept_zero_value;
 
   void    *in_auto; /* private structure for auto-network */
 };
index c3d23cbed93c0206215366ef3a46af27276dabdf..1b72710dd67e398239de94ce9c3eda712df13d48 100644 (file)
@@ -651,6 +651,13 @@ const idclass_t mpegts_mux_class =
       .opts     = PO_RDONLY | PO_NOSAVE,
       .get      = mpegts_mux_class_get_num_chn,
     },
+    {
+       .type     = PT_BOOL,
+       .id       = "tsid_zero",
+       .name     = N_("Accept zero value for TSID"),
+       .off      = offsetof(mpegts_mux_t, mm_tsid_accept_zero_value),
+       .opts     = PO_ADVANCED
+    },
     {
       .type     = PT_INT,
       .id       = "pmt_06_ac3",
index a19ce7369c8b40ef0ed170a1945d763af4b86684..d5e7a90c93a3fbbf00db3d5c3d201fe7e653c70c 100644 (file)
@@ -142,6 +142,7 @@ void tsfile_add_file ( const char *path )
   
   /* Create logical instance */
   mm = tsfile_mux_create(uuid, tsfile_network);
+  mm->mm_tsid_accept_zero_value = 1;
   
   /* Create physical instance (for each tuner) */
   LIST_FOREACH(mi, &tsfile_inputs, tsi_link)