Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
mpegts inputs: allow to disable init/idle scan per tuner/input, fixes…
… #2475
  • Loading branch information
perexg committed Nov 14, 2014
1 parent 7e5abcb commit af4a2af
Show file tree
Hide file tree
Showing 14 changed files with 80 additions and 39 deletions.
3 changes: 2 additions & 1 deletion src/epggrab/otamux.c
Expand Up @@ -532,7 +532,8 @@ epggrab_ota_kick_cb ( void *p )

/* Subscribe to the mux */
om->om_requeue = 1;
if ((r = mpegts_mux_subscribe(mm, "epggrab", SUBSCRIPTION_PRIO_EPG))) {
if ((r = mpegts_mux_subscribe(mm, "epggrab", SUBSCRIPTION_PRIO_EPG,
SUBSCRIPTION_EPG))) {
TAILQ_INSERT_TAIL(&epggrab_ota_pending, om, om_q_link);
om->om_q_type = EPGGRAB_OTA_MUX_PENDING;
if (r == SM_CODE_NO_FREE_ADAPTER)
Expand Down
10 changes: 7 additions & 3 deletions src/input/mpegts.h
Expand Up @@ -355,6 +355,7 @@ struct mpegts_mux

mpegts_mux_scan_result_t mm_scan_result; ///< Result of last scan
int mm_scan_weight; ///< Scan priority
int mm_scan_flags; ///< Subscription flags
int mm_scan_init; ///< Flag to timeout handler
gtimer_t mm_scan_timeout; ///< Timer to handle timeout
TAILQ_ENTRY(mpegts_mux) mm_scan_link; ///< Link to Queue
Expand Down Expand Up @@ -539,6 +540,9 @@ struct mpegts_input

int mi_ota_epg;

int mi_initscan;
int mi_idlescan;

LIST_ENTRY(mpegts_input) mi_global_link;

mpegts_network_link_list_t mi_networks;
Expand Down Expand Up @@ -588,7 +592,7 @@ struct mpegts_input
/*
* Functions
*/
int (*mi_is_enabled) (mpegts_input_t*, mpegts_mux_t *mm, const char *reason);
int (*mi_is_enabled) (mpegts_input_t*, mpegts_mux_t *mm, int flags);
void (*mi_enabled_updated)(mpegts_input_t*);
void (*mi_display_name) (mpegts_input_t*, char *buf, size_t len);
int (*mi_is_free) (mpegts_input_t*);
Expand Down Expand Up @@ -661,7 +665,7 @@ void mpegts_input_status_timer ( void *p );

int mpegts_input_grace ( mpegts_input_t * mi, mpegts_mux_t * mm );

int mpegts_input_is_enabled ( mpegts_input_t * mi, mpegts_mux_t *mm, const char *reason );
int mpegts_input_is_enabled ( mpegts_input_t * mi, mpegts_mux_t *mm, int flags );

/* TODO: exposing these class methods here is a bit of a hack */
const void *mpegts_input_class_network_get ( void *o );
Expand Down Expand Up @@ -747,7 +751,7 @@ void mpegts_mux_open_table ( mpegts_mux_t *mm, mpegts_table_t *mt, int subscribe
void mpegts_mux_close_table ( mpegts_mux_t *mm, mpegts_table_t *mt );

void mpegts_mux_remove_subscriber(mpegts_mux_t *mm, th_subscription_t *s, int reason);
int mpegts_mux_subscribe(mpegts_mux_t *mm, const char *name, int weight);
int mpegts_mux_subscribe(mpegts_mux_t *mm, const char *name, int weight, int flags);
void mpegts_mux_unsubscribe_by_name(mpegts_mux_t *mm, const char *name);

void mpegts_mux_scan_done ( mpegts_mux_t *mm, const char *buf, int res );
Expand Down
2 changes: 1 addition & 1 deletion src/input/mpegts/linuxdvb/linuxdvb_adapter.c
Expand Up @@ -120,7 +120,7 @@ linuxdvb_adapter_is_enabled ( linuxdvb_adapter_t *la )
{
linuxdvb_frontend_t *lfe;
LIST_FOREACH(lfe, &la->la_frontends, lfe_link) {
if (lfe->mi_is_enabled((mpegts_input_t*)lfe, NULL, "adapter"))
if (lfe->mi_is_enabled((mpegts_input_t*)lfe, NULL, 0))
return 1;
}
return 0;
Expand Down
5 changes: 2 additions & 3 deletions src/input/mpegts/linuxdvb/linuxdvb_frontend.c
Expand Up @@ -263,12 +263,11 @@ linuxdvb_frontend_get_grace ( mpegts_input_t *mi, mpegts_mux_t *mm )
}

static int
linuxdvb_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm,
const char *reason )
linuxdvb_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
{
linuxdvb_frontend_t *lfe = (linuxdvb_frontend_t*)mi;
if (lfe->lfe_fe_path == NULL) return 0;
if (!mpegts_input_is_enabled(mi, mm, reason)) return 0;
if (!mpegts_input_is_enabled(mi, mm, flags)) return 0;
if (access(lfe->lfe_fe_path, R_OK | W_OK)) return 0;
if (lfe->lfe_in_setup) return 0;
return 1;
Expand Down
27 changes: 24 additions & 3 deletions src/input/mpegts/mpegts_input.c
Expand Up @@ -185,6 +185,22 @@ const idclass_t mpegts_input_class =
.off = offsetof(mpegts_input_t, mi_ota_epg),
.def.i = 1,
},
{
.type = PT_BOOL,
.id = "initscan",
.name = "Initial Scan",
.off = offsetof(mpegts_input_t, mi_initscan),
.def.i = 1,
.opts = PO_ADVANCED,
},
{
.type = PT_BOOL,
.id = "idlescan",
.name = "Idle Scan",
.off = offsetof(mpegts_input_t, mi_idlescan),
.def.i = 1,
.opts = PO_ADVANCED,
},
{
.type = PT_STR,
.id = "networks",
Expand All @@ -204,10 +220,13 @@ const idclass_t mpegts_input_class =
* *************************************************************************/

int
mpegts_input_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm,
const char *reason )
mpegts_input_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
{
if (!strcmp(reason, "epggrab") && !mi->mi_ota_epg)
if ((flags & SUBSCRIPTION_EPG) != 0 && !mi->mi_ota_epg)
return 0;
if ((flags & SUBSCRIPTION_INITSCAN) != 0 && !mi->mi_initscan)
return 0;
if ((flags & SUBSCRIPTION_IDLESCAN) != 0 && !mi->mi_idlescan)
return 0;
return mi->mi_enabled;
}
Expand Down Expand Up @@ -1123,6 +1142,8 @@ mpegts_input_create0

/* Defaults */
mi->mi_ota_epg = 1;
mi->mi_initscan = 1;
mi->mi_idlescan = 1;

/* Add to global list */
LIST_INSERT_HEAD(&mpegts_input_all, mi, mi_global_link);
Expand Down
15 changes: 9 additions & 6 deletions src/input/mpegts/mpegts_mux.c
Expand Up @@ -275,7 +275,8 @@ mpegts_mux_class_scan_state_set ( void *o, const void *p )
return 0;

/* Start */
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_USER, 0);
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_USER,
SUBSCRIPTION_USERSCAN, 0);

