]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
iptv auto network: m3u - add support for #EXTVLCOPT:program= lines
authorJaroslav Kysela <perex@perex.cz>
Mon, 22 May 2017 15:44:47 +0000 (17:44 +0200)
committerJaroslav Kysela <perex@perex.cz>
Tue, 23 May 2017 08:05:57 +0000 (10:05 +0200)
src/input/mpegts.h
src/input/mpegts/dvb_psi.c
src/input/mpegts/iptv/iptv_auto.c
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_service.c
src/misc/m3u.c

index 6d0158510af4880153c611a7b7c68e2ad1c04303..7c918256f146fe1a7c9678a2d408588c02e4e6cf 100644 (file)
@@ -529,6 +529,7 @@ struct mpegts_mux
   char *mm_charset;
   int   mm_pmt_ac3;
   int   mm_eit_tsid_nocheck;
+  int   mm_sid_filter;
 
   /*
    * TSDEBUG
index 8d61585422a8e970adf333679257f4aa71dcf349..41f49b7a25c1c23952b2bd7accb35477ec6bfd16 100644 (file)
@@ -1034,6 +1034,8 @@ dvb_pmt_callback
 
   /* Start */
   sid = ptr[0] << 8 | ptr[1];
+  if (mm->mm_sid_filter > 0 && sid != mm->mm_sid_filter)
+    goto end;
   r   = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
                         tableid, sid, 9, &st, &sect, &last, &ver);
   if (r != 1) return r;
@@ -1061,6 +1063,7 @@ dvb_pmt_callback
 #endif
 
   /* Finish */
+end:
   return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
 }
 
index f17ca0a3d6b477cfd001d57a5d84103401f45e3f..f6745a638555eb8a07ca5532649ba7feb2e7f1f5 100644 (file)
@@ -82,7 +82,7 @@ iptv_auto_network_process_m3u_item(iptv_network_t *in,
   http_arg_t *ra1, *ra2, *ra2_next;
   htsbuf_queue_t q;
   size_t l;
-  int64_t chnum2;
+  int64_t chnum2, vlcprog;
   const char *url, *name, *logo, *epgid, *tags;
   char url2[512], custom[512], name2[128], buf[32], *n;
 
@@ -281,6 +281,10 @@ skip_url:
     htsmsg_add_s32(conf, "epg", epgcfg);
   if (in->in_tsid_accept_zero_value)
     htsmsg_add_s32(conf, "tsid_zero", 1);
+  if (!htsmsg_get_s64(item, "vlc-program", &vlcprog) &&
+      vlcprog > 1 && vlcprog < 8191)
+    htsmsg_add_s32(conf, "sid_filter", vlcprog);
+
   im = iptv_mux_create0(in, NULL, conf);
   htsmsg_destroy(conf);
 
index ff48c91c854461c25b042d3136f6c2d55c73faa8..49c4c693da4b2baa34772c022b4600a615e00bee 100644 (file)
@@ -674,6 +674,14 @@ const idclass_t mpegts_mux_class =
       .off      = offsetof(mpegts_mux_t, mm_eit_tsid_nocheck),
       .opts     = PO_HIDDEN | PO_EXPERT
     },
+    {
+      .type     = PT_BOOL,
+      .id       = "sid_filter",
+      .name     = N_("Service ID"),
+      .desc     = N_("Use only this service ID, filter out others."),
+      .off      = offsetof(mpegts_mux_t, mm_sid_filter),
+      .opts     = PO_HIDDEN | PO_EXPERT
+    },
     {}
   }
 };
index f4f9153b5547e1c558ffddf760d7c1234cdb0a5a..37af4b59b3562126b2c9f876449034b0574c7ab4 100644 (file)
@@ -841,6 +841,9 @@ mpegts_service_find
   /* Validate */
   lock_assert(&global_lock);
 
+  if (mm->mm_sid_filter > 0 && sid != mm->mm_sid_filter)
+    return NULL;
+
   /* Find existing service */
   LIST_FOREACH(s, &mm->mm_services, s_dvb_mux_link) {
     if (s->s_dvb_service_id == sid) {
index a31631a228511a6adc735fd967cd9b111117a9d3..c0af7e8fedbff2dad74193bf6d2f740dba490c31 100644 (file)
@@ -180,9 +180,9 @@ htsmsg_t *parse_m3u
         free(y);
       }
       continue;
-    } else if (strncmp(data, "#EXT-X-VERSION", 14) == 0) {
-      htsmsg_add_s64(m, "version", strtoll(data + 14, NULL, 10));
-      data = until_eol(data + 14);
+    } else if (strncmp(data, "#EXT-X-VERSION:", 15) == 0) {
+      htsmsg_add_s64(m, "version", strtoll(data + 15, NULL, 10));
+      data = until_eol(data + 15);
       continue;
     } else if (strncmp(data, "#EXT-X-MEDIA-SEQUENCE:", 22) == 0) {
       htsmsg_add_s64(m, "media-sequence", strtoll(data + 22, NULL, 10));
@@ -235,6 +235,9 @@ multi:
       htsmsg_add_bool(m, "x-endlist", 1);
       data = until_eol(data + 14);
       continue;
+    } else if (strncmp(data, "#EXTVLCOPT:program=", 19) == 0) {
+      htsmsg_add_s64(m, "vlc-program", strtoll(data + 19, NULL, 10));
+      data = until_eol(data + 19);
     } else if (strncmp(data, "#EXT", 4) == 0) {
       data = until_eol(data + 4);
       continue;