epggrab_ota_map_t *map = mt->mt_opaque;
epggrab_module_t *mod = (epggrab_module_t *)map->om_module;
epggrab_ota_mux_t *ota = NULL;
- mpegts_table_state_t *st;
+ mpegts_psi_table_state_t *st;
/* Validate */
if(tableid < 0x4e || tableid > 0x6f || len < 11)
ota = epggrab_ota_register((epggrab_module_ota_t*)mod, NULL, mm);
/* Begin */
- r = dvb_table_begin(mt, ptr, len, tableid, extraid, 11, &st, §, &last, &ver);
+ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+ tableid, extraid, 11, &st, §, &last, &ver);
if (r != 1) return r;
if (st) {
uint32_t mask;
if (save) epg_updated();
done:
- r = dvb_table_end(mt, st, sect);
+ r = dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
if (ota && !r)
epggrab_ota_complete((epggrab_module_ota_t*)mod, ota);
{
int r = 1, cid, mjd;
int sect, last, ver;
- mpegts_table_state_t *st;
+ mpegts_psi_table_state_t *st;
opentv_status_t *sta = mt->mt_opaque;
opentv_module_t *mod = sta->os_mod;
epggrab_ota_mux_t *ota = sta->os_ota;
mjd = (mjd - 40587) * 86400;
/* Begin */
- r = dvb_table_begin(mt, buf, len, tableid, (uint64_t)cid << 32 | mjd, 7,
+ r = dvb_table_begin((mpegts_psi_table_t *)mt, buf, len,
+ tableid, (uint64_t)cid << 32 | mjd, 7,
&st, §, &last, &ver);
if (r != 1) goto done;
r = opentv_parse_event_section(sta, cid, mjd, buf, len);
/* End */
- r = dvb_table_end(mt, st, sect);
+ r = dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
/* Complete */
done:
const uint8_t dtag, const uint8_t *dptr, int dlen );
};
-typedef struct mpegts_table_state
-{
- int tableid;
- uint64_t extraid;
- int version;
- int complete;
- int working;
- uint32_t sections[8];
- RB_ENTRY(mpegts_table_state) link;
-} mpegts_table_state_t;
-
typedef struct mpegts_pid_sub
{
RB_ENTRY(mpegts_pid_sub) mps_link;
struct mpegts_table
{
+ mpegts_psi_table_t;
+
/**
* Flags, must never be changed after creation.
* We inspect it without holding global_lock
* File descriptor for filter
*/
- LIST_ENTRY(mpegts_table) mt_link;
TAILQ_ENTRY(mpegts_table) mt_defer_link;
mpegts_mux_t *mt_mux;
- char *mt_name;
-
void *mt_opaque;
void *mt_bat;
mpegts_table_callback_t mt_callback;
- RB_HEAD(,mpegts_table_state) mt_state;
- int mt_complete;
- int mt_incomplete;
- uint8_t mt_finished;
uint8_t mt_subscribed;
uint8_t mt_defer_cmd;
int mt_count;
- int mt_pid;
-
int mt_id;
- int mt_table; // SI table id (base)
- int mt_mask; // mask
-
int mt_destroyed; // Refcounting
int mt_arefcount;
typedef void (*mpegts_psi_section_callback_t)
( const uint8_t *tsb, size_t len, void *opaque );
+typedef struct mpegts_psi_table_state
+{
+ int tableid;
+ uint64_t extraid;
+ int version;
+ int complete;
+ int working;
+ uint32_t sections[8];
+ RB_ENTRY(mpegts_psi_table_state) link;
+} mpegts_psi_table_state_t;
+
+typedef struct mpegts_psi_table
+{
+ LIST_ENTRY(mpegts_table) mt_link;
+ RB_HEAD(,mpegts_psi_table_state) mt_state;
+
+ char *mt_name;
+
+ uint8_t mt_table; // SI table id (base)
+ uint8_t mt_mask; // mask
+
+ int mt_pid;
+
+ int mt_complete;
+ int mt_incomplete;
+ uint8_t mt_finished;
+} mpegts_psi_table_t;
+
/*
* Assemble SI section
*/
/* PSI table callbacks */
int dvb_table_end
- (struct mpegts_table *mt, struct mpegts_table_state *st, int sect );
+ (mpegts_psi_table_t *mt, mpegts_psi_table_state_t *st, int sect );
int dvb_table_begin
- (struct mpegts_table *mt, const uint8_t *ptr, int len,
+ (mpegts_psi_table_t *mt, const uint8_t *ptr, int len,
int tableid, uint64_t extraid, int minlen,
- struct mpegts_table_state **st, int *sect, int *last, int *ver);
-void dvb_table_reset
- (struct mpegts_table *mt);
+ mpegts_psi_table_state_t **st, int *sect, int *last, int *ver);
+void dvb_table_reset (mpegts_psi_table_t *mt);
+void dvb_table_release (mpegts_psi_table_t *mt);
extern htsmsg_t *satellites;
int r, sect, last, ver;
uint16_t sid, pid, tsid;
uint16_t nit_pid = 0;
- mpegts_mux_t *mm = mt->mt_mux;
- mpegts_table_state_t *st = NULL;
+ mpegts_mux_t *mm = mt->mt_mux;
+ mpegts_psi_table_state_t *st = NULL;
mpegts_service_t *s;
/* Begin */
if (tableid != 0) return -1;
tsid = (ptr[0] << 8) | ptr[1];
- r = dvb_table_begin(mt, ptr, len, tableid, tsid, 5,
- &st, §, &last, &ver);
+ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+ tableid, tsid, 5, &st, §, &last, &ver);
if (r != 1) return r;
/* Multiplex */
NULL, "nit", MT_QUICKREQ | MT_CRC, nit_pid);
/* End */
- return dvb_table_end(mt, st, sect);
+ return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
}
/*
uint8_t dtag, dlen;
uint16_t pid;
uintptr_t caid;
- mpegts_mux_t *mm = mt->mt_mux;
- mpegts_table_state_t *st = NULL;
+ mpegts_mux_t *mm = mt->mt_mux;
+ mpegts_psi_table_state_t *st = NULL;
/* Start */
- r = dvb_table_begin(mt, ptr, len, tableid, 0, 5, &st, §, &last, &ver);
+ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+ tableid, 0, 5, &st, §, &last, &ver);
if (r != 1) return r;
ptr += 5;
len -= 5;
}
/* Finish */
- return dvb_table_end(mt, st, sect);
+ return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
}
/*
uint16_t sid;
mpegts_mux_t *mm = mt->mt_mux;
mpegts_service_t *s;
- mpegts_table_state_t *st = NULL;
+ mpegts_psi_table_state_t *st = NULL;
/* Start */
sid = ptr[0] << 8 | ptr[1];
- r = dvb_table_begin(mt, ptr, len, tableid, sid, 9, &st, §, &last, &ver);
+ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+ tableid, sid, 9, &st, §, &last, &ver);
if (r != 1) return r;
/* Find service */
service_restart((service_t*)s);
/* Finish */
- return dvb_table_end(mt, st, sect);
+ return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
}
/*
mpegts_mux_t *mm = mt->mt_mux, *mux;
mpegts_network_t *mn = mm->mm_network;
char name[256];
- mpegts_table_state_t *st = NULL;
+ mpegts_psi_table_state_t *st = NULL;
const char *charset;
bouquet_t *bq = NULL;
dvb_bat_t *b = NULL;
tableid != DVB_FASTSCAN_NIT_BASE)
return -1;
- r = dvb_table_begin(mt, ptr, len, tableid, nbid, 7, &st, §, &last, &ver);
+ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+ tableid, nbid, 7, &st, §, &last, &ver);
if (r == 0) {
if (tableid == 0x4A || tableid == DVB_FASTSCAN_NIT_BASE) {
if ((b = mt->mt_bat) != NULL) {
/* Specific NID */
if (mn->mn_nid) {
if (mn->mn_nid != nbid) {
- return dvb_table_end(mt, st, sect);
+ return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
}
/* Only use "this" network */
} else if (tableid != 0x40) {
- return dvb_table_end(mt, st, sect);
+ return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
}
}
}
/* End */
- return dvb_table_end(mt, st, sect);
+ return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
}
/**
uint16_t onid, tsid;
mpegts_mux_t *mm = mt->mt_mux, *mm_orig = mm;
mpegts_network_t *mn = mm->mm_network;
- mpegts_table_state_t *st = NULL;
+ mpegts_psi_table_state_t *st = NULL;
/* Begin */
tsid = ptr[0] << 8 | ptr[1];
onid = ptr[5] << 8 | ptr[6];
extraid = ((int)onid) << 16 | tsid;
if (tableid != 0x42 && tableid != 0x46) return -1;
- r = dvb_table_begin(mt, ptr, len, tableid, extraid, 8, &st, §, &last, &ver);
+ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+ tableid, extraid, 8, &st, §, &last, &ver);
if (r != 1) return r;
/* ID */
}
/* Done */
- return dvb_table_end(mt, st, sect);
+ return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
}
/*
mpegts_mux_t *mm = mt->mt_mux, *mm_orig = mm;
mpegts_network_t *mn = mm->mm_network;
mpegts_service_t *s;
- mpegts_table_state_t *st = NULL;
+ mpegts_psi_table_state_t *st = NULL;
/* Validate */
if (tableid != 0xc8 && tableid != 0xc9) return -1;
extraid = tsid;
/* Begin */
- r = dvb_table_begin(mt, ptr, len, tableid, extraid, 7,
- &st, §, &last, &ver);
+ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+ tableid, extraid, 7, &st, §, &last, &ver);
if (r != 1) return r;
tvhdebug("vct", "tsid %04X (%d)", tsid, tsid);
len -= dlen + 32;
}
- return dvb_table_end(mt, st, sect);
+ return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
}
#if ENABLE_MPEGTS_DVB
static int
dvb_fs_sdt_mux
- ( mpegts_table_t *mt, mpegts_mux_t *mm, mpegts_table_state_t *st,
+ ( mpegts_table_t *mt, mpegts_mux_t *mm, mpegts_psi_table_state_t *st,
const uint8_t *ptr, int len, int discovery )
{
uint16_t onid, tsid, service_id;
int r, sect, last, ver;
uint16_t nbid;
mpegts_mux_t *mm = mt->mt_mux;
- mpegts_table_state_t *st = NULL;
+ mpegts_psi_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);
+ r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+ tableid, nbid, 7, &st, §, &last, &ver);
if (r == 0) {
mt->mt_working -= st->working;
st->working = 0;
dvb_fs_sdt_mux(mt, mm, st, ptr, len, 0);
/* End */
- return dvb_table_end(mt, st, sect);
+ return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
}
#endif
#include "input.h"
#include "dvb.h"
-SKEL_DECLARE(mpegts_table_state_skel, struct mpegts_table_state);
+SKEL_DECLARE(mpegts_psi_table_state_skel, struct mpegts_psi_table_state);
/* **************************************************************************
* Lookup tables
*/
static int sect_cmp
- ( struct mpegts_table_state *a, struct mpegts_table_state *b )
+ ( mpegts_psi_table_state_t *a, mpegts_psi_table_state_t *b )
{
if (a->tableid != b->tableid)
return a->tableid - b->tableid;
static void
mpegts_table_state_reset
- ( mpegts_table_t *mt, mpegts_table_state_t *st, int last )
+ ( mpegts_psi_table_t *mt, mpegts_psi_table_state_t *st, int last )
{
int i;
mt->mt_finished = 0;
st->sections[last / 32] = 0xFFFFFFFF << (31 - (last % 32));
}
-static struct mpegts_table_state *
+static mpegts_psi_table_state_t *
mpegts_table_state_find
- ( mpegts_table_t *mt, int tableid, uint64_t extraid, int last )
+ ( mpegts_psi_table_t *mt, int tableid, uint64_t extraid, int last )
{
- struct mpegts_table_state *st;
+ mpegts_psi_table_state_t *st;
/* Find state */
- SKEL_ALLOC(mpegts_table_state_skel);
- mpegts_table_state_skel->tableid = tableid;
- mpegts_table_state_skel->extraid = extraid;
- st = RB_INSERT_SORTED(&mt->mt_state, mpegts_table_state_skel, link, sect_cmp);
+ SKEL_ALLOC(mpegts_psi_table_state_skel);
+ mpegts_psi_table_state_skel->tableid = tableid;
+ mpegts_psi_table_state_skel->extraid = extraid;
+ st = RB_INSERT_SORTED(&mt->mt_state, mpegts_psi_table_state_skel, link, sect_cmp);
if (!st) {
- st = mpegts_table_state_skel;
- SKEL_USED(mpegts_table_state_skel);
+ st = mpegts_psi_table_state_skel;
+ SKEL_USED(mpegts_psi_table_state_skel);
mt->mt_incomplete++;
mpegts_table_state_reset(mt, st, last);
}
*/
static int
dvb_table_complete
- (mpegts_table_t *mt)
+ (mpegts_psi_table_t *mt)
{
if (mt->mt_incomplete || !mt->mt_complete) {
int total = 0;
- mpegts_table_state_t *st;
+ mpegts_psi_table_state_t *st;
RB_FOREACH(st, &mt->mt_state, link)
total++;
tvhtrace(mt->mt_name, "incomplete %d complete %d total %d",
int
dvb_table_end
- (mpegts_table_t *mt, mpegts_table_state_t *st, int sect)
+ (mpegts_psi_table_t *mt, mpegts_psi_table_state_t *st, int sect)
{
int sa, sb;
uint32_t rem;
*/
int
dvb_table_begin
- (mpegts_table_t *mt, const uint8_t *ptr, int len,
+ (mpegts_psi_table_t *mt, const uint8_t *ptr, int len,
int tableid, uint64_t extraid, int minlen,
- mpegts_table_state_t **ret, int *sect, int *last, int *ver)
+ mpegts_psi_table_state_t **ret, int *sect, int *last, int *ver)
{
- mpegts_table_state_t *st;
+ mpegts_psi_table_state_t *st;
uint32_t sa, sb;
/* Not long enough */
}
void
-dvb_table_reset(mpegts_table_t *mt)
+dvb_table_reset(mpegts_psi_table_t *mt)
{
- mpegts_table_state_t *st;
+ mpegts_psi_table_state_t *st;
tvhtrace(mt->mt_name, "pid %02X complete reset", mt->mt_pid);
mt->mt_incomplete = 0;
free(st);
}
}
+
+void
+dvb_table_release(mpegts_psi_table_t *mt)
+{
+ mpegts_psi_table_state_t *st;
+
+ while ((st = RB_FIRST(&mt->mt_state))) {
+ RB_REMOVE(&mt->mt_state, st, link);
+ free(st);
+ }
+}
void dvb_done( void )
{
- extern SKEL_DECLARE(mpegts_table_state_skel, struct mpegts_table_state);
+ extern SKEL_DECLARE(mpegts_psi_table_state_skel, mpegts_psi_table_state_t);
- SKEL_FREE(mpegts_table_state_skel);
+ SKEL_FREE(mpegts_psi_table_state_skel);
#if ENABLE_MPEGTS_DVB
htsmsg_destroy(satellites);
#endif
"(len %i, total %zi, errors %zi)",
len, r, mt->mt_err_log.count);
}
- dvb_table_reset(mt);
+ dvb_table_reset((mpegts_psi_table_t *)mt);
return;
}
void
mpegts_table_release_ ( mpegts_table_t *mt )
{
- struct mpegts_table_state *st;
-
- while ((st = RB_FIRST(&mt->mt_state))) {
- RB_REMOVE(&mt->mt_state, st, link);
- free(st);
- }
+ dvb_table_release((mpegts_psi_table_t *)mt);
tvhtrace("mpegts", "table: mux %p free %s %02X/%02X (%d) pid %04X (%d)",
mt->mt_mux, mt->mt_name, mt->mt_table, mt->mt_mask, mt->mt_table,
mt->mt_pid, mt->mt_pid);