From 7d8470ba986a02672571c4791f3e77eb489210d0 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 11 Aug 2014 13:45:28 +0200 Subject: [PATCH] Streaming - add special streaming priority for all inputs (including IPTV) --- docs/html/config_muxes.html | 3 +++ docs/html/config_networks.html | 4 ++++ docs/html/config_tvadapters.html | 5 +++++ src/api/api_mpegts.c | 2 +- src/htsp_server.c | 3 ++- src/input/mpegts.h | 11 ++++++----- src/input/mpegts/iptv/iptv.c | 19 +++++++++++++++++-- src/input/mpegts/iptv/iptv_mux.c | 8 ++++++++ src/input/mpegts/iptv/iptv_private.h | 2 ++ src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 8 ++++---- src/input/mpegts/mpegts_input.c | 16 ++++++++++++++-- src/input/mpegts/mpegts_mux.c | 6 +++--- src/input/mpegts/mpegts_service.c | 8 ++++---- src/input/mpegts/satip/satip_frontend.c | 8 ++++---- src/service.c | 8 ++++---- src/service.h | 8 ++++---- src/service_mapper.c | 2 +- src/subscriptions.c | 3 ++- src/subscriptions.h | 1 + src/webui/webui.c | 13 ++++++------- 20 files changed, 95 insertions(+), 43 deletions(-) diff --git a/docs/html/config_muxes.html b/docs/html/config_muxes.html index 9630afe2..6948cb04 100644 --- a/docs/html/config_muxes.html +++ b/docs/html/config_muxes.html @@ -55,5 +55,8 @@
Priority
IPTV : The mux priority value (higher value = higher priority to use services from this mux). Value 0 means use the IPTV network priority value. +
Streaming Priority +
IPTV : The mux priority value for streamed channels through HTTP or HTSP (higher value = higher priority to use services from this mux). Value 0 means use the standard streaming network priority value. + diff --git a/docs/html/config_networks.html b/docs/html/config_networks.html index a773a9c5..a34e4b1b 100644 --- a/docs/html/config_networks.html +++ b/docs/html/config_networks.html @@ -49,5 +49,9 @@
Priority
IPTV : The network priority value (higher value = higher priority to use muxes/services from this network). +
Streaming Priority +
IPTV : The network priority value for streamed channels through HTTP or HTSP (higher value = higher priority to use muxes/services from this + network). If not set, the standard network priority value is used. + diff --git a/docs/html/config_tvadapters.html b/docs/html/config_tvadapters.html index 6572a8cf..d508783d 100644 --- a/docs/html/config_tvadapters.html +++ b/docs/html/config_tvadapters.html @@ -26,6 +26,11 @@
The tuner priority value (higher value = higher priority to use this tuner).
+
Streaming Priority
+
The tuner priority value for streamed channels through HTTP or HTSP + (higher value = higher priority to use this tuner). If not set (zero), + the standard priority value is used.
+

diff --git a/src/api/api_mpegts.c b/src/api/api_mpegts.c index c5084aa1..3e6ffcee 100644 --- a/src/api/api_mpegts.c +++ b/src/api/api_mpegts.c @@ -244,7 +244,7 @@ api_mpegts_service_grid LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link) { if (hide && !mm->mm_is_enabled(mm)) continue; LIST_FOREACH(ms, &mm->mm_services, s_dvb_mux_link) { - if (hide == 2 && !ms->s_is_enabled((service_t*)ms)) continue; + if (hide == 2 && !ms->s_is_enabled((service_t*)ms, 0)) continue; idnode_set_add(ins, (idnode_t*)ms, &conf->filter); } } diff --git a/src/htsp_server.c b/src/htsp_server.c index c9ffbaad..6e22bc43 100644 --- a/src/htsp_server.c +++ b/src/htsp_server.c @@ -1545,7 +1545,8 @@ htsp_method_subscribe(htsp_connection_t *htsp, htsmsg_t *in) tvhdebug("htsp", "%s - subscribe to %s\n", htsp->htsp_logname, ch->ch_name ?: ""); hs->hs_s = subscription_create_from_channel(ch, weight, htsp->htsp_logname, - st, 0, + st, + SUBSCRIPTION_STREAMING, htsp->htsp_peername, htsp->htsp_username, htsp->htsp_clientname); diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 64418d65..720dca47 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -395,7 +395,7 @@ struct mpegts_mux void (*mm_config_save) (mpegts_mux_t *mm); void (*mm_display_name) (mpegts_mux_t*, char *buf, size_t len); int (*mm_is_enabled) (mpegts_mux_t *mm); - int (*mm_start) (mpegts_mux_t *mm, const char *r, int w); + int (*mm_start) (mpegts_mux_t *mm, const char *r, int w, int flags); void (*mm_stop) (mpegts_mux_t *mm, int force); void (*mm_open_table) (mpegts_mux_t*,mpegts_table_t*,int subscribe); void (*mm_close_table) (mpegts_mux_t*,mpegts_table_t*); @@ -520,6 +520,7 @@ struct mpegts_input char *mi_name; int mi_priority; + int mi_streaming_priority; int mi_ota_epg; @@ -576,8 +577,8 @@ struct mpegts_input 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*); - int (*mi_get_weight) (mpegts_input_t*); - int (*mi_get_priority) (mpegts_input_t*, mpegts_mux_t *mm); + int (*mi_get_weight) (mpegts_input_t*, int flags); + 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_start_mux) (mpegts_input_t*,mpegts_mux_instance_t*); void (*mi_stop_mux) (mpegts_input_t*,mpegts_mux_instance_t*); @@ -752,8 +753,8 @@ void mpegts_input_recv_packets int mpegts_input_is_free ( mpegts_input_t *mi ); -int mpegts_input_get_weight ( mpegts_input_t *mi ); -int mpegts_input_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm ); +int mpegts_input_get_weight ( mpegts_input_t *mi, int flags ); +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 ); void mpegts_input_save ( mpegts_input_t *mi, htsmsg_t *c ); diff --git a/src/input/mpegts/iptv/iptv.c b/src/input/mpegts/iptv/iptv.c index 1b2f8c6a..b828d99e 100644 --- a/src/input/mpegts/iptv/iptv.c +++ b/src/input/mpegts/iptv/iptv.c @@ -127,7 +127,7 @@ iptv_input_is_free ( mpegts_input_t *mi ) } static int -iptv_input_get_weight ( mpegts_input_t *mi ) +iptv_input_get_weight ( mpegts_input_t *mi, int flags ) { int c = 0, w = 0; const th_subscription_t *ths; @@ -170,10 +170,16 @@ iptv_input_get_grace ( mpegts_input_t *mi, mpegts_mux_t *mm ) } static int -iptv_input_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm ) +iptv_input_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags ) { iptv_mux_t *im = (iptv_mux_t *)mm; iptv_network_t *in = (iptv_network_t *)im->mm_network; + if (flags & SUBSCRIPTION_STREAMING) { + if (im->mm_iptv_streaming_priority > 0) + return im->mm_iptv_streaming_priority; + if (in->in_streaming_priority > 0) + return in->in_streaming_priority; + } return im->mm_iptv_priority > 0 ? im->mm_iptv_priority : in->in_priority; } @@ -412,6 +418,14 @@ const idclass_t iptv_network_class = { .def.i = 1, .opts = PO_ADVANCED }, + { + .type = PT_INT, + .id = "spriority", + .name = "Streaming Priority", + .off = offsetof(iptv_network_t, in_streaming_priority), + .def.i = 1, + .opts = PO_ADVANCED + }, { .type = PT_U32, .id = "max_streams", @@ -478,6 +492,7 @@ iptv_network_create0 /* Init Network */ in->in_priority = 1; + in->in_streaming_priority = 1; if (!mpegts_network_create0((mpegts_network_t *)in, &iptv_network_class, uuid, NULL, conf)) { diff --git a/src/input/mpegts/iptv/iptv_mux.c b/src/input/mpegts/iptv/iptv_mux.c index 7084b9f2..a9e1649f 100644 --- a/src/input/mpegts/iptv/iptv_mux.c +++ b/src/input/mpegts/iptv/iptv_mux.c @@ -88,6 +88,14 @@ const idclass_t iptv_mux_class = .def.i = 0, .opts = PO_ADVANCED }, + { + .type = PT_INT, + .id = "spriority", + .name = "Streaming Priority", + .off = offsetof(iptv_mux_t, mm_iptv_streaming_priority), + .def.i = 0, + .opts = PO_ADVANCED + }, { .type = PT_STR, .id = "iptv_url", diff --git a/src/input/mpegts/iptv/iptv_private.h b/src/input/mpegts/iptv/iptv_private.h index f9936bc4..32f0620f 100644 --- a/src/input/mpegts/iptv/iptv_private.h +++ b/src/input/mpegts/iptv/iptv_private.h @@ -65,6 +65,7 @@ struct iptv_network int in_bw_limited; int in_priority; + int in_streaming_priority; uint32_t in_max_streams; uint32_t in_max_bandwidth; @@ -78,6 +79,7 @@ struct iptv_mux mpegts_mux_t; int mm_iptv_priority; + int mm_iptv_streaming_priority; int mm_iptv_fd; udp_connection_t *mm_iptv_connection; char *mm_iptv_url; diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index 3e36764f..e3213c24 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -223,21 +223,21 @@ linuxdvb_frontend_is_free ( mpegts_input_t *mi ) } static int -linuxdvb_frontend_get_weight ( mpegts_input_t *mi ) +linuxdvb_frontend_get_weight ( mpegts_input_t *mi, int flags ) { int weight = 0; linuxdvb_adapter_t *la = ((linuxdvb_frontend_t*)mi)->lfe_adapter; linuxdvb_frontend_t *lfe; LIST_FOREACH(lfe, &la->la_frontends, lfe_link) - weight = MAX(weight, mpegts_input_get_weight((mpegts_input_t*)lfe)); + weight = MAX(weight, mpegts_input_get_weight((mpegts_input_t*)lfe, flags)); return weight; } static int -linuxdvb_frontend_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm ) +linuxdvb_frontend_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags ) { linuxdvb_frontend_t *lfe = (linuxdvb_frontend_t*)mi; - int r = mpegts_input_get_priority(mi, mm); + int r = mpegts_input_get_priority(mi, mm, flags); if (lfe->lfe_satconf) r += linuxdvb_satconf_get_priority(lfe->lfe_satconf, mm); return r; diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index 682f0e11..14ebd357 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -160,6 +160,14 @@ const idclass_t mpegts_input_class = .def.i = 1, .opts = PO_ADVANCED }, + { + .type = PT_INT, + .id = "spriority", + .name = "Streaming Priority", + .off = offsetof(mpegts_input_t, mi_streaming_priority), + .def.i = 1, + .opts = PO_ADVANCED + }, { .type = PT_STR, .id = "displayname", @@ -221,7 +229,7 @@ mpegts_input_is_free ( mpegts_input_t *mi ) } int -mpegts_input_get_weight ( mpegts_input_t *mi ) +mpegts_input_get_weight ( mpegts_input_t *mi, int flags ) { const mpegts_mux_instance_t *mmi; const service_t *s; @@ -249,8 +257,12 @@ mpegts_input_get_weight ( mpegts_input_t *mi ) } int -mpegts_input_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm ) +mpegts_input_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags ) { + if (flags & SUBSCRIPTION_STREAMING) { + if (mi->mi_streaming_priority > 0) + return mi->mi_streaming_priority; + } return mi->mi_priority; } diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index b53813bc..0d775397 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -492,7 +492,7 @@ mpegts_mux_start1( mpegts_mux_instance_t *mmi ) static int mpegts_mux_start - ( mpegts_mux_t *mm, const char *reason, int weight ) + ( mpegts_mux_t *mm, const char *reason, int weight, int flags ) { int havefree = 0, enabled = 0, index, index2, weight2, count, size = 0; char buf[256]; @@ -549,8 +549,8 @@ mpegts_mux_start tvhtrace("mpegts", "%s - found mmi %p", buf, mmi); aweight = ((int64_t )mmi->mmi_input->mi_get_priority(mmi->mmi_input, - mmi->mmi_mux) << 32) | - mmi->mmi_input->mi_get_weight(mmi->mmi_input); + mmi->mmi_mux, flags) << 32) | + mmi->mmi_input->mi_get_weight(mmi->mmi_input, flags); for (index = 0; index < count; index++) { if (allw[index] >= aweight) break; diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index e4dc026b..471d0022 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -164,7 +164,7 @@ const idclass_t mpegts_service_class = * Check the service is enabled */ static int -mpegts_service_is_enabled(service_t *t) +mpegts_service_is_enabled(service_t *t, int flags) { mpegts_service_t *s = (mpegts_service_t*)t; mpegts_mux_t *mm = s->s_dvb_mux; @@ -191,7 +191,7 @@ mpegts_service_config_save ( service_t *t ) * Service instance list */ static void -mpegts_service_enlist(service_t *t, struct service_instance_list *sil) +mpegts_service_enlist(service_t *t, struct service_instance_list *sil, int flags) { int p = 0, w; mpegts_service_t *s = (mpegts_service_t*)t; @@ -215,8 +215,8 @@ mpegts_service_enlist(service_t *t, struct service_instance_list *sil) w = -1; p = -1; } else { - w = mmi->mmi_input->mi_get_weight(mmi->mmi_input); - p = mmi->mmi_input->mi_get_priority(mmi->mmi_input, mmi->mmi_mux); + w = mmi->mmi_input->mi_get_weight(mmi->mmi_input, flags); + p = mmi->mmi_input->mi_get_priority(mmi->mmi_input, mmi->mmi_mux, flags); } service_instance_add(sil, t, mmi->mmi_input->mi_instance, p, w); diff --git a/src/input/mpegts/satip/satip_frontend.c b/src/input/mpegts/satip/satip_frontend.c index 03d0be93..a0c7eb25 100644 --- a/src/input/mpegts/satip/satip_frontend.c +++ b/src/input/mpegts/satip/satip_frontend.c @@ -314,16 +314,16 @@ satip_frontend_is_free ( mpegts_input_t *mi ) } static int -satip_frontend_get_weight ( mpegts_input_t *mi ) +satip_frontend_get_weight ( mpegts_input_t *mi, int flags ) { - return mpegts_input_get_weight(mi); + return mpegts_input_get_weight(mi, flags); } static int -satip_frontend_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm ) +satip_frontend_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags ) { satip_frontend_t *lfe = (satip_frontend_t*)mi; - int r = mpegts_input_get_priority(mi, mm); + int r = mpegts_input_get_priority(mi, mm, flags); if (lfe->sf_positions) r += satip_satconf_get_priority(lfe, mm); return r; diff --git a/src/service.c b/src/service.c index ceac50a1..4a9e8b27 100644 --- a/src/service.c +++ b/src/service.c @@ -611,7 +611,7 @@ service_start(service_t *t, int instance, int postpone) service_instance_t * service_find_instance (service_t *s, channel_t *ch, service_instance_list_t *sil, - int *error, int weight, int postpone) + int *error, int weight, int flags, int postpone) { channel_service_mapping_t *csm; service_instance_t *si, *next; @@ -626,11 +626,11 @@ service_find_instance if (ch) { LIST_FOREACH(csm, &ch->ch_services, csm_chn_link) { s = csm->csm_svc; - if (s->s_is_enabled(s)) - s->s_enlist(s, sil); + if (s->s_is_enabled(s, flags)) + s->s_enlist(s, sil, flags); } } else { - s->s_enlist(s, sil); + s->s_enlist(s, sil, flags); } /* Clean */ diff --git a/src/service.h b/src/service.h index 00bcc80a..59646477 100644 --- a/src/service.h +++ b/src/service.h @@ -271,9 +271,9 @@ typedef struct service { LIST_HEAD(, th_subscription) s_subscriptions; - int (*s_is_enabled)(struct service *t); + int (*s_is_enabled)(struct service *t, int flags); - void (*s_enlist)(struct service *s, service_instance_list_t *sil); + void (*s_enlist)(struct service *s, service_instance_list_t *sil, int flags); int (*s_start_feed)(struct service *s, int instance); @@ -469,8 +469,8 @@ service_t *service_find(const char *identifier); service_instance_t *service_find_instance(struct service *s, struct channel *ch, service_instance_list_t *sil, - int *error, - int weight, int postpone); + int *error, int weight, + int flags, int postpone); elementary_stream_t *service_stream_find_(service_t *t, int pid); diff --git a/src/service_mapper.c b/src/service_mapper.c index 3e632211..d7fce5c0 100644 --- a/src/service_mapper.c +++ b/src/service_mapper.c @@ -107,7 +107,7 @@ service_mapper_start ( const service_mapper_conf_t *conf, htsmsg_t *uuids ) service_mapper_stat.ignore++; /* Disabled */ - if (!s->s_is_enabled(s)) continue; + if (!s->s_is_enabled(s, 0)) continue; tvhtrace("service_mapper", " enabled"); /* Get service info */ diff --git a/src/subscriptions.c b/src/subscriptions.c index 66e5a43d..0a929fcc 100644 --- a/src/subscriptions.c +++ b/src/subscriptions.c @@ -308,6 +308,7 @@ subscription_reschedule(void) s->ths_service->s_nicename, s->ths_weight); si = service_find_instance(s->ths_service, s->ths_channel, &s->ths_instances, &error, s->ths_weight, + s->ths_flags, dispatch_clock > s->ths_postpone_end ? 0 : s->ths_postpone_end - dispatch_clock); s->ths_current_instance = si; @@ -716,7 +717,7 @@ subscription_create_from_mux int r; /* Tune */ - r = mm->mm_start(mm, name, weight); + r = mm->mm_start(mm, name, weight, flags); if (r) { if (err) *err = r; return NULL; diff --git a/src/subscriptions.h b/src/subscriptions.h index 96ad4961..fad0edec 100644 --- a/src/subscriptions.h +++ b/src/subscriptions.h @@ -26,6 +26,7 @@ extern struct th_subscription_list subscriptions; #define SUBSCRIPTION_RAW_MPEGTS 0x1 #define SUBSCRIPTION_NONE 0x2 #define SUBSCRIPTION_FULLMUX 0x4 +#define SUBSCRIPTION_STREAMING 0x8 /* Some internal prioties */ #define SUBSCRIPTION_PRIO_SCAN_IDLE 1 ///< Idle scanning diff --git a/src/webui/webui.c b/src/webui/webui.c index b6c7831f..91cf0a14 100644 --- a/src/webui/webui.c +++ b/src/webui/webui.c @@ -715,7 +715,7 @@ http_stream_service(http_connection_t *hc, service_t *service, int weight) streaming_target_t *st; dvr_config_t *cfg; muxer_container_type_t mc; - int flags; + int flags = SUBSCRIPTION_STREAMING; const char *str; size_t qsize; const char *name; @@ -739,13 +739,12 @@ http_stream_service(http_connection_t *hc, service_t *service, int weight) gh = NULL; tsfix = NULL; st = &sq.sq_st; - flags = SUBSCRIPTION_RAW_MPEGTS; + flags |= SUBSCRIPTION_RAW_MPEGTS; } else { streaming_queue_init2(&sq, 0, qsize); gh = globalheaders_create(&sq.sq_st); tsfix = tsfix_create(gh); st = tsfix; - flags = 0; } tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrbuf, 50); @@ -794,7 +793,8 @@ http_stream_mux(http_connection_t *hc, mpegts_mux_t *mm, int weight) tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrbuf, 50); s = subscription_create_from_mux(mm, weight ?: 10, "HTTP", &sq.sq_st, SUBSCRIPTION_RAW_MPEGTS | - SUBSCRIPTION_FULLMUX, + SUBSCRIPTION_FULLMUX | + SUBSCRIPTION_STREAMING, addrbuf, hc->hc_username, http_arg_get(&hc->hc_args, "User-Agent"), NULL); if (!s) @@ -826,7 +826,7 @@ http_stream_channel(http_connection_t *hc, channel_t *ch, int weight) streaming_target_t *tr = NULL; #endif dvr_config_t *cfg; - int flags; + int flags = SUBSCRIPTION_STREAMING; muxer_container_type_t mc; char *str; size_t qsize; @@ -851,7 +851,7 @@ http_stream_channel(http_connection_t *hc, channel_t *ch, int weight) gh = NULL; tsfix = NULL; st = &sq.sq_st; - flags = SUBSCRIPTION_RAW_MPEGTS; + flags |= SUBSCRIPTION_RAW_MPEGTS; } else { streaming_queue_init2(&sq, 0, qsize); gh = globalheaders_create(&sq.sq_st); @@ -865,7 +865,6 @@ http_stream_channel(http_connection_t *hc, channel_t *ch, int weight) #endif tsfix = tsfix_create(gh); st = tsfix; - flags = 0; } tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrbuf, 50);