From patchwork Tue Aug 29 02:45:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Justin Ruggles X-Patchwork-Id: 4872 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.15.201 with SMTP id 70csp2749806jao; Mon, 28 Aug 2017 19:51:22 -0700 (PDT) X-Received: by 10.223.155.141 with SMTP id d13mr1406893wrc.14.1503975082052; Mon, 28 Aug 2017 19:51:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1503975082; cv=none; d=google.com; s=arc-20160816; b=KfTSEuuLo3TSm0pTN5J/d4qxVfiOC7AcyVPN1at9eg/wVDZgbrEA/JLMRd8lkU4OtZ xKwsUpo+zZhXTHD7FlGFJNS7/cpL9x0JF8xm6VLzZ5lggwIkX0rs40VhhE55jmKDTIwM gnXeTzNz+YFqF+TMQyiGJ1hflIuHprzGXxikUTd4ebW+VCSdoLjJJjhdD8qnk+75r+xx ecHOCwF5Kzt1Mzsbc2wfvLWHXnr8ZOUeMxjjq3sP7tHFsVxFkbU25q+yPWUYrwEZs7Mu OSKyKaMTRt3bTmKJcCf4qUmwixT8B/3a/FIiKm5ZBH4EEOa3SLz8v7dDJWE/574j+8/1 qeaA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=8usK1nwVF6Qhruuw+MzY/JPAsFa0njPf7NGJ+Gj2KBE=; b=u0p9E5S1W5fmqg1+DZnb0zoYMaSfVoCFwmGvAgUfwpcGuE85EZdkl0zUKHNG/7TfD4 95DaWcaUMXQqiIBToqOwccz5QKKr57En2hnk3FB5DAMCDI567QS1IJizeRg1mxoEGhxh g7LMNDQbJCMGxZ9hrfHe8e3EEiugLy4PGf83nLxPC11sY2kseKCetsenkhbgU1z3xoHH MFD2B2g9BO2458JaSiZo/1AylUbsUAvQaXmhqXYJ9pib7963Q7rHFkp79O1dlRxEFe+U zf9jiR+LUmYiAUVSq+xfeicwAYVv09QpsCzZCkwzUxggB1X2+Zj1125X08R36bnC5scD KDIA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Rgtkh/Fx; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id l6si713503wrb.49.2017.08.28.19.51.21; Mon, 28 Aug 2017 19:51:22 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Rgtkh/Fx; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B6C8C68A079; Tue, 29 Aug 2017 05:51:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk0-f194.google.com (mail-qk0-f194.google.com [209.85.220.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BE295689E64 for ; Tue, 29 Aug 2017 05:51:10 +0300 (EEST) Received: by mail-qk0-f194.google.com with SMTP id p67so1821941qkd.2 for ; Mon, 28 Aug 2017 19:51:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=3GTOqtjrqSFXgRbfVZr3WlZM8jS4Lw0O+Gm7OZyTHy0=; b=Rgtkh/Fx0aKgz6LvPqDQZm1pBJ2+VNsza/iSzPDpSW8HinCMWZP2jysuUOzhWL+Wpe mNnkNCkbk0hWb+U4WKfx5F4lgZuAMFzKKGUAN6WL+KhTiV2gbaBxC/27WXX2nkuM9Kp9 znH8Kj2RkgNebLrCFXK5R601/WQ5ePE4kPLQc2IxC+gd3a8JiQIRwATE5EaO4WITkoTX /hclXAAQxvrrw/3rIyB43hWuHuj0oVQo9n1djXhP5V9oMWzVF3b8Ngp2ZItzeyWd4bOF nkc7stw1ZUSrB51UCaM6x7jZrO6ABsC5+yuN3vdxhW87V/yObWT2Uk8MRSEQHHZDKwTq 45fw== 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; bh=3GTOqtjrqSFXgRbfVZr3WlZM8jS4Lw0O+Gm7OZyTHy0=; b=RkAZbZaLnvnMDQfZycTDEszGPUdTRV2moUb8ZB01fvZAuGepY+ckJcMcay0rwrE4b9 mn75oYp+Bk2jtY8vU4H9u0UTowH3BOLv1DQv1U7bHPbdKe77wpuSLsik3etNKEygTH2/ Mz+jV/PsZfu0gRBjM6lCc38YPVramN4FgSM/U6aEOzp9GRL/M7MFcrRzO9P5E3LTngl/ IO50to4X396k8TZn6VxJegsL5JvyVRGDuh17bFqYEyauBRvJ9pec9gJuKnF/YbKKj1sW sS7Jr93hVqypUos7nMO9/cLeXFfQlrVZhKRirn224nFc88lMPpYCvrWVoJdL2qqCXMG6 Z1Bw== X-Gm-Message-State: AHYfb5g57RMmipw0V481hg0tbZyt7fR3yoXujIZe/AZUvEZb1PeLQHqQ sA98HzFxlgBE8fB2I9c= X-Received: by 10.55.76.21 with SMTP id z21mr3805578qka.174.1503974721640; Mon, 28 Aug 2017 19:45:21 -0700 (PDT) Received: from localhost.localdomain (pool-96-250-176-86.nycmny.fios.verizon.net. [96.250.176.86]) by smtp.gmail.com with ESMTPSA id u49sm1288402qta.76.2017.08.28.19.45.20 for (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 28 Aug 2017 19:45:20 -0700 (PDT) From: Justin Ruggles To: ffmpeg-devel@ffmpeg.org Date: Mon, 28 Aug 2017 22:45:20 -0400 Message-Id: <20170829024520.5048-1-justin.ruggles@gmail.com> X-Mailer: git-send-email 2.14.1 Subject: [FFmpeg-devel] [PATCH] avformat/concatdec: add fallback for calculating file duration 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" If a file does not have a known duration, this leads to the timestamps starting over for the next file, causing non-monotonic timestamps. To prevent this, track the duration during demuxing and use it to determine the current file duration before opening the next file. --- libavformat/concatdec.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c index e8b37d6..0e18901 100644 --- a/libavformat/concatdec.c +++ b/libavformat/concatdec.c @@ -44,6 +44,7 @@ typedef struct { int64_t file_start_time; int64_t file_inpoint; int64_t duration; + int64_t next_dts; ConcatStream *streams; int64_t inpoint; int64_t outpoint; @@ -149,6 +150,7 @@ static int add_file(AVFormatContext *avf, char *filename, ConcatFile **rfile, file->url = url; file->start_time = AV_NOPTS_VALUE; file->duration = AV_NOPTS_VALUE; + file->next_dts = AV_NOPTS_VALUE; file->inpoint = AV_NOPTS_VALUE; file->outpoint = AV_NOPTS_VALUE; @@ -509,8 +511,14 @@ static int open_next_file(AVFormatContext *avf) ConcatContext *cat = avf->priv_data; unsigned fileno = cat->cur_file - cat->files; - if (cat->cur_file->duration == AV_NOPTS_VALUE) - cat->cur_file->duration = cat->avf->duration - (cat->cur_file->file_inpoint - cat->cur_file->file_start_time); + if (cat->cur_file->duration == AV_NOPTS_VALUE) { + if (cat->avf->duration > 0 || cat->cur_file->next_dts == AV_NOPTS_VALUE) { + cat->cur_file->duration = cat->avf->duration; + } else { + cat->cur_file->duration = cat->cur_file->next_dts; + } + cat->cur_file->duration -= (cat->cur_file->file_inpoint - cat->cur_file->file_start_time); + } if (++fileno >= cat->nb_files) { cat->eof = 1; @@ -627,6 +635,14 @@ static int concat_read_packet(AVFormatContext *avf, AVPacket *pkt) memcpy(metadata, packed_metadata, metadata_len); av_freep(&packed_metadata); } + + if (cat->cur_file->duration == AV_NOPTS_VALUE && st->cur_dts != AV_NOPTS_VALUE) { + int64_t next_dts = av_rescale_q(st->cur_dts, st->time_base, AV_TIME_BASE_Q); + if (cat->cur_file->next_dts == AV_NOPTS_VALUE || next_dts > cat->cur_file->next_dts) { + cat->cur_file->next_dts = next_dts; + } + } + return ret; }