From patchwork Tue Mar 2 18:53:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Ronald S. Bultje" X-Patchwork-Id: 26067 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 418C144B0BB for ; Tue, 2 Mar 2021 20:53:30 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1F19668AB2C; Tue, 2 Mar 2021 20:53:30 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f171.google.com (mail-qt1-f171.google.com [209.85.160.171]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1D7A8680831 for ; Tue, 2 Mar 2021 20:53:24 +0200 (EET) Received: by mail-qt1-f171.google.com with SMTP id r24so15548955qtt.8 for ; Tue, 02 Mar 2021 10:53:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=JNoFx+tq0E0IivPasxAr2yAKiepfYSM8qnFEIZZNP6M=; b=n6VwrggtbA7ZvuW6FWN+0XR3Y9DyV62I9teytSKhz3R4vF+fypY79EPhPJUV3rW0rU bQGEbUlDUJs2qe4Uv8K7QweAug1bqkNVAM+7RDbBBEy73N/scpR/gL7cDQJbGftc75NP erFphDQeeSNFf5PNlO2UxS16GKHkd3kvuaJOOEClWK1hFNvMktG33aKhtEAoqhST+UWG /n4Daqv+MSZf5VbmjkdZre4PFP8zssoimIooB7iZ5NU4Sr2Ta6UpdojYpwaeNuIiX6HL 0cQbacZJPq35W86+/Nz21o8lSpFCER8jwXhTxvW14c1hGy3kmVhbn98Do/VO106m/YS5 Ryug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=JNoFx+tq0E0IivPasxAr2yAKiepfYSM8qnFEIZZNP6M=; b=bEVkFQM7A/lLBOQmdkpDchErGjxaRe42mehxa8t5cVtfYN2O35cWwHJ+n85MY8HQ0V TAbS8bKmN+pwbUMj6Em3CUIUHyjefcyjSSGXK7W+xQDGe+N08aSrFEFUEBnpeOLLYnpy B36IK/TC1LVvcoj5ZI0tbJtsgWtLl7BBd41eVDmBseLx3T59+GI9dli2aHEhf+YQ6WHw VQk6SakI7Z5+8Ramk6YHbKBSqwwz17+94ZgYN5XTqUX6z8AmcIy96twCnhvS764AdXXc l2bxmlOhdpsQbrWbETchtY9NCt6TQ007OwCkKG8IrBiOz5ZGcQYIxMa0m5WCCFJbf6wN 6nJw== X-Gm-Message-State: AOAM5335HUObR4bATrnmvqSRLjSSKn+V/OGwbnMf1SS5SXHvT1no+efT 3mzk3S3z9fOTlmxfmhGkJD8rpFJFdPcSHw== X-Google-Smtp-Source: ABdhPJyloQee5u/5p12Vj0BzRBHzwNcl2fC4+KydpA6c26uPiRMJWjHC0ahN7PqRebg0gQ1VmSszuw== X-Received: by 2002:ac8:3432:: with SMTP id u47mr19674512qtb.325.1614711202507; Tue, 02 Mar 2021 10:53:22 -0800 (PST) Received: from localhost.localdomain (2603-7000-3c3e-ec9c-3036-ce08-27a9-b5f8.res6.spectrum.com. [2603:7000:3c3e:ec9c:3036:ce08:27a9:b5f8]) by smtp.gmail.com with ESMTPSA id y15sm14445031qth.52.2021.03.02.10.53.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Mar 2021 10:53:22 -0800 (PST) From: "Ronald S. Bultje" To: ffmpeg-devel@ffmpeg.org Date: Tue, 2 Mar 2021 13:53:17 -0500 Message-Id: <1614711197-46855-1-git-send-email-rsbultje@gmail.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <41cd04df-d8a8-63f2-8abf-3ed8d22f8044@gmail.com> References: <41cd04df-d8a8-63f2-8abf-3ed8d22f8044@gmail.com> Subject: [FFmpeg-devel] [PATCH] ivfenc: write duration for frame_cnt=1. 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 Cc: "Ronald S. Bultje" MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavformat/ivfenc.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/libavformat/ivfenc.c b/libavformat/ivfenc.c index 0951f56..889c004 100644 --- a/libavformat/ivfenc.c +++ b/libavformat/ivfenc.c @@ -23,7 +23,7 @@ typedef struct IVFEncContext { unsigned frame_cnt; - uint64_t last_pts, sum_delta_pts; + uint64_t last_pts, sum_delta_pts, last_pkt_duration; } IVFEncContext; static int ivf_init(AVFormatContext *s) @@ -86,6 +86,7 @@ static int ivf_write_packet(AVFormatContext *s, AVPacket *pkt) avio_write(pb, pkt->data, pkt->size); if (ctx->frame_cnt) ctx->sum_delta_pts += pkt->pts - ctx->last_pts; + ctx->last_pkt_duration = pkt->duration; ctx->frame_cnt++; ctx->last_pts = pkt->pts; @@ -97,12 +98,15 @@ static int ivf_write_trailer(AVFormatContext *s) AVIOContext *pb = s->pb; IVFEncContext *ctx = s->priv_data; - if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && ctx->frame_cnt > 1) { + if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && + (ctx->frame_cnt > 1 || (ctx->frame_cnt == 1 && ctx->last_pkt_duration))) { int64_t end = avio_tell(pb); avio_seek(pb, 24, SEEK_SET); // overwrite the "length" field (duration) - avio_wl32(pb, ctx->frame_cnt * ctx->sum_delta_pts / (ctx->frame_cnt - 1)); + avio_wl32(pb, ctx->last_pkt_duration ? + ctx->sum_delta_pts + ctx->last_pkt_duration : + ctx->frame_cnt * ctx->sum_delta_pts / (ctx->frame_cnt - 1)); avio_wl32(pb, 0); // zero out unused bytes avio_seek(pb, end, SEEK_SET); }