Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
dvb psi: change the NIT parser to handle correctly new mux descriptor…
…s, fixes #2605
  • Loading branch information
perexg committed Jan 14, 2015
1 parent eb5cfaa commit 30cc0a7
Showing 1 changed file with 32 additions and 19 deletions.
51 changes: 32 additions & 19 deletions src/input/mpegts/dvb_psi.c
Expand Up @@ -1278,7 +1278,8 @@ static int
dvb_nit_mux
(mpegts_table_t *mt, mpegts_mux_t *mux, mpegts_mux_t *mm,
mpegts_network_t *mn, uint16_t onid, uint16_t tsid,
const uint8_t *lptr, int llen, uint8_t tableid, dvb_bat_id_t *bi)
const uint8_t *lptr, int llen, uint8_t tableid,
dvb_bat_id_t *bi, int discovery)
{
uint32_t priv = 0;
uint8_t dtag;
Expand All @@ -1296,11 +1297,21 @@ dvb_nit_mux
mpegts_mux_nice_name(mux, buf, sizeof(buf));
else
strcpy(buf, "<none>");
tvhdebug(mt->mt_name, " onid %04X (%d) tsid %04X (%d) mux %s", onid, onid, tsid, tsid, buf);
tvhdebug(mt->mt_name, " onid %04X (%d) tsid %04X (%d) mux %s%s",
onid, onid, tsid, tsid, buf, discovery ? " (discovery)" : "");

DVB_DESC_FOREACH(lptr, llen, 4, dlptr, dllen, dtag, dlen, dptr) {
tvhtrace(mt->mt_name, " dtag %02X dlen %d", dtag, dlen);

#if ENABLE_MPEGTS_DVB
/* Limit delivery descriptiors only in the discovery phase */
if (discovery &&
dtag != DVB_DESC_SAT_DEL &&
dtag != DVB_DESC_CABLE_DEL &&
dtag != DVB_DESC_TERR_DEL)
continue;
#endif

/* User-defined */
if (mt->mt_mux_cb && mux) {
int i = 0;
Expand All @@ -1327,15 +1338,17 @@ dvb_nit_mux
case DVB_DESC_SAT_DEL:
case DVB_DESC_CABLE_DEL:
case DVB_DESC_TERR_DEL:
if (dtag == DVB_DESC_SAT_DEL)
mux = dvb_desc_sat_del(mm, onid, tsid, dptr, dlen);
else if (dtag == DVB_DESC_CABLE_DEL)
mux = dvb_desc_cable_del(mm, onid, tsid, dptr, dlen);
else
mux = dvb_desc_terr_del(mm, onid, tsid, dptr, dlen);
if (mux) {
mpegts_mux_set_onid(mux, onid);
mpegts_mux_set_tsid(mux, tsid, 0);
if (discovery) {
if (dtag == DVB_DESC_SAT_DEL)
mux = dvb_desc_sat_del(mm, onid, tsid, dptr, dlen);
else if (dtag == DVB_DESC_CABLE_DEL)
mux = dvb_desc_cable_del(mm, onid, tsid, dptr, dlen);
else
mux = dvb_desc_terr_del(mm, onid, tsid, dptr, dlen);
if (mux) {
mpegts_mux_set_onid(mux, onid);
mpegts_mux_set_tsid(mux, tsid, 0);
}
}
break;
#endif
Expand Down Expand Up @@ -1551,21 +1564,21 @@ dvb_nit_callback
tsid = (lptr[0] << 8) | lptr[1];
onid = (lptr[2] << 8) | lptr[3];

#if ENABLE_MPEGTS_DVB
/* Create new muxes (auto-discovery) */
r = dvb_nit_mux(mt, NULL, mm, mn, onid, tsid, lptr, llen, tableid, bi, 1);
if (r < 0)
return r;
#endif

/* Find existing mux */
r = -1;
LIST_FOREACH(mux, &mn->mn_muxes, mm_network_link)
if (mux->mm_onid == onid && mux->mm_tsid == tsid) {
r = dvb_nit_mux(mt, mux, mm, mn, onid, tsid, lptr, llen, tableid, bi);
r = dvb_nit_mux(mt, mux, mm, mn, onid, tsid, lptr, llen, tableid, bi, 0);
if (r < 0)
return r;
}

/* New mux */
if (r == -1) {
r = dvb_nit_mux(mt, NULL, mm, mn, onid, tsid, lptr, llen, tableid, bi);
if (r < 0)
return r;
}
lptr += r;
llen -= r;
}
Expand Down

0 comments on commit 30cc0a7

Please sign in to comment.