int (*mi_is_enabled) (mpegts_input_t*, mpegts_mux_t *mm, int flags, int weight);
void (*mi_enabled_updated)(mpegts_input_t*);
void (*mi_display_name) (mpegts_input_t*, char *buf, size_t len);
- int (*mi_get_weight) (mpegts_input_t*, mpegts_mux_t *mm, int flags);
+ int (*mi_get_weight) (mpegts_input_t*, mpegts_mux_t *mm, int flags, int weight);
int (*mi_get_priority) (mpegts_input_t*, mpegts_mux_t *mm, int flags);
int (*mi_get_grace) (mpegts_input_t*, mpegts_mux_t *mm);
int (*mi_warm_mux) (mpegts_input_t*,mpegts_mux_instance_t*);
(mpegts_input_t *mi, mpegts_mux_instance_t *mmi, sbuf_t *sb,
int flags, mpegts_pcr_t *pcr);
-int mpegts_input_get_weight ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags );
+int mpegts_input_get_weight ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags, int weight );
int mpegts_input_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags );
int mpegts_input_get_grace ( mpegts_input_t *mi, mpegts_mux_t *mm );
int mpegts_input_warm_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi );
}
};
-static int
-iptv_input_is_free ( mpegts_input_t *mi, mpegts_mux_t *mm, int active )
+static mpegts_mux_instance_t *
+iptv_input_is_free ( mpegts_input_t *mi, mpegts_mux_t *mm,
+ int active, int weight, int *lweight )
{
- int c = active;
- mpegts_mux_instance_t *mmi;
+ int h = 0, l = 0, w, rw = INT_MAX;
+ mpegts_mux_instance_t *mmi, *rmmi = NULL;
iptv_network_t *in = (iptv_network_t *)mm->mm_network;
+ pthread_mutex_lock(&mi->mi_output_lock);
LIST_FOREACH(mmi, &mi->mi_mux_active, mmi_active_link)
- if (mmi->mmi_mux->mm_network == (mpegts_network_t *)in)
- c++;
-
+ if (mmi->mmi_mux->mm_network == (mpegts_network_t *)in) {
+ w = mpegts_mux_instance_weight(mmi);
+ if (w < rw) {
+ rmmi = mmi;
+ rw = w;
+ }
+ if (w >= weight) h++; else l++;
+ }
+ pthread_mutex_unlock(&mi->mi_output_lock);
+
+ if (lweight)
+ *lweight = rw == INT_MAX ? 0 : rw;
+
/* Limit reached */
- if (in->in_max_streams && c >= in->in_max_streams)
- return 0;
+ if (in->in_max_streams && h >= in->in_max_streams) {
+ if (active) {
+ if (l == 0)
+ return rmmi;
+ } else {
+ return rmmi;
+ }
+ }
/* Bandwidth reached */
- if (in->in_bw_limited)
- return 0;
+ if (in->in_bw_limited && l == 0)
+ return rmmi;
- return 1;
+ return NULL;
}
static int
iptv_input_is_enabled
( mpegts_input_t *mi, mpegts_mux_t *mm, int flags, int weight )
{
- return iptv_input_is_free(mi, mm, 0);
+ if (!mpegts_input_is_enabled(mi, mm, flags, weight)) return 0;
+ return iptv_input_is_free(mi, mm, 0, weight, NULL) == NULL;
}
static int
-iptv_input_get_weight ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
+iptv_input_get_weight ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags, int weight )
{
- int w = 0;
- const th_subscription_t *ths;
- const service_t *s;
- mpegts_mux_instance_t *mmi;
+ int w;
/* Find the "min" weight */
- if (!iptv_input_is_free(mi, mm, 0)) {
- w = INT_MAX;
-
- /* Service subs */
- pthread_mutex_lock(&mi->mi_output_lock);
- LIST_FOREACH(mmi, &mi->mi_mux_active, mmi_active_link)
- LIST_FOREACH(s, &mmi->mmi_mux->mm_transports, s_active_link)
- LIST_FOREACH(ths, &s->s_subscriptions, ths_service_link)
- w = MIN(w, ths->ths_weight);
- pthread_mutex_unlock(&mi->mi_output_lock);
-
- if (w == INT_MAX)
- w = 0;
- }
+ iptv_input_is_free(mi, mm, 1, weight, &w);
return w;
iptv_input_warm_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi )
{
iptv_mux_t *im = (iptv_mux_t*)mmi->mmi_mux;
+ mpegts_mux_instance_t *lmmi;
/* Already active */
if (im->mm_active)
return 0;
/* Do we need to stop something? */
- if (!iptv_input_is_free(mi, mmi->mmi_mux, 1)) {
- pthread_mutex_lock(&mi->mi_output_lock);
- mpegts_mux_instance_t *m, *s = NULL;
- int w = INT_MAX;
- LIST_FOREACH(m, &mi->mi_mux_active, mmi_active_link) {
- int t = mpegts_mux_instance_weight(m);
- if (t < w) {
- s = m;
- w = t;
- }
- }
- pthread_mutex_unlock(&mi->mi_output_lock);
-
+ lmmi = iptv_input_is_free(mi, mmi->mmi_mux, 1, mmi->mmi_start_weight, NULL);
+ if (lmmi) {
/* Stop */
- if (s)
- s->mmi_mux->mm_stop(s->mmi_mux, 1, SM_CODE_ABORTED);
+ lmmi->mmi_mux->mm_stop(lmmi->mmi_mux, 1, SM_CODE_ABORTED);
}
return 0;
}
iptv_input_stop_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi )
{
iptv_mux_t *im = (iptv_mux_t*)mmi->mmi_mux;
- mpegts_network_link_t *mnl;
pthread_mutex_lock(&iptv_lock);
sbuf_free(&im->mm_iptv_buffer);
/* Clear bw limit */
- LIST_FOREACH(mnl, &mi->mi_networks, mnl_mi_link) {
- iptv_network_t *in = (iptv_network_t*)mnl->mnl_network;
- in->in_bw_limited = 0;
- }
+ ((iptv_network_t *)im->mm_network)->in_bw_limited = 0;
pthread_mutex_unlock(&iptv_lock);
}
}
static int
-linuxdvb_frontend_get_weight ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
+linuxdvb_frontend_get_weight ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags, int weight )
{
- int weight = 0;
+ int w = 0;
linuxdvb_adapter_t *la = ((linuxdvb_frontend_t*)mi)->lfe_adapter;
linuxdvb_frontend_t *lfe;
if (la->la_exclusive) {
LIST_FOREACH(lfe, &la->la_frontends, lfe_link)
- weight = MAX(weight, mpegts_input_get_weight((mpegts_input_t*)lfe, mm, flags));
+ w = MAX(weight, mpegts_input_get_weight((mpegts_input_t*)lfe, mm, flags, weight));
} else {
- weight = mpegts_input_get_weight(mi, mm, flags);
+ w = mpegts_input_get_weight(mi, mm, flags, weight);
}
- return weight;
+ return w;
}
static int
* *************************************************************************/
static int
-satip_frontend_get_weight ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
+satip_frontend_get_weight ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags, int weight )
{
- return mpegts_input_get_weight(mi, mm, flags);
+ return mpegts_input_get_weight(mi, mm, flags, weight);
}
static int
if (lfe2 != lfe) continue;
if (lfe->sf_master != lfe2->sf_number &&
lfe2->sf_master != lfe->sf_number) continue;
- w2 = lfe2->mi_get_weight((mpegts_input_t *)lfe2, mm, flags);
+ w2 = lfe2->mi_get_weight((mpegts_input_t *)lfe2, mm, flags, 0);
if (w2 > w)
w = w2;
}