]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb psi: re-parse PAT every hour, issue #4847
authorJaroslav Kysela <perex@perex.cz>
Tue, 16 Jan 2018 09:16:03 +0000 (10:16 +0100)
committerJaroslav Kysela <perex@perex.cz>
Tue, 16 Jan 2018 09:16:03 +0000 (10:16 +0100)
src/epggrab/module/eit.c
src/epggrab/module/opentv.c
src/epggrab/module/psip.c
src/input/mpegts/dvb.h
src/input/mpegts/dvb_psi.c
src/input/mpegts/dvb_psi_hbbtv.c
src/input/mpegts/dvb_psi_lib.c
src/input/mpegts/mpegts_input.c

index f330e453494902cebbb0cb0fc72d6e5dcfc37428..32205b73dce6480e2f825adecc07fee5ff245134 100644 (file)
@@ -967,7 +967,7 @@ _eit_callback
 
   /* Begin */
   r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
-                      tableid, extraid, 11, &st, &sect, &last, &ver);
+                      tableid, extraid, 11, &st, &sect, &last, &ver, 0);
   if (r == 0) goto complete;
   if (r < 0) return r;
   if (tableid != 0x4e && r != 1) return r;
index 09311cdfdb2966afd1f14fe456bb3157418c338f..a6fec5d3c322eaf3ddd128237eda555c12c5ac41 100644 (file)
@@ -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, &sect, &last, &ver);
+                      &st, &sect, &last, &ver, 0);
   if (r != 1) goto done;
 
   /* Process */
index 351994a700c09adb45f8e7796e195584f5107569..d07ccb22e518e88096dbc23f6914f97fcaf7064f 100644 (file)
@@ -489,7 +489,7 @@ _psip_eit_callback
 
   /* Begin */
   r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, tableid, extraid, 7,
-                      &st, &sect, &last, &ver);
+                      &st, &sect, &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, &sect, &last, &ver);
+                      &st, &sect, &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, &sect, &last, &ver);
+                      &st, &sect, &last, &ver, 0);
   if (r != 1) return r;
 
   /* # tables */
index e38c1569d68abe35573b298e544284b2c97c97ca..e3a5ff315af5eccb428623ed254858ebc756dba3 100644 (file)
@@ -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);
 
index 25927b98eb716d5fa90f78a9c6da4299543dc7aa..7a0fb39463426fe20edfae68b57867769a1bf4eb 100644 (file)
@@ -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, &sect, &last, &ver);
+                         tableid, tsid, 5, &st, &sect, &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, &sect, &last, &ver);
+                      tableid, 0, 5, &st, &sect, &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, &sect, &last, &ver);
+                        tableid, sid, 9, &st, &sect, &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, &sect, &last, &ver);
+                      tableid, nbid, 7, &st, &sect, &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, &sect, &last, &ver);
+                      tableid, extraid, 8, &st, &sect, &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, &sect, &last, &ver);
+                      tableid, extraid, 7, &st, &sect, &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, &sect, &last, &ver);
+                      &st, &sect, &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, &sect, &last, &ver);
+                      tableid, nbid, 7, &st, &sect, &last, &ver, 0);
   if (r == 0) {
     mt->mt_working -= st->working;
     st->working = 0;
index c9cb2ebb256e89c90f902a4cf607ec62a6d675c3..2fe5b11e95f74cf8555d9b7a273fe5a2fc2b2d55 100644 (file)
@@ -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, &sect, &last, &ver);
+                      tableid, app_type, 5, &tst, &sect, &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
index c3dee5af28bd9bfe05327ba561aca58a4c3e8b11..ee125c9e2aab3e35a8fc7e3fd5f9705f975a0f82 100644 (file)
@@ -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);
index ef3ec3ae5d35b2ffe5a7fd63915ac6438bf5a8a3..8fdfb7a8350b29572022fd402b0f8982fd7f9795 100644 (file)
@@ -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, &sect, &last, &ver);
+                      tableid, 0, 5, &st, &sect, &last, &ver, 0);
   if (r != 1) return r;
   ptr += 5;
   len -= 5;