/* Stop */
} else if (state == MM_SCAN_STATE_IDLE) {
Expand Down Expand Up @@ -570,7 +571,7 @@ mpegts_mux_start
/* Calculate priority+weight and sort */
count = 0;
LIST_FOREACH(mmi, &mm->mm_instances, mmi_mux_link) {
int e = mmi->mmi_input->mi_is_enabled(mmi->mmi_input, mm, reason);
int e = mmi->mmi_input->mi_is_enabled(mmi->mmi_input, mm, flags);
tvhtrace("mpegts", "%s - mmi %p enabled %d", buf, mmi, e);
if (!e) continue;
enabled = 1;
Expand Down Expand Up @@ -979,9 +980,11 @@ mpegts_mux_create0

/* Initial scan */
if (mm->mm_scan_result == MM_SCAN_NONE || !mn->mn_skipinitscan)
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_INIT, 10);
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_INIT,
SUBSCRIPTION_INITSCAN, 10);
else if (mm->mm_network->mn_idlescan)
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE, 10);
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE,
SUBSCRIPTION_IDLESCAN, 10);

mpegts_mux_nice_name(mm, buf, sizeof(buf));
tvhtrace("mpegts", "%s - created", buf);
Expand Down Expand Up @@ -1079,15 +1082,15 @@ mpegts_mux_remove_subscriber

