]> 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:47 +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

index b2dd2221ae00de533d8195d4897e8ff838e40d6d..e58943ea78810d5c07d79c66ba2c4e77962c34e6 100644 (file)
@@ -814,7 +814,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 a4217dba1d8e075e7cccc04ab9de7045c0b83331..b618cd50850dada07463ee75bddf32dbc9e4727c 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
@@ -259,6 +262,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;
@@ -328,7 +333,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 aa2ec3ef6372a7d6f2f75ef94dfdd23f5d13a896..1831b950757eb9723405232b98260c690a6dd61f 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 d4a228e6fc0bcacaa1072a35e5be264684f59dca..c8c3c4efe1784fb30dc882f8175ecbbcd96d8fc3 100644 (file)
@@ -332,7 +332,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;
@@ -599,10 +600,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 5f48db7e31ba98cfa9afac9fec69e8d9aa1387b8..f2911128a7960bc65756efbfc4ab57ce38a0cd34 100644 (file)
@@ -538,7 +538,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);
       }