]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
psi lib: do filtering more early
authorJaroslav Kysela <perex@perex.cz>
Sat, 1 Jul 2017 13:47:10 +0000 (15:47 +0200)
committerJaroslav Kysela <perex@perex.cz>
Sat, 1 Jul 2017 13:47:10 +0000 (15:47 +0200)
src/epggrab/module/eit.c
src/input/mpegts/dvb.h
src/input/mpegts/dvb_psi_lib.c
src/input/mpegts/mpegts_table.c
src/muxer/muxer_pass.c
src/satip/rtp.c
src/service.c

index d831873c00303cecab94ca07a8fc6bc61ae94d37..e41aaba1d8688ffd4e82d0349b4f6820e9f4f402 100644 (file)
@@ -849,7 +849,8 @@ static int _eit_start
 
   /* Freesat (3002/3003) */
   if (pid == 3003 && !strcmp("uk_freesat", m->id))
-    mpegts_table_add(dm, 0, 0, dvb_bat_callback, NULL, "bat", LS_TBL_BASE, MT_CRC, 3002, MPS_WEIGHT_EIT);
+    mpegts_table_add(dm, DVB_BAT_BASE, DVB_BAT_MASK, dvb_bat_callback, NULL,
+                     "bat", LS_TBL_BASE, MT_CRC, 3002, MPS_WEIGHT_EIT);
 
   /* Standard (0x12) */
   if (pid == 0) {
index 45b88b67e1658beae5894f9b3cc21110c36b6b5d..c5b147acc44be761125045d389ab43853241255f 100644 (file)
@@ -78,6 +78,9 @@ struct lang_str;
 #define DVB_TOT_BASE                  0x73
 #define DVB_TOT_MASK                  0xFF
 
+#define DVB_HBBTV_BASE                0x74
+#define DVB_HBBTV_MASK                0xFF
+
 #define DVB_FASTSCAN_NIT_BASE         0xBC
 #define DVB_FASTSCAN_SDT_BASE         0xBD
 #define DVB_FASTSCAN_MASK             0xFF
@@ -268,6 +271,8 @@ do {\
 
 typedef struct mpegts_psi_section
 {
+  uint8_t ps_table;  // SI table ID
+  uint8_t ps_mask;   // mask
   int8_t  ps_cc;
   int8_t  ps_cco;
   int     ps_offset;
@@ -337,7 +342,8 @@ typedef void (*mpegts_psi_parse_callback_t)
   ( mpegts_psi_table_t *, const uint8_t *buf, int len );
 
 void dvb_table_parse_init
-  ( mpegts_psi_table_t *mt, const char *name, int subsys, int pid, void *opaque );
+  ( mpegts_psi_table_t *mt, const char *name, int subsys, int pid,
+    uint8_t table, uint8_t mask, void *opaque );
 
 void dvb_table_parse_done ( mpegts_psi_table_t *mt);
 
index 56460ab469cbc0dcafbc81ac4d71c771d47c6d23..f72536c48fa8cac594e3d26679f61fd92ed06462 100644 (file)
@@ -76,13 +76,19 @@ mpegts_psi_section_reassemble0
     int len, int start, int crc,
     mpegts_psi_section_callback_t cb, void *opaque)
 {
-  uint8_t *p = mt->mt_sect.ps_data;
+
   int excess, tsize;
 
+  if(len <= 0)
+    return -1;
+
   if(start) {
     // Payload unit start indicator
     mt->mt_sect.ps_offset = 0;
-    mt->mt_sect.ps_lock = 1;
+    if((data[0] & mt->mt_sect.ps_mask) != mt->mt_sect.ps_table)
+      mt->mt_sect.ps_lock = 0;
+    else
+      mt->mt_sect.ps_lock = 1;
   }
 
   if(!mt->mt_sect.ps_lock)
@@ -389,7 +395,8 @@ dvb_table_release(mpegts_psi_table_t *mt)
  */
 
 void dvb_table_parse_init
-  ( mpegts_psi_table_t *mt, const char *name, int subsys, int pid, void *opaque )
+  ( mpegts_psi_table_t *mt, const char *name, int subsys, int pid,
+    uint8_t table, uint8_t mask, void *opaque )
 {
   memset(mt, 0, sizeof(*mt));
   mt->mt_name = strdup(name);
@@ -397,6 +404,8 @@ void dvb_table_parse_init
   mt->mt_opaque = opaque;
   mt->mt_pid = pid;
   mt->mt_sect.ps_cc = -1;
+  mt->mt_sect.ps_table = table;
+  mt->mt_sect.ps_mask = mask;
 }
 
 void dvb_table_parse_done( mpegts_psi_table_t *mt )
index 21314991508e779d0eebb2861c67128491865344..fe9ed23d7b6da82dffd4fc64a38b611a3f418801 100644 (file)
@@ -93,8 +93,7 @@ mpegts_table_dispatch
   tid = sec[0];
 
   /* Check table mask */
-  if((tid & mt->mt_mask) != mt->mt_table)
-    return;
+  assert((tid & mt->mt_mask) == mt->mt_table);
 
   len = ((sec[1] & 0x0f) << 8) | sec[2];
   crc_len = (mt->mt_flags & MT_CRC) ? 4 : 0;
@@ -236,6 +235,8 @@ mpegts_table_add
   mt->mt_mask       = mask;
   mt->mt_mux        = mm;
   mt->mt_sect.ps_cc = -1;
+  mt->mt_sect.ps_table = tableid;
+  mt->mt_sect.ps_mask = mask;
 
   /* Open table */
   if (pid < 0) {
index 852d7d30269eeb7f3853b04a5c1fa9e4ec61eb02..c6a82b8ff4561ef134a8682162a5be2ea2512f5f 100644 (file)
@@ -347,7 +347,8 @@ pass_muxer_reconfigure(muxer_t* m, const struct streaming_start *ss)
     pm->pm_ss = streaming_start_copy(ss);
 
     dvb_table_parse_done(&pm->pm_pmt);
-    dvb_table_parse_init(&pm->pm_pmt, "pass-pmt", LS_TBL_PASS, pm->pm_pmt_pid, pm);
+    dvb_table_parse_init(&pm->pm_pmt, "pass-pmt", LS_TBL_PASS, pm->pm_pmt_pid,
+                         DVB_PMT_BASE, DVB_PMT_MASK, pm);
   }
 
   return 0;
@@ -614,10 +615,14 @@ pass_muxer_create(const muxer_config_t *m_cfg)
   pm->m_destroy      = pass_muxer_destroy;
   pm->pm_fd          = -1;
 
-  dvb_table_parse_init(&pm->pm_pat, "pass-pat", LS_TBL_PASS, DVB_PAT_PID, pm);
-  dvb_table_parse_init(&pm->pm_pmt, "pass-pmt", LS_TBL_PASS, 100,         pm);
-  dvb_table_parse_init(&pm->pm_sdt, "pass-sdt", LS_TBL_PASS, DVB_SDT_PID, pm);
-  dvb_table_parse_init(&pm->pm_eit, "pass-eit", LS_TBL_PASS, DVB_EIT_PID, pm);
+  dvb_table_parse_init(&pm->pm_pat, "pass-pat", LS_TBL_PASS, DVB_PAT_PID,
+                       DVB_PAT_BASE, DVB_PAT_MASK, pm);
+  dvb_table_parse_init(&pm->pm_pmt, "pass-pmt", LS_TBL_PASS, 100,
+                       DVB_PMT_BASE, DVB_PMT_MASK, pm);
+  dvb_table_parse_init(&pm->pm_sdt, "pass-sdt", LS_TBL_PASS, DVB_SDT_PID,
+                       DVB_SDT_BASE, DVB_SDT_MASK, pm);
+  dvb_table_parse_init(&pm->pm_eit, "pass-eit", LS_TBL_PASS, DVB_EIT_PID,
+                       0, 0, pm);
 
   return (muxer_t *)pm;
 }
index b0e492b89c62552d94d311820c736fc88f46b86b..d7041c271e28e6f06a4c9fa3e5f611e4309c70e5 100644 (file)
@@ -554,7 +554,8 @@ void satip_rtp_update_pmt_pids(void *id, mpegts_apids_t *pmt_pids)
           break;
       if (!tbl) {
         tbl = calloc(1, sizeof(*tbl));
-        dvb_table_parse_init(&tbl->tbl, "satip-pmt", LS_TBL_SATIP, pid, rtp);
+        dvb_table_parse_init(&tbl->tbl, "satip-pmt", LS_TBL_SATIP, pid,
+                             DVB_PMT_BASE, DVB_PMT_MASK, rtp);
         tbl->pid = pid;
         TAILQ_INSERT_TAIL(&rtp->pmt_tables, tbl, link);
       }
index 48f6063fb30eeda2cab6dfa5b5e29b7ee7b2c6df..22b1171e535772281bbb7f6c35189652fc57e31b 100644 (file)
@@ -279,7 +279,8 @@ stream_init(elementary_stream_t *st)
   st->es_blank = 0;
 
   if (st->es_type == SCT_HBBTV && st->es_psi.mt_name == NULL)
-    dvb_table_parse_init(&st->es_psi, "hbbtv", LS_TS, st->es_pid, st);
+    dvb_table_parse_init(&st->es_psi, "hbbtv", LS_TS, st->es_pid,
+                         DVB_HBBTV_BASE, DVB_HBBTV_MASK, st);
 
   TAILQ_INIT(&st->es_backlog);
 }