From patchwork Wed Feb 6 23:57:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Jan_Ekstr=C3=B6m?= X-Patchwork-Id: 11981 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 1A653448B18 for ; Thu, 7 Feb 2019 01:57:50 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E92A968AAAC; Thu, 7 Feb 2019 01:57:49 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f195.google.com (mail-lj1-f195.google.com [209.85.208.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 872F2680C91 for ; Thu, 7 Feb 2019 01:57:43 +0200 (EET) Received: by mail-lj1-f195.google.com with SMTP id l15-v6so7715747lja.9 for ; Wed, 06 Feb 2019 15:57: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=2TmEj8jbUr1hrF67C0EwfSVXVp7JOC9DE0QQYma6Ems=; b=n1Q+/0TVqhcnTcjwWtnWgNuEUx0o2NhwIcfeSMzlgD+/+htAnkrDW2UDWCa8WTun/C aNJYv1cwX3S3kGYCRQpmAeREjibq4IYOyjxZRehPJyiJNBhvoL0xNdndX9cfKjb1lhWO q9HvwRX68jL7OQFq00VQLHFU3cwFyQUtkBcWV+SPdChbvTDqPJDF6Dkqo9/gW+44MQ5A andh3di3bpG41h6u2u3QsZ7S+sNuIr71FN9ebQnyE2FAKKxKHwuyQzvcJzk74uZ1djT6 52f1haqTSygjhUVktyDKK8dywmbSYFR4lX2/fzpsmqI6IMjS/o++upunD4ui+ibZfJgX nyPg== 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=2TmEj8jbUr1hrF67C0EwfSVXVp7JOC9DE0QQYma6Ems=; b=YC+ogbXsHQ2UESaQFr4U9w5dwPxk7CLKGZGlNlLxoUDG0fEXUsGPwCzYXD85qt0gGx vOunSwN6ltDwKFApUNUntK7mVq9bRQiXJIREANzU+2HLYXhiWsM8KXACee1baIyjilWz oZEJpd+4IMAtFEiIWGyvx3s2roK1nkYPP7ZqNtcawTobyIqmMJRMbqOxx4ZeVkZaOhk3 /2srCz5/E7ORArJbhlfYEDwubcU1+41zdj4lm1T643uSs2rXYkf9g9VP/eCSGgIrL+gI vgf2lOfo+M5NHAaqcxaiCUyCRRiL1tAkQ4MsqahnKIX2SoaVMr0z+6DLArKxUdZp94k7 fQtw== X-Gm-Message-State: AHQUAuZ2aVOjWF60540q7MwEfYX8jVfm9tSYl71ldQXoL+vVzUM47A6i NFWJp2jpKCpsaKTz1nP8+/+4ab7G X-Google-Smtp-Source: AHgI3IbT49DqygGidvd3veSE42HnNpIL/4TWd4Lcl4C78W/1CMEJY8JGchIJqIo5z9WnAXB9Qd7nbw== X-Received: by 2002:a2e:8446:: with SMTP id u6-v6mr8062371ljh.74.1549497462437; Wed, 06 Feb 2019 15:57: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 q10-v6sm3974395ljj.3.2019.02.06.15.57.41 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 06 Feb 2019 15:57:41 -0800 (PST) From: =?UTF-8?q?Jan=20Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Thu, 7 Feb 2019 01:57:40 +0200 Message-Id: <20190206235740.6357-1-jeebjp@gmail.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavf/utils: update default wrap-around reference while iterating streams 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" From: Masaki Tanaka Seems to fix mistaken cases of discontinuity handling in MPEG-TS when program structure changes. Additional changes to patch from its original state by Jan Ekström. --- Had been meaning to post this for comments/discussion for a while, as this seems to make timestamps continuously rising in at least one of my samples where the program structure changes mid-stream. The original version of this patch can be found at: https://github.com/jeeb/ffmpeg/commit/6117366eaadbaf48bbd88eb2a353dfc852ff3400 The sample for which this helped is available at: https://kuroko.fushizen.eu/samples/pid_switch_sample.ts The difference of timestamps received from libavformat can be seen with: https://kuroko.fushizen.eu/screenshots/ffmpeg/blue_vanilla-orange_patched.png Jan libavformat/utils.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/libavformat/utils.c b/libavformat/utils.c index 7afef545fe..0efb1aae9c 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -815,8 +815,41 @@ static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_in while (program) { if (program->pts_wrap_reference != pts_wrap_reference) { for (i = 0; inb_stream_indexes; i++) { - s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference; - s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior; + int64_t *stream_pts_wrap_reference = &(s->streams[program->stream_index[i]]->pts_wrap_reference); + int *stream_pts_wrap_behavior = &(s->streams[program->stream_index[i]]->pts_wrap_behavior); + + if (*stream_pts_wrap_reference != AV_NOPTS_VALUE && + (*stream_pts_wrap_reference - pts_wrap_reference > 1ULL << (st->pts_wrap_bits - 3) || + *stream_pts_wrap_reference < pts_wrap_reference)) { + /* + * If we find a defined wrap reference that is + * considerably larger, or that is smaller than the + * current default wrap reference, we update + * the default to current stream's wrap reference. + */ + av_log(s, AV_LOG_DEBUG, + "Updating default PTS wrap reference " + "%"PRId64" and PTS wrap behavior %d to " + "stream PTS wrap reference %"PRId64" and " + "PTS wrap behavior %d (program: %d, stream:%d, " + "stream_id: %d)\n", pts_wrap_reference, + pts_wrap_behavior, + *stream_pts_wrap_reference, + *stream_pts_wrap_behavior, + program->id, program->stream_index[i], + s->streams[program->stream_index[i]]->id); + + pts_wrap_reference = *stream_pts_wrap_reference; + pts_wrap_behavior = *stream_pts_wrap_behavior; + } else { + /* + * Otherwise, we just utilize and override the + * stream's wrap-around reference with the default + * wrap-around reference. + */ + *stream_pts_wrap_reference = pts_wrap_reference; + *stream_pts_wrap_behavior = pts_wrap_behavior; + } } program->pts_wrap_reference = pts_wrap_reference;