mpegts mux: fix the active mux check for IPTV - introduce warm mux callback
This commit is contained in:
parent
e5fda6dd79
commit
2bfa7e3c08
4 changed files with 40 additions and 17 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue