]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb psi: fix hbbtv parsing, fixes #5531
authorJaroslav Kysela <perex@perex.cz>
Sat, 9 Feb 2019 20:02:20 +0000 (21:02 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sat, 9 Feb 2019 20:03:09 +0000 (21:03 +0100)
src/input/mpegts/dvb_psi_hbbtv.c
src/input/mpegts/dvb_psi_pmt.c

index 89c06d00f97b74a085227bd8bebd9613811e4eb6..3eba6e25343251043068ab98798d4d4b56785fb1 100644 (file)
@@ -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;
index 9c59a5778096bb412847fea12d0dba6e47371897..90d681a0c1e5ea262478a13db622da2ead2f458b 100644 (file)
@@ -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);