dvb: re-instate some of the form scanning code.

Mux TSID and ONID can now be updated from other tables if, and only if,
they values are not yet set. Values from the NIT will ALWAYS override
existing values, as they're hopefully more reliable.
This commit is contained in:
Adam Sutton 2013-02-01 20:53:36 +00:00
parent 2e25766a10
commit dc160b9e48
3 changed files with 26 additions and 12 deletions

View file

@ -429,9 +429,9 @@ th_dvb_mux_instance_t *dvb_mux_create(th_dvb_adapter_t *tda,
void dvb_mux_set_networkname(th_dvb_mux_instance_t *tdmi, const char *name);
void dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid);
void dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid, int force);
void dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid);
void dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid, int force);
void dvb_mux_set_enable(th_dvb_mux_instance_t *tdmi, int enabled);

View file

@ -169,12 +169,14 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
}
if(tdmi != NULL) {
/* Update stuff ... */
int save = 0;
char buf2[1024];
buf2[0] = 0;
if(tdmi_compare_conf(tda->tda_type, &tdmi->tdmi_conf, dmc)) {
if(tdmi->tdmi_adapter->tda_autodiscovery &&
tdmi_compare_conf(tda->tda_type, &tdmi->tdmi_conf, dmc)) {
#if DVB_API_VERSION >= 5
snprintf(buf2, sizeof(buf2), " (");
if (tdmi->tdmi_conf.dmc_fe_modulation != dmc->dmc_fe_modulation)
@ -861,10 +863,14 @@ dvb_mux_set_networkname(th_dvb_mux_instance_t *tdmi, const char *networkname)
*
*/
void
dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid)
dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid, int force)
{
htsmsg_t *m;
if (!force)
if (tdmi->tdmi_transport_stream_id != 0xFFFF || tsid == 0xFFFF)
return;
tdmi->tdmi_transport_stream_id = tsid;
dvb_mux_save(tdmi);
@ -879,10 +885,14 @@ dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid)
*
*/
void
dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid)
dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid, int force)
{
htsmsg_t *m;
if (force)
if (tdmi->tdmi_network_id != 0 || onid == 0)
return;
tdmi->tdmi_network_id = onid;
dvb_mux_save(tdmi);

View file

@ -342,6 +342,8 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
tsid = ptr[0] << 8 | ptr[1];
onid = ptr[5] << 8 | ptr[6];
if (tableid == 0x42) {
dvb_mux_set_tsid(tdmi, tsid, 0);
dvb_mux_set_onid(tdmi, onid, 0);
if(tdmi->tdmi_transport_stream_id != tsid || tdmi->tdmi_network_id != onid)
return -1;
} else {
@ -504,6 +506,7 @@ dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
}
tsid = (ptr[0] << 8) | ptr[1];
dvb_mux_set_tsid(tdmi, tsid, 0);
if (tdmi->tdmi_transport_stream_id != tsid)
return -1;
@ -844,11 +847,11 @@ dvb_table_local_channel(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
t = dvb_service_find(tdmi, sid, 0, NULL);
if(t != NULL) {
if(t->s_channel_number != chan) {
t->s_channel_number = chan;
t->s_config_save(t);
service_refresh_channel(t);
}
if(t->s_channel_number != chan) {
t->s_channel_number = chan;
t->s_config_save(t);
service_refresh_channel(t);
}
}
}
ptr += 4;
@ -999,8 +1002,9 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
/* Search all muxes on adapter */
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == tsid && tdmi->tdmi_network_id == onid);
break;
if(tdmi->tdmi_transport_stream_id == tsid &&
tdmi->tdmi_network_id == onid);
break;
if(tdmi == NULL)
continue;