Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
mpegts: DVB scan - add OK (partial) status
It seems that few tables are not completely read during
the short scan phase or broadcaster are crazy enough to
add invalid tables (tested mostly on 1W satellite position).
  • Loading branch information
perexg committed Sep 26, 2015
1 parent d09aaca commit 2342e59
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 19 deletions.
6 changes: 5 additions & 1 deletion src/input/mpegts.h
Expand Up @@ -343,9 +343,13 @@ typedef enum mpegts_mux_scan_result
{
MM_SCAN_NONE,
MM_SCAN_OK,
MM_SCAN_FAIL
MM_SCAN_FAIL,
MM_SCAN_PARTIAL
} mpegts_mux_scan_result_t;

#define MM_SCAN_CHECK_OK(mm) \
((mm)->mm_scan_result == MM_SCAN_OK || (mm)->mm_scan_result == MM_SCAN_PARTIAL)

enum mpegts_mux_epg_flag
{
MM_EPG_DISABLE,
Expand Down
41 changes: 28 additions & 13 deletions src/input/mpegts/mpegts_mux.c
Expand Up @@ -177,7 +177,7 @@ mpegts_mux_subscribe_linked
LIST_FOREACH(mnl2, &mi2->mi_networks, mnl_mi_link)
if (mnl2->mnl_network == mm->mm_network)
LIST_FOREACH(mm2, &mnl2->mnl_network->mn_muxes, mm_network_link)
if (!mm2->mm_active && mm->mm_scan_result == MM_SCAN_OK &&
if (!mm2->mm_active && MM_SCAN_CHECK_OK(mm) &&
!LIST_EMPTY(&mm2->mm_services))
if (!mpegts_mux_subscribe_keep(mm2, mi2))
return;
Expand All @@ -186,7 +186,7 @@ mpegts_mux_subscribe_linked
LIST_FOREACH(mnl2, &mi2->mi_networks, mnl_mi_link)
if (mnl2->mnl_network != mm->mm_network)
LIST_FOREACH(mm2, &mnl2->mnl_network->mn_muxes, mm_network_link)
if (!mm2->mm_active && mm->mm_scan_result == MM_SCAN_OK &&
if (!mm2->mm_active && MM_SCAN_CHECK_OK(mm) &&
!LIST_EMPTY(&mm2->mm_services))
if (!mpegts_mux_subscribe_keep(mm2, mi2))
return;
Expand Down Expand Up @@ -385,9 +385,10 @@ scan_state_tab[] = {

static struct strtab
scan_result_tab[] = {
{ N_("NONE"), MM_SCAN_NONE },
{ N_("OK"), MM_SCAN_OK },
{ N_("FAIL"), MM_SCAN_FAIL },
{ N_("NONE"), MM_SCAN_NONE },
{ N_("OK"), MM_SCAN_OK },
{ N_("FAIL"), MM_SCAN_FAIL },
{ N_("OK (partial)"), MM_SCAN_PARTIAL },
};

int
Expand Down Expand Up @@ -960,6 +961,7 @@ void
mpegts_mux_scan_done ( mpegts_mux_t *mm, const char *buf, int res )
{
mpegts_table_t *mt;
int total = 0, incomplete = 0;

assert(mm->mm_scan_state == MM_SCAN_STATE_ACTIVE);

Expand All @@ -969,20 +971,36 @@ mpegts_mux_scan_done ( mpegts_mux_t *mm, const char *buf, int res )
LIST_FOREACH(mt, &mm->mm_tables, mt_link) {
if (mt->mt_flags & MT_QUICKREQ) {
const char *s = "not found";
if (mt->mt_complete)
if (mt->mt_complete) {
s = "complete";
else if (mt->mt_count)
total++;
} else if (mt->mt_count) {
s = "incomplete";
total++;
incomplete++;
}
tvhdebug("mpegts", "%s - %04X (%d) %s %s", buf, mt->mt_pid, mt->mt_pid, mt->mt_name, s);
}
}
pthread_mutex_unlock(&mm->mm_tables_lock);

if (res) {
if (res < 0) {
/* is threshold 3 missing tables enough? */
if (incomplete > 0 && total > incomplete && incomplete <= 3) {
tvhinfo("mpegts", "%s - scan complete (partial - %d/%d tables)", buf, total, incomplete);
mpegts_network_scan_mux_partial(mm);
} else {
tvhinfo("mpegts", "%s - scan timed out (%d/%d tables)", buf, total, incomplete);
mpegts_network_scan_mux_fail(mm);
}
} else if (res) {
tvhinfo("mpegts", "%s scan complete", buf);
mpegts_network_scan_mux_done(mm);
mpegts_mux_scan_service_check(mm);
} else
} else {
tvhinfo("mpegts", "%s - scan no data, failed", buf);
mpegts_network_scan_mux_fail(mm);
}
}

static void
Expand All @@ -996,8 +1014,7 @@ mpegts_mux_scan_timeout ( void *aux )

/* Timeout */
if (mm->mm_scan_init) {
tvhinfo("mpegts", "%s - scan timed out", buf);
mpegts_mux_scan_done(mm, buf, 0);
mpegts_mux_scan_done(mm, buf, -1);
return;
}
mm->mm_scan_init = 1;
Expand Down Expand Up @@ -1027,7 +1044,6 @@ mpegts_mux_scan_timeout ( void *aux )

/* No DATA - give up now */
if (!c) {
tvhinfo("mpegts", "%s - scan no data, failed", buf);
mpegts_mux_scan_done(mm, buf, 0);

/* Pending tables (another 20s or 30s - bit arbitrary) */
Expand All @@ -1038,7 +1054,6 @@ mpegts_mux_scan_timeout ( void *aux )

/* Complete */
} else {
tvhinfo("mpegts", "%s - scan complete", buf);
mpegts_mux_scan_done(mm, buf, 1);
}
}
Expand Down
6 changes: 3 additions & 3 deletions src/input/mpegts/mpegts_network_scan.c
Expand Up @@ -147,11 +147,11 @@ mpegts_network_scan_mux_done ( mpegts_mux_t *mm )
mpegts_network_scan_mux_done0(mm, MM_SCAN_OK, 0);
}

/* Failed - no input */
/* Partially completed (not all tables were read) */
void
mpegts_network_scan_mux_timeout ( mpegts_mux_t *mm )
mpegts_network_scan_mux_partial ( mpegts_mux_t *mm )
{
mpegts_network_scan_mux_done0(mm, MM_SCAN_FAIL, 0);
mpegts_network_scan_mux_done0(mm, MM_SCAN_PARTIAL, 0);
}

/* Interrupted (re-add) */
Expand Down
2 changes: 1 addition & 1 deletion src/input/mpegts/mpegts_network_scan.h
Expand Up @@ -42,7 +42,7 @@ void mpegts_network_scan_queue_del ( mpegts_mux_t *mm );
*/
void mpegts_network_scan_mux_fail ( mpegts_mux_t *mm );
void mpegts_network_scan_mux_done ( mpegts_mux_t *mm );
void mpegts_network_scan_mux_timeout ( mpegts_mux_t *mm );
void mpegts_network_scan_mux_partial ( mpegts_mux_t *mm );
void mpegts_network_scan_mux_cancel ( mpegts_mux_t *mm, int reinsert );
void mpegts_network_scan_mux_active ( mpegts_mux_t *mm );

Expand Down
1 change: 0 additions & 1 deletion src/input/mpegts/mpegts_table.c
Expand Up @@ -74,7 +74,6 @@ mpegts_table_fastswitch ( mpegts_mux_t *mm, mpegts_table_t *mtm )
pthread_mutex_unlock(&mm->mm_tables_lock);

mpegts_mux_nice_name(mm, buf, sizeof(buf));
tvhinfo("mpegts", "%s scan complete", buf);
mpegts_mux_scan_done(mm, buf, 1);
}

Expand Down

0 comments on commit 2342e59

Please sign in to comment.