From 2da800d8f30bd40e87695e9e9b7cf9f28103604f Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 30 May 2016 15:03:00 +0200 Subject: [PATCH] mpegts mux: implement enable/disable/ignore mux settings --- src/epggrab/module/eit.c | 2 +- src/input/mpegts.h | 12 ++++- src/input/mpegts/dvb_psi.c | 3 +- src/input/mpegts/mpegts_dvb.h | 2 +- src/input/mpegts/mpegts_mux.c | 76 +++++++++++++++++++-------- src/input/mpegts/mpegts_network.c | 8 +-- src/input/mpegts/mpegts_network_dvb.c | 9 ++-- src/satip/rtsp.c | 2 +- 8 files changed, 81 insertions(+), 33 deletions(-) diff --git a/src/epggrab/module/eit.c b/src/epggrab/module/eit.c index 3fa2c6087..19505ce55 100644 --- a/src/epggrab/module/eit.c +++ b/src/epggrab/module/eit.c @@ -673,7 +673,7 @@ _eit_callback // Note: tableid=0x4f,0x60-0x6f is other TS // so must find the tdmi if(tableid == 0x4f || tableid >= 0x60) { - mm = mpegts_network_find_mux(mm->mm_network, onid, tsid); + mm = mpegts_network_find_mux(mm->mm_network, onid, tsid, 1); } else { if ((mm->mm_tsid != tsid || mm->mm_onid != onid) && diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 8c95d372b..b7b8e3cb7 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -365,12 +365,20 @@ typedef enum mpegts_mux_scan_result MM_SCAN_NONE, MM_SCAN_OK, MM_SCAN_FAIL, - MM_SCAN_PARTIAL + MM_SCAN_PARTIAL, + MM_SCAN_IGNORE, } mpegts_mux_scan_result_t; #define MM_SCAN_CHECK_OK(mm) \ ((mm)->mm_scan_result == MM_SCAN_OK || (mm)->mm_scan_result == MM_SCAN_PARTIAL) +enum mpegts_mux_enable +{ + MM_IGNORE = -1, + MM_DISABLE = 0, + MM_ENABLE = 1, +}; + enum mpegts_mux_epg_flag { MM_EPG_DISABLE, @@ -825,7 +833,7 @@ static inline mpegts_network_t *mpegts_network_find(const char *uuid) { return idnode_find(uuid, &mpegts_network_class, NULL); } mpegts_mux_t *mpegts_network_find_mux - (mpegts_network_t *mn, uint16_t onid, uint16_t tsid); + (mpegts_network_t *mn, uint16_t onid, uint16_t tsid, int check); void mpegts_network_class_delete ( const idclass_t *idc, int delconf ); diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 4dad4aff5..0e961bb08 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -97,6 +97,7 @@ mpegts_mux_alive(mpegts_mux_t *mm) /* * Return, if mux seems to be alive for updating. */ + if (mm->mm_enabled != MM_ENABLE) return 0; return !LIST_EMPTY(&mm->mm_services) && mm->mm_scan_result != MM_SCAN_FAIL; } @@ -1181,7 +1182,7 @@ dvb_nit_mux const char *charset; char buf[128], dauth[256]; - if (mux && !mux->mm_enabled) + if (mux && mux->mm_enabled != MM_ENABLE) bi = NULL; charset = dvb_charset_find(mux ? mux->mm_network : mm->mm_network, mux, NULL); diff --git a/src/input/mpegts/mpegts_dvb.h b/src/input/mpegts/mpegts_dvb.h index 0258e7cf2..c0f446502 100644 --- a/src/input/mpegts/mpegts_dvb.h +++ b/src/input/mpegts/mpegts_dvb.h @@ -70,7 +70,7 @@ dvb_network_t *dvb_network_create0 ( const char *uuid, const idclass_t *idc, htsmsg_t *conf ); dvb_mux_t *dvb_network_find_mux - ( dvb_network_t *ln, dvb_mux_conf_t *dmc, uint16_t onid, uint16_t tsid ); + ( dvb_network_t *ln, dvb_mux_conf_t *dmc, uint16_t onid, uint16_t tsid, int check ); const idclass_t *dvb_network_mux_class(mpegts_network_t *mn); int dvb_network_get_orbital_pos(mpegts_network_t *mn); diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 9e98c0c57..849411fff 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -30,6 +30,9 @@ #include static void mpegts_mux_scan_timeout ( void *p ); +static void mpegts_mux_do_stop ( mpegts_mux_t *mm, int delconf ); + + /* **************************************************************************** * Mux instance (input linkage) * ***************************************************************************/ @@ -396,6 +399,7 @@ scan_result_tab[] = { { N_("OK"), MM_SCAN_OK }, { N_("FAIL"), MM_SCAN_FAIL }, { N_("OK (partial)"), MM_SCAN_PARTIAL }, + { N_("IGNORE"), MM_SCAN_IGNORE }, }; int @@ -455,9 +459,24 @@ mpegts_mux_class_enabled_notify ( void *p, const char *lang ) if (!mm->mm_is_enabled(mm)) { mm->mm_stop(mm, 1, SM_CODE_MUX_NOT_ENABLED); mpegts_network_scan_mux_cancel(mm, 0); + if (mm->mm_enabled == MM_IGNORE) { + mpegts_mux_do_stop(mm, 1); + mm->mm_scan_result = MM_SCAN_IGNORE; + } } } +static htsmsg_t * +mpegts_mux_enable_list ( void *o, const char *lang ) +{ + static const struct strtab tab[] = { + { N_("Ignore"), MM_IGNORE }, + { N_("Disable"), MM_DISABLE }, + { N_("Enable"), MM_ENABLE }, + }; + return strtab2htsmsg(tab, 1, lang); +} + static htsmsg_t * mpegts_mux_epg_list ( void *o, const char *lang ) { @@ -503,13 +522,17 @@ const idclass_t mpegts_mux_class = .ic_get_title = mpegts_mux_class_get_title, .ic_properties = (const property_t[]){ { - .type = PT_BOOL, + .type = PT_INT, .id = "enabled", .name = N_("Enabled"), - .desc = N_("Enable or disable the mux."), + .desc = N_("Enable, disable or ignore the mux. " + "When the mux is marked as ignore, " + "all discovered services are removed."), .off = offsetof(mpegts_mux_t, mm_enabled), - .def.i = 1, + .def.i = MM_ENABLE, + .list = mpegts_mux_enable_list, .notify = mpegts_mux_class_enabled_notify, + .opts = PO_DOC_NLIST }, { .type = PT_INT, @@ -662,24 +685,12 @@ mpegts_mux_display_name ( mpegts_mux_t *mm, char *buf, size_t len ) mm->mm_onid, mm->mm_tsid); } -void -mpegts_mux_delete ( mpegts_mux_t *mm, int delconf ) +static void +mpegts_mux_do_stop ( mpegts_mux_t *mm, int delconf ) { mpegts_mux_instance_t *mmi; - mpegts_service_t *s; th_subscription_t *ths; - char buf[256]; - - idnode_save_check(&mm->mm_id, delconf); - - mpegts_mux_nice_name(mm, buf, sizeof(buf)); - tvhinfo("mpegts", "%s (%p) - deleting", buf, mm); - - /* Stop */ - mm->mm_stop(mm, 1, SM_CODE_ABORTED); - - /* Remove from network */ - LIST_REMOVE(mm, mm_network_link); + mpegts_service_t *s; /* Cancel scan */ mpegts_network_scan_queue_del(mm); @@ -701,6 +712,26 @@ mpegts_mux_delete ( mpegts_mux_t *mm, int delconf ) /* Stop PID timer */ mtimer_disarm(&mm->mm_update_pids_timer); +} + +void +mpegts_mux_delete ( mpegts_mux_t *mm, int delconf ) +{ + char buf[256]; + + idnode_save_check(&mm->mm_id, delconf); + + mpegts_mux_nice_name(mm, buf, sizeof(buf)); + tvhinfo("mpegts", "%s (%p) - deleting", buf, mm); + + /* Stop */ + mm->mm_stop(mm, 1, SM_CODE_ABORTED); + + /* Remove from network */ + LIST_REMOVE(mm, mm_network_link); + + /* Real stop */ + mpegts_mux_do_stop(mm, delconf); /* Free memory */ idnode_save_check(&mm->mm_id, 1); @@ -720,7 +751,7 @@ mpegts_mux_config_save ( mpegts_mux_t *mm, char *filename, size_t fsize ) static int mpegts_mux_is_enabled ( mpegts_mux_t *mm ) { - return mm->mm_enabled; + return mm->mm_enabled == MM_ENABLE; } static int @@ -1127,8 +1158,8 @@ mpegts_mux_create0 } /* Enabled by default */ - mm->mm_enabled = 1; - mm->mm_epg = 1; + mm->mm_enabled = MM_ENABLE; + mm->mm_epg = MM_EPG_ENABLE; /* Identification */ mm->mm_onid = onid; @@ -1167,6 +1198,9 @@ mpegts_mux_create0 if (conf) idnode_load(&mm->mm_id, conf); + if (mm->mm_enabled == MM_IGNORE) + mm->mm_scan_result = MM_SCAN_IGNORE; + /* Initial scan */ if (mm->mm_scan_result == MM_SCAN_NONE || !mn->mn_skipinitscan) mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_INIT, diff --git a/src/input/mpegts/mpegts_network.c b/src/input/mpegts/mpegts_network.c index aba8accfc..fc829aa0c 100644 --- a/src/input/mpegts/mpegts_network.c +++ b/src/input/mpegts/mpegts_network.c @@ -633,13 +633,15 @@ mpegts_network_build mpegts_mux_t * mpegts_network_find_mux - ( mpegts_network_t *mn, uint16_t onid, uint16_t tsid ) + ( mpegts_network_t *mn, uint16_t onid, uint16_t tsid, int check ) { mpegts_mux_t *mm; LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link) { if (mm->mm_onid && onid && mm->mm_onid != onid) continue; - if (mm->mm_tsid == tsid && mm->mm_enabled) - break; + if (mm->mm_tsid == tsid) { + if (!check || mm->mm_enabled == MM_ENABLE) + break; + } } return mm; } diff --git a/src/input/mpegts/mpegts_network_dvb.c b/src/input/mpegts/mpegts_network_dvb.c index b10a33aa5..67b01fa40 100644 --- a/src/input/mpegts/mpegts_network_dvb.c +++ b/src/input/mpegts/mpegts_network_dvb.c @@ -80,7 +80,7 @@ dvb_network_scanfile_set ( dvb_network_t *ln, const char *id ) /* Create */ LIST_FOREACH(dmc, &sfn->sfn_muxes, dmc_link) { - if (!(mm = dvb_network_find_mux(ln, dmc, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE))) { + if (!(mm = dvb_network_find_mux(ln, dmc, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE, 0))) { mm = dvb_mux_create0(ln, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE, dmc, NULL, NULL); if (mm) @@ -498,12 +498,15 @@ dvb_network_check_orbital_pos ( int satpos1, int satpos2 ) dvb_mux_t * dvb_network_find_mux - ( dvb_network_t *ln, dvb_mux_conf_t *dmc, uint16_t onid, uint16_t tsid ) + ( dvb_network_t *ln, dvb_mux_conf_t *dmc, uint16_t onid, uint16_t tsid, int check ) { int deltaf, deltar; mpegts_mux_t *mm, *mm_alt = NULL; LIST_FOREACH(mm, &ln->mn_muxes, mm_network_link) { + + if (check && mm->mm_enabled != MM_ENABLE) continue; + deltaf = 2000; // 2K/MHz deltar = 1000; dvb_mux_t *lm = (dvb_mux_t*)mm; @@ -654,7 +657,7 @@ dvb_network_create_mux } ln = (dvb_network_t*)mn; - mm = dvb_network_find_mux(ln, dmc, onid, tsid); + mm = dvb_network_find_mux(ln, dmc, onid, tsid, 0); if (!mm && (ln->mn_autodiscovery || force)) { cls = dvb_network_mux_class((mpegts_network_t *)ln); save |= cls == &dvb_mux_dvbt_class && dmc->dmc_fe_type == DVB_TYPE_T; diff --git a/src/satip/rtsp.c b/src/satip/rtsp.c index 07cc2c606..602d39d37 100644 --- a/src/satip/rtsp.c +++ b/src/satip/rtsp.c @@ -521,7 +521,7 @@ rtsp_start if (!mn2) mn2 = mn; mux = (mpegts_mux_t *) dvb_network_find_mux((dvb_network_t *)mn, &rs->dmc, - MPEGTS_ONID_NONE, MPEGTS_TSID_NONE); + MPEGTS_ONID_NONE, MPEGTS_TSID_NONE, 1); if (mux) { dmc = ((dvb_mux_t *)mux)->lm_tuning; rs->perm_lock = 0; -- 2.47.3