mpegts: stop network scanning from failing due to bad mux
This commit is contained in:
parent
1253a97177
commit
8e00dc64d9
6 changed files with 63 additions and 19 deletions
|
@ -542,6 +542,7 @@ mpegts_mux_t *mpegts_mux_create0
|
|||
{ mpegts_mux_t *mm = mpegts_mux_find(u); if (mm) mm->mm_delete(mm); }
|
||||
|
||||
void mpegts_mux_initial_scan_done ( mpegts_mux_t *mm );
|
||||
void mpegts_mux_initial_scan_fail ( mpegts_mux_t *mm );
|
||||
|
||||
void mpegts_mux_delete ( mpegts_mux_t *mm );
|
||||
|
||||
|
|
|
@ -295,7 +295,7 @@ static int
|
|||
mpegts_mux_start
|
||||
( mpegts_mux_t *mm, const char *reason, int weight )
|
||||
{
|
||||
int pass, fail;
|
||||
int pass, fail, havefree = 0;
|
||||
char buf[256];
|
||||
mpegts_mux_instance_t *mmi, *tune;
|
||||
|
||||
|
@ -319,7 +319,11 @@ mpegts_mux_start
|
|||
mm->mm_create_instances(mm);
|
||||
if (!LIST_FIRST(&mm->mm_instances)) {
|
||||
tvhtrace("mpegts", "%s - has no instances", buf);
|
||||
return SM_CODE_NO_FREE_ADAPTER;
|
||||
return SM_CODE_TUNING_FAILED;
|
||||
// Note: we report a permanent inability to tune at this
|
||||
// time, rather than a lack of free tuners
|
||||
// this stops the init scan thinking we can't
|
||||
// proceed
|
||||
}
|
||||
|
||||
/* Find */
|
||||
|
@ -329,15 +333,17 @@ mpegts_mux_start
|
|||
while (pass < 2) {
|
||||
tune = NULL;
|
||||
if (!mmi) mmi = LIST_FIRST(&mm->mm_instances);
|
||||
|
||||
|
||||
/* First pass - free only */
|
||||
if (!pass) {
|
||||
|
||||
if (!mmi->mmi_tune_failed &&
|
||||
mmi->mmi_input->mi_is_enabled(mmi->mmi_input) &&
|
||||
if (mmi->mmi_input->mi_is_enabled(mmi->mmi_input) &&
|
||||
mmi->mmi_input->mi_is_free(mmi->mmi_input)) {
|
||||
tune = mmi;
|
||||
tvhtrace("mpegts", "%s - found free mmi %p", buf, mmi);
|
||||
havefree = 1;
|
||||
if (!mmi->mmi_tune_failed) {
|
||||
tune = mmi;
|
||||
tvhtrace("mpegts", "%s - found free mmi %p", buf, mmi);
|
||||
}
|
||||
}
|
||||
|
||||
/* Second pass - non-free */
|
||||
|
@ -368,7 +374,7 @@ mpegts_mux_start
|
|||
|
||||
if (!tune) {
|
||||
tvhdebug("mpegts", "%s - no free input (fail=%d)", buf, fail);
|
||||
return SM_CODE_NO_FREE_ADAPTER;
|
||||
return havefree ? SM_CODE_TUNING_FAILED : SM_CODE_NO_FREE_ADAPTER;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -522,6 +528,26 @@ mpegts_mux_initial_scan_done ( mpegts_mux_t *mm )
|
|||
idnode_updated(&mm->mm_network->mn_id);
|
||||
}
|
||||
|
||||
void
|
||||
mpegts_mux_initial_scan_fail ( mpegts_mux_t *mm )
|
||||
{
|
||||
char buf[256];
|
||||
mpegts_network_t *mn = mm->mm_network;
|
||||
|
||||
/* Stop */
|
||||
mm->mm_display_name(mm, buf, sizeof(buf));
|
||||
tvhinfo("mpegts", "%s - initial scan failed (remove mux)", buf);
|
||||
gtimer_disarm(&mm->mm_initial_scan_timeout);
|
||||
mn->mn_initial_scan_num--;
|
||||
mm->mm_initial_scan_status = MM_SCAN_DONE;
|
||||
|
||||
/* Save */
|
||||
mm->mm_initial_scan_done = 1;
|
||||
mm->mm_config_save(mm);
|
||||
idnode_updated(&mm->mm_id);
|
||||
idnode_updated(&mm->mm_network->mn_id);
|
||||
}
|
||||
|
||||
/* **************************************************************************
|
||||
* Creation / Config
|
||||
* *************************************************************************/
|
||||
|
@ -640,11 +666,12 @@ int
|
|||
mpegts_mux_subscribe
|
||||
( mpegts_mux_t *mm, const char *name, int weight )
|
||||
{
|
||||
int err = 0;
|
||||
th_subscription_t *s;
|
||||
s = subscription_create_from_mux(mm, weight, name, NULL,
|
||||
SUBSCRIPTION_NONE,
|
||||
NULL, NULL, NULL);
|
||||
return s != NULL ? 0 : 1;
|
||||
NULL, NULL, NULL, &err);
|
||||
return s ? 0 : err;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -236,15 +236,28 @@ mpegts_network_delete
|
|||
static void
|
||||
mpegts_network_initial_scan(void *aux)
|
||||
{
|
||||
int r;
|
||||
mpegts_network_t *mn = aux;
|
||||
mpegts_mux_t *mm;
|
||||
|
||||
tvhtrace("mpegts", "setup initial scan for %p", mn);
|
||||
while((mm = TAILQ_FIRST(&mn->mn_initial_scan_pending_queue)) != NULL) {
|
||||
assert(mm->mm_initial_scan_status == MM_SCAN_PENDING);
|
||||
if (mpegts_mux_subscribe(mm, "initscan", 1))
|
||||
r = mpegts_mux_subscribe(mm, "initscan", 1);
|
||||
|
||||
/* Stop scanning here */
|
||||
if (r == SM_CODE_NO_FREE_ADAPTER)
|
||||
break;
|
||||
assert(mm->mm_initial_scan_status == MM_SCAN_CURRENT);
|
||||
|
||||
/* Started */
|
||||
if (!r) {
|
||||
assert(mm->mm_initial_scan_status == MM_SCAN_CURRENT);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Remove */
|
||||
TAILQ_REMOVE(&mn->mn_initial_scan_pending_queue, mm, mm_initial_scan_link);
|
||||
mpegts_mux_initial_scan_fail(mm);
|
||||
}
|
||||
gtimer_arm(&mn->mn_initial_scan_timer, mpegts_network_initial_scan, mn, 10);
|
||||
}
|
||||
|
|
|
@ -553,11 +553,12 @@ subscription_create_from_mux
|
|||
(mpegts_mux_t *mm,
|
||||
unsigned int weight,
|
||||
const char *name,
|
||||
streaming_target_t *st,
|
||||
streaming_target_t *st,
|
||||
int flags,
|
||||
const char *hostname,
|
||||
const char *username,
|
||||
const char *client)
|
||||
const char *hostname,
|
||||
const char *username,
|
||||
const char *client,
|
||||
int *err)
|
||||
{
|
||||
th_subscription_t *s;
|
||||
streaming_message_t *sm;
|
||||
|
@ -566,8 +567,10 @@ subscription_create_from_mux
|
|||
|
||||
/* Tune */
|
||||
r = mm->mm_start(mm, name, weight);
|
||||
if (r)
|
||||
if (r) {
|
||||
if (err) *err = r;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Create subscription */
|
||||
s = subscription_create(weight, name, st, flags, NULL,
|
||||
|
|
|
@ -128,7 +128,7 @@ th_subscription_t *subscription_create_from_mux
|
|||
int flags,
|
||||
const char *hostname,
|
||||
const char *username,
|
||||
const char *client);
|
||||
const char *client, int *err);
|
||||
#endif
|
||||
|
||||
th_subscription_t *subscription_create(int weight, const char *name,
|
||||
|
|
|
@ -732,7 +732,7 @@ http_stream_mux(http_connection_t *hc, mpegts_mux_t *mm)
|
|||
tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrbuf, 50);
|
||||
s = subscription_create_from_mux(mm, weight, "HTTP", &sq.sq_st, 0,
|
||||
addrbuf, hc->hc_username,
|
||||
http_arg_get(&hc->hc_args, "User-Agent"));
|
||||
http_arg_get(&hc->hc_args, "User-Agent"), NULL);
|
||||
if (!s)
|
||||
return HTTP_STATUS_BAD_REQUEST;
|
||||
name = tvh_strdupa(s->ths_title);
|
||||
|
|
Loading…
Add table
Reference in a new issue