/* 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;
/* 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 */
/* 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",
/* 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;
/* 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 */
int mt_pid;
+ time_t mt_last_complete;
int mt_complete;
int mt_incomplete;
uint8_t mt_finished;
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);
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)) {
/* 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;
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;
}
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) {
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 */
/* 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);
/* 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 */
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;
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;
htsmsg_destroy(apps);
htsmsg_destroy(titles);
return;
-}
+}
\ No newline at end of file
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;
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;
}
}
}
+ if (mt->mt_last_complete == 0)
+ mt->mt_last_complete = gclk();
+
tvhlog_hexdump(mt->mt_subsys, ptr, len);
return 1;
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);
/* 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;