]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvbpsi: move the service enable / seen flag to PMT table (test also running elementar...
authorJaroslav Kysela <perex@perex.cz>
Sat, 17 Oct 2015 17:40:24 +0000 (19:40 +0200)
committerJaroslav Kysela <perex@perex.cz>
Sat, 17 Oct 2015 17:40:24 +0000 (19:40 +0200)
src/input/mpegts/dvb_psi.c
src/service.c
src/service.h

index 2e078feee0618cda15736ea2d8548c8f896eedce..e0d5e696768d6b801f67c50cde08a6dcdff1e593 100644 (file)
@@ -872,12 +872,6 @@ dvb_pat_callback
       tvhdebug("pat", "  sid %04X (%d) on pid %04X (%d)", sid, sid, pid, pid);
       int save = 0;
       if ((s = mpegts_service_find(mm, sid, pid, 1, &save))) {
-        if (!s->s_enabled && s->s_auto == SERVICE_AUTO_PAT_MISSING) {
-          tvhinfo("mpegts", "enabling service %s [sid %04X/%d] (found in PAT)",
-                  s->s_nicename, s->s_dvb_service_id, s->s_dvb_service_id);
-          service_set_enabled((service_t *)s, 1, SERVICE_AUTO_NORMAL);
-        }
-        s->s_dvb_check_seen = dispatch_clock;
         mpegts_table_add(mm, DVB_PMT_BASE, DVB_PMT_MASK, dvb_pmt_callback,
                          NULL, "pmt",
                          MT_CRC | MT_QUICKREQ | MT_ONESHOT | MT_SCANSUBS,
@@ -2358,6 +2352,15 @@ psi_parse_pmt
     // notify descrambler that we found another CAIDs
     if (update & PMT_UPDATE_NEW_CAID)
       descrambler_caid_changed((service_t *)t);
+
+    if (service_has_audio_or_video((service_t *)t)) {
+      t->s_dvb_check_seen = dispatch_clock;
+      if (!t->s_enabled && t->s_auto == SERVICE_AUTO_PAT_MISSING) {
+        tvhinfo("mpegts", "enabling service %s [sid %04X/%d] (found in PAT and PMT)",
+                t->s_nicename, t->s_dvb_service_id, t->s_dvb_service_id);
+        service_set_enabled((service_t *)t, 1, SERVICE_AUTO_NORMAL);
+      }
+    }
   }
   return ret;
 }
index 2acf4e4782668fc82a819cfc7afca577d8fe5b50..f6c6be36813092260b48a68a89e60c788967fedb 100644 (file)
@@ -1071,6 +1071,16 @@ service_data_timeout(void *aux)
 /**
  *
  */
+int
+service_has_audio_or_video(service_t *t)
+{
+  elementary_stream_t *st;
+  TAILQ_FOREACH(st, &t->s_components, es_link)
+    if (SCT_ISVIDEO(st->es_type) || SCT_ISAUDIO(st->es_type))
+      return 1;
+  return 0;
+}
+
 int
 service_is_sdtv(service_t *t)
 {
index dcaf590c212c6f4e2cab1e8acf0fcfdcbcf09563..3a96e611cbf2b7f8e78d103479fc8108c09e93dc 100644 (file)
@@ -530,6 +530,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_is_sdtv(service_t *t);
 int service_is_hdtv(service_t *t);
 int service_is_radio(service_t *t);