psi tables: moved base parsers outside mpegts.h

This commit is contained in:
Jaroslav Kysela 2015-03-23 13:35:03 +01:00
parent 6547bbe2e0
commit b520cbeb34
8 changed files with 111 additions and 91 deletions

View file

@ -565,7 +565,7 @@ _eit_callback
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)
@ -584,7 +584,8 @@ _eit_callback
ota = epggrab_ota_register((epggrab_module_ota_t*)mod, NULL, mm);
/* Begin */
r = dvb_table_begin(mt, ptr, len, tableid, extraid, 11, &st, &sect, &last, &ver);
r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
tableid, extraid, 11, &st, &sect, &last, &ver);
if (r != 1) return r;
if (st) {
uint32_t mask;
@ -657,7 +658,7 @@ _eit_callback
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);

View file

@ -512,7 +512,7 @@ opentv_table_callback
{
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;
@ -526,7 +526,8 @@ opentv_table_callback
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, &sect, &last, &ver);
if (r != 1) goto done;
@ -534,7 +535,7 @@ opentv_table_callback
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:

View file

@ -125,17 +125,6 @@ struct mpegts_table_mux_cb
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;
@ -165,6 +154,8 @@ typedef struct mpegts_pid
struct mpegts_table
{
mpegts_psi_table_t;
/**
* Flags, must never be changed after creation.
* We inspect it without holding global_lock
@ -194,20 +185,13 @@ struct mpegts_table
* 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;
@ -218,13 +202,8 @@ struct mpegts_table
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;

View file

@ -215,6 +215,34 @@ typedef struct mpegts_psi_section
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
*/
@ -225,13 +253,13 @@ void mpegts_psi_section_reassemble
/* 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;

View file

@ -848,15 +848,15 @@ dvb_pat_callback
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, &sect, &last, &ver);
r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
tableid, tsid, 5, &st, &sect, &last, &ver);
if (r != 1) return r;
/* Multiplex */
@ -907,7 +907,7 @@ dvb_pat_callback
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);
}
/*
@ -921,11 +921,12 @@ dvb_cat_callback
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, &sect, &last, &ver);
r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
tableid, 0, 5, &st, &sect, &last, &ver);
if (r != 1) return r;
ptr += 5;
len -= 5;
@ -956,7 +957,7 @@ dvb_cat_callback
}
/* Finish */
return dvb_table_end(mt, st, sect);
return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
}
/*
@ -971,11 +972,12 @@ dvb_pmt_callback
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, &sect, &last, &ver);
r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
tableid, sid, 9, &st, &sect, &last, &ver);
if (r != 1) return r;
/* Find service */
@ -992,7 +994,7 @@ dvb_pmt_callback
service_restart((service_t*)s);
/* Finish */
return dvb_table_end(mt, st, sect);
return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
}
/*
@ -1267,7 +1269,7 @@ dvb_nit_callback
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;
@ -1281,7 +1283,8 @@ dvb_nit_callback
tableid != DVB_FASTSCAN_NIT_BASE)
return -1;
r = dvb_table_begin(mt, ptr, len, tableid, nbid, 7, &st, &sect, &last, &ver);
r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
tableid, nbid, 7, &st, &sect, &last, &ver);
if (r == 0) {
if (tableid == 0x4A || tableid == DVB_FASTSCAN_NIT_BASE) {
if ((b = mt->mt_bat) != NULL) {
@ -1304,12 +1307,12 @@ dvb_nit_callback
/* 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);
}
}
@ -1426,7 +1429,7 @@ dvb_nit_callback
}
/* End */
return dvb_table_end(mt, st, sect);
return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
}
/**
@ -1579,14 +1582,15 @@ dvb_sdt_callback
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, &sect, &last, &ver);
r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
tableid, extraid, 8, &st, &sect, &last, &ver);
if (r != 1) return r;
/* ID */
@ -1614,7 +1618,7 @@ dvb_sdt_callback
}
/* Done */
return dvb_table_end(mt, st, sect);
return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
}
/*
@ -1632,7 +1636,7 @@ atsc_vct_callback
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;
@ -1642,8 +1646,8 @@ atsc_vct_callback
extraid = tsid;
/* Begin */
r = dvb_table_begin(mt, ptr, len, tableid, extraid, 7,
&st, &sect, &last, &ver);
r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
tableid, extraid, 7, &st, &sect, &last, &ver);
if (r != 1) return r;
tvhdebug("vct", "tsid %04X (%d)", tsid, tsid);
@ -1701,7 +1705,7 @@ next:
len -= dlen + 32;
}
return dvb_table_end(mt, st, sect);
return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
}
@ -1718,7 +1722,7 @@ dvb_bat_callback
#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;
@ -1857,7 +1861,7 @@ dvb_fs_sdt_callback
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];
@ -1865,7 +1869,8 @@ dvb_fs_sdt_callback
/* Begin */
if (tableid != 0xBD)
return -1;
r = dvb_table_begin(mt, ptr, len, tableid, nbid, 7, &st, &sect, &last, &ver);
r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
tableid, nbid, 7, &st, &sect, &last, &ver);
if (r == 0) {
mt->mt_working -= st->working;
st->working = 0;
@ -1879,7 +1884,7 @@ dvb_fs_sdt_callback
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

View file

@ -21,7 +21,7 @@
#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
@ -151,7 +151,7 @@ mpegts_psi_section_reassemble
*/
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;
@ -164,7 +164,7 @@ static int sect_cmp
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;
@ -176,20 +176,20 @@ mpegts_table_state_reset
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);
}
@ -201,11 +201,11 @@ mpegts_table_state_find
*/
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",
@ -220,7 +220,7 @@ dvb_table_complete
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;
@ -250,11 +250,11 @@ dvb_table_end
*/
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 */
@ -326,9 +326,9 @@ dvb_table_begin
}
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;
@ -338,3 +338,14 @@ dvb_table_reset(mpegts_table_t *mt)
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);
}
}

View file

@ -933,9 +933,9 @@ void dvb_init( void )
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

View file

@ -88,7 +88,7 @@ mpegts_table_dispatch
"(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;
}
@ -134,12 +134,7 @@ mpegts_table_dispatch
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);