From: Jaroslav Kysela Date: Sat, 1 Jul 2017 13:47:10 +0000 (+0200) Subject: psi lib: do filtering more early X-Git-Tag: v4.2.4~118 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d4b98111444c72735a5c3a39a63a7a929e779a5d;p=thirdparty%2Ftvheadend.git psi lib: do filtering more early --- diff --git a/src/epggrab/module/eit.c b/src/epggrab/module/eit.c index b2dd2221a..e58943ea7 100644 --- a/src/epggrab/module/eit.c +++ b/src/epggrab/module/eit.c @@ -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) { diff --git a/src/input/mpegts/dvb.h b/src/input/mpegts/dvb.h index a4217dba1..b618cd508 100644 --- a/src/input/mpegts/dvb.h +++ b/src/input/mpegts/dvb.h @@ -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); diff --git a/src/input/mpegts/dvb_psi_lib.c b/src/input/mpegts/dvb_psi_lib.c index aa2ec3ef6..1831b9507 100644 --- a/src/input/mpegts/dvb_psi_lib.c +++ b/src/input/mpegts/dvb_psi_lib.c @@ -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 ) diff --git a/src/input/mpegts/mpegts_table.c b/src/input/mpegts/mpegts_table.c index 213149915..fe9ed23d7 100644 --- a/src/input/mpegts/mpegts_table.c +++ b/src/input/mpegts/mpegts_table.c @@ -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) { diff --git a/src/muxer/muxer_pass.c b/src/muxer/muxer_pass.c index d4a228e6f..c8c3c4efe 100644 --- a/src/muxer/muxer_pass.c +++ b/src/muxer/muxer_pass.c @@ -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; } diff --git a/src/satip/rtp.c b/src/satip/rtp.c index 5f48db7e3..f2911128a 100644 --- a/src/satip/rtp.c +++ b/src/satip/rtp.c @@ -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); }