From: Jaroslav Kysela Date: Fri, 23 Mar 2018 18:40:38 +0000 (+0100) Subject: IPTV: fix network builder (to add the new network to all IPTV input threads), fixes... X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9ea22e4d0788442cdde66f40932b1cfa7699f41b;p=thirdparty%2Ftvheadend.git IPTV: fix network builder (to add the new network to all IPTV input threads), fixes #5024 - also add mpegts_mux_post_create() helper to set the mux nicename correctly --- diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 10c391304..518d1258d 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -357,7 +357,7 @@ struct mpegts_network (mpegts_mux_t*, uint16_t sid, uint16_t pmt_pid); const idclass_t* (*mn_mux_class) (mpegts_network_t*); mpegts_mux_t * (*mn_mux_create2) (mpegts_network_t *mn, htsmsg_t *conf); - void (*mn_scan) (mpegts_network_t*); + void (*mn_scan) (mpegts_network_t*); /* * Configuration @@ -885,6 +885,8 @@ mpegts_mux_t *mpegts_mux_create0 mpegts_mux_create0(calloc(1, sizeof(mpegts_mux_t)), &mpegts_mux_class, uuid,\ mn, onid, tsid, conf) +mpegts_mux_t *mpegts_mux_post_create(mpegts_mux_t *mm); + static inline mpegts_mux_t *mpegts_mux_find0(tvh_uuid_t *uuid) { return idnode_find0(uuid, &mpegts_mux_class, NULL); } diff --git a/src/input/mpegts/iptv/iptv.c b/src/input/mpegts/iptv/iptv.c index 739fb422e..0897f3c24 100644 --- a/src/input/mpegts/iptv/iptv.c +++ b/src/input/mpegts/iptv/iptv.c @@ -150,7 +150,7 @@ iptv_input_is_free ( mpegts_input_t *mi, mpegts_mux_t *mm, iptv_input_t *mi2; iptv_network_t *in = (iptv_network_t *)mm->mm_network; iptv_thread_pool_t *pool; - + TAILQ_FOREACH(pool, &iptv_tpool, link) { mi2 = pool->input; pthread_mutex_lock(&mi2->mi_output_lock); @@ -1017,7 +1017,8 @@ static mpegts_mux_t * iptv_network_create_mux2 ( mpegts_network_t *mn, htsmsg_t *conf ) { - return (mpegts_mux_t*)iptv_mux_create0((iptv_network_t*)mn, NULL, conf); + iptv_mux_t *im = iptv_mux_create0((iptv_network_t*)mn, NULL, conf); + return mpegts_mux_post_create((mpegts_mux_t *)im); } static void @@ -1059,6 +1060,7 @@ iptv_network_create0 ( const char *uuid, htsmsg_t *conf, const idclass_t *idc ) { iptv_network_t *in = calloc(1, sizeof(*in)); + iptv_mux_t *im; htsmsg_t *c; char ubuf[UUID_HEX_SIZE]; @@ -1098,7 +1100,8 @@ iptv_network_create0 HTSMSG_FOREACH(f, c) { if (!(e = htsmsg_get_map_by_field(f))) continue; if (!(e = htsmsg_get_map(e, "config"))) continue; - iptv_mux_create0(in, f->hmf_name, e); + im = iptv_mux_create0(in, f->hmf_name, e); + mpegts_mux_post_create((mpegts_mux_t *)im); } htsmsg_destroy(c); } @@ -1113,7 +1116,13 @@ static mpegts_network_t * iptv_network_builder ( const idclass_t *idc, htsmsg_t *conf ) { - return (mpegts_network_t*)iptv_network_create0(NULL, conf, idc); + mpegts_network_t *mn; + iptv_thread_pool_t *pool; + + mn = (mpegts_network_t *)iptv_network_create0(NULL, conf, idc); + TAILQ_FOREACH(pool, &iptv_tpool, link) + mpegts_input_add_network((mpegts_input_t *)pool->input, mn); + return mn; } /* ************************************************************************** diff --git a/src/input/mpegts/iptv/iptv_auto.c b/src/input/mpegts/iptv/iptv_auto.c index 509819a06..0ee497df8 100644 --- a/src/input/mpegts/iptv/iptv_auto.c +++ b/src/input/mpegts/iptv/iptv_auto.c @@ -311,6 +311,7 @@ skip_url: htsmsg_add_s32(conf, "spriority", smuxprio); im = iptv_mux_create0(in, NULL, conf); + mpegts_mux_post_create((mpegts_mux_t *)im); htsmsg_destroy(conf); if (im) { diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 51cfcf041..6acfb348f 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -1197,8 +1197,6 @@ mpegts_mux_create0 ( mpegts_mux_t *mm, const idclass_t *class, const char *uuid, mpegts_network_t *mn, uint16_t onid, uint16_t tsid, htsmsg_t *conf ) { - char buf[256]; - if (idnode_insert(&mm->mm_id, uuid, class, 0)) { if (uuid) tvherror(LS_MPEGTS, "invalid mux uuid '%s'", uuid); @@ -1251,9 +1249,26 @@ mpegts_mux_create0 if (conf) idnode_load(&mm->mm_id, conf); + return mm; +} + +mpegts_mux_t * +mpegts_mux_post_create ( mpegts_mux_t *mm ) +{ + mpegts_network_t *mn; + char buf[256]; + + if (mm == NULL) + return NULL; + + mn = mm->mm_network; if (mm->mm_enabled == MM_IGNORE) mm->mm_scan_result = MM_SCAN_IGNORE; + mpegts_mux_nice_name(mm, buf, sizeof(buf)); + tvhtrace(LS_MPEGTS, "%s - created", buf); + mm->mm_nicename = strdup(buf); + /* Initial scan */ if (mm->mm_scan_result == MM_SCAN_NONE || !mn->mn_skipinitscan) mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_INIT, @@ -1262,10 +1277,6 @@ mpegts_mux_create0 mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE, SUBSCRIPTION_IDLESCAN, 10); - mpegts_mux_nice_name(mm, buf, sizeof(buf)); - tvhtrace(LS_MPEGTS, "%s - created", buf); - mm->mm_nicename = strdup(buf); - return mm; } diff --git a/src/input/mpegts/mpegts_mux_dvb.c b/src/input/mpegts/mpegts_mux_dvb.c index 7f8260658..7228dcd1e 100644 --- a/src/input/mpegts/mpegts_mux_dvb.c +++ b/src/input/mpegts/mpegts_mux_dvb.c @@ -1103,7 +1103,6 @@ dvb_mux_create0 htsmsg_t *c, *c2, *e; htsmsg_field_t *f; dvb_fe_delivery_system_t delsys; - char buf[512]; char ubuf1[UUID_HEX_SIZE]; char ubuf2[UUID_HEX_SIZE]; @@ -1167,10 +1166,6 @@ dvb_mux_create0 lm->mm_display_name = dvb_mux_display_name; lm->mm_config_save = dvb_mux_config_save; - mpegts_mux_nice_name(mm, buf, sizeof(buf)); - free(mm->mm_nicename); - mm->mm_nicename = strdup(buf); - /* No config */ if (!conf) return lm; diff --git a/src/input/mpegts/mpegts_network_dvb.c b/src/input/mpegts/mpegts_network_dvb.c index 88d5d6ad8..a4904f209 100644 --- a/src/input/mpegts/mpegts_network_dvb.c +++ b/src/input/mpegts/mpegts_network_dvb.c @@ -83,8 +83,10 @@ dvb_network_scanfile_set ( dvb_network_t *ln, const char *id ) if (!(mm = dvb_network_find_mux(ln, dmc, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE, 0, 0))) { mm = dvb_mux_create0(ln, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE, dmc, NULL, NULL); - if (mm) + if (mm) { + mpegts_mux_post_create((mpegts_mux_t *)mm); idnode_changed(&mm->mm_id); + } if (tvhtrace_enabled()) { char buf[128]; dvb_mux_conf_str(dmc, buf, sizeof(buf)); @@ -706,6 +708,7 @@ dvb_network_create_mux } if (save) { mm = dvb_mux_create0(ln, onid, tsid, dmc, NULL, NULL); + mpegts_mux_post_create((mpegts_mux_t *)mm); if (tvhtrace_enabled()) { char buf[128]; dvb_mux_conf_str(&((dvb_mux_t *)mm)->lm_tuning, buf, sizeof(buf)); @@ -835,9 +838,10 @@ dvb_network_mux_create2 ( mpegts_network_t *mn, htsmsg_t *conf ) { dvb_network_t *ln = (dvb_network_t*)mn; - return (mpegts_mux_t*) - dvb_mux_create0(ln, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE, - NULL, NULL, conf); + dvb_mux_t *mm; + mm = dvb_mux_create0(ln, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE, + NULL, NULL, conf); + return mpegts_mux_post_create((mpegts_mux_t *)mm); } /* **************************************************************************** @@ -849,6 +853,7 @@ dvb_network_create0 ( const char *uuid, const idclass_t *idc, htsmsg_t *conf ) { dvb_network_t *ln; + dvb_mux_t *lm; htsmsg_t *c, *e; htsmsg_field_t *f; const char *s; @@ -883,7 +888,8 @@ dvb_network_create0 HTSMSG_FOREACH(f, c) { if (!(e = htsmsg_get_map_by_field(f))) continue; if (!(e = htsmsg_get_map(e, "config"))) continue; - (void)dvb_mux_create1(ln, f->hmf_name, e); + lm = dvb_mux_create1(ln, f->hmf_name, e); + mpegts_mux_post_create((mpegts_mux_t *)lm); } htsmsg_destroy(c); } diff --git a/src/input/mpegts/mpegts_network_scan.c b/src/input/mpegts/mpegts_network_scan.c index 3bf2c8249..72a000efe 100644 --- a/src/input/mpegts/mpegts_network_scan.c +++ b/src/input/mpegts/mpegts_network_scan.c @@ -423,6 +423,7 @@ tsid_lookup: mux, NULL, NULL); if (mm) { char buf[256]; + mpegts_mux_post_create(mm); idnode_changed(&mm->mm_id); mn->mn_display_name(mn, buf, sizeof(buf)); tvhinfo(LS_MPEGTS, "fastscan mux add to network '%s'", buf); diff --git a/src/input/mpegts/tsfile/tsfile.c b/src/input/mpegts/tsfile/tsfile.c index 4262a03db..c7540ef3a 100644 --- a/src/input/mpegts/tsfile/tsfile.c +++ b/src/input/mpegts/tsfile/tsfile.c @@ -143,6 +143,7 @@ void tsfile_add_file ( const char *path ) /* Create logical instance */ mm = tsfile_mux_create(uuid, tsfile_network); mm->mm_tsid_accept_zero_value = 1; + mpegts_mux_post_create(mm); /* Create physical instance (for each tuner) */ LIST_FOREACH(mi, &tsfile_inputs, tsi_link)