From 9bb1ab8f9b78930b7a64ab6ac55eafd44ee1b867 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 18 May 2017 14:51:31 +0200 Subject: [PATCH] tsdemux: increase PCR change limit for no audio streams --- src/input/mpegts/tsdemux.c | 5 +++-- src/service.c | 15 +++++++++++++++ src/service.h | 2 ++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/input/mpegts/tsdemux.c b/src/input/mpegts/tsdemux.c index b8d422a25..c8cee5636 100644 --- a/src/input/mpegts/tsdemux.c +++ b/src/input/mpegts/tsdemux.c @@ -58,8 +58,9 @@ static void ts_recv_pcr(mpegts_service_t *t, const uint8_t *tsb) pcr |= ((uint64_t)tsb[10] >> 7) & 0x01; /* handle the broken info using candidate variable */ if (t->s_current_pcr == PTS_UNSET || t->s_current_pcr_guess || - pts_diff(t->s_current_pcr, pcr) <= 90000 || - (t->s_candidate_pcr != PTS_UNSET && pts_diff(t->s_candidate_pcr, pcr) <= 90000)) { + pts_diff(t->s_current_pcr, pcr) <= (int64_t)t->s_pcr_boundary || + (t->s_candidate_pcr != PTS_UNSET && + pts_diff(t->s_candidate_pcr, pcr) <= (int64_t)t->s_pcr_boundary)) { if (pcr != t->s_current_pcr) { if (t->s_current_pcr == PTS_UNSET) tvhtrace(LS_PCR, "%s: initial : %"PRId64, service_nicename((service_t*)t), pcr); diff --git a/src/service.c b/src/service.c index c03364ffe..05fa172fa 100644 --- a/src/service.c +++ b/src/service.c @@ -693,6 +693,7 @@ service_start(service_t *t, int instance, int weight, int flags, t->s_scrambled_seen = 0; t->s_scrambled_pass = !!(flags & SUBSCRIPTION_NODESCR); t->s_start_time = mclk(); + t->s_pcr_boundary = 90000; pthread_mutex_lock(&t->s_stream_mutex); service_build_filter(t); @@ -700,6 +701,9 @@ service_start(service_t *t, int instance, int weight, int flags, descrambler_caid_changed(t); + if (service_has_no_audio(t, 1)) + t->s_pcr_boundary = 4*90000; + if((r = t->s_start_feed(t, instance, weight, flags))) return r; @@ -1270,6 +1274,17 @@ service_has_audio_or_video(service_t *t) return 0; } +int +service_has_no_audio(service_t *t, int filtered) +{ + elementary_stream_t *st; + TAILQ_FOREACH(st, filtered ? &t->s_filt_components : + &t->s_components, es_link) + if (SCT_ISAUDIO(st->es_type)) + return 0; + return 1; +} + int service_is_sdtv(service_t *t) { diff --git a/src/service.h b/src/service.h index be0a44d80..75d50cc49 100644 --- a/src/service.h +++ b/src/service.h @@ -312,6 +312,7 @@ typedef struct service { int s_prio; int s_type_user; int s_pts_shift; // in ms (may be negative) + int s_pcr_boundary; LIST_ENTRY(service) s_active_link; @@ -560,6 +561,7 @@ void service_settings_write(service_t *t); const char *service_servicetype_txt(service_t *t); int service_has_audio_or_video(service_t *t); +int service_has_no_audio(service_t *t, int filtered); int service_is_sdtv(service_t *t); int service_is_uhdtv(service_t *t); int service_is_hdtv(service_t *t); -- 2.47.3