Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
mpegts mux: implement enable/disable/ignore mux settings
  • Loading branch information
perexg committed May 30, 2016
1 parent f8bd44a commit 2da800d
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 33 deletions.
2 changes: 1 addition & 1 deletion src/epggrab/module/eit.c
Expand Up @@ -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) &&
Expand Down
12 changes: 10 additions & 2 deletions src/input/mpegts.h
Expand Up @@ -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,
Expand Down Expand Up @@ -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 );

Expand Down
3 changes: 2 additions & 1 deletion src/input/mpegts/dvb_psi.c
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion src/input/mpegts/mpegts_dvb.h
Expand Up @@ -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);
Expand Down
76 changes: 55 additions & 21 deletions src/input/mpegts/mpegts_mux.c
Expand Up @@ -30,6 +30,9 @@
#include <assert.h>

static void mpegts_mux_scan_timeout ( void *p );
static void mpegts_mux_do_stop ( mpegts_mux_t *mm, int delconf );


/* ****************************************************************************
* Mux instance (input linkage)
* ***************************************************************************/
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 )
{
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down
8 changes: 5 additions & 3 deletions src/input/mpegts/mpegts_network.c
Expand Up @@ -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;
}
Expand Down
9 changes: 6 additions & 3 deletions src/input/mpegts/mpegts_network_dvb.c
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/satip/rtsp.c
Expand Up @@ -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;
Expand Down

0 comments on commit 2da800d

Please sign in to comment.