From: Beavis Date: Sun, 17 May 2020 16:03:52 +0000 (+0200) Subject: see https://tvheadend.org/issues/5722 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=25e9c0600b6090335cebee2854bea1f9b2fecaa4;p=thirdparty%2Ftvheadend.git see https://tvheadend.org/issues/5722 --- diff --git a/src/parsers/message.c b/src/parsers/message.c index 74c92401d..35f2439b4 100644 --- a/src/parsers/message.c +++ b/src/parsers/message.c @@ -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; diff --git a/src/parsers/parsers.c b/src/parsers/parsers.c index 7524f715f..304ee800b 100644 --- a/src/parsers/parsers.c +++ b/src/parsers/parsers.c @@ -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); diff --git a/src/parsers/parsers.h b/src/parsers/parsers.h index f37a56c57..404d69dd5 100644 --- a/src/parsers/parsers.h +++ b/src/parsers/parsers.h @@ -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