fastscan: add discovered muxes at first unconditionally - it should be _FAST_
This commit is contained in:
parent
7a2560e642
commit
1fca590172
4 changed files with 71 additions and 45 deletions
|
@ -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*);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue