From b520cbeb34bae9adcff61b972af237a037ac361b Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 23 Mar 2015 13:35:03 +0100 Subject: [PATCH] psi tables: moved base parsers outside mpegts.h --- src/epggrab/module/eit.c | 7 ++-- src/epggrab/module/opentv.c | 7 ++-- src/input/mpegts.h | 25 ++------------ src/input/mpegts/dvb.h | 38 +++++++++++++++++--- src/input/mpegts/dvb_psi.c | 61 ++++++++++++++++++--------------- src/input/mpegts/dvb_psi_lib.c | 51 ++++++++++++++++----------- src/input/mpegts/dvb_support.c | 4 +-- src/input/mpegts/mpegts_table.c | 9 ++--- 8 files changed, 111 insertions(+), 91 deletions(-) diff --git a/src/epggrab/module/eit.c b/src/epggrab/module/eit.c index 5c448fd7..85e53142 100644 --- a/src/epggrab/module/eit.c +++ b/src/epggrab/module/eit.c @@ -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, §, &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; @@ -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); diff --git a/src/epggrab/module/opentv.c b/src/epggrab/module/opentv.c index d735390e..07f4469f 100644 --- a/src/epggrab/module/opentv.c +++ b/src/epggrab/module/opentv.c @@ -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, §, &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: diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 3708c06f..3c075695 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -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; diff --git a/src/input/mpegts/dvb.h b/src/input/mpegts/dvb.h index 8a749246..a30c76c4 100644 --- a/src/input/mpegts/dvb.h +++ b/src/input/mpegts/dvb.h @@ -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; diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index beba4a72..0e9ff0a6 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -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, §, &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 */ @@ -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, §, &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; @@ -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, §, &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 */ @@ -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, §, &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) { @@ -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, §, &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 */ @@ -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, §, &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); @@ -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, §, &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; @@ -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 diff --git a/src/input/mpegts/dvb_psi_lib.c b/src/input/mpegts/dvb_psi_lib.c index 49604969..b65232c0 100644 --- a/src/input/mpegts/dvb_psi_lib.c +++ b/src/input/mpegts/dvb_psi_lib.c @@ -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); + } +} diff --git a/src/input/mpegts/dvb_support.c b/src/input/mpegts/dvb_support.c index 7afd081b..bc9a5c34 100644 --- a/src/input/mpegts/dvb_support.c +++ b/src/input/mpegts/dvb_support.c @@ -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 diff --git a/src/input/mpegts/mpegts_table.c b/src/input/mpegts/mpegts_table.c index f27b671f..29715650 100644 --- a/src/input/mpegts/mpegts_table.c +++ b/src/input/mpegts/mpegts_table.c @@ -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);