From patchwork Sat Dec 15 18:50:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Jan_Ekstr=C3=B6m?= X-Patchwork-Id: 11430 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 98E1844E2F1 for ; Sat, 15 Dec 2018 20:50:48 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C1F0468AB0C; Sat, 15 Dec 2018 20:50:48 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f196.google.com (mail-lj1-f196.google.com [209.85.208.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1DD4468A9AD for ; Sat, 15 Dec 2018 20:50:43 +0200 (EET) Received: by mail-lj1-f196.google.com with SMTP id c19-v6so7666075lja.5 for ; Sat, 15 Dec 2018 10:50:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=qIc222omdJgj8cZ4j9DDm3p0N6GES7qcR/R6wGS7SEc=; b=I3O3jcWtDfdA2/HWq2aaH6D5pW368eYPT9BALpBtutiqHVBsbMigKkU298hCzjYki1 Tfw3J01D1B4dNTO3Wb1zLpcgRBj+Ov/25Gl4ggdmW3IWOqp6mJdBJA1n9P5OetL7XVcG 0ZB/xcHHxkqPWUB2b3rY30QsOAZq8hvx72bfj7Njbd5lcWGVJTWnI+BP014a8eiq0jXD JBsJ+EhVid+AKgzItvjmYP+EEhb86AOdhUhuREosmD8D+nyKWLTTm7ftHFdvVnhd5YJA DgzEr1YFj4Y66tWjAgbD9JmFGwKTo/Z7Xsd+L8xB3yHupnYNCUfj5lJNcMUmaJKOuWLs L4fg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=qIc222omdJgj8cZ4j9DDm3p0N6GES7qcR/R6wGS7SEc=; b=FyhGjxhqvKEw8TNXODYTDziNx9THWJgdTm+wLMbwAEJoMMhQswT3QdXy8ZAfq9iBq+ AOocYy6JuGtMYKmAb95YKJeIderoqLoarHe67UhbsAwWCkjXWj/7LGZki1h4Lz3j5R7H w0znIYXM5ykLyURwcIV4sxpNumH1kGVzdtYoZjnvOYFX7hd2u55anAkbDekbMx9oVR5X Kx29jH/S26DPWs5Zk4YC94JwzFTrGxsnPw4H8/TbA+ibSJzS8C0JYg9f2wIM+zNVbF5S KZ8fPuEuVaN4jS8zLBHingY2nrjr8675YdHqWu9OCdjas0z7Zv1F/xo94XBS5TCTGrvq K8pw== X-Gm-Message-State: AA+aEWbxCntMmY9GGlOwKV9AWdpyLamcDRz7plvdSphZDqjAnaVY9h1J QaXx/q9u2/l7SvLEqXczvU4tLOOc X-Google-Smtp-Source: AFSGD/UHq0FTRpHHRhgx9s8w9Bxc413BFGUtEYh80iAd55UOvfcmMcclZ6KjtCsu+LzUsvOLIcs5dw== X-Received: by 2002:a2e:5555:: with SMTP id j82-v6mr4861711ljb.69.1544899842810; Sat, 15 Dec 2018 10:50:42 -0800 (PST) Received: from localhost.localdomain (91-159-194-103.elisa-laajakaista.fi. [91.159.194.103]) by smtp.gmail.com with ESMTPSA id a20-v6sm1543338ljf.28.2018.12.15.10.50.41 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 15 Dec 2018 10:50:41 -0800 (PST) From: =?UTF-8?q?Jan=20Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Sat, 15 Dec 2018 20:50:41 +0200 Message-Id: <20181215185041.12703-1-jeebjp@gmail.com> X-Mailer: git-send-email 2.20.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/mpegts: unset DTS/PTS for subtitle PES packets if PCR not available X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Fixes issues when a subtitle packet is received before PCR for the program has been received, leading to wildly jumping timestamps on the lavf client side as well as in the re-ordering logic. This usually happens in case of multiplexes where the PCR of a program is not taken into account with subtitle tracks' DTS/PTS. --- libavformat/mpegts.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index edf6b5701d..8f6ee81cda 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -1219,6 +1219,7 @@ skip: || pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE) ) { AVProgram *p = NULL; + int pcr_found = 0; while ((p = av_find_program_from_stream(pes->stream, p, pes->st->index))) { if (p->pcr_pid != -1 && p->discard != AVDISCARD_ALL) { MpegTSFilter *f = pes->ts->pids[p->pcr_pid]; @@ -1242,6 +1243,7 @@ skip: // and the pcr error to this packet should be no more than 100 ms. // TODO: we should interpolate the PCR, not just use the last one int64_t pcr = f->last_pcr / 300; + pcr_found = 1; pes->st->pts_wrap_reference = st->pts_wrap_reference; pes->st->pts_wrap_behavior = st->pts_wrap_behavior; if (pes->dts == AV_NOPTS_VALUE || pes->dts < pcr) { @@ -1258,6 +1260,15 @@ skip: } } } + + if (!pcr_found) { + av_log(pes->stream, AV_LOG_VERBOSE, + "Forcing DTS/PTS to be unset for a " + "non-trustworthy PES packet for PID %d as " + "PCR hasn't been received yet.\n", + pes->pid); + pes->dts = pes->pts = AV_NOPTS_VALUE; + } } } break;