/*
* Service instance list
*/
-static void
+static int
mpegts_service_enlist
( service_t *t, tvh_input_t *ti, struct service_instance_list *sil,
int flags, int weight )
assert(s->s_source_type == S_MPEG_TS);
+ /* invalid PMT */
+ if (s->s_pmt_pid <= 0 || s->s_pmt_pid >= 8191)
+ return SM_CODE_INVALID_SERVICE;
+
/* Create instances */
m->mm_create_instances(m);
service_instance_add(sil, t, mi->mi_instance, mi->mi_name, p, w);
}
+
+ return 0;
}
/*
idnode_list_mapping_t *ilm;
service_instance_t *si, *next;
profile_t *pro = prch ? prch->prch_pro : NULL;
- int enlisted;
+ int enlisted, r, r1;
lock_assert(&global_lock);
TAILQ_FOREACH(si, sil, si_link)
si->si_mark = 1;
+ r = 0;
if (ch) {
if (!ch->ch_enabled) {
*error = SM_CODE_SVC_NOT_ENABLED;
pro->pro_svfilter == PROFILE_SVF_NONE ||
(pro->pro_svfilter == PROFILE_SVF_SD && service_is_sdtv(s)) ||
(pro->pro_svfilter == PROFILE_SVF_HD && service_is_hdtv(s))) {
- s->s_enlist(s, ti, sil, flags, weight);
- enlisted++;
+ r1 = s->s_enlist(s, ti, sil, flags, weight);
+ if (r1 == 0)
+ enlisted++;
+ else if (enlisted == 0)
+ r = r1;
}
}
}
if (enlisted == 0) {
LIST_FOREACH(ilm, &ch->ch_services, ilm_in2_link) {
s = (service_t *)ilm->ilm_in1;
- if (s->s_is_enabled(s, flags))
- s->s_enlist(s, ti, sil, flags, weight);
+ if (s->s_is_enabled(s, flags)) {
+ r1 = s->s_enlist(s, ti, sil, flags, weight);
+ if (r1 == 0)
+ enlisted++;
+ else if (enlisted == 0)
+ r = r1;
+ }
}
}
} else {
- s->s_enlist(s, ti, sil, flags, weight);
+ r = s->s_enlist(s, ti, sil, flags, weight);
+ }
+
+ if (r) {
+ if (*error < r)
+ *error = r;
+ return NULL;
}
/* Clean */
int (*s_is_enabled)(struct service *t, int flags);
- void (*s_enlist)(struct service *s, struct tvh_input *ti,
- service_instance_list_t *sil, int flags, int weight);
+ int (*s_enlist)(struct service *s, struct tvh_input *ti,
+ service_instance_list_t *sil, int flags, int weight);
int (*s_start_feed)(struct service *s, int instance, int weight, int flags);
subscription_unsubscribe(sub, UNSUBSCRIBE_FINAL);
if(err) {
- tvhinfo("service_mapper", "%s: failed [err %s]", s->s_nicename, err);
+ tvhinfo("service_mapper", "%s: failed [reason: %s]", s->s_nicename, err);
service_mapper_stat.fail++;
} else
service_mapper_process(&smi->conf, s, NULL);
return N_("No service assigned to channel");
case SM_CODE_NO_ADAPTERS:
return N_("No assigned adapters");
+ case SM_CODE_INVALID_SERVICE:
+ return N_("Invalid service");
case SM_CODE_ABORTED:
return N_("Aborted by user");
#define SM_CODE_NO_SERVICE 207
#define SM_CODE_NO_VALID_ADAPTER 208
#define SM_CODE_NO_ADAPTERS 209
+#define SM_CODE_INVALID_SERVICE 210
#define SM_CODE_ABORTED 300