From: Jaroslav Kysela Date: Tue, 16 Jan 2018 09:16:03 +0000 (+0100) Subject: dvb psi: re-parse PAT every hour, issue #4847 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3180ef69d84394e2bfc4acfc76b86346005a28e3;p=thirdparty%2Ftvheadend.git dvb psi: re-parse PAT every hour, issue #4847 --- diff --git a/src/epggrab/module/eit.c b/src/epggrab/module/eit.c index f330e4534..32205b73d 100644 --- a/src/epggrab/module/eit.c +++ b/src/epggrab/module/eit.c @@ -967,7 +967,7 @@ _eit_callback /* Begin */ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, - tableid, extraid, 11, &st, §, &last, &ver); + tableid, extraid, 11, &st, §, &last, &ver, 0); if (r == 0) goto complete; if (r < 0) return r; if (tableid != 0x4e && r != 1) return r; diff --git a/src/epggrab/module/opentv.c b/src/epggrab/module/opentv.c index 09311cdfd..a6fec5d3c 100644 --- a/src/epggrab/module/opentv.c +++ b/src/epggrab/module/opentv.c @@ -594,7 +594,7 @@ opentv_table_callback /* Begin */ r = dvb_table_begin((mpegts_psi_table_t *)mt, buf, len, tableid, (uint64_t)(od.cid) << 32 | od.mjd, 7, - &st, §, &last, &ver); + &st, §, &last, &ver, 0); if (r != 1) goto done; /* Process */ diff --git a/src/epggrab/module/psip.c b/src/epggrab/module/psip.c index 351994a70..d07ccb22e 100644 --- a/src/epggrab/module/psip.c +++ b/src/epggrab/module/psip.c @@ -489,7 +489,7 @@ _psip_eit_callback /* Begin */ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, tableid, extraid, 7, - &st, §, &last, &ver); + &st, §, &last, &ver, 0); if (r == 0) goto complete; if (r != 1) return r; tvhtrace(LS_PSIP, "0x%04x: EIT tsid %04X (%s), ver %d", @@ -566,7 +566,7 @@ _psip_ett_callback /* Begin */ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, tableid, extraid, 7, - &st, §, &last, &ver); + &st, §, &last, &ver, 0); if (r == 0) goto complete; if (r != 1) return r; @@ -658,7 +658,7 @@ _psip_mgt_callback /* Begin */ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, tableid, extraid, 7, - &st, §, &last, &ver); + &st, §, &last, &ver, 0); if (r != 1) return r; /* # tables */ diff --git a/src/input/mpegts/dvb.h b/src/input/mpegts/dvb.h index e38c1569d..e3a5ff315 100644 --- a/src/input/mpegts/dvb.h +++ b/src/input/mpegts/dvb.h @@ -326,6 +326,7 @@ typedef struct mpegts_psi_table int mt_pid; + time_t mt_last_complete; int mt_complete; int mt_incomplete; uint8_t mt_finished; @@ -350,7 +351,8 @@ int dvb_table_end int dvb_table_begin (mpegts_psi_table_t *mt, const uint8_t *ptr, int len, int tableid, uint64_t extraid, int minlen, - mpegts_psi_table_state_t **st, int *sect, int *last, int *ver); + mpegts_psi_table_state_t **st, int *sect, int *last, int *ver, + time_t interval); void dvb_table_reset (mpegts_psi_table_t *mt); void dvb_table_release (mpegts_psi_table_t *mt); diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 25927b98e..7a0fb3946 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -945,7 +945,8 @@ dvb_pat_callback if (tableid != 0) return -1; tsid = extract_tsid(ptr); r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, - tableid, tsid, 5, &st, §, &last, &ver); + tableid, tsid, 5, &st, §, &last, &ver, + 3600); if (r != 1) return r; if (tsid == 0 && !mm->mm_tsid_accept_zero_value) { if (tvhlog_limit(&mm->mm_tsid_loglimit, 2)) { @@ -1034,7 +1035,7 @@ dvb_cat_callback /* Start */ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, - tableid, 0, 5, &st, §, &last, &ver); + tableid, 0, 5, &st, §, &last, &ver, 0); if (r != 1) return r; ptr += 5; len -= 5; @@ -1105,7 +1106,7 @@ dvb_pmt_callback if (len < 2) return -1; sid = extract_svcid(ptr); r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, - tableid, sid, 9, &st, §, &last, &ver); + tableid, sid, 9, &st, §, &last, &ver, 0); if (r != 1) return r; if (mm->mm_sid_filter > 0 && sid != mm->mm_sid_filter) goto end; @@ -1448,7 +1449,7 @@ dvb_nit_callback } r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, - tableid, nbid, 7, &st, §, &last, &ver); + tableid, nbid, 7, &st, §, &last, &ver, 0); if (r == 0) { if (tableid == 0x4A || tableid == DVB_FASTSCAN_NIT_BASE) { if (tableid == DVB_FASTSCAN_NIT_BASE && bq) { @@ -1773,7 +1774,7 @@ dvb_sdt_callback extraid = ((int)onid) << 16 | tsid; if (tableid != 0x42 && tableid != 0x46) return -1; r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, - tableid, extraid, 8, &st, §, &last, &ver); + tableid, extraid, 8, &st, §, &last, &ver, 0); if (r != 1) return r; /* ID */ @@ -1835,7 +1836,7 @@ atsc_vct_callback /* Begin */ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, - tableid, extraid, 7, &st, §, &last, &ver); + tableid, extraid, 7, &st, §, &last, &ver, 0); if (r != 1) return r; tvhdebug(mt->mt_subsys, "%s: tsid %04X (%d)", mt->mt_name, tsid, tsid); @@ -1948,7 +1949,7 @@ atsc_stt_callback /* Begin */ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, tableid, extraid, 7, - &st, §, &last, &ver); + &st, §, &last, &ver, 0); if (r != 1) return r; /* Parse fields */ @@ -2138,7 +2139,7 @@ dvb_fs_sdt_callback return 0; } r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, - tableid, nbid, 7, &st, §, &last, &ver); + tableid, nbid, 7, &st, §, &last, &ver, 0); if (r == 0) { mt->mt_working -= st->working; st->working = 0; diff --git a/src/input/mpegts/dvb_psi_hbbtv.c b/src/input/mpegts/dvb_psi_hbbtv.c index c9cb2ebb2..2fe5b11e9 100644 --- a/src/input/mpegts/dvb_psi_hbbtv.c +++ b/src/input/mpegts/dvb_psi_hbbtv.c @@ -55,7 +55,7 @@ ts_recv_hbbtv_cb(mpegts_psi_table_t *mt, const uint8_t *buf, int len) return; r = dvb_table_begin(mt, buf + 3, len - 3, - tableid, app_type, 5, &tst, §, &last, &ver); + tableid, app_type, 5, &tst, §, &last, &ver, 0); if (r != 1) return; p = buf; @@ -184,4 +184,4 @@ dvberr: htsmsg_destroy(apps); htsmsg_destroy(titles); return; -} +} \ No newline at end of file diff --git a/src/input/mpegts/dvb_psi_lib.c b/src/input/mpegts/dvb_psi_lib.c index c3dee5af2..ee125c9e2 100644 --- a/src/input/mpegts/dvb_psi_lib.c +++ b/src/input/mpegts/dvb_psi_lib.c @@ -287,7 +287,8 @@ int dvb_table_begin (mpegts_psi_table_t *mt, const uint8_t *ptr, int len, int tableid, uint64_t extraid, int minlen, - mpegts_psi_table_state_t **ret, int *sect, int *last, int *ver) + mpegts_psi_table_state_t **ret, int *sect, int *last, int *ver, + time_t interval) { mpegts_psi_table_state_t *st; uint32_t sa, sb; @@ -324,13 +325,21 @@ dvb_table_begin return -1; #endif + /* Inverval check */ + if (interval && mt->mt_last_complete && + mt->mt_last_complete + interval > gclk()) { + tvhtrace(mt->mt_subsys, "%s: time interval exceeded, restart", mt->mt_name); + goto restart; + } + /* New version */ if (st->version != *ver) { + tvhtrace(mt->mt_subsys, "%s: new version, restart", mt->mt_name); +restart: if (st->complete == 2) mt->mt_complete--; if (st->complete) mt->mt_incomplete++; - tvhtrace(mt->mt_subsys, "%s: new version, restart", mt->mt_name); mpegts_table_state_reset(mt, st, *last); st->version = *ver; } @@ -357,6 +366,9 @@ dvb_table_begin } } + if (mt->mt_last_complete == 0) + mt->mt_last_complete = gclk(); + tvhlog_hexdump(mt->mt_subsys, ptr, len); return 1; @@ -370,6 +382,7 @@ dvb_table_reset(mpegts_psi_table_t *mt) tvhtrace(mt->mt_subsys, "%s: pid %02X complete reset", mt->mt_name, mt->mt_pid); mt->mt_incomplete = 0; mt->mt_complete = 0; + mt->mt_last_complete = 0; while ((st = RB_FIRST(&mt->mt_state)) != NULL) { RB_REMOVE(&mt->mt_state, st, link); free(st); diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index ef3ec3ae5..8fdfb7a83 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -684,7 +684,7 @@ mpegts_input_cat_pass_callback /* Start */ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, - tableid, 0, 5, &st, §, &last, &ver); + tableid, 0, 5, &st, §, &last, &ver, 0); if (r != 1) return r; ptr += 5; len -= 5;