Move some table stuff over to dvb_mux_t
This commit is contained in:
parent
e9604bd9de
commit
8681d71857
12 changed files with 220 additions and 206 deletions
|
@ -93,11 +93,11 @@ typedef struct dvb_network {
|
|||
struct th_dvb_mux_instance_queue dn_initial_scan_queue;
|
||||
int dn_initial_num_mux;
|
||||
|
||||
struct th_dvb_mux_instance *dn_mux_epg;
|
||||
struct dvb_mux *dn_mux_epg;
|
||||
|
||||
int dn_fe_type; // Frontend types for this network (FE_QPSK, etc)
|
||||
|
||||
// struct dvb_mux_list dn_muxes;
|
||||
struct dvb_mux_list dn_muxes;
|
||||
|
||||
} dvb_network_t;
|
||||
|
||||
|
@ -108,7 +108,7 @@ typedef struct dvb_network {
|
|||
*/
|
||||
typedef struct dvb_mux {
|
||||
|
||||
// LIST_ENTRY(dvb_mux) dm_network_link;
|
||||
LIST_ENTRY(dvb_mux) dm_network_link;
|
||||
dvb_network_t *dm_dn;
|
||||
|
||||
struct service_list dm_services;
|
||||
|
@ -120,6 +120,10 @@ typedef struct dvb_mux {
|
|||
char *dm_network_name; /* Name of network, from NIT table */
|
||||
char *dm_default_authority;
|
||||
|
||||
TAILQ_HEAD(, epggrab_ota_mux) dm_epg_grab;
|
||||
|
||||
struct th_dvb_mux_instance *dm_tdmi; // wrong
|
||||
|
||||
} dvb_mux_t;
|
||||
|
||||
|
||||
|
@ -172,8 +176,6 @@ typedef struct th_dvb_mux_instance {
|
|||
TAILQ_ENTRY(th_dvb_mux_instance) tdmi_scan_link;
|
||||
struct th_dvb_mux_instance_queue *tdmi_scan_queue;
|
||||
|
||||
TAILQ_HEAD(, epggrab_ota_mux) tdmi_epg_grab;
|
||||
|
||||
struct th_subscription_list tdmi_subscriptions;
|
||||
|
||||
} th_dvb_mux_instance_t;
|
||||
|
@ -314,7 +316,7 @@ typedef struct th_dvb_table {
|
|||
char *tdt_name;
|
||||
|
||||
void *tdt_opaque;
|
||||
int (*tdt_callback)(th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len,
|
||||
int (*tdt_callback)(dvb_mux_t *dm, uint8_t *buf, int len,
|
||||
uint8_t tableid, void *opaque);
|
||||
|
||||
|
||||
|
@ -426,11 +428,11 @@ th_dvb_mux_instance_t *dvb_mux_create(th_dvb_adapter_t *tda,
|
|||
const char *logprefix, int enabled,
|
||||
int initialscan, const char *identifier);
|
||||
|
||||
void dvb_mux_set_networkname(th_dvb_mux_instance_t *tdmi, const char *name);
|
||||
void dvb_mux_set_networkname(dvb_mux_t *dm, const char *name);
|
||||
|
||||
void dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid);
|
||||
void dvb_mux_set_tsid(dvb_mux_t *dm, uint16_t tsid);
|
||||
|
||||
void dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid);
|
||||
void dvb_mux_set_onid(dvb_mux_t *mux, uint16_t onid);
|
||||
|
||||
void dvb_mux_set_enable(th_dvb_mux_instance_t *tdmi, int enabled);
|
||||
|
||||
|
@ -501,22 +503,21 @@ void dvb_fe_stop(th_dvb_mux_instance_t *tdmi, int retune);
|
|||
*/
|
||||
void dvb_table_init(th_dvb_adapter_t *tda);
|
||||
|
||||
void dvb_table_add_default(th_dvb_mux_instance_t *tdmi);
|
||||
void dvb_table_add_default(dvb_mux_t *dm);
|
||||
|
||||
void dvb_table_flush_all(th_dvb_mux_instance_t *tdmi);
|
||||
|
||||
void dvb_table_add_pmt(th_dvb_mux_instance_t *tdmi, int pmt_pid);
|
||||
void dvb_table_add_pmt(dvb_mux_t *dm, int pmt_pid);
|
||||
|
||||
void dvb_table_rem_pmt(th_dvb_mux_instance_t *tdmi, int pmt_pid);
|
||||
void dvb_table_rem_pmt(dvb_mux_t *dm, int pmt_pid);
|
||||
|
||||
void tdt_add(th_dvb_mux_instance_t *tdmi, int table, int mask,
|
||||
int (*callback)(th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len,
|
||||
void tdt_add(dvb_mux_t *dm, int table, int mask,
|
||||
int (*callback)(dvb_mux_t *dm, uint8_t *buf, int len,
|
||||
uint8_t tableid, void *opaque), void *opaque,
|
||||
const char *name, int flags, int pid);
|
||||
|
||||
int dvb_pidx11_callback
|
||||
(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||
uint8_t tableid, void *opaque);
|
||||
int dvb_pidx11_callback(dvb_mux_t *dm, uint8_t *ptr, int len,
|
||||
uint8_t tableid, void *opaque);
|
||||
|
||||
#define TDT_CRC 0x1
|
||||
#define TDT_QUICKREQ 0x2
|
||||
|
|
|
@ -748,7 +748,7 @@ dvb_adapter_mux_scanner(void *aux)
|
|||
if (period > 20)
|
||||
gtimer_arm(&tda->tda_mux_scanner_timer,
|
||||
dvb_adapter_mux_scanner, tda, period);
|
||||
dvb_fe_tune(tda->tda_dn->dn_mux_epg, "EPG scan");
|
||||
dvb_fe_tune(tda->tda_dn->dn_mux_epg->dm_tdmi, "EPG scan");
|
||||
return;
|
||||
|
||||
}
|
||||
|
|
|
@ -277,7 +277,7 @@ dvb_fe_stop(th_dvb_mux_instance_t *tdmi, int retune)
|
|||
|
||||
assert(tdmi->tdmi_scan_queue == NULL);
|
||||
|
||||
epggrab_mux_stop(tdmi, 0);
|
||||
epggrab_mux_stop(tdmi->tdmi_mux, 0);
|
||||
|
||||
if (!retune) {
|
||||
gtimer_disarm(&tda->tda_fe_monitor_timer);
|
||||
|
@ -512,8 +512,8 @@ dvb_fe_tune(th_dvb_mux_instance_t *tdmi, const char *reason)
|
|||
gtimer_arm(&tda->tda_fe_monitor_timer, dvb_fe_monitor, tda, 1);
|
||||
|
||||
|
||||
dvb_table_add_default(tdmi);
|
||||
epggrab_mux_start(tdmi);
|
||||
dvb_table_add_default(tdmi->tdmi_mux);
|
||||
epggrab_mux_start(tdmi->tdmi_mux);
|
||||
|
||||
dvb_adapter_notify(tda);
|
||||
return 0;
|
||||
|
|
|
@ -228,11 +228,14 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
|
|||
dm->dm_network_id = onid;
|
||||
dm->dm_transport_stream_id = tsid;
|
||||
dm->dm_network_name = network ? strdup(network) : NULL;
|
||||
dm->dm_dn = tda->tda_dn;
|
||||
TAILQ_INIT(&dm->dm_epg_grab);
|
||||
|
||||
dm->dm_dn = tda->tda_dn;
|
||||
LIST_INSERT_HEAD(&tda->tda_dn->dn_muxes, dm, dm_network_link);
|
||||
|
||||
tdmi = calloc(1, sizeof(th_dvb_mux_instance_t));
|
||||
tdmi->tdmi_mux = dm;
|
||||
dm->dm_tdmi = tdmi;
|
||||
|
||||
if(identifier == NULL) {
|
||||
char qpsktxt[20];
|
||||
|
@ -263,7 +266,6 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
TAILQ_INIT(&tdmi->tdmi_epg_grab);
|
||||
|
||||
tdmi->tdmi_enabled = enabled;
|
||||
|
||||
|
@ -332,7 +334,7 @@ dvb_mux_destroy(th_dvb_mux_instance_t *tdmi)
|
|||
if(tdmi->tdmi_table_initial)
|
||||
tda->tda_dn->dn_initial_num_mux--;
|
||||
|
||||
epggrab_mux_delete(tdmi);
|
||||
epggrab_mux_delete(tdmi->tdmi_mux); // XXX(dvbreorg)
|
||||
|
||||
hts_settings_remove("dvbmuxes/%s", tdmi->tdmi_identifier);
|
||||
|
||||
|
@ -810,12 +812,15 @@ dvb_mux_load(th_dvb_adapter_t *tda)
|
|||
*
|
||||
*/
|
||||
void
|
||||
dvb_mux_set_networkname(th_dvb_mux_instance_t *tdmi, const char *networkname)
|
||||
dvb_mux_set_networkname(dvb_mux_t *dm, const char *networkname)
|
||||
{
|
||||
htsmsg_t *m;
|
||||
|
||||
free(tdmi->tdmi_mux->dm_network_name);
|
||||
tdmi->tdmi_mux->dm_network_name = strdup(networkname);
|
||||
free(dm->dm_network_name);
|
||||
dm->dm_network_name = strdup(networkname);
|
||||
|
||||
th_dvb_mux_instance_t *tdmi = dm->dm_tdmi;
|
||||
|
||||
dvb_mux_save(tdmi);
|
||||
|
||||
m = htsmsg_create_map();
|
||||
|
@ -829,12 +834,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(dvb_mux_t *dm, uint16_t tsid)
|
||||
{
|
||||
htsmsg_t *m;
|
||||
|
||||
tdmi->tdmi_mux->dm_transport_stream_id = tsid;
|
||||
|
||||
dm->dm_transport_stream_id = tsid;
|
||||
|
||||
th_dvb_mux_instance_t *tdmi = dm->dm_tdmi;
|
||||
|
||||
dvb_mux_save(tdmi);
|
||||
|
||||
m = htsmsg_create_map();
|
||||
|
@ -847,12 +854,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(dvb_mux_t *dm, uint16_t onid)
|
||||
{
|
||||
htsmsg_t *m;
|
||||
|
||||
tdmi->tdmi_mux->dm_network_id = onid;
|
||||
|
||||
dm->dm_network_id = onid;
|
||||
|
||||
th_dvb_mux_instance_t *tdmi = dm->dm_tdmi;
|
||||
|
||||
dvb_mux_save(tdmi);
|
||||
|
||||
m = htsmsg_create_map();
|
||||
|
|
|
@ -97,7 +97,7 @@ dvb_service_start(service_t *t, unsigned int weight, int force_start)
|
|||
if(!r)
|
||||
tda->tda_open_service(tda, t);
|
||||
|
||||
dvb_table_add_pmt(t->s_dvb_mux_instance, t->s_pmt_pid);
|
||||
dvb_table_add_pmt(t->s_dvb_mux_instance->tdmi_mux, t->s_pmt_pid);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -86,6 +86,7 @@ dvb_table_dispatch(uint8_t *sec, int r, th_dvb_table_t *tdt)
|
|||
uint8_t *ptr;
|
||||
int ret;
|
||||
th_dvb_mux_instance_t *tdmi = tdt->tdt_tdmi;
|
||||
dvb_mux_t *dm = tdmi->tdmi_mux;
|
||||
|
||||
/* It seems some hardware (or is it the dvb API?) does not
|
||||
honour the DMX_CHECK_CRC flag, so we check it again */
|
||||
|
@ -106,12 +107,12 @@ dvb_table_dispatch(uint8_t *sec, int r, th_dvb_table_t *tdt)
|
|||
if(chkcrc) len -= 4; /* Strip trailing CRC */
|
||||
|
||||
if(tdt->tdt_flags & TDT_CA)
|
||||
ret = tdt->tdt_callback((th_dvb_mux_instance_t *)tdt,
|
||||
sec, len + 3, tableid, tdt->tdt_opaque);
|
||||
ret = tdt->tdt_callback((dvb_mux_t *)tdt,
|
||||
sec, len + 3, tableid, tdt->tdt_opaque);
|
||||
else if(tdt->tdt_flags & TDT_TDT)
|
||||
ret = tdt->tdt_callback(tdt->tdt_tdmi, ptr, len, tableid, tdt);
|
||||
ret = tdt->tdt_callback(dm, ptr, len, tableid, tdt);
|
||||
else
|
||||
ret = tdt->tdt_callback(tdt->tdt_tdmi, ptr, len, tableid, tdt->tdt_opaque);
|
||||
ret = tdt->tdt_callback(dm, ptr, len, tableid, tdt->tdt_opaque);
|
||||
|
||||
if(ret == 0)
|
||||
tdt->tdt_count++;
|
||||
|
@ -154,12 +155,13 @@ dvb_tdt_destroy(th_dvb_adapter_t *tda, th_dvb_mux_instance_t *tdmi,
|
|||
* Add a new DVB table
|
||||
*/
|
||||
void
|
||||
tdt_add(th_dvb_mux_instance_t *tdmi, int tableid, int mask,
|
||||
int (*callback)(th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len,
|
||||
tdt_add(dvb_mux_t *dm, int tableid, int mask,
|
||||
int (*callback)(dvb_mux_t *dm, uint8_t *buf, int len,
|
||||
uint8_t tableid, void *opaque), void *opaque,
|
||||
const char *name, int flags, int pid)
|
||||
{
|
||||
th_dvb_table_t *t;
|
||||
th_dvb_mux_instance_t *tdmi = dm->dm_tdmi;
|
||||
|
||||
// Allow multiple entries per PID, but only one per callback/opaque instance
|
||||
// TODO: this could mean reading the same data multiple times, and not
|
||||
|
@ -230,14 +232,14 @@ dvb_desc_def_authority(uint8_t *ptr, int len, char *defauth, size_t dalen)
|
|||
}
|
||||
|
||||
static int
|
||||
dvb_bat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len,
|
||||
dvb_bat_callback(dvb_mux_t *dm, uint8_t *buf, int len,
|
||||
uint8_t tableid, void *opaque)
|
||||
{
|
||||
int i, j, bdlen, tslen, tdlen;
|
||||
uint8_t dtag, dlen;
|
||||
uint16_t tsid, onid;
|
||||
char crid[257];
|
||||
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
|
||||
dvb_network_t *dn = dm->dm_dn;
|
||||
|
||||
if (tableid != 0x4a) return -1;
|
||||
bdlen = ((buf[5] & 0xf) << 8) | buf[6];
|
||||
|
@ -266,14 +268,13 @@ dvb_bat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len,
|
|||
i += 6;
|
||||
j = 0;
|
||||
|
||||
/* Find TDMI */
|
||||
LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link)
|
||||
if(tdmi->tdmi_mux->dm_transport_stream_id == tsid &&
|
||||
tdmi->tdmi_mux->dm_network_id == onid)
|
||||
/* Find mux */
|
||||
LIST_FOREACH(dm, &dn->dn_muxes, dm_network_link)
|
||||
if(dm->dm_transport_stream_id == tsid && dm->dm_network_id == onid)
|
||||
break;
|
||||
|
||||
/* Descriptors */
|
||||
if (tdmi) {
|
||||
if (dm != NULL) {
|
||||
int save = 0;
|
||||
*crid = 0;
|
||||
while (j+2 < tdlen) {
|
||||
|
@ -288,13 +289,13 @@ dvb_bat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len,
|
|||
}
|
||||
j += dlen;
|
||||
}
|
||||
if (*crid && strcmp(tdmi->tdmi_mux->dm_default_authority ?: "", crid)) {
|
||||
free(tdmi->tdmi_mux->dm_default_authority);
|
||||
tdmi->tdmi_mux->dm_default_authority = strdup(crid);
|
||||
if (*crid && strcmp(dm->dm_default_authority ?: "", crid)) {
|
||||
free(dm->dm_default_authority);
|
||||
dm->dm_default_authority = strdup(crid);
|
||||
save = 1;
|
||||
}
|
||||
if (save)
|
||||
dvb_mux_save(tdmi);
|
||||
dvb_mux_save(dm->dm_tdmi);
|
||||
}
|
||||
|
||||
i += tdlen;
|
||||
|
@ -307,7 +308,7 @@ dvb_bat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len,
|
|||
* DVB SDT (Service Description Table)
|
||||
*/
|
||||
static int
|
||||
dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||
dvb_sdt_callback(dvb_mux_t *dm, uint8_t *ptr, int len,
|
||||
uint8_t tableid, void *opaque)
|
||||
{
|
||||
service_t *t;
|
||||
|
@ -323,7 +324,7 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
uint8_t stype;
|
||||
int l;
|
||||
|
||||
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
|
||||
dvb_network_t *dn = dm->dm_dn;
|
||||
|
||||
if (tableid != 0x42 && tableid != 0x46) return -1;
|
||||
|
||||
|
@ -332,16 +333,16 @@ 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) {
|
||||
if(tdmi->tdmi_mux->dm_transport_stream_id != tsid)
|
||||
if(dm->dm_transport_stream_id != tsid)
|
||||
return -1;
|
||||
if(!tdmi->tdmi_mux->dm_network_id)
|
||||
dvb_mux_set_onid(tdmi, onid);
|
||||
if(!dm->dm_network_id)
|
||||
dvb_mux_set_onid(dm, onid);
|
||||
} else {
|
||||
LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link)
|
||||
if(tdmi->tdmi_mux->dm_transport_stream_id == tsid &&
|
||||
tdmi->tdmi_mux->dm_network_id != onid)
|
||||
LIST_FOREACH(dm, &dn->dn_muxes, dm_network_link)
|
||||
if(dm->dm_transport_stream_id == tsid &&
|
||||
dm->dm_network_id != onid)
|
||||
break;
|
||||
if (!tdmi) return 0;
|
||||
if (!dm) return 0;
|
||||
}
|
||||
|
||||
// version = ptr[2] >> 1 & 0x1f;
|
||||
|
@ -373,7 +374,7 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
if(dllen > len)
|
||||
break;
|
||||
|
||||
if (!(t = dvb_service_find(tdmi, service_id, 0, NULL))) {
|
||||
if (!(t = dvb_service_find(dm->dm_tdmi, service_id, 0, NULL))) {
|
||||
len -= dllen;
|
||||
ptr += dllen;
|
||||
continue;
|
||||
|
@ -460,14 +461,14 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
/*
|
||||
* Combined PID 0x11 callback, for stuff commonly found on that PID
|
||||
*/
|
||||
int dvb_pidx11_callback
|
||||
(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||
uint8_t tableid, void *opaque)
|
||||
int
|
||||
dvb_pidx11_callback(dvb_mux_t *dm, uint8_t *ptr, int len,
|
||||
uint8_t tableid, void *opaque)
|
||||
{
|
||||
if (tableid == 0x42 || tableid == 0x46)
|
||||
return dvb_sdt_callback(tdmi, ptr, len, tableid, opaque);
|
||||
return dvb_sdt_callback(dm, ptr, len, tableid, opaque);
|
||||
else if (tableid == 0x4a)
|
||||
return dvb_bat_callback(tdmi, ptr, len, tableid, opaque);
|
||||
return dvb_bat_callback(dm, ptr, len, tableid, opaque);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -475,11 +476,11 @@ int dvb_pidx11_callback
|
|||
* PAT - Program Allocation table
|
||||
*/
|
||||
static int
|
||||
dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||
dvb_pat_callback(dvb_mux_t *dm, uint8_t *ptr, int len,
|
||||
uint8_t tableid, void *opaque)
|
||||
{
|
||||
th_dvb_mux_instance_t *other;
|
||||
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
|
||||
dvb_mux_t *other;
|
||||
dvb_network_t *dn = dm->dm_dn;
|
||||
uint16_t service, pmt, tsid;
|
||||
|
||||
if(len < 5)
|
||||
|
@ -495,15 +496,15 @@ dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
// Make sure this TSID is not already known on another mux
|
||||
// That might indicate that we have accedentally received a PAT
|
||||
// from another mux
|
||||
LIST_FOREACH(other, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link)
|
||||
if(other != tdmi &&
|
||||
other->tdmi_mux->dm_transport_stream_id == tsid &&
|
||||
other->tdmi_mux->dm_network_id == tdmi->tdmi_mux->dm_network_id)
|
||||
LIST_FOREACH(other, &dn->dn_muxes, dm_network_link)
|
||||
if(other != dm &&
|
||||
other->dm_transport_stream_id == tsid &&
|
||||
other->dm_network_id == dm->dm_network_id)
|
||||
return -1;
|
||||
|
||||
if(tdmi->tdmi_mux->dm_transport_stream_id == 0xffff)
|
||||
dvb_mux_set_tsid(tdmi, tsid);
|
||||
else if (tdmi->tdmi_mux->dm_transport_stream_id != tsid)
|
||||
if(dm->dm_transport_stream_id == 0xffff)
|
||||
dvb_mux_set_tsid(dm, tsid);
|
||||
else if (dm->dm_transport_stream_id != tsid)
|
||||
return -1; // TSID mismatches, skip packet, may be from another mux
|
||||
|
||||
ptr += 5;
|
||||
|
@ -515,9 +516,9 @@ dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
|
||||
if(service != 0 && pmt != 0) {
|
||||
int save = 0;
|
||||
dvb_service_find2(tdmi, service, pmt, NULL, &save);
|
||||
if (save || !tda->tda_disable_pmt_monitor)
|
||||
dvb_table_add_pmt(tdmi, pmt);
|
||||
dvb_service_find2(dm->dm_tdmi, service, pmt, NULL, &save);
|
||||
if (save || ! dm->dm_tdmi->tdmi_adapter->tda_disable_pmt_monitor)
|
||||
dvb_table_add_pmt(dm, pmt);
|
||||
}
|
||||
ptr += 4;
|
||||
len -= 4;
|
||||
|
@ -530,10 +531,10 @@ dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
* CA - Conditional Access
|
||||
*/
|
||||
static int
|
||||
dvb_ca_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||
dvb_ca_callback(dvb_mux_t *dm, uint8_t *ptr, int len,
|
||||
uint8_t tableid, void *opaque)
|
||||
{
|
||||
cwc_emm(ptr, len, (uintptr_t)opaque, (void *)tdmi);
|
||||
cwc_emm(ptr, len, (uintptr_t)opaque, (void *)dm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -541,8 +542,8 @@ dvb_ca_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
* CAT - Conditional Access Table
|
||||
*/
|
||||
static int
|
||||
dvb_cat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||
uint8_t tableid, void *opaque)
|
||||
dvb_cat_callback(dvb_mux_t *dm, uint8_t *ptr, int len,
|
||||
uint8_t tableid, void *opaque)
|
||||
{
|
||||
int tag, tlen;
|
||||
uint16_t pid;
|
||||
|
@ -568,7 +569,7 @@ dvb_cat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
if(pid == 0)
|
||||
break;
|
||||
|
||||
tdt_add(tdmi, 0, 0, dvb_ca_callback, (void *)caid, "CA",
|
||||
tdt_add(dm, 0, 0, dvb_ca_callback, (void *)caid, "CA",
|
||||
TDT_CA, pid);
|
||||
break;
|
||||
|
||||
|
@ -613,13 +614,13 @@ static const fe_modulation_t qam_tab [6] = {
|
|||
* Cable delivery descriptor
|
||||
*/
|
||||
static int
|
||||
dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||
dvb_table_cable_delivery(dvb_mux_t *dm, uint8_t *ptr, int len,
|
||||
uint16_t tsid, uint16_t onid)
|
||||
{
|
||||
struct dvb_mux_conf dmc;
|
||||
int freq, symrate;
|
||||
|
||||
if(!tdmi->tdmi_adapter->tda_autodiscovery)
|
||||
if(!dm->dm_tdmi->tdmi_adapter->tda_autodiscovery)
|
||||
return -1;
|
||||
|
||||
if(len < 11)
|
||||
|
@ -651,7 +652,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, onid, tsid, NULL,
|
||||
dvb_mux_create(dm->dm_tdmi->tdmi_adapter, &dmc, onid, tsid, NULL,
|
||||
"automatic mux discovery", 1, 1, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
@ -660,14 +661,14 @@ dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
* Satellite delivery descriptor
|
||||
*/
|
||||
static int
|
||||
dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||
dvb_table_sat_delivery(dvb_mux_t *dm, uint8_t *ptr, int len,
|
||||
uint16_t tsid, uint16_t onid)
|
||||
{
|
||||
int freq, symrate;
|
||||
// uint16_t orbital_pos;
|
||||
struct dvb_mux_conf dmc;
|
||||
|
||||
if(!tdmi->tdmi_adapter->tda_autodiscovery)
|
||||
if(!dm->dm_tdmi->tdmi_adapter->tda_autodiscovery)
|
||||
return -1;
|
||||
|
||||
if(len < 11)
|
||||
|
@ -734,7 +735,7 @@ dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
}
|
||||
|
||||
#endif
|
||||
dvb_mux_create(tdmi->tdmi_adapter, &dmc, onid, tsid, NULL,
|
||||
dvb_mux_create(dm->dm_tdmi->tdmi_adapter, &dmc, onid, tsid, NULL,
|
||||
"automatic mux discovery", 1, 1, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
@ -744,19 +745,18 @@ 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,
|
||||
dvb_table_local_channel(dvb_mux_t *dm, uint8_t *ptr, int len,
|
||||
uint16_t tsid, uint16_t onid)
|
||||
{
|
||||
uint16_t sid, chan;
|
||||
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
|
||||
dvb_network_t *dn = dm->dm_dn;
|
||||
service_t *t;
|
||||
|
||||
LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link)
|
||||
if(tdmi->tdmi_mux->dm_transport_stream_id == tsid &&
|
||||
tdmi->tdmi_mux->dm_network_id == onid)
|
||||
LIST_FOREACH(dm, &dn->dn_muxes, dm_network_link)
|
||||
if(dm->dm_transport_stream_id == tsid && dm->dm_network_id == onid)
|
||||
break;
|
||||
|
||||
if(tdmi == NULL)
|
||||
if(dm == NULL)
|
||||
return;
|
||||
|
||||
while(len >= 4) {
|
||||
|
@ -764,7 +764,7 @@ dvb_table_local_channel(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
chan = ((ptr[2] & 3) << 8) | ptr[3];
|
||||
|
||||
if(chan != 0) {
|
||||
t = dvb_service_find(tdmi, sid, 0, NULL);
|
||||
t = dvb_service_find(dm->dm_tdmi, sid, 0, NULL);
|
||||
if(t != NULL) {
|
||||
|
||||
if(t->s_channel_number != chan) {
|
||||
|
@ -785,7 +785,7 @@ dvb_table_local_channel(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
* NIT - Network Information Table
|
||||
*/
|
||||
static int
|
||||
dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||
dvb_nit_callback(dvb_mux_t *dm, uint8_t *ptr, int len,
|
||||
uint8_t tableid, void *opaque)
|
||||
{
|
||||
uint8_t tag, tlen;
|
||||
|
@ -794,11 +794,11 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
uint16_t tsid, onid;
|
||||
uint16_t network_id = (ptr[0] << 8) | ptr[1];
|
||||
|
||||
if(tdmi->tdmi_adapter->tda_nitoid) {
|
||||
if(dm->dm_tdmi->tdmi_adapter->tda_nitoid) {
|
||||
if(tableid != 0x41)
|
||||
return -1;
|
||||
|
||||
if(network_id != tdmi->tdmi_adapter->tda_nitoid)
|
||||
if(network_id != dm->dm_tdmi->tdmi_adapter->tda_nitoid)
|
||||
return -1;
|
||||
|
||||
} else {
|
||||
|
@ -831,8 +831,8 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
if(dvb_get_string(networkname, sizeof(networkname), ptr, tlen, NULL, NULL))
|
||||
return -1;
|
||||
|
||||
if(strcmp(tdmi->tdmi_mux->dm_network_name ?: "", networkname))
|
||||
dvb_mux_set_networkname(tdmi, networkname);
|
||||
if(strcmp(dm->dm_network_name ?: "", networkname))
|
||||
dvb_mux_set_networkname(dm, networkname);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -869,15 +869,15 @@ 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_fe_type == FE_QPSK)
|
||||
dvb_table_sat_delivery(tdmi, ptr, tlen, tsid, onid);
|
||||
if(dm->dm_dn->dn_fe_type == FE_QPSK)
|
||||
dvb_table_sat_delivery(dm, ptr, tlen, tsid, onid);
|
||||
break;
|
||||
case DVB_DESC_CABLE:
|
||||
if(tdmi->tdmi_adapter->tda_fe_type == FE_QAM)
|
||||
dvb_table_cable_delivery(tdmi, ptr, tlen, tsid, onid);
|
||||
if(dm->dm_dn->dn_fe_type == FE_QAM)
|
||||
dvb_table_cable_delivery(dm, ptr, tlen, tsid, onid);
|
||||
break;
|
||||
case DVB_DESC_LOCAL_CHAN:
|
||||
dvb_table_local_channel(tdmi, ptr, tlen, tsid, onid);
|
||||
dvb_table_local_channel(dm, ptr, tlen, tsid, onid);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -894,10 +894,10 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
* VCT - ATSC Virtual Channel Table
|
||||
*/
|
||||
static int
|
||||
atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||
atsc_vct_callback(dvb_mux_t *dm, uint8_t *ptr, int len,
|
||||
uint8_t tableid, void *opaque)
|
||||
{
|
||||
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
|
||||
dvb_network_t *dn = dm->dm_dn;
|
||||
service_t *t;
|
||||
int numch;
|
||||
char chname[256];
|
||||
|
@ -932,16 +932,15 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
onid = (ptr[24] << 8) | ptr[25];
|
||||
|
||||
/* Search all muxes on adapter */
|
||||
LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link)
|
||||
if(tdmi->tdmi_mux->dm_transport_stream_id == tsid &&
|
||||
tdmi->tdmi_mux->dm_network_id == onid);
|
||||
LIST_FOREACH(dm, &dn->dn_muxes, dm_network_link)
|
||||
if(dm->dm_transport_stream_id == tsid && dm->dm_network_id == onid);
|
||||
break;
|
||||
|
||||
if(tdmi == NULL)
|
||||
if(dm == NULL)
|
||||
continue;
|
||||
|
||||
service_id = (ptr[24] << 8) | ptr[25];
|
||||
if((t = dvb_service_find(tdmi, service_id, 0, NULL)) == NULL)
|
||||
if((t = dvb_service_find(dm->dm_tdmi, service_id, 0, NULL)) == NULL)
|
||||
continue;
|
||||
|
||||
atsc_stype = ptr[27] & 0x3f;
|
||||
|
@ -979,12 +978,13 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
* PMT - Program Mapping Table
|
||||
*/
|
||||
static int
|
||||
dvb_pmt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||
dvb_pmt_callback(dvb_mux_t *dm, uint8_t *ptr, int len,
|
||||
uint8_t tableid, void *opaque)
|
||||
{
|
||||
int active = 0;
|
||||
service_t *t;
|
||||
th_dvb_table_t *tdt = opaque;
|
||||
th_dvb_mux_instance_t *tdmi = dm->dm_tdmi;
|
||||
|
||||
LIST_FOREACH(t, &tdmi->tdmi_mux->dm_services, s_group_link) {
|
||||
pthread_mutex_lock(&t->s_stream_mutex);
|
||||
|
@ -1005,23 +1005,23 @@ dvb_pmt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
|||
* Demux for default DVB tables that we want
|
||||
*/
|
||||
static void
|
||||
dvb_table_add_default_dvb(th_dvb_mux_instance_t *tdmi)
|
||||
dvb_table_add_default_dvb(dvb_mux_t *dm)
|
||||
{
|
||||
/* Network Information Table */
|
||||
|
||||
int table;
|
||||
|
||||
if(tdmi->tdmi_adapter->tda_nitoid) {
|
||||
if(dm->dm_tdmi->tdmi_adapter->tda_nitoid) {
|
||||
table = 0x41;
|
||||
} else {
|
||||
table = 0x40;
|
||||
}
|
||||
tdt_add(tdmi, table, 0xff, dvb_nit_callback, NULL, "nit",
|
||||
tdt_add(dm, table, 0xff, dvb_nit_callback, NULL, "nit",
|
||||
TDT_QUICKREQ | TDT_CRC, 0x10);
|
||||
|
||||
/* Service Descriptor Table and Bouqeut Allocation Table */
|
||||
|
||||
tdt_add(tdmi, 0, 0, dvb_pidx11_callback, NULL, "pidx11",
|
||||
tdt_add(dm, 0, 0, dvb_pidx11_callback, NULL, "pidx11",
|
||||
TDT_QUICKREQ | TDT_CRC, 0x11);
|
||||
}
|
||||
|
||||
|
@ -1030,17 +1030,17 @@ dvb_table_add_default_dvb(th_dvb_mux_instance_t *tdmi)
|
|||
* Demux for default ATSC tables that we want
|
||||
*/
|
||||
static void
|
||||
dvb_table_add_default_atsc(th_dvb_mux_instance_t *tdmi)
|
||||
dvb_table_add_default_atsc(dvb_mux_t *dm)
|
||||
{
|
||||
int tableid;
|
||||
|
||||
if(tdmi->tdmi_mux->dm_conf.dmc_fe_params.u.vsb.modulation == VSB_8) {
|
||||
if(dm->dm_conf.dmc_fe_params.u.vsb.modulation == VSB_8) {
|
||||
tableid = 0xc8; // Terrestrial
|
||||
} else {
|
||||
tableid = 0xc9; // Cable
|
||||
}
|
||||
|
||||
tdt_add(tdmi, tableid, 0xff, atsc_vct_callback, NULL, "vct",
|
||||
tdt_add(dm, tableid, 0xff, atsc_vct_callback, NULL, "vct",
|
||||
TDT_QUICKREQ | TDT_CRC, 0x1ffb);
|
||||
}
|
||||
|
||||
|
@ -1051,26 +1051,26 @@ dvb_table_add_default_atsc(th_dvb_mux_instance_t *tdmi)
|
|||
* Setup FD + demux for default tables that we want
|
||||
*/
|
||||
void
|
||||
dvb_table_add_default(th_dvb_mux_instance_t *tdmi)
|
||||
dvb_table_add_default(dvb_mux_t *dm)
|
||||
{
|
||||
/* Program Allocation Table */
|
||||
tdt_add(tdmi, 0x00, 0xff, dvb_pat_callback, NULL, "pat",
|
||||
tdt_add(dm, 0x00, 0xff, dvb_pat_callback, NULL, "pat",
|
||||
TDT_QUICKREQ | TDT_CRC, 0);
|
||||
|
||||
/* Conditional Access Table */
|
||||
tdt_add(tdmi, 0x1, 0xff, dvb_cat_callback, NULL, "cat",
|
||||
tdt_add(dm, 0x1, 0xff, dvb_cat_callback, NULL, "cat",
|
||||
TDT_CRC, 1);
|
||||
|
||||
|
||||
switch(tdmi->tdmi_adapter->tda_fe_type) {
|
||||
switch(dm->dm_dn->dn_fe_type) {
|
||||
case FE_QPSK:
|
||||
case FE_OFDM:
|
||||
case FE_QAM:
|
||||
dvb_table_add_default_dvb(tdmi);
|
||||
dvb_table_add_default_dvb(dm);
|
||||
break;
|
||||
|
||||
case FE_ATSC:
|
||||
dvb_table_add_default_atsc(tdmi);
|
||||
dvb_table_add_default_atsc(dm);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1080,24 +1080,26 @@ dvb_table_add_default(th_dvb_mux_instance_t *tdmi)
|
|||
* Setup FD + demux for a services PMT
|
||||
*/
|
||||
void
|
||||
dvb_table_add_pmt(th_dvb_mux_instance_t *tdmi, int pmt_pid)
|
||||
dvb_table_add_pmt(dvb_mux_t *dm, int pmt_pid)
|
||||
{
|
||||
char pmtname[100];
|
||||
|
||||
snprintf(pmtname, sizeof(pmtname), "PMT(%d)", pmt_pid);
|
||||
tdt_add(tdmi, 0x2, 0xff, dvb_pmt_callback, NULL, pmtname,
|
||||
tdt_add(dm, 0x2, 0xff, dvb_pmt_callback, NULL, pmtname,
|
||||
TDT_CRC | TDT_QUICKREQ | TDT_TDT, pmt_pid);
|
||||
}
|
||||
|
||||
void
|
||||
dvb_table_rem_pmt(th_dvb_mux_instance_t *tdmi, int pmt_pid)
|
||||
dvb_table_rem_pmt(dvb_mux_t *dm, int pmt_pid)
|
||||
{
|
||||
th_dvb_mux_instance_t *tdmi = dm->dm_tdmi;
|
||||
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
|
||||
th_dvb_table_t *tdt = NULL;
|
||||
LIST_FOREACH(tdt, &tdmi->tdmi_tables, tdt_link)
|
||||
if (tdt->tdt_pid == pmt_pid && tdt->tdt_callback == dvb_pmt_callback)
|
||||
break;
|
||||
if (tdt) dvb_tdt_destroy(tda, tdmi, tdt);
|
||||
if (tdt)
|
||||
dvb_tdt_destroy(tda, tdmi, tdt);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -169,10 +169,10 @@ struct epggrab_module_ext
|
|||
*/
|
||||
struct epggrab_ota_mux
|
||||
{
|
||||
TAILQ_ENTRY(epggrab_ota_mux) glob_link; ///< Grabber link
|
||||
TAILQ_ENTRY(epggrab_ota_mux) tdmi_link; ///< Link to mux
|
||||
TAILQ_ENTRY(epggrab_ota_mux) grab_link; ///< Link to grabber
|
||||
struct th_dvb_mux_instance *tdmi; ///< Mux instance
|
||||
TAILQ_ENTRY(epggrab_ota_mux) glob_link;///< Grabber link
|
||||
TAILQ_ENTRY(epggrab_ota_mux) dm_link; ///< Link to dvb mux
|
||||
TAILQ_ENTRY(epggrab_ota_mux) grab_link;///< Link to grabber
|
||||
struct dvb_mux *dm; ///< Mux instance
|
||||
epggrab_module_ota_t *grab; ///< Grab instance
|
||||
|
||||
int timeout; ///< Time out if this long
|
||||
|
@ -203,7 +203,7 @@ struct epggrab_module_ota
|
|||
TAILQ_HEAD(, epggrab_ota_mux) muxes; ///< List of related muxes
|
||||
|
||||
/* Transponder tuning */
|
||||
void (*start) ( epggrab_module_ota_t *m, struct th_dvb_mux_instance *tdmi );
|
||||
void (*start) ( epggrab_module_ota_t *m, struct dvb_mux *dm );
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -259,11 +259,11 @@ void epggrab_channel_mod ( struct channel *ch );
|
|||
/*
|
||||
* Transport handling
|
||||
*/
|
||||
void epggrab_mux_start ( struct th_dvb_mux_instance *tdmi );
|
||||
void epggrab_mux_stop ( struct th_dvb_mux_instance *tdmi, int timeout );
|
||||
void epggrab_mux_delete ( struct th_dvb_mux_instance *tdmi );
|
||||
int epggrab_mux_period ( struct th_dvb_mux_instance *tdmi );
|
||||
struct th_dvb_mux_instance *epggrab_mux_next ( struct th_dvb_adapter *tda );
|
||||
void epggrab_mux_start ( struct dvb_mux *tdmi );
|
||||
void epggrab_mux_stop ( struct dvb_mux *tdmi, int timeout );
|
||||
void epggrab_mux_delete ( struct dvb_mux *tdmi );
|
||||
int epggrab_mux_period ( struct dvb_mux *tdmi );
|
||||
struct dvb_mux *epggrab_mux_next ( struct th_dvb_adapter *tda );
|
||||
|
||||
/*
|
||||
* Re-schedule
|
||||
|
|
|
@ -457,7 +457,7 @@ epggrab_module_ota_t *epggrab_module_ota_create
|
|||
( epggrab_module_ota_t *skel,
|
||||
const char *id, const char *name, int priority,
|
||||
void (*start) (epggrab_module_ota_t*m,
|
||||
struct th_dvb_mux_instance *tdmi),
|
||||
struct dvb_mux *dm),
|
||||
int (*enable) (void *m, uint8_t e ),
|
||||
epggrab_channel_tree_t *channels )
|
||||
{
|
||||
|
|
|
@ -654,9 +654,9 @@ static int _eit_process_event
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int _eit_callback
|
||||
( th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||
uint8_t tableid, void *opaque )
|
||||
static int
|
||||
_eit_callback(dvb_mux_t *dm, uint8_t *ptr, int len,
|
||||
uint8_t tableid, void *opaque)
|
||||
{
|
||||
epggrab_module_t *mod = opaque;
|
||||
epggrab_ota_mux_t *ota;
|
||||
|
@ -672,7 +672,7 @@ static int _eit_callback
|
|||
if(tableid < 0x4e || tableid > 0x6f || len < 11) return -1;
|
||||
|
||||
/* Get OTA */
|
||||
ota = epggrab_ota_find((epggrab_module_ota_t*)mod, tdmi);
|
||||
ota = epggrab_ota_find((epggrab_module_ota_t*)mod, dm);
|
||||
if (!ota || !ota->status) return -1;
|
||||
sta = ota->status;
|
||||
|
||||
|
@ -713,24 +713,26 @@ static int _eit_callback
|
|||
// Note: tableid=0x4f,0x60-0x6f is other TS
|
||||
// so must find the tdmi
|
||||
if(tableid == 0x4f || tableid >= 0x60) {
|
||||
tda = tdmi->tdmi_adapter;
|
||||
tdmi = dvb_mux_find(tda, NULL, onid, tsid, 1);
|
||||
tda = dm->dm_tdmi->tdmi_adapter;
|
||||
th_dvb_mux_instance_t *tdmi = dvb_mux_find(tda, NULL, onid, tsid, 1);
|
||||
dm = tdmi->tdmi_mux;
|
||||
|
||||
} else {
|
||||
if (tdmi->tdmi_mux->dm_transport_stream_id != tsid ||
|
||||
tdmi->tdmi_mux->dm_network_id != onid) {
|
||||
if (dm->dm_transport_stream_id != tsid ||
|
||||
dm->dm_network_id != onid) {
|
||||
#ifdef EPG_EIT_TRACE
|
||||
tvhlog(LOG_DEBUG, mod->id,
|
||||
"invalid transport id found tid 0x%02X, onid:tsid %d:%d != %d:%d",
|
||||
tableid, tdmi->tdmi_network_id, tdmi->tdmi_transport_stream_id,
|
||||
onid, tsid);
|
||||
#endif
|
||||
tdmi = NULL;
|
||||
dm = NULL;
|
||||
}
|
||||
}
|
||||
if(!tdmi) goto done;
|
||||
if(!dm) goto done;
|
||||
|
||||
/* Get service */
|
||||
svc = dvb_service_find3(NULL, tdmi, NULL, 0, 0, sid, 1, 1);
|
||||
svc = dvb_service_find3(NULL, dm->dm_tdmi, NULL, 0, 0, sid, 1, 1);
|
||||
if (!svc || !svc->s_ch) goto done;
|
||||
|
||||
/* Register as interesting */
|
||||
|
@ -815,10 +817,9 @@ static void _eit_ota_destroy ( epggrab_ota_mux_t *ota )
|
|||
}
|
||||
|
||||
static void _eit_start
|
||||
( epggrab_module_ota_t *m, th_dvb_mux_instance_t *tdmi )
|
||||
( epggrab_module_ota_t *m, dvb_mux_t *dm )
|
||||
{
|
||||
epggrab_ota_mux_t *ota;
|
||||
|
||||
/* Disabled */
|
||||
if (!m->enabled) return;
|
||||
|
||||
|
@ -830,7 +831,7 @@ static void _eit_start
|
|||
}
|
||||
|
||||
/* Register */
|
||||
if (!(ota = epggrab_ota_create(m, tdmi))) return;
|
||||
if (!(ota = epggrab_ota_create(m, dm))) return;
|
||||
if (!ota->status) {
|
||||
ota->status = calloc(1, sizeof(eit_status_t));
|
||||
ota->destroy = _eit_ota_destroy;
|
||||
|
@ -842,16 +843,16 @@ static void _eit_start
|
|||
tdt_add(tdmi, 0, 0, dvb_pidx11_callback, m, m->id, TDT_CRC, 3840, NULL);
|
||||
tdt_add(tdmi, 0, 0, _eit_callback, m, m->id, TDT_CRC, 3841, NULL);
|
||||
#endif
|
||||
tdt_add(tdmi, 0, 0, dvb_pidx11_callback, m, m->id, TDT_CRC, 3002);
|
||||
tdt_add(tdmi, 0, 0, _eit_callback, m, m->id, TDT_CRC, 3003);
|
||||
tdt_add(dm, 0, 0, dvb_pidx11_callback, m, m->id, TDT_CRC, 3002);
|
||||
tdt_add(dm, 0, 0, _eit_callback, m, m->id, TDT_CRC, 3003);
|
||||
|
||||
/* Viasat Baltic (0x39) */
|
||||
} else if (!strcmp("viasat_baltic", m->id)) {
|
||||
tdt_add(tdmi, 0, 0, _eit_callback, m, m->id, TDT_CRC, 0x39);
|
||||
tdt_add(dm, 0, 0, _eit_callback, m, m->id, TDT_CRC, 0x39);
|
||||
|
||||
/* Standard (0x12) */
|
||||
} else {
|
||||
tdt_add(tdmi, 0, 0, _eit_callback, m, m->id, TDT_CRC, 0x12);
|
||||
tdt_add(dm, 0, 0, _eit_callback, m, m->id, TDT_CRC, 0x12);
|
||||
}
|
||||
tvhlog(LOG_DEBUG, m->id, "install table handlers");
|
||||
}
|
||||
|
|
|
@ -519,11 +519,11 @@ static int _opentv_bat_section
|
|||
* ***********************************************************************/
|
||||
|
||||
static epggrab_ota_mux_t *_opentv_event_callback
|
||||
( th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len, uint8_t tid, void *p )
|
||||
( dvb_mux_t *dm, uint8_t *buf, int len, uint8_t tid, void *p )
|
||||
{
|
||||
th_dvb_table_t *tdt = p;
|
||||
opentv_module_t *mod = tdt->tdt_opaque;
|
||||
epggrab_ota_mux_t *ota = epggrab_ota_find((epggrab_module_ota_t*)mod, tdmi);
|
||||
epggrab_ota_mux_t *ota = epggrab_ota_find((epggrab_module_ota_t*)mod, dm);
|
||||
opentv_status_t *sta;
|
||||
opentv_pid_t *pid;
|
||||
|
||||
|
@ -584,9 +584,9 @@ static epggrab_ota_mux_t *_opentv_event_callback
|
|||
}
|
||||
|
||||
static int _opentv_title_callback
|
||||
( th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len, uint8_t tid, void *p )
|
||||
( dvb_mux_t *dm, uint8_t *buf, int len, uint8_t tid, void *p )
|
||||
{
|
||||
epggrab_ota_mux_t *ota = _opentv_event_callback(tdmi, buf, len, tid, p);
|
||||
epggrab_ota_mux_t *ota = _opentv_event_callback(dm, buf, len, tid, p);
|
||||
if (ota)
|
||||
return _opentv_parse_event_section((opentv_module_t*)ota->grab,
|
||||
(opentv_status_t*)ota->status,
|
||||
|
@ -595,9 +595,9 @@ static int _opentv_title_callback
|
|||
}
|
||||
|
||||
static int _opentv_summary_callback
|
||||
( th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len, uint8_t tid, void *p )
|
||||
( dvb_mux_t *dm, uint8_t *buf, int len, uint8_t tid, void *p )
|
||||
{
|
||||
epggrab_ota_mux_t *ota = _opentv_event_callback(tdmi, buf, len, tid, p);
|
||||
epggrab_ota_mux_t *ota = _opentv_event_callback(dm, buf, len, tid, p);
|
||||
if (ota)
|
||||
return _opentv_parse_event_section((opentv_module_t*)ota->grab,
|
||||
(opentv_status_t*)ota->status,
|
||||
|
@ -606,10 +606,10 @@ static int _opentv_summary_callback
|
|||
}
|
||||
|
||||
static int _opentv_channel_callback
|
||||
( th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len, uint8_t tid, void *p )
|
||||
( dvb_mux_t *dm, uint8_t *buf, int len, uint8_t tid, void *p )
|
||||
{
|
||||
opentv_module_t *mod = p;
|
||||
epggrab_ota_mux_t *ota = epggrab_ota_find((epggrab_module_ota_t*)mod, tdmi);
|
||||
epggrab_ota_mux_t *ota = epggrab_ota_find((epggrab_module_ota_t*)mod, dm);
|
||||
opentv_status_t *sta;
|
||||
if (!ota || !ota->status) return 0;
|
||||
sta = ota->status;
|
||||
|
@ -642,7 +642,7 @@ static void _opentv_ota_destroy ( epggrab_ota_mux_t *ota )
|
|||
}
|
||||
|
||||
static void _opentv_start
|
||||
( epggrab_module_ota_t *m, th_dvb_mux_instance_t *tdmi )
|
||||
( epggrab_module_ota_t *m, dvb_mux_t *dm )
|
||||
{
|
||||
int *t;
|
||||
epggrab_ota_mux_t *ota;
|
||||
|
@ -651,10 +651,10 @@ static void _opentv_start
|
|||
|
||||
/* Ignore */
|
||||
if (!m->enabled) return;
|
||||
if (mod->tsid != tdmi->tdmi_mux->dm_transport_stream_id) return;
|
||||
if (mod->tsid != dm->dm_transport_stream_id) return;
|
||||
|
||||
/* Create link */
|
||||
if (!(ota = epggrab_ota_create(m, tdmi))) return;
|
||||
if (!(ota = epggrab_ota_create(m, dm))) return;
|
||||
if (!ota->status) {
|
||||
ota->status = calloc(1, sizeof(opentv_status_t));
|
||||
ota->destroy = _opentv_ota_destroy;
|
||||
|
@ -672,7 +672,7 @@ static void _opentv_start
|
|||
t = mod->channel;
|
||||
while (*t) {
|
||||
// TODO: what about 0x46 (service description)
|
||||
tdt_add(tdmi, 0x4a, 0xff, _opentv_channel_callback, m,
|
||||
tdt_add(dm, 0x4a, 0xff, _opentv_channel_callback, m,
|
||||
m->id, TDT_CRC, *t++);
|
||||
}
|
||||
|
||||
|
@ -680,7 +680,7 @@ static void _opentv_start
|
|||
t = mod->title;
|
||||
while (*t) {
|
||||
_opentv_status_get_pid(sta, *t);
|
||||
tdt_add(tdmi, 0xa0, 0xfc, _opentv_title_callback, m,
|
||||
tdt_add(dm, 0xa0, 0xfc, _opentv_title_callback, m,
|
||||
m->id, TDT_CRC | TDT_TDT, *t++);
|
||||
}
|
||||
|
||||
|
@ -688,7 +688,7 @@ static void _opentv_start
|
|||
t = mod->summary;
|
||||
while (*t) {
|
||||
_opentv_status_get_pid(sta, *t);
|
||||
tdt_add(tdmi, 0xa8, 0xfc, _opentv_summary_callback, m,
|
||||
tdt_add(dm, 0xa8, 0xfc, _opentv_summary_callback, m,
|
||||
m->id, TDT_CRC | TDT_TDT, *t++);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,27 +36,27 @@ TAILQ_HEAD(, epggrab_ota_mux) ota_mux_all;
|
|||
* Global functions (called from DVB code)
|
||||
* *************************************************************************/
|
||||
|
||||
void epggrab_mux_start ( th_dvb_mux_instance_t *tdmi )
|
||||
void epggrab_mux_start ( dvb_mux_t *dm )
|
||||
{
|
||||
epggrab_module_t *m;
|
||||
epggrab_module_ota_t *om;
|
||||
LIST_FOREACH(m, &epggrab_modules, link) {
|
||||
if (m->type == EPGGRAB_OTA) {
|
||||
om = (epggrab_module_ota_t*)m;
|
||||
if (om->start) om->start(om, tdmi);
|
||||
if (om->start) om->start(om, dm);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void epggrab_mux_stop ( th_dvb_mux_instance_t *tdmi, int timeout )
|
||||
void epggrab_mux_stop ( dvb_mux_t *dm, int timeout )
|
||||
{
|
||||
// Note: the slightly akward list iteration here is because
|
||||
// _ota_cancel/delete can remove the object and free() it
|
||||
epggrab_ota_mux_t *a, *b;
|
||||
a = TAILQ_FIRST(&tdmi->tdmi_epg_grab);
|
||||
a = TAILQ_FIRST(&dm->dm_epg_grab);
|
||||
while (a) {
|
||||
b = TAILQ_NEXT(a, tdmi_link);
|
||||
if (a->tdmi == tdmi) {
|
||||
b = TAILQ_NEXT(a, dm_link);
|
||||
if (a->dm == dm) {
|
||||
if (timeout)
|
||||
epggrab_ota_timeout(a);
|
||||
else
|
||||
|
@ -66,16 +66,16 @@ void epggrab_mux_stop ( th_dvb_mux_instance_t *tdmi, int timeout )
|
|||
}
|
||||
}
|
||||
|
||||
void epggrab_mux_delete ( th_dvb_mux_instance_t *tdmi )
|
||||
void epggrab_mux_delete ( dvb_mux_t *dm )
|
||||
{
|
||||
epggrab_ota_destroy_by_tdmi(tdmi);
|
||||
epggrab_ota_destroy_by_dm(dm);
|
||||
}
|
||||
|
||||
int epggrab_mux_period ( th_dvb_mux_instance_t *tdmi )
|
||||
int epggrab_mux_period ( dvb_mux_t *dm )
|
||||
{
|
||||
int period = 0;
|
||||
epggrab_ota_mux_t *ota;
|
||||
TAILQ_FOREACH(ota, &tdmi->tdmi_epg_grab, tdmi_link) {
|
||||
TAILQ_FOREACH(ota, &dm->dm_epg_grab, dm_link) {
|
||||
if (!ota->is_reg) continue;
|
||||
if (ota->timeout > period)
|
||||
period = ota->timeout;
|
||||
|
@ -83,7 +83,7 @@ int epggrab_mux_period ( th_dvb_mux_instance_t *tdmi )
|
|||
return period;
|
||||
}
|
||||
|
||||
th_dvb_mux_instance_t *epggrab_mux_next ( th_dvb_adapter_t *tda )
|
||||
dvb_mux_t *epggrab_mux_next ( th_dvb_adapter_t *tda )
|
||||
{
|
||||
time_t now;
|
||||
epggrab_ota_mux_t *ota;
|
||||
|
@ -91,9 +91,9 @@ th_dvb_mux_instance_t *epggrab_mux_next ( th_dvb_adapter_t *tda )
|
|||
TAILQ_FOREACH(ota, &ota_mux_all, glob_link) {
|
||||
if (ota->interval + ota->completed > now) return NULL;
|
||||
if (!ota->is_reg) return NULL;
|
||||
if (ota->tdmi->tdmi_adapter == tda) break;
|
||||
if (ota->dm->dm_tdmi->tdmi_adapter == tda) break;
|
||||
}
|
||||
return ota ? ota->tdmi : NULL;
|
||||
return ota ? ota->dm : NULL;
|
||||
}
|
||||
|
||||
/* **************************************************************************
|
||||
|
@ -148,7 +148,7 @@ static void _epggrab_ota_save_one ( htsmsg_t *m, epggrab_module_ota_t *mod )
|
|||
if (!l) l = htsmsg_create_list();
|
||||
e = htsmsg_create_map();
|
||||
|
||||
const dvb_mux_t *dm = ota->tdmi->tdmi_mux;
|
||||
const dvb_mux_t *dm = ota->dm;
|
||||
|
||||
htsmsg_add_u32(e, "onid", dm->dm_network_id);
|
||||
htsmsg_add_u32(e, "tsid", dm->dm_transport_stream_id);
|
||||
|
@ -212,11 +212,11 @@ static int _ota_time_cmp ( void *_a, void *_b )
|
|||
* Find existing link
|
||||
*/
|
||||
epggrab_ota_mux_t *epggrab_ota_find
|
||||
( epggrab_module_ota_t *mod, th_dvb_mux_instance_t *tdmi )
|
||||
( epggrab_module_ota_t *mod, dvb_mux_t *dm )
|
||||
{
|
||||
epggrab_ota_mux_t *ota;
|
||||
TAILQ_FOREACH(ota, &mod->muxes, grab_link) {
|
||||
if (ota->tdmi == tdmi) break;
|
||||
if (ota->dm == dm) break;
|
||||
}
|
||||
return ota;
|
||||
}
|
||||
|
@ -225,18 +225,18 @@ epggrab_ota_mux_t *epggrab_ota_find
|
|||
* Create (temporary) or Find (existing) link
|
||||
*/
|
||||
epggrab_ota_mux_t *epggrab_ota_create
|
||||
( epggrab_module_ota_t *mod, th_dvb_mux_instance_t *tdmi )
|
||||
( epggrab_module_ota_t *mod, dvb_mux_t *dm)
|
||||
{
|
||||
/* Search for existing */
|
||||
epggrab_ota_mux_t *ota = epggrab_ota_find(mod, tdmi);
|
||||
epggrab_ota_mux_t *ota = epggrab_ota_find(mod, dm);
|
||||
|
||||
/* Create new */
|
||||
if (!ota) {
|
||||
ota = calloc(1, sizeof(epggrab_ota_mux_t));
|
||||
ota->grab = mod;
|
||||
ota->tdmi = tdmi;
|
||||
ota->dm = dm;
|
||||
TAILQ_INSERT_TAIL(&ota_mux_all, ota, glob_link);
|
||||
TAILQ_INSERT_TAIL(&tdmi->tdmi_epg_grab, ota, tdmi_link);
|
||||
TAILQ_INSERT_TAIL(&dm->dm_epg_grab, ota, dm_link);
|
||||
TAILQ_INSERT_TAIL(&mod->muxes, ota, grab_link);
|
||||
|
||||
} else {
|
||||
|
@ -259,12 +259,12 @@ void epggrab_ota_create_and_register_by_id
|
|||
epggrab_ota_mux_t *ota;
|
||||
TAILQ_FOREACH(tda, &dvb_adapters, tda_global_link) {
|
||||
LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link) {
|
||||
const dvb_mux_t *dm = tdmi->tdmi_mux;
|
||||
dvb_mux_t *dm = tdmi->tdmi_mux;
|
||||
if (dm->dm_transport_stream_id != tsid) continue;
|
||||
if (onid && dm->dm_network_id != onid) continue;
|
||||
if (networkname && (!dm->dm_network_name ||
|
||||
strcmp(networkname, dm->dm_network_name))) continue;
|
||||
ota = epggrab_ota_create(mod, tdmi);
|
||||
ota = epggrab_ota_create(mod, dm);
|
||||
epggrab_ota_register(ota, period, interval);
|
||||
}
|
||||
}
|
||||
|
@ -276,7 +276,7 @@ void epggrab_ota_create_and_register_by_id
|
|||
void epggrab_ota_destroy ( epggrab_ota_mux_t *ota )
|
||||
{
|
||||
TAILQ_REMOVE(&ota_mux_all, ota, glob_link);
|
||||
TAILQ_REMOVE(&ota->tdmi->tdmi_epg_grab, ota, tdmi_link);
|
||||
TAILQ_REMOVE(&ota->dm->dm_epg_grab, ota, dm_link);
|
||||
TAILQ_REMOVE(&ota->grab->muxes, ota, grab_link);
|
||||
if (ota->destroy) ota->destroy(ota);
|
||||
else {
|
||||
|
@ -288,10 +288,10 @@ void epggrab_ota_destroy ( epggrab_ota_mux_t *ota )
|
|||
/*
|
||||
* Destroy by tdmi
|
||||
*/
|
||||
void epggrab_ota_destroy_by_tdmi ( th_dvb_mux_instance_t *tdmi )
|
||||
void epggrab_ota_destroy_by_dm ( dvb_mux_t *dm )
|
||||
{
|
||||
epggrab_ota_mux_t *ota;
|
||||
while ((ota = TAILQ_FIRST(&tdmi->tdmi_epg_grab)))
|
||||
while ((ota = TAILQ_FIRST(&dm->dm_epg_grab)))
|
||||
epggrab_ota_destroy(ota);
|
||||
}
|
||||
|
||||
|
@ -359,7 +359,7 @@ int epggrab_ota_begin ( epggrab_ota_mux_t *ota )
|
|||
|
||||
void epggrab_ota_complete ( epggrab_ota_mux_t *ota )
|
||||
{
|
||||
th_dvb_mux_instance_t *tdmi = ota->tdmi;
|
||||
dvb_mux_t *dm = ota->dm;
|
||||
|
||||
if (ota->state != EPGGRAB_OTA_MUX_COMPLETE) {
|
||||
tvhlog(LOG_DEBUG, ota->grab->id, "processing complete");
|
||||
|
@ -367,12 +367,13 @@ void epggrab_ota_complete ( epggrab_ota_mux_t *ota )
|
|||
time(&ota->completed);
|
||||
|
||||
/* Check others */
|
||||
TAILQ_FOREACH(ota, &tdmi->tdmi_epg_grab, tdmi_link) {
|
||||
TAILQ_FOREACH(ota, &dm->dm_epg_grab, dm_link) {
|
||||
if (ota->is_reg && ota->state == EPGGRAB_OTA_MUX_RUNNING) break;
|
||||
}
|
||||
|
||||
/* All complete (bring timer forward) */
|
||||
if (!ota) {
|
||||
th_dvb_mux_instance_t *tdmi = dm->dm_tdmi;
|
||||
gtimer_arm(&tdmi->tdmi_adapter->tda_mux_scanner_timer,
|
||||
dvb_adapter_mux_scanner, tdmi->tdmi_adapter, 20);
|
||||
}
|
||||
|
|
|
@ -88,7 +88,7 @@ epggrab_module_ota_t *epggrab_module_ota_create
|
|||
( epggrab_module_ota_t *skel,
|
||||
const char *id, const char *name, int priority,
|
||||
void (*start) (epggrab_module_ota_t*m,
|
||||
struct th_dvb_mux_instance *tdmi),
|
||||
struct dvb_mux *dm),
|
||||
int (*enable) (void *m, uint8_t e ),
|
||||
epggrab_channel_tree_t *channels );
|
||||
|
||||
|
@ -109,9 +109,9 @@ void epggrab_ota_save ( void );
|
|||
* blocked (i.e. has completed within interval period)
|
||||
*/
|
||||
epggrab_ota_mux_t *epggrab_ota_find
|
||||
( epggrab_module_ota_t *mod, struct th_dvb_mux_instance *tdmi );
|
||||
( epggrab_module_ota_t *mod, struct dvb_mux *dm );
|
||||
epggrab_ota_mux_t *epggrab_ota_create
|
||||
( epggrab_module_ota_t *mod, struct th_dvb_mux_instance *tdmi );
|
||||
( epggrab_module_ota_t *mod, struct dvb_mux *dm );
|
||||
void epggrab_ota_create_and_register_by_id
|
||||
( epggrab_module_ota_t *mod, int nid, int tsid,
|
||||
int period, int interval, const char *name );
|
||||
|
@ -121,7 +121,7 @@ void epggrab_ota_create_and_register_by_id
|
|||
*/
|
||||
void epggrab_ota_destroy ( epggrab_ota_mux_t *ota );
|
||||
void epggrab_ota_destroy_by_module ( epggrab_module_ota_t *mod );
|
||||
void epggrab_ota_destroy_by_tdmi ( struct th_dvb_mux_instance *tdmi );
|
||||
void epggrab_ota_destroy_by_dm ( struct dvb_mux *dm );
|
||||
|
||||
/*
|
||||
* Register interest
|
||||
|
|
Loading…
Add table
Reference in a new issue