From: Jaroslav Kysela Date: Mon, 16 Oct 2017 06:53:47 +0000 (+0200) Subject: parsers: implement PTS clock recovery for ugly encoder, issue #4662 X-Git-Tag: v4.2.5~43 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2e0811d10e7fb5026b0360b59e84a9eeeb75bc0b;p=thirdparty%2Ftvheadend.git parsers: implement PTS clock recovery for ugly encoder, issue #4662 --- diff --git a/src/parsers/parsers.c b/src/parsers/parsers.c index 711c6f35a..a99f7d2cf 100644 --- a/src/parsers/parsers.c +++ b/src/parsers/parsers.c @@ -931,7 +931,7 @@ static int parse_pes_header(service_t *t, elementary_stream_t *st, const uint8_t *buf, size_t len) { - int64_t dts, pts, d; + int64_t dts, pts, d, d2; int hdr, flags, hlen; if (len < 3) @@ -954,8 +954,25 @@ parse_pes_header(service_t *t, elementary_stream_t *st, dts = getpts(buf + 5); d = (pts - dts) & PTS_MASK; - if(d > 180000) // More than two seconds of PTS/DTS delta, probably corrupt + if(d > 180000) { + /* More than two seconds of PTS/DTS delta, probably corrupt */ + if (st->es_curpts != PTS_UNSET && st->es_frame_duration > 10) { + /* try to do a recovery for this: + * dts 2954743318 pts 2954746828 + * dts 2954746918 pts 2419836508 ERROR + * dts 2954750518 pts 2419843708 ERROR + * dts 2954754118 pts 2954757628 + * dts 2954757718 pts 2954761228 + */ + d2 = pts_diff(st->es_curdts, dts); + if (d2 != PTS_UNSET && d2 < 10000) + pts = st->es_curpts + st->es_frame_duration; + d = (pts - dts) & PTS_MASK; + if (d <= 180000) + goto cont; + } pts = dts = PTS_UNSET; + } } else if((flags & 0xc0) == 0x80) { if(hlen < 5) @@ -965,6 +982,7 @@ parse_pes_header(service_t *t, elementary_stream_t *st, } else return hlen + 3; + cont: if(st->es_buf.sb_err) { st->es_curdts = PTS_UNSET; st->es_curpts = PTS_UNSET;