]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
see https://tvheadend.org/issues/5722
authorBeavis <beavis@nas.scaryflop.com>
Sun, 17 May 2020 16:03:52 +0000 (18:03 +0200)
committerFlole998 <Flole998@users.noreply.github.com>
Mon, 6 Jul 2020 15:06:45 +0000 (17:06 +0200)
src/parsers/message.c
src/parsers/parsers.c
src/parsers/parsers.h

index 74c92401df184e9699e1d6c46b2067a44d9b49cb..35f2439b4415f7fbdbb957a8c858b10d60ec6b13 100644 (file)
@@ -272,6 +272,21 @@ static void parser_clean_es(parser_es_t *pes)
   tvhlog_limit_reset(&pes->es_pcr_log);
 }
 
+static void
+parser_do_rstlog(parser_t *prs)
+{
+  streaming_message_t *sm;
+  th_pkt_t *pkt;
+  while ((sm = TAILQ_FIRST(&prs->prs_rstlog)) != NULL) {
+    TAILQ_REMOVE(&prs->prs_rstlog, sm, sm_link);
+    pkt = sm->sm_data;
+    pkt_trace(LS_PARSER, pkt, "deliver from rstlog");
+    streaming_target_deliver2(prs->prs_output, streaming_msg_create_pkt(pkt));
+    sm->sm_data = NULL;
+    streaming_msg_free(sm);
+  }
+}
+
 /**
  *
  */
@@ -300,6 +315,10 @@ static void parser_input_start(parser_t *prs, streaming_message_t *sm)
     prs->prs_pcr_boundary = 6*90000;
 
   streaming_target_deliver2(prs->prs_output, sm);
+  /* do_rstlog */
+  if (!TAILQ_EMPTY(&prs->prs_rstlog)) {
+    parser_do_rstlog(prs);
+  }
 }
 
 /**
@@ -359,6 +378,7 @@ parser_create(streaming_target_t *output, th_subscription_t *ts)
   prs->prs_output = output;
   prs->prs_subscription = ts;
   prs->prs_service = t;
+  TAILQ_INIT(&prs->prs_rstlog);
   elementary_set_init(&prs->prs_components, LS_PARSER, service_nicename(t), t);
   streaming_target_init(&prs->prs_input, &parser_input_ops, prs, 0);
   return &prs->prs_input;
@@ -374,6 +394,7 @@ parser_destroy(streaming_target_t *pad)
   parser_t *prs = (parser_t *)pad;
   elementary_stream_t *es;
   parser_es_t *pes;
+  streaming_queue_clear(&prs->prs_rstlog);
 
   TAILQ_FOREACH(es, &prs->prs_components.set_all, es_link) {
     pes = (parser_es_t *)es;
index 7524f715f433bc0f4001ef698a5b17fdfce122eb..304ee800bce916153d1a9d695dd12cb64c1eac46 100644 (file)
@@ -92,6 +92,20 @@ parser_deliver_error(parser_t *t, parser_es_t *st)
   st->es_buf.sb_err = 0;
 }
 
+
+
+/**
+ * prs_rstlog
+ */
+static void
+parser_rstlog(parser_t *t, th_pkt_t *pkt)
+{
+  streaming_message_t *sm = streaming_msg_create_pkt(pkt);
+  pkt_ref_dec(pkt); /* streaming_msg_create_pkt increses ref counter */
+  streaming_message_t *clone = streaming_msg_clone(sm);
+  TAILQ_INSERT_TAIL (&t->prs_rstlog, clone, sm_link);
+}
+
 /**
  *
  */
@@ -127,15 +141,20 @@ parser_deliver(parser_t *t, parser_es_t *st, th_pkt_t *pkt)
 deliver:
   pkt->pkt_componentindex = st->es_index;
 
-  pkt_trace(LS_PARSER, pkt, "deliver");
-
   if (SCT_ISVIDEO(pkt->pkt_type)) {
     pkt->v.pkt_aspect_num = st->es_aspect_num;
     pkt->v.pkt_aspect_den = st->es_aspect_den;
   }
 
   /* Forward packet */
-  streaming_target_deliver2(t->prs_output, streaming_msg_create_pkt(pkt));
+  if(atomic_get(&st->es_service->s_pending_restart) == 1) {
+    /* Queue pkt to prs_rstlog if pending restart */
+    pkt_trace(LS_PARSER, pkt, "deliver to rstlog");
+    parser_rstlog(t, pkt);
+  } else {
+    pkt_trace(LS_PARSER, pkt, "deliver");
+    streaming_target_deliver2(t->prs_output, streaming_msg_create_pkt(pkt));
+  }
 
   /* Decrease our own reference to the packet */
   pkt_ref_dec(pkt);
index f37a56c57e1e2f8dca2b30c939499513b45cfa7d..404d69dd5012e0954cdce2b52524390f69f86ff3 100644 (file)
@@ -98,6 +98,8 @@ struct parser {
   commercial_advice_t prs_tt_commercial_advice;
   time_t prs_tt_clock;   /* Network clock as determined by teletext decoder */
 
+  /* restart_pending log */
+  struct streaming_message_queue prs_rstlog;
 };
 
 static inline int64_t