]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
parser: fix the saving of the parsed parameters, fixes #5034
authorJaroslav Kysela <perex@perex.cz>
Tue, 27 Mar 2018 14:31:56 +0000 (16:31 +0200)
committerJaroslav Kysela <perex@perex.cz>
Tue, 27 Mar 2018 14:31:56 +0000 (16:31 +0200)
The parser do not touch the elementary streams registered for service
(the timeshift preparation), but the parsed parameters should be
saved for the live streaming. This fixed the endless streaming restart
(visible for MPEG2 streams).

src/parsers/parsers.c
src/service.c
src/service.h

index ca9d17694763b2f13dc82b72e5362fc47ac8e724..62cff29a7f3053c2f5ebd59abe09c4672b2b4252 100644 (file)
@@ -812,7 +812,7 @@ ok:
         tvhtrace(LS_PARSER, "mpeg audio version change %02d: val=%d (old=%d)",
                  st->es_index, layer, st->es_audio_version);
         st->es_audio_version = layer;
-        atomic_set(&st->es_service->s_pending_restart, 1);
+        service_update_elementary_stream(st->es_service, (elementary_stream_t *)st);
       }
       makeapkt(t, st, buf + i, fsize, dts, duration,
                channels, mpa_sri[(buf[i+2] >> 2) & 3]);
@@ -1117,8 +1117,7 @@ parser_set_stream_vparam(parser_es_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);
-    atomic_set(&st->es_service->s_pending_restart, 1);
+    service_update_elementary_stream(st->es_service, (elementary_stream_t *)st);
   }
 }
 
index 86fe77e3f97b145369e1a339caef95af4d280846..5352c2e3879d1c0e92d7122e172187b62e907d59 100644 (file)
@@ -1030,6 +1030,44 @@ service_restart(service_t *t)
   descrambler_service_start(t);
 }
 
+/**
+ * Update one elementary stream from the parser.
+ * The update should be handled only for the live streaming.
+ */
+void
+service_update_elementary_stream(service_t *t, elementary_stream_t *src)
+{
+  elementary_stream_t *es;
+  int change = 0, restart = 0;
+
+  es = elementary_stream_find(&t->s_components, src->es_pid);
+  if (es == NULL)
+    return;
+
+  # define _CHANGE(field) \
+    if (es->field != src->field) { es->field = src->field; change++; }
+  # define _RESTART(field) \
+    if (es->field != src->field) { es->field = src->field; restart++; }
+
+  _CHANGE(es_frame_duration);
+  _RESTART(es_width);
+  _RESTART(es_height);
+  _CHANGE(es_aspect_num);
+  _CHANGE(es_aspect_den);
+  _RESTART(es_audio_version);
+  _RESTART(es_sri);
+  _RESTART(es_ext_sri);
+  _CHANGE(es_channels);
+
+  # undef _CHANGE
+  # undef _RESTART
+
+  if (change || restart)
+    service_request_save(t);
+  if (restart)
+    atomic_set(&t->s_pending_restart, 1);
+}
+
 /**
  *
  */
index 4ea9726b6ee48ffb76e91930cf42922644585f1d..925abf0b285d3017bc1c20eb9931742244c6e2b1 100644 (file)
@@ -475,6 +475,8 @@ void service_restart_streams(service_t *t);
 
 void service_request_save(service_t *t);
 
+void service_update_elementary_stream(service_t *t, elementary_stream_t *src);
+
 void service_source_info_free(source_info_t *si);
 
 void service_source_info_copy(source_info_t *dst, const source_info_t *src);