Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add the concept of onid into the DVB structures, this will help overc…
…ome a few minor issues.
  • Loading branch information
adamsutton committed Oct 10, 2012
1 parent 16fdfd2 commit 1cc67b7
Show file tree
Hide file tree
Showing 8 changed files with 94 additions and 60 deletions.
3 changes: 2 additions & 1 deletion src/dvb/dvb.h
Expand Up @@ -128,6 +128,7 @@ typedef struct th_dvb_mux_instance {
/* Linked if tdmi_conf.dmc_satconf != NULL */
LIST_ENTRY(th_dvb_mux_instance) tdmi_satconf_link;

uint32_t tdmi_network_id;
uint16_t tdmi_transport_stream_id;

char *tdmi_identifier;
Expand Down Expand Up @@ -354,7 +355,7 @@ void dvb_mux_destroy(th_dvb_mux_instance_t *tdmi);

th_dvb_mux_instance_t *dvb_mux_create(th_dvb_adapter_t *tda,
const struct dvb_mux_conf *dmc,
uint16_t tsid, const char *network,
uint16_t onid, uint16_t tsid, const char *network,
const char *logprefix, int enabled,
int initialscan, const char *identifier,
dvb_satconf_t *satconf);
Expand Down
20 changes: 16 additions & 4 deletions src/dvb/dvb_multiplex.c
Expand Up @@ -153,7 +153,7 @@ tdmi_compare_conf(int adapter_type,
*/
th_dvb_mux_instance_t *
dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
uint16_t tsid, const char *network, const char *source,
uint16_t onid, uint16_t tsid, const char *network, const char *source,
int enabled, int initialscan, const char *identifier,
dvb_satconf_t *satconf)
{
Expand Down Expand Up @@ -200,6 +200,10 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
tdmi->tdmi_transport_stream_id = tsid;
save = 1;
}
if(onid && tdmi->tdmi_network_id != onid) {
tdmi->tdmi_network_id = onid;
save = 1;
}

/* HACK - load old transports and remove old mux config */
if(identifier) {
Expand Down Expand Up @@ -262,6 +266,7 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,

TAILQ_INIT(&tdmi->tdmi_table_queue);

tdmi->tdmi_network_id = onid;
tdmi->tdmi_transport_stream_id = tsid;
tdmi->tdmi_adapter = tda;
tdmi->tdmi_network = network ? strdup(network) : NULL;
Expand Down Expand Up @@ -560,6 +565,7 @@ dvb_mux_save(th_dvb_mux_instance_t *tdmi)
htsmsg_add_str(m, "status", dvb_mux_status(tdmi));

htsmsg_add_u32(m, "transportstreamid", tdmi->tdmi_transport_stream_id);
htsmsg_add_u32(m, "originalnetworkid", tdmi->tdmi_network_id);
if(tdmi->tdmi_network != NULL)
htsmsg_add_str(m, "network", tdmi->tdmi_network);

Expand Down Expand Up @@ -650,7 +656,7 @@ tdmi_create_by_msg(th_dvb_adapter_t *tda, htsmsg_t *m, const char *identifier)
struct dvb_mux_conf dmc;
const char *s;
int r;
unsigned int tsid, u32, enabled, initscan;
unsigned int onid, tsid, u32, enabled, initscan;

memset(&dmc, 0, sizeof(dmc));

Expand Down Expand Up @@ -765,6 +771,8 @@ tdmi_create_by_msg(th_dvb_adapter_t *tda, htsmsg_t *m, const char *identifier)

if(htsmsg_get_u32(m, "transportstreamid", &tsid))
tsid = 0xffff;
if(htsmsg_get_u32(m, "originalnetworkid", &onid))
onid = 0;

if(htsmsg_get_u32(m, "enabled", &enabled))
enabled = 1;
Expand All @@ -779,7 +787,7 @@ tdmi_create_by_msg(th_dvb_adapter_t *tda, htsmsg_t *m, const char *identifier)
initscan = 1;

tdmi = dvb_mux_create(tda, &dmc,
tsid, htsmsg_get_str(m, "network"), NULL, enabled,
onid, tsid, htsmsg_get_str(m, "network"), NULL, enabled,
initscan,
identifier, NULL);
if(tdmi != NULL) {
Expand Down Expand Up @@ -1004,6 +1012,9 @@ dvb_mux_build_msg(th_dvb_mux_instance_t *tdmi)
if(tdmi->tdmi_transport_stream_id != 0xffff)
htsmsg_add_u32(m, "muxid", tdmi->tdmi_transport_stream_id);

if(tdmi->tdmi_network_id)
htsmsg_add_u32(m, "onid", tdmi->tdmi_network_id);

htsmsg_add_u32(m, "quality", tdmi->tdmi_quality);
return m;
}
Expand Down Expand Up @@ -1137,7 +1148,7 @@ dvb_mux_add_by_params(th_dvb_adapter_t *tda,
}
dmc.dmc_polarisation = polarisation;

tdmi = dvb_mux_create(tda, &dmc, 0xffff, NULL, NULL, 1, 1, NULL, NULL);
tdmi = dvb_mux_create(tda, &dmc, 0, 0xffff, NULL, NULL, 1, 1, NULL, NULL);

if(tdmi == NULL)
return "Mux already exist";
Expand All @@ -1160,6 +1171,7 @@ dvb_mux_copy(th_dvb_adapter_t *dst, th_dvb_mux_instance_t *tdmi_src,

tdmi_dst = dvb_mux_create(dst,
&tdmi_src->tdmi_conf,
tdmi_src->tdmi_network_id,
tdmi_src->tdmi_transport_stream_id,
tdmi_src->tdmi_network,
"copy operation", tdmi_src->tdmi_enabled,
Expand Down
2 changes: 1 addition & 1 deletion src/dvb/dvb_preconf.c
Expand Up @@ -98,7 +98,7 @@ dvb_mux_preconf_add(th_dvb_adapter_t *tda, const network_t *net,

dmc.dmc_satconf = dvb_satconf_entry_find(tda, satconf, 0);

dvb_mux_create(tda, &dmc, 0xffff, NULL, source, 1, 1, NULL, NULL);
dvb_mux_create(tda, &dmc, 0, 0xffff, NULL, source, 1, 1, NULL, NULL);
}
}

Expand Down
50 changes: 28 additions & 22 deletions src/dvb/dvb_tables.c
Expand Up @@ -366,7 +366,7 @@ dvb_bat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len,
{
int i, j, bdlen, tslen, tdlen;
uint8_t dtag, dlen;
uint16_t tsid;
uint16_t tsid, onid;
char crid[257];
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;

Expand All @@ -391,14 +391,16 @@ dvb_bat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len,
i = 0;
while (i+6 < tslen) {
tsid = buf[i] << 8 | buf[i+1];
onid = buf[i+2] << 8 | buf[i+3];
tdlen = ((buf[i+4] & 0xf) << 8) | buf[i+5];
if (tdlen+i+6 > tslen) break;
i += 6;
j = 0;

/* Find TDMI */
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == tsid)
if(tdmi->tdmi_transport_stream_id == tsid &&
tdmi->tdmi_network_id == onid)
break;

/* Descriptors */
Expand Down Expand Up @@ -441,7 +443,7 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
{
service_t *t;
uint16_t service_id;
uint16_t transport_stream_id;
uint16_t tsid, onid;
int free_ca_mode;
int dllen;
uint8_t dtag, dlen;
Expand All @@ -458,13 +460,15 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,

if(len < 8) return -1;

transport_stream_id = ptr[0] << 8 | ptr[1];
tsid = ptr[0] << 8 | ptr[1];
onid = ptr[5] << 8 | ptr[6];
if (tableid == 0x42) {
if(tdmi->tdmi_transport_stream_id != transport_stream_id)
if(tdmi->tdmi_transport_stream_id != tsid || tdmi->tdmi_network_id != onid)
return -1;
} else {
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == transport_stream_id)
if(tdmi->tdmi_transport_stream_id == tsid &&
tdmi->tdmi_network_id != onid)
break;
if (!tdmi) return 0;
}
Expand Down Expand Up @@ -623,14 +627,14 @@ dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
LIST_FOREACH(other, &tda->tda_muxes, tdmi_adapter_link)
if(other != tdmi &&
other->tdmi_conf.dmc_satconf == tdmi->tdmi_conf.dmc_satconf &&
other->tdmi_transport_stream_id == tsid)
other->tdmi_transport_stream_id == tsid &&
other->tdmi_network_id == tdmi->tdmi_network_id)
return -1;

if(tdmi->tdmi_transport_stream_id == 0xffff)
dvb_mux_set_tsid(tdmi, tsid);
else if(tdmi->tdmi_transport_stream_id != tsid) {
else if (tdmi->tdmi_transport_stream_id != tsid)
return -1; // TSID mismatches, skip packet, may be from another mux
}

ptr += 5;
len -= 5;
Expand Down Expand Up @@ -740,7 +744,7 @@ static const fe_modulation_t qam_tab [6] = {
*/
static int
dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint16_t tsid)
uint16_t tsid, uint16_t onid)
{
struct dvb_mux_conf dmc;
int freq, symrate;
Expand Down Expand Up @@ -777,7 +781,7 @@ dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,

dmc.dmc_fe_params.u.qam.fec_inner = fec_tab[ptr[10] & 0x07];

dvb_mux_create(tdmi->tdmi_adapter, &dmc, tsid, NULL,
dvb_mux_create(tdmi->tdmi_adapter, &dmc, onid, tsid, NULL,
"automatic mux discovery", 1, 1, NULL, NULL);
return 0;
}
Expand All @@ -787,7 +791,7 @@ dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
*/
static int
dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint16_t tsid)
uint16_t tsid, uint16_t onid)
{
int freq, symrate;
// uint16_t orbital_pos;
Expand Down Expand Up @@ -862,7 +866,7 @@ dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
}

#endif
dvb_mux_create(tdmi->tdmi_adapter, &dmc, tsid, NULL,
dvb_mux_create(tdmi->tdmi_adapter, &dmc, onid, tsid, NULL,
"automatic mux discovery", 1, 1, NULL, tdmi->tdmi_conf.dmc_satconf);

return 0;
Expand All @@ -874,14 +878,14 @@ dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
*/
static void
dvb_table_local_channel(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint16_t tsid)
uint16_t tsid, uint16_t onid)
{
uint16_t sid, chan;
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
service_t *t;

LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == tsid)
if(tdmi->tdmi_transport_stream_id == tsid && tdmi->tdmi_network_id == onid)
break;

if(tdmi == NULL)
Expand Down Expand Up @@ -919,7 +923,7 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint8_t tag, tlen;
int ntl;
char networkname[256];
uint16_t tsid;
uint16_t tsid, onid;
uint16_t network_id = (ptr[0] << 8) | ptr[1];

if(tdmi->tdmi_adapter->tda_nitoid) {
Expand Down Expand Up @@ -981,6 +985,7 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,

while(len >= 6) {
tsid = ( ptr[0] << 8) | ptr[1];
onid = ( ptr[2] << 8) | ptr[3];
ntl = ((ptr[4] & 0xf) << 8) | ptr[5];

ptr += 6;
Expand All @@ -997,14 +1002,14 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
switch(tag) {
case DVB_DESC_SAT:
if(tdmi->tdmi_adapter->tda_type == FE_QPSK)
dvb_table_sat_delivery(tdmi, ptr, tlen, tsid);
dvb_table_sat_delivery(tdmi, ptr, tlen, tsid, onid);
break;
case DVB_DESC_CABLE:
if(tdmi->tdmi_adapter->tda_type == FE_QAM)
dvb_table_cable_delivery(tdmi, ptr, tlen, tsid);
dvb_table_cable_delivery(tdmi, ptr, tlen, tsid, onid);
break;
case DVB_DESC_LOCAL_CHAN:
dvb_table_local_channel(tdmi, ptr, tlen, tsid);
dvb_table_local_channel(tdmi, ptr, tlen, tsid, onid);
break;
}

Expand All @@ -1031,7 +1036,7 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint8_t atsc_stype;
uint8_t stype;
uint16_t service_id;
uint16_t transport_stream_id;
uint16_t tsid, onid;
int dlen, dl;
uint8_t *dptr;

Expand All @@ -1055,11 +1060,12 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
if(dlen + 32 > len)
return -1; // Corrupt table

transport_stream_id = (ptr[22] << 8) | ptr[23];
tsid = (ptr[22] << 8) | ptr[23];
onid = (ptr[24] << 8) | ptr[25];

/* Search all muxes on adapter */
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == transport_stream_id)
if(tdmi->tdmi_transport_stream_id == tsid && tdmi->tdmi_network_id == onid);
break;

if(tdmi == NULL)
Expand Down

0 comments on commit 1cc67b7

Please sign in to comment.