From: Jaroslav Kysela Date: Sun, 11 Feb 2018 16:34:56 +0000 (+0100) Subject: dvb psi: parse first table bugfix X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1c128496126e3884ef1cf44ff15d662b6c375deb;p=thirdparty%2Ftvheadend.git dvb psi: parse first table bugfix --- diff --git a/src/input/mpegts/dvb.h b/src/input/mpegts/dvb.h index 5fe624275..317dff8df 100644 --- a/src/input/mpegts/dvb.h +++ b/src/input/mpegts/dvb.h @@ -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]; diff --git a/src/input/mpegts/dvb_psi_lib.c b/src/input/mpegts/dvb_psi_lib.c index 348f71e54..ce181601e 100644 --- a/src/input/mpegts/dvb_psi_lib.c +++ b/src/input/mpegts/dvb_psi_lib.c @@ -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? */