]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
service: use s_pending_restart more properly, issue #4701
authorJaroslav Kysela <perex@perex.cz>
Fri, 3 Nov 2017 16:37:10 +0000 (17:37 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 3 Nov 2017 17:01:06 +0000 (18:01 +0100)
src/input/mpegts/dvb_psi.c
src/input/mpegts/mpegts_service.c
src/parsers/parsers.c
src/service.c
src/service.h
src/streaming.c

index 4256ef0045b84e90b1cfce7195c7fcf980b8b3a5..e608096b62ebe73531ec8a868c9044c19e713cc0 100644 (file)
@@ -2660,7 +2660,7 @@ psi_parse_pmt
      update&PMT_UPDATE_CAID_PID          ? ", CAID PID changed":"",
      update&PMT_REORDERED                ? ", PIDs reordered":"");
     
-    service_request_save((service_t*)t, 1);
+    service_request_save((service_t*)t, 0);
 
     // Only restart if something that our clients worry about did change
     if(update & ~(PMT_UPDATE_NEW_CA_STREAM |
@@ -2678,11 +2678,6 @@ psi_parse_pmt
     t->s_verified = 1;
   }
 
-  /* FIXME: Move pending_restart handling to another place? */
-  if (atomic_set(&t->s_pending_restart, 0) && !ret)
-    tvhdebug(mt->mt_subsys, "%s: Service \"%s\" forced restart",
-             mt->mt_name, service_nicename((service_t*)t));
-
   *_update = update;
   return ret;
 }
index acd0334b0c109408f57dfc60d09d3914c6be89a1..24dd2342fd6f40729d9bef1e1db914222a0ac06f 100644 (file)
@@ -462,7 +462,6 @@ mpegts_service_setsourceinfo(service_t *t, source_info_t *si)
 
   /* Validate */
   assert(s->s_source_type == S_MPEG_TS);
-  lock_assert(&global_lock);
 
   /* Update */
   memset(si, 0, sizeof(struct source_info));
index 5eac1ad6cf0da5b8f400303edb92b2c5c00ee035..3089e9476a7cef21f4007397976005e35fa82b19 100644 (file)
@@ -671,7 +671,7 @@ parse_mpa123(service_t *t, elementary_stream_t *st)
     default: fsize = 0;
     }
 
-    if (fsize && st->es_audio_version != layer) {
+    if (fsize && st->es_audio_version < layer) {
       st->es_audio_version = layer;
       atomic_set(&t->s_pending_restart, 1);
     }
@@ -1065,7 +1065,8 @@ parser_set_stream_vparam(elementary_stream_t *st, int width, int height,
     st->es_width = width;
     st->es_height = height;
     st->es_frame_duration = duration;
-    service_request_save(st->es_service, 1);
+    service_request_save(st->es_service, 0);
+    atomic_set(&st->es_service->s_pending_restart, 1);
   }
 }
 
index 7e38a9599907346e7dff092efc62adbeb7da59ae..21937196870ea8b074ac2ec060b7031ee3034ba1 100644 (file)
@@ -1460,23 +1460,16 @@ service_set_streaming_status_flags_(service_t *t, int set)
 }
 
 /**
- * Restart output on a service.
+ * Restart output on a service (streams only).
  * Happens if the stream composition changes.
  * (i.e. an AC3 stream disappears, etc)
  */
 void
-service_restart(service_t *t)
+service_restart_streams(service_t *t)
 {
   streaming_message_t *sm;
-  int had_components;
-
-  if(t->s_type != STYPE_STD)
-    goto refresh;
-
-  pthread_mutex_lock(&t->s_stream_mutex);
-
-  had_components = TAILQ_FIRST(&t->s_filt_components) != NULL &&
-                   t->s_running;
+  int had_components = TAILQ_FIRST(&t->s_filt_components) != NULL &&
+                       t->s_running;
 
   service_build_filter(t);
 
@@ -1493,13 +1486,25 @@ service_restart(service_t *t)
     streaming_service_deliver(t, sm);
     t->s_running = 0;
   }
+}
 
-  pthread_mutex_unlock(&t->s_stream_mutex);
+/**
+ * Restart output on a service.
+ * Happens if the stream composition changes.
+ * (i.e. an AC3 stream disappears, etc)
+ */
+void
+service_restart(service_t *t)
+{
+  if (t->s_type == STYPE_STD) {
+    pthread_mutex_lock(&t->s_stream_mutex);
+    service_restart_streams(t);
+    pthread_mutex_unlock(&t->s_stream_mutex);
 
-  descrambler_caid_changed(t);
+    descrambler_caid_changed(t);
+  }
 
-refresh:
-  if(t->s_refresh_feed != NULL)
+  if (t->s_refresh_feed != NULL)
     t->s_refresh_feed(t);
 
   descrambler_service_start(t);
index 0f012c8ae77ef93a6071d45331d984fd508f39da..d7a17a0a9047a3b6407a01d2b2105a22869c1368 100644 (file)
@@ -617,6 +617,8 @@ struct streaming_start *service_build_stream_start(service_t *t);
 
 void service_restart(service_t *t);
 
+void service_restart_streams(service_t *t);
+
 void service_stream_destroy(service_t *t, elementary_stream_t *st);
 
 void service_request_save(service_t *t, int restart);
index c134abe68853b0a7a5fc68cfb2ce52e0c8b7295e..708af3930c204816934cffc112336b318a55c84a 100644 (file)
@@ -426,6 +426,8 @@ streaming_pad_deliver(streaming_pad_t *sp, streaming_message_t *sm)
 void
 streaming_service_deliver(service_t *t, streaming_message_t *sm)
 {
+  if (atomic_set(&t->s_pending_restart, 0))
+    service_restart_streams(t);
   streaming_pad_deliver(&t->s_streaming_pad, sm);
 }