int
mpegts_mux_subscribe
( mpegts_mux_t *mm, const char *name, int weight )
( mpegts_mux_t *mm, const char *name, int weight, int flags )
{
int err = 0;
profile_chain_t prch;
th_subscription_t *s;
memset(&prch, 0, sizeof(prch));
prch.prch_id = mm;
s = subscription_create_from_mux(&prch, weight, name,
SUBSCRIPTION_NONE,
SUBSCRIPTION_NONE | flags,
NULL, NULL, NULL, &err);
return s ? 0 : err;
}
Expand Down
2 changes: 1 addition & 1 deletion src/input/mpegts/mpegts_mux_dvb.c
Expand Up @@ -600,7 +600,7 @@ dvb_mux_create_instances ( mpegts_mux_t *mm )
mpegts_network_link_t *mnl;
LIST_FOREACH(mnl, &mm->mm_network->mn_inputs, mnl_mn_link) {
mpegts_input_t *mi = mnl->mnl_input;
if (mi->mi_is_enabled(mi, mm, "service"))
if (mi->mi_is_enabled(mi, mm, 0))
mi->mi_create_mux_instance(mi, mm);
}
}
Expand Down
7 changes: 5 additions & 2 deletions src/input/mpegts/mpegts_network.c
Expand Up @@ -118,10 +118,13 @@ mpegts_network_class_idlescan_notify ( void *p )
mpegts_mux_t *mm;
LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link) {
if (mn->mn_idlescan)
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE, 0);
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE,
SUBSCRIPTION_IDLESCAN, 0);
else if (mm->mm_scan_state == MM_SCAN_STATE_PEND &&
mm->mm_scan_weight == SUBSCRIPTION_PRIO_SCAN_IDLE)
mm->mm_scan_weight == SUBSCRIPTION_PRIO_SCAN_IDLE) {
mm->mm_scan_flags = 0;
mpegts_network_scan_queue_del(mm);
}
}
}

Expand Down
17 changes: 13 additions & 4 deletions src/input/mpegts/mpegts_network_scan.c
Expand Up @@ -50,7 +50,8 @@ mpegts_network_scan_timer_cb ( void *p )
assert(mm->mm_scan_state == MM_SCAN_STATE_PEND);

/* Attempt to tune */
r = mpegts_mux_subscribe(mm, "scan", mm->mm_scan_weight);
printf("mm->mm_scan_flags = 0x%x\n", mm->mm_scan_flags);

This comment has been minimized.

Copy link
@Jalle19

Jalle19 Nov 14, 2014

Contributor

I assume this shouldn't be here?

This comment has been minimized.

Copy link
@perexg

perexg Nov 14, 2014

Author Contributor

I overlooked this. Thanks. Fixed in fdbe678 .

r = mpegts_mux_subscribe(mm, "scan", mm->mm_scan_weight, mm->mm_scan_flags);

/* Started */
if (!r) {
Expand Down Expand Up @@ -123,7 +124,7 @@ mpegts_network_scan_mux_done0

/* Re-enable? */
if (weight > 0)
mpegts_network_scan_queue_add(mm, weight, 10);
mpegts_network_scan_queue_add(mm, weight, mm->mm_scan_flags, 10);
}

/* Failed - couldn't start */
Expand All @@ -137,6 +138,7 @@ mpegts_network_scan_mux_fail ( mpegts_mux_t *mm )
void
mpegts_network_scan_mux_done ( mpegts_mux_t *mm )
{
mm->mm_scan_flags = 0;
mpegts_network_scan_mux_done0(mm, MM_SCAN_OK, 0);
}

Expand All @@ -154,6 +156,9 @@ mpegts_network_scan_mux_cancel ( mpegts_mux_t *mm, int reinsert )
if (mm->mm_scan_state != MM_SCAN_STATE_ACTIVE)
return;

if (!reinsert)
mm->mm_scan_flags = 0;

mpegts_network_scan_mux_done0(mm, MM_SCAN_NONE,
reinsert ? mm->mm_scan_weight : 0);
}
Expand Down Expand Up @@ -196,7 +201,8 @@ mpegts_network_scan_queue_del ( mpegts_mux_t *mm )
}

void
mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight, int delay )
mpegts_network_scan_queue_add
( mpegts_mux_t *mm, int weight, int flags, int delay )
{
int reload = 0;
char buf[256], buf2[256];;
Expand Down Expand Up @@ -228,7 +234,10 @@ mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight, int delay )
buf2, buf, weight);

