]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
tsdemux: increase PCR change limit for no audio streams
authorJaroslav Kysela <perex@perex.cz>
Thu, 18 May 2017 12:51:31 +0000 (14:51 +0200)
committerJaroslav Kysela <perex@perex.cz>
Thu, 18 May 2017 12:51:31 +0000 (14:51 +0200)
src/input/mpegts/tsdemux.c
src/service.c
src/service.h

index b8d422a259f6fd54ffa03ddf29c698c3b9f2abf7..c8cee563685af78bf46b1668484334efe7b48a7b 100644 (file)
@@ -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);
index c03364ffe1a80a88a953f2755146491ea9258430..05fa172fa7572ab5a5733257768bc1971b85b54a 100644 (file)
@@ -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)
 {
index be0a44d80c6f2d18eac787403194cba65cfc3e14..75d50cc4955ffceeadcc1768b33026f53086c939 100644 (file)
@@ -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);