From: Jaroslav Kysela Date: Mon, 27 Jun 2016 12:51:51 +0000 (+0200) Subject: mpegts mux: add 'accept zero value for TSID' option, fixes #3877 X-Git-Tag: v4.2.1~410 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=631b6b5e3a575e44392cf8df6d2f8c0e49179279;p=thirdparty%2Ftvheadend.git mpegts mux: add 'accept zero value for TSID' option, fixes #3877 --- diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 9062d50b8..a12bafc27 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -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; diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 28b1ecd42..0b8f64add 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -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, §, &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)", diff --git a/src/input/mpegts/iptv/iptv.c b/src/input/mpegts/iptv/iptv.c index 5b0f73099..1ff3db061 100644 --- a/src/input/mpegts/iptv/iptv.c +++ b/src/input/mpegts/iptv/iptv.c @@ -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", diff --git a/src/input/mpegts/iptv/iptv_auto.c b/src/input/mpegts/iptv/iptv_auto.c index edca3342f..f193c3765 100644 --- a/src/input/mpegts/iptv/iptv_auto.c +++ b/src/input/mpegts/iptv/iptv_auto.c @@ -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); diff --git a/src/input/mpegts/iptv/iptv_private.h b/src/input/mpegts/iptv/iptv_private.h index d2c5a61c8..78f939993 100644 --- a/src/input/mpegts/iptv/iptv_private.h +++ b/src/input/mpegts/iptv/iptv_private.h @@ -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 */ }; diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index c3d23cbed..1b72710dd 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -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", diff --git a/src/input/mpegts/tsfile/tsfile.c b/src/input/mpegts/tsfile/tsfile.c index a19ce7369..d5e7a90c9 100644 --- a/src/input/mpegts/tsfile/tsfile.c +++ b/src/input/mpegts/tsfile/tsfile.c @@ -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)