Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
mpegts mux: fix the active mux check for IPTV - introduce warm mux ca…
…llback
  • Loading branch information
perexg committed Aug 18, 2014
1 parent e5fda6d commit 2bfa7e3
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 17 deletions.
1 change: 1 addition & 0 deletions src/input/mpegts.h
Expand Up @@ -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);
Expand Down
22 changes: 17 additions & 5 deletions src/input/mpegts/iptv/iptv.c
Expand Up @@ -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)
Expand All @@ -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));
Expand Down Expand Up @@ -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;
Expand Down
20 changes: 20 additions & 0 deletions src/input/mpegts/mpegts_input.c
Expand Up @@ -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 )
{
Expand Down Expand Up @@ -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;
Expand Down
14 changes: 2 additions & 12 deletions src/input/mpegts/mpegts_mux.c
Expand Up @@ -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));
Expand All @@ -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;

Expand Down

0 comments on commit 2bfa7e3

Please sign in to comment.