diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 720dca47..5c942e14 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -580,6 +580,7 @@ struct mpegts_input 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_warm_mux) (mpegts_input_t*,mpegts_mux_instance_t*); int (*mi_start_mux) (mpegts_input_t*,mpegts_mux_instance_t*); void (*mi_stop_mux) (mpegts_input_t*,mpegts_mux_instance_t*); void (*mi_open_service) (mpegts_input_t*,mpegts_service_t*,int first); diff --git a/src/input/mpegts/iptv/iptv.c b/src/input/mpegts/iptv/iptv.c index b828d99e..53b616e5 100644 --- a/src/input/mpegts/iptv/iptv.c +++ b/src/input/mpegts/iptv/iptv.c @@ -184,13 +184,9 @@ iptv_input_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags ) } static int -iptv_input_start_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi ) +iptv_input_warm_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi ) { - int ret = SM_CODE_TUNING_FAILED; iptv_mux_t *im = (iptv_mux_t*)mmi->mmi_mux; - iptv_handler_t *ih; - char buf[256]; - url_t url; /* Already active */ if (im->mm_active) @@ -214,6 +210,21 @@ iptv_input_start_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi ) if (s) s->mmi_mux->mm_stop(s->mmi_mux, 1); } + return 0; +} + +static int +iptv_input_start_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi ) +{ + int ret = SM_CODE_TUNING_FAILED; + iptv_mux_t *im = (iptv_mux_t*)mmi->mmi_mux; + iptv_handler_t *ih; + char buf[256]; + url_t url; + + /* Already active */ + if (im->mm_active) + return 0; /* Parse URL */ mpegts_mux_nice_name((mpegts_mux_t*)im, buf, sizeof(buf)); @@ -572,6 +583,7 @@ void iptv_init ( void ) /* Init Input */ mpegts_input_create0((mpegts_input_t*)iptv_input, &iptv_input_class, NULL, NULL); + iptv_input->mi_warm_mux = iptv_input_warm_mux; iptv_input->mi_start_mux = iptv_input_start_mux; iptv_input->mi_stop_mux = iptv_input_stop_mux; iptv_input->mi_is_free = iptv_input_is_free; diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index 2599cc47..f949063f 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -266,6 +266,25 @@ mpegts_input_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags ) return mi->mi_priority; } +static int +mpegts_input_warm_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi ) +{ + mpegts_mux_instance_t *cur; + + cur = LIST_FIRST(&mi->mi_mux_active); + if (cur != NULL) { + /* Already tuned */ + if (mmi == cur) + return 0; + + /* Stop current */ + cur->mmi_mux->mm_stop(cur->mmi_mux, 1); + } + if (LIST_FIRST(&mi->mi_mux_active)) + return SM_CODE_TUNING_FAILED; + return 0; +} + static int mpegts_input_start_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi ) { @@ -1033,6 +1052,7 @@ mpegts_input_create0 mi->mi_is_free = mpegts_input_is_free; mi->mi_get_weight = mpegts_input_get_weight; mi->mi_get_priority = mpegts_input_get_priority; + mi->mi_warm_mux = mpegts_input_warm_mux; mi->mi_start_mux = mpegts_input_start_mux; mi->mi_stop_mux = mpegts_input_stop_mux; mi->mi_open_service = mpegts_input_open_service; diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 9a6cb2b9..ae8f7bb8 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -96,7 +96,6 @@ mpegts_mux_instance_start int r; char buf[256], buf2[256]; mpegts_mux_instance_t *mmi = *mmiptr; - mpegts_mux_instance_t *cur; mpegts_mux_t * mm = mmi->mmi_mux; mpegts_input_t * mi = mmi->mmi_input; mpegts_mux_nice_name(mm, buf, sizeof(buf)); @@ -109,20 +108,11 @@ mpegts_mux_instance_start return 0; } - cur = LIST_FIRST(&mi->mi_mux_active); - if (cur != NULL) { - /* Already tuned */ - if (mmi == cur) - return 0; - - /* Stop current */ - cur->mmi_mux->mm_stop(cur->mmi_mux, 1); - } - assert(LIST_FIRST(&mi->mi_mux_active) == NULL); - /* Start */ mi->mi_display_name(mi, buf2, sizeof(buf2)); tvhinfo("mpegts", "%s - tuning on %s", buf, buf2); + r = mi->mi_warm_mux(mi, mmi); + if (r) return r; r = mi->mi_start_mux(mi, mmi); if (r) return r;