From: Jaroslav Kysela Date: Thu, 27 Apr 2017 16:32:49 +0000 (+0200) Subject: parsers: add PCR / PTS check (comparison) before the packet is pushed to next chain X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3067a3e973a2fdc3ff12d5cb3156bbf9d45998b0;p=thirdparty%2Ftvheadend.git parsers: add PCR / PTS check (comparison) before the packet is pushed to next chain - the goal is to improve the parsed data stability - drop the invalid packets to avoid troubles in the packet processors --- diff --git a/src/parsers/parsers.c b/src/parsers/parsers.c index 966b36be1..b386777b9 100644 --- a/src/parsers/parsers.c +++ b/src/parsers/parsers.c @@ -1830,6 +1830,14 @@ parser_deliver(service_t *t, elementary_stream_t *st, th_pkt_t *pkt) { assert(pkt->pkt_type == st->es_type); + if (tvhlog_limit(&st->es_pcr_log, 2)) { + if (pts_diff(pkt->pkt_pcr, pkt->pkt_pts) > 2*90000) { + tvhwarn(LS_PARSER, "%s: PTS and PCR diff is very large (%"PRId64")", + service_component_nicename(st), pts_diff(pkt->pkt_pcr, pkt->pkt_pts)); + goto end; + } + } + pkt->pkt_componentindex = st->es_index; pkt_trace(LS_PARSER, pkt, "deliver"); @@ -1850,6 +1858,7 @@ parser_deliver(service_t *t, elementary_stream_t *st, th_pkt_t *pkt) /* Forward packet */ streaming_pad_deliver(&t->s_streaming_pad, streaming_msg_create_pkt(pkt)); +end: /* Decrease our own reference to the packet */ pkt_ref_dec(pkt); diff --git a/src/service.c b/src/service.c index 220b4ad39..978736e63 100644 --- a/src/service.c +++ b/src/service.c @@ -310,6 +310,7 @@ stream_clean(elementary_stream_t *st) tvhlog_limit_reset(&st->es_cc_log); tvhlog_limit_reset(&st->es_pes_log); + tvhlog_limit_reset(&st->es_pcr_log); } /** diff --git a/src/service.h b/src/service.h index 68a492293..9290e570c 100644 --- a/src/service.h +++ b/src/service.h @@ -127,6 +127,7 @@ typedef struct elementary_stream { tvhlog_limit_t es_cc_log; tvhlog_limit_t es_pes_log; + tvhlog_limit_t es_pcr_log; char *es_nicename;