dvb psi: change the NIT parser to handle correctly new mux descriptors, fixes #2605
This commit is contained in:
parent
eb5cfaa6e9
commit
30cc0a73bd
1 changed files with 32 additions and 19 deletions
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue