From: Jaroslav Kysela Date: Sat, 9 Feb 2019 20:02:20 +0000 (+0100) Subject: dvb psi: fix hbbtv parsing, fixes #5531 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e4e96ff3f7e28eb71a3f077f59e8ba756c3470ab;p=thirdparty%2Ftvheadend.git dvb psi: fix hbbtv parsing, fixes #5531 --- diff --git a/src/input/mpegts/dvb_psi_hbbtv.c b/src/input/mpegts/dvb_psi_hbbtv.c index 89c06d00f..3eba6e253 100644 --- a/src/input/mpegts/dvb_psi_hbbtv.c +++ b/src/input/mpegts/dvb_psi_hbbtv.c @@ -84,7 +84,7 @@ dvb_psi_parse_hbbtv dlen -= 5; l3 -= 5; } - if (dlen < 3 || l3 < 3) goto dvberr; + if (dlen < 3) goto dvberr; flags = dptr[0]; tvhtrace(mt->mt_subsys, "%s: flags %02X prio %02X", mt->mt_name, dptr[0], dptr[1]); dptr += 2; diff --git a/src/input/mpegts/dvb_psi_pmt.c b/src/input/mpegts/dvb_psi_pmt.c index 9c59a5778..90d681a0c 100644 --- a/src/input/mpegts/dvb_psi_pmt.c +++ b/src/input/mpegts/dvb_psi_pmt.c @@ -216,6 +216,17 @@ psi_desc_teletext(elementary_set_t *set, const uint8_t *ptr, int size, return r; } +/** + * + */ +static void +dvb_pmt_hbbtv_table_remove(mpegts_mux_t *mm, elementary_stream_t *st) +{ + mpegts_table_t *mt = mpegts_table_find(mm, "hbbtv", st); + if (mt) + mpegts_table_destroy(mt); +} + /** * PMT parser, from ISO 13818-1 and ETSI EN 300 468 */ @@ -509,6 +520,8 @@ dvb_psi_parse_pmt } if(st->es_delete_me) { + if (st->es_type == SCT_HBBTV) + dvb_pmt_hbbtv_table_remove(mt->mt_mux, st); elementary_set_stream_destroy(set, st); update |= PMT_UPDATE_STREAM_DELETED; } @@ -547,14 +560,13 @@ int dvb_pmt_callback (mpegts_table_t *mt, const uint8_t *ptr, int len, int tableid) { - int r, sect, last, ver, restart, hbbtv = 0; + int r, sect, last, ver, restart; uint32_t update; uint16_t sid; mpegts_mux_t *mm = mt->mt_mux; mpegts_service_t *s; elementary_stream_t *es; mpegts_psi_table_state_t *st = NULL; - uint16_t hbbtv_pids[16]; /* Start */ if (len < 2) return -1; @@ -579,10 +591,6 @@ dvb_pmt_callback if (update) { if (s->s_status == SERVICE_RUNNING) elementary_set_filter_build(&s->s_components); - TAILQ_FOREACH(es, &s->s_components.set_filter, es_filter_link) { - if (hbbtv >= ARRAY_SIZE(hbbtv_pids)) break; - hbbtv_pids[hbbtv++] = es->es_pid; - } service_request_save((service_t*)s); } /* Only restart if something that our clients worry about did change */ @@ -607,11 +615,17 @@ dvb_pmt_callback if (update & (PMT_UPDATE_NEW_CA_STREAM|PMT_UPDATE_NEW_CAID| PMT_UPDATE_CAID_DELETED|PMT_UPDATE_CAID_PID)) descrambler_caid_changed((service_t *)s); - for (r = 0; r < hbbtv; r++) + + TAILQ_FOREACH(es, &s->s_components.set_filter, es_filter_link) { + if (es->es_type != SCT_HBBTV) continue; + tvhdebug(mt->mt_subsys, "%s: install hbbtv pid %04X (%d)", + mt->mt_name, es->es_pid, es->es_pid); mpegts_table_add(mm, DVB_HBBTV_BASE, DVB_HBBTV_MASK, - dvb_hbbtv_callback, NULL, "hbbtv", LS_TBL_BASE, - MT_CRC | MT_FULL | MT_QUICKREQ | MT_ONESHOT | MT_SCANSUBS, - hbbtv_pids[r], MPS_WEIGHT_HBBTV_SCAN); + dvb_hbbtv_callback, es, "hbbtv", LS_TBL_BASE, + MT_CRC | MT_FULL | MT_QUICKREQ | MT_ONESHOT, + es->es_pid, MPS_WEIGHT_HBBTV_SCAN); + + } #if ENABLE_LINUXDVB_CA dvbcam_pmt_data(s, ptr, len);