Keep track of transport-id for each mux so we can do cross-transport EPG updates

This commit is contained in:
Andreas Öman 2008-04-19 14:11:21 +00:00
parent eabbc204be
commit 2eb2cf2a1f
6 changed files with 35 additions and 9 deletions

View file

@ -498,6 +498,7 @@ ajax_adaptercreatemux(http_connection_t *hc, http_reply_t *hr,
return HTTP_STATUS_NOT_FOUND;
v = dvb_mux_create_str(tda,
"65535",
http_arg_get(&hc->hc_req_args, "freq"),
http_arg_get(&hc->hc_req_args, "symrate"),
http_arg_get(&hc->hc_req_args, "const"),

BIN
dvb.c

Binary file not shown.

4
dvb.h
View file

@ -53,8 +53,10 @@ th_transport_t *dvb_find_transport(th_dvb_mux_instance_t *tdmi,
th_dvb_mux_instance_t *dvb_mux_create(th_dvb_adapter_t *tda,
struct dvb_frontend_parameters *fe_param,
int polarisation, int switchport,
int save);
int save, uint16_t tsid);
void dvb_tdmi_save(th_dvb_mux_instance_t *tdmi);
void dvb_tda_save(th_dvb_adapter_t *tda);
#endif /* DVB_H_ */

View file

@ -98,6 +98,8 @@ dvb_mux_store(FILE *fp, th_dvb_mux_instance_t *tdmi)
{
struct dvb_frontend_parameters *f = tdmi->tdmi_fe_params;
fprintf(fp, "\ttransportstreamid = %d\n", tdmi->tdmi_transport_stream_id);
fprintf(fp, "\tfrequency = %d\n", f->frequency);
switch(tdmi->tdmi_adapter->tda_fe_info->type) {
@ -156,6 +158,7 @@ dvb_mux_store(FILE *fp, th_dvb_mux_instance_t *tdmi)
*/
const char *
dvb_mux_create_str(th_dvb_adapter_t *tda,
const char *tsidstr,
const char *freqstr,
const char *symratestr,
const char *qamstr,
@ -173,7 +176,7 @@ dvb_mux_create_str(th_dvb_adapter_t *tda,
struct dvb_frontend_parameters f;
int r;
int polarisation = 0, switchport = 0;
memset(&f, 0, sizeof(f));
f.inversion = INVERSION_AUTO;
@ -247,7 +250,7 @@ dvb_mux_create_str(th_dvb_adapter_t *tda,
break;
}
dvb_mux_create(tda, &f, polarisation, switchport, save);
dvb_mux_create(tda, &f, polarisation, switchport, save, atoi(tsidstr));
return NULL;
}

View file

@ -22,6 +22,7 @@
void dvb_mux_store(FILE *fp, th_dvb_mux_instance_t *tdmi);
const char *dvb_mux_create_str(th_dvb_adapter_t *tda,
const char *tsidstr,
const char *freqstr,
const char *symratestr,
const char *qamstr,

View file

@ -202,6 +202,7 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
{
th_transport_t *t;
th_channel_t *ch;
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
uint16_t serviceid;
int version;
@ -224,6 +225,8 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
char desc[5000];
epg_content_type_t *ect;
// printf("EIT!, tid = %x\n", tableid);
if(tableid < 0x4e || tableid > 0x6f || len < 11)
return;
@ -240,6 +243,14 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
len -= 11;
ptr += 11;
/* Search all muxes on adapter */
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == transport_stream_id)
break;
if(tdmi == NULL)
return;
t = dvb_find_transport(tdmi, serviceid, 0, NULL);
if(t == NULL)
return;
@ -445,6 +456,11 @@ dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
tid = (ptr[0] << 8) | ptr[1];
if(tdmi->tdmi_transport_stream_id != tid) {
tdmi->tdmi_transport_stream_id = tid;
dvb_tda_save(tdmi->tdmi_adapter);
}
ptr += 5;
len -= 5;
@ -514,7 +530,8 @@ static const fe_modulation_t qam_tab [6] = {
* Cable delivery descriptor
*/
static void
dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len)
dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint16_t tsid)
{
int freq, symrate;
struct dvb_frontend_parameters fe_param;
@ -546,14 +563,15 @@ dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len)
fe_param.u.qam.fec_inner = fec_tab[ptr[10] & 0x07];
dvb_mux_create(tdmi->tdmi_adapter, &fe_param, 0, 0, 1);
dvb_mux_create(tdmi->tdmi_adapter, &fe_param, 0, 0, 1, tsid);
}
/**
* Satellite delivery descriptor
*/
static void
dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len)
dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint16_t tsid)
{
int freq, symrate, pol;
struct dvb_frontend_parameters fe_param;
@ -578,7 +596,8 @@ dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len)
pol = (ptr[6] >> 5) & 0x03;
dvb_mux_create(tdmi->tdmi_adapter, &fe_param, pol, tdmi->tdmi_switchport, 1);
dvb_mux_create(tdmi->tdmi_adapter, &fe_param, pol, tdmi->tdmi_switchport, 1,
tsid);
}
@ -658,10 +677,10 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
switch(tag) {
case DVB_DESC_SAT:
dvb_table_sat_delivery(tdmi, ptr, tlen);
dvb_table_sat_delivery(tdmi, ptr, tlen, tsid);
break;
case DVB_DESC_CABLE:
dvb_table_cable_delivery(tdmi, ptr, tlen);
dvb_table_cable_delivery(tdmi, ptr, tlen, tsid);
break;
}