]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts tables: improve incomplete/complete counting
authorJaroslav Kysela <perex@perex.cz>
Wed, 9 Jul 2014 20:31:46 +0000 (22:31 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 9 Jul 2014 20:31:46 +0000 (22:31 +0200)
src/input/mpegts/dvb_psi.c

index 42512eb713cc67c5007f83950ea0391006112076..8a61a73279a3e73ba7bf5377d9df67f3db2400d9 100644 (file)
@@ -390,10 +390,6 @@ mpegts_table_state_reset
   ( mpegts_table_t *mt, mpegts_table_state_t *st, int last )
 {
   int i;
-  if (st->complete == 2) {
-    mt->mt_complete--;
-    mt->mt_incomplete++;
-  }
   mt->mt_finished = 0;
   st->complete = 0;
   st->version = 0xff;  /* invalid */
@@ -451,7 +447,7 @@ dvb_table_end
 {
   int sa, sb;
   uint32_t rem;
-  if (st) {
+  if (st && !st->complete) {
     assert(sect >= 0 && sect <= 255);
     sa = sect / 32;
     sb = sect % 32;
@@ -467,7 +463,8 @@ dvb_table_end
       mt->mt_incomplete--;
       return dvb_table_complete(mt);
     }
-  }
+  } else if (st)
+    return dvb_table_complete(mt);
   return 2;
 }
 
@@ -505,12 +502,15 @@ dvb_table_begin
     *ret = st = mpegts_table_state_find(mt, tableid, extraid, *last);
 
     /* New version */
-    if (st->complete &&
-        st->version != *ver) {
+    if (st->version != *ver) {
+      if (st->complete == 2)
+        mt->mt_complete--;
+      if (st->complete)
+        mt->mt_incomplete++;
       tvhtrace(mt->mt_name, "  new version, restart");
       mpegts_table_state_reset(mt, st, *last);
+      st->version = *ver;
     }
-    st->version = *ver;
 
     /* Complete? */
     if (st->complete) {
@@ -543,6 +543,8 @@ dvb_table_reset(mpegts_table_t *mt)
   mpegts_table_state_t *st;
 
   tvhtrace(mt->mt_name, "pid %02X complete reset", mt->mt_pid);
+  mt->mt_incomplete = 0;
+  mt->mt_complete   = 0;
   while ((st = RB_FIRST(&mt->mt_state)) != NULL) {
     RB_REMOVE(&mt->mt_state, st, link);
     free(st);