mpegts mux: fix the active mux check for IPTV - introduce warm mux callback

This commit is contained in:
Jaroslav Kysela 2014-08-18 14:06:20 +02:00
parent e5fda6dd79
commit 2bfa7e3c08
4 changed files with 40 additions and 17 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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;

View file

@ -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;