]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb psi: parse first table bugfix
authorJaroslav Kysela <perex@perex.cz>
Sun, 11 Feb 2018 16:34:56 +0000 (17:34 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sun, 11 Feb 2018 16:39:36 +0000 (17:39 +0100)
src/input/mpegts/dvb.h
src/input/mpegts/dvb_psi_lib.c

index 5fe624275b54e69d3096236463558b32b050649a..317dff8df3b89d558ea01da3c2c828507be63f12 100644 (file)
@@ -287,6 +287,7 @@ do {\
  */
 
 #define MPEGTS_PSI_SECTION_SIZE 5000
+#define MPEGTS_PSI_VERSION_NONE 255
 
 typedef struct mpegts_psi_section
 {
@@ -307,6 +308,7 @@ typedef struct mpegts_psi_table_state
   int      tableid;
   uint64_t extraid;
   int      version;
+  int      last;
   int      complete;
   int      working;
   uint32_t sections[8];
index 348f71e5462bc5191fc152167ea478859411e519..ce181601eb47785ba52c45a4d9e595e0cbbd19a7 100644 (file)
@@ -201,13 +201,26 @@ mpegts_table_state_reset
   int i;
   mt->mt_finished = 0;
   st->complete = 0;
-  st->version = 0xff;  /* invalid */
+  st->version = MPEGTS_PSI_VERSION_NONE;
+  st->last = last;
   memset(st->sections, 0, sizeof(st->sections));
   for (i = 0; i < last / 32; i++)
     st->sections[i] = 0xFFFFFFFF;
   st->sections[last / 32] = 0xFFFFFFFF << (31 - (last % 32));
 }
 
+static void
+mpegts_table_state_restart
+  ( mpegts_psi_table_t *mt, mpegts_psi_table_state_t *st, int last, int ver )
+{
+  if (st->complete == 2)
+    mt->mt_complete--;
+  if (st->complete)
+    mt->mt_incomplete++;
+  mpegts_table_state_reset(mt, st, last);
+  st->version = ver;
+}
+
 static mpegts_psi_table_state_t *
 mpegts_table_state_find
   ( mpegts_psi_table_t *mt, int tableid, uint64_t extraid, int last )
@@ -290,7 +303,7 @@ dvb_table_begin
    mpegts_psi_table_state_t **ret, int *sect, int *last, int *ver,
    time_t interval)
 {
-  mpegts_psi_table_state_t *st;
+  mpegts_psi_table_state_t *st, *st2;
   uint32_t sa, sb;
 
   /* Not long enough */
@@ -329,20 +342,17 @@ dvb_table_begin
     if (interval && mt->mt_last_complete &&
       mt->mt_last_complete + interval < gclk()) {
       mt->mt_last_complete = 0;
-      tvhtrace(mt->mt_subsys, "%s:  time interval exceeded, restart", mt->mt_name);
-      goto restart;
+      tvhtrace(mt->mt_subsys, "%s:  time interval exceeded, complete restart", mt->mt_name);
+      RB_FOREACH(st2, &mt->mt_state, link)
+        if (st != st2)
+          mpegts_table_state_restart(mt, st2, st2->last, MPEGTS_PSI_VERSION_NONE);
+      mpegts_table_state_restart(mt, st, *last, *ver);
     }
 
     /* New version */
-    if (st->version != *ver) {
+    if (st->version != MPEGTS_PSI_VERSION_NONE && 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++;
-      mpegts_table_state_reset(mt, st, *last);
-      st->version = *ver;
+      mpegts_table_state_restart(mt, st, *last, *ver);
     }
 
     /* Complete? */