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);
}
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)
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));
/* 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;
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 )
{
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;
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));
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;