diff --git a/src/input/mpegts.h b/src/input/mpegts.h index a085c6e6..1befbf6a 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -283,7 +283,7 @@ struct mpegts_network void (*mn_display_name) (mpegts_network_t*, char *buf, size_t len); void (*mn_config_save) (mpegts_network_t*); mpegts_mux_t* (*mn_create_mux) - (mpegts_mux_t*, uint16_t onid, uint16_t tsid, void *conf); + (mpegts_mux_t*, uint16_t onid, uint16_t tsid, void *conf, int force); mpegts_service_t* (*mn_create_service) (mpegts_mux_t*, uint16_t sid, uint16_t pmt_pid); const idclass_t* (*mn_mux_class) (mpegts_network_t*); diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 6e22e70f..787a46a3 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -152,7 +152,7 @@ static const dvb_fe_code_rate_t fec_tab [16] = { static mpegts_mux_t * dvb_desc_sat_del (mpegts_mux_t *mm, uint16_t onid, uint16_t tsid, - const uint8_t *ptr, int len ) + const uint8_t *ptr, int len, int force ) { int frequency, symrate; dvb_mux_conf_t dmc; @@ -214,7 +214,7 @@ dvb_desc_sat_del tvhdebug("nit", " %s", buf); /* Create */ - return mm->mm_network->mn_create_mux(mm, onid, tsid, &dmc); + return mm->mm_network->mn_create_mux(mm, onid, tsid, &dmc, force); } /* @@ -271,7 +271,7 @@ dvb_desc_cable_del tvhdebug("nit", " %s", buf); /* Create */ - return mm->mm_network->mn_create_mux(mm, onid, tsid, &dmc); + return mm->mm_network->mn_create_mux(mm, onid, tsid, &dmc, 0); } /* @@ -339,7 +339,7 @@ dvb_desc_terr_del tvhdebug("nit", " %s", buf); /* Create */ - return mm->mm_network->mn_create_mux(mm, onid, tsid, &dmc); + return mm->mm_network->mn_create_mux(mm, onid, tsid, &dmc, 0); } #endif /* ENABLE_MPEGTS_DVB */ @@ -1340,7 +1340,7 @@ dvb_nit_mux case DVB_DESC_TERR_DEL: if (discovery) { if (dtag == DVB_DESC_SAT_DEL) - mux = dvb_desc_sat_del(mm, onid, tsid, dptr, dlen); + mux = dvb_desc_sat_del(mm, onid, tsid, dptr, dlen, 0); else if (dtag == DVB_DESC_CABLE_DEL) mux = dvb_desc_cable_del(mm, onid, tsid, dptr, dlen); else @@ -1878,37 +1878,17 @@ dvb_bat_callback } #if ENABLE_MPEGTS_DVB -/* - * DVB fastscan table processing - */ -int -dvb_fs_sdt_callback - (mpegts_table_t *mt, const uint8_t *ptr, int len, int tableid) +static int +dvb_fs_sdt_mux + ( mpegts_table_t *mt, mpegts_mux_t *mm, mpegts_table_state_t *st, + const uint8_t *ptr, int len, int discovery ) { - int r, sect, last, ver; + uint16_t onid, tsid, service_id; uint8_t dtag; int llen, dlen; const uint8_t *lptr, *dptr; - uint16_t nbid = 0, onid, tsid, service_id; - mpegts_mux_t *mm = mt->mt_mux, *mux; mpegts_network_t *mn = mm->mm_network; - mpegts_table_state_t *st = NULL; - - /* Fastscan ID */ - nbid = (ptr[0] << 8) | ptr[1]; - - /* Begin */ - if (tableid != 0xBD) - return -1; - r = dvb_table_begin(mt, ptr, len, tableid, nbid, 7, &st, §, &last, &ver); - if (r == 0) { - mt->mt_working -= st->working; - st->working = 0; - } - if (r != 1) return r; - if (len < 5) return -1; - ptr += 5; - len -= 5; + mpegts_mux_t *mux; while (len > 0) { const char *charset; @@ -1925,12 +1905,30 @@ dvb_fs_sdt_callback /* (ptr[10] << 8) | ptr[12] - audio ecm pid */ /* (ptr[14] << 8) | ptr[15] - pcr pid */ - tvhdebug(mt->mt_name, " service %04X (%d) onid %04X (%d) tsid %04X (%d)", - service_id, service_id, onid, onid, tsid, tsid); - /* Initialise the loop */ DVB_LOOP_INIT(ptr, len, 16, lptr, llen); + if (discovery) { + /* Descriptor loop */ + DVB_DESC_EACH(lptr, llen, dtag, dlen, dptr) { + switch (dtag) { + case DVB_DESC_SAT_DEL: + tvhtrace(mt->mt_name, " dtag %02X dlen %d (discovery) onid %04X (%d) tsid %04X (%d)", + dtag, dlen, onid, onid, tsid, tsid); + mux = dvb_desc_sat_del(mm, onid, tsid, dptr, dlen, 1); + if (mux) { + mpegts_mux_set_onid(mux, onid); + mpegts_mux_set_tsid(mux, tsid, 0); + } + break; + } + } + continue; + } + + tvhdebug(mt->mt_name, " service %04X (%d) onid %04X (%d) tsid %04X (%d)", + service_id, service_id, onid, onid, tsid, tsid); + /* Find existing mux */ LIST_FOREACH(mux, &mn->mn_muxes, mm_network_link) if (mux->mm_onid == onid && mux->mm_tsid == tsid) @@ -1954,13 +1952,6 @@ dvb_fs_sdt_callback sizeof(sprov), sname, sizeof(sname), charset)) return -1; break; - case DVB_DESC_SAT_DEL: - mux = dvb_desc_sat_del(mm, onid, tsid, dptr, dlen); - if (mux) { - mpegts_mux_set_onid(mux, onid); - mpegts_mux_set_tsid(mux, tsid, 0); - } - break; } } @@ -2015,6 +2006,41 @@ dvb_fs_sdt_callback } } + return 0; +} + + +/* + * DVB fastscan table processing + */ +int +dvb_fs_sdt_callback + (mpegts_table_t *mt, const uint8_t *ptr, int len, int tableid) +{ + int r, sect, last, ver; + uint16_t nbid; + mpegts_mux_t *mm = mt->mt_mux; + mpegts_table_state_t *st = NULL; + + /* Fastscan ID */ + nbid = (ptr[0] << 8) | ptr[1]; + + /* Begin */ + if (tableid != 0xBD) + return -1; + r = dvb_table_begin(mt, ptr, len, tableid, nbid, 7, &st, §, &last, &ver); + if (r == 0) { + mt->mt_working -= st->working; + st->working = 0; + } + if (r != 1) return r; + if (len < 5) return -1; + ptr += 5; + len -= 5; + + dvb_fs_sdt_mux(mt, mm, st, ptr, len, 1); + dvb_fs_sdt_mux(mt, mm, st, ptr, len, 0); + /* End */ return dvb_table_end(mt, st, sect); } diff --git a/src/input/mpegts/mpegts_network.c b/src/input/mpegts/mpegts_network.c index 3cfb59c0..481bb9d6 100644 --- a/src/input/mpegts/mpegts_network.c +++ b/src/input/mpegts/mpegts_network.c @@ -255,7 +255,7 @@ mpegts_network_config_save static mpegts_mux_t * mpegts_network_create_mux - ( mpegts_mux_t *mm, uint16_t sid, uint16_t tsid, void *aux ) + ( mpegts_mux_t *mm, uint16_t sid, uint16_t tsid, void *aux, int force ) { return NULL; } diff --git a/src/input/mpegts/mpegts_network_dvb.c b/src/input/mpegts/mpegts_network_dvb.c index 98bb0564..afe7f78b 100644 --- a/src/input/mpegts/mpegts_network_dvb.c +++ b/src/input/mpegts/mpegts_network_dvb.c @@ -362,7 +362,7 @@ dvb_network_mux_class static mpegts_mux_t * dvb_network_create_mux - ( mpegts_mux_t *mm, uint16_t onid, uint16_t tsid, void *p ) + ( mpegts_mux_t *mm, uint16_t onid, uint16_t tsid, void *p, int force ) { int save = 0; mpegts_mux_t *mmo = mm; @@ -370,7 +370,7 @@ dvb_network_create_mux dvb_mux_conf_t *dmc = p; mm = dvb_network_find_mux(ln, dmc, onid, tsid); - if (!mm && ln->mn_autodiscovery) { + if (!mm && (ln->mn_autodiscovery || force)) { const idclass_t *cls; cls = dvb_network_mux_class((mpegts_network_t *)ln); save |= cls == &dvb_mux_dvbt_class && dmc->dmc_fe_type == DVB_TYPE_T;