From 81894db60a0f5561d26b23ef0e5f2de1b31d5bf8 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 22 May 2017 17:44:47 +0200 Subject: [PATCH] iptv auto network: m3u - add support for #EXTVLCOPT:program= lines --- src/input/mpegts.h | 1 + src/input/mpegts/dvb_psi.c | 3 +++ src/input/mpegts/iptv/iptv_auto.c | 6 +++++- src/input/mpegts/mpegts_mux.c | 8 ++++++++ src/input/mpegts/mpegts_service.c | 3 +++ src/misc/m3u.c | 9 ++++++--- 6 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 6d0158510..7c918256f 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -529,6 +529,7 @@ struct mpegts_mux char *mm_charset; int mm_pmt_ac3; int mm_eit_tsid_nocheck; + int mm_sid_filter; /* * TSDEBUG diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 8d6158542..41f49b7a2 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -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, §, &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); } diff --git a/src/input/mpegts/iptv/iptv_auto.c b/src/input/mpegts/iptv/iptv_auto.c index f17ca0a3d..f6745a638 100644 --- a/src/input/mpegts/iptv/iptv_auto.c +++ b/src/input/mpegts/iptv/iptv_auto.c @@ -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); diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index ff48c91c8..49c4c693d 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -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 + }, {} } }; diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index f4f9153b5..37af4b59b 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -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) { diff --git a/src/misc/m3u.c b/src/misc/m3u.c index a31631a22..c0af7e8fe 100644 --- a/src/misc/m3u.c +++ b/src/misc/m3u.c @@ -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; -- 2.47.2