/* Add new entry */
mm->mm_scan_state = MM_SCAN_STATE_PEND;
mm->mm_scan_state = MM_SCAN_STATE_PEND;
mm->mm_scan_flags |= flags;
if (mm->mm_scan_flags == 0)
mm->mm_scan_flags = SUBSCRIPTION_IDLE;
TAILQ_INSERT_SORTED_R(&mn->mn_scan_pend, mpegts_mux_queue,
mm, mm_scan_link, mm_cmp);
gtimer_arm(&mn->mn_scan_timer, mpegts_network_scan_timer_cb, mn, delay);
Expand Down
3 changes: 2 additions & 1 deletion src/input/mpegts/mpegts_network_scan.h
Expand Up @@ -33,7 +33,8 @@ void mpegts_network_scan_timer_cb ( void *p );
/*
* Registration functions
*/
void mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight, int delay );
void mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight,
int flags, int delay );
void mpegts_network_scan_queue_del ( mpegts_mux_t *mm );

/*
Expand Down
2 changes: 1 addition & 1 deletion src/input/mpegts/mpegts_service.c
Expand Up @@ -242,7 +242,7 @@ mpegts_service_enlist(service_t *t, struct service_instance_list *sil, int flags

mi = mmi->mmi_input;

if (!mi->mi_is_enabled(mi, mmi->mmi_mux, "service")) continue;
if (!mi->mi_is_enabled(mi, mmi->mmi_mux, flags)) continue;

/* Set weight to -1 (forced) for already active mux */
if (mmi->mmi_mux->mm_active == mmi) {
Expand Down
5 changes: 2 additions & 3 deletions src/input/mpegts/satip/satip_frontend.c
Expand Up @@ -366,16 +366,15 @@ satip_frontend_match_satcfg ( satip_frontend_t *lfe2, mpegts_mux_t *mm2 )
}

static int
satip_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm,
const char *reason )
satip_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
{
satip_frontend_t *lfe = (satip_frontend_t*)mi;
satip_frontend_t *lfe2;
int position;

lock_assert(&global_lock);

if (!mpegts_input_is_enabled(mi, mm, reason)) return 0;
if (!mpegts_input_is_enabled(mi, mm, flags)) return 0;
if (lfe->sf_device->sd_dbus_allow <= 0) return 0;
if (lfe->sf_type != DVB_TYPE_S) return 1;
/* check if the position is enabled */
Expand Down
7 changes: 2 additions & 5 deletions src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c
Expand Up @@ -64,12 +64,9 @@ tvhdhomerun_frontend_get_grace ( mpegts_input_t *mi, mpegts_mux_t *mm )
}

static int
tvhdhomerun_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm,
const char *reason )
tvhdhomerun_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
{
tvhdhomerun_frontend_t *hfe = (tvhdhomerun_frontend_t*)mi;
if (!hfe->mi_enabled) return 0;
return 1;
return mpegts_input_is_enabled(mi, mm, flags);
}

static void *
Expand Down
14 changes: 9 additions & 5 deletions src/subscriptions.h
Expand Up @@ -25,11 +25,15 @@ struct profile_chain;

extern struct th_subscription_list subscriptions;

#define SUBSCRIPTION_RAW_MPEGTS 0x01
#define SUBSCRIPTION_NONE 0x02
#define SUBSCRIPTION_FULLMUX 0x04
#define SUBSCRIPTION_STREAMING 0x08
#define SUBSCRIPTION_RESTART 0x10
#define SUBSCRIPTION_RAW_MPEGTS 0x001
#define SUBSCRIPTION_NONE 0x002
#define SUBSCRIPTION_FULLMUX 0x004
#define SUBSCRIPTION_STREAMING 0x008
#define SUBSCRIPTION_RESTART 0x010
#define SUBSCRIPTION_INITSCAN 0x020 ///< for mux subscriptions
#define SUBSCRIPTION_IDLESCAN 0x040 ///< for mux subscriptions
#define SUBSCRIPTION_USERSCAN 0x080 ///< for mux subscriptions
#define SUBSCRIPTION_EPG 0x100 ///< for mux subscriptions

/* Some internal prioties */
#define SUBSCRIPTION_PRIO_SCAN_IDLE 1 ///< Idle scanning
Expand Down

0 comments on commit af4a2af

Please sign in to comment.