/* 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) {
#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
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;
( 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);
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)
*/
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);
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 )
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;
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) {
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;
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;
}
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);
}