From patchwork Tue Feb 28 12:01:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 40542 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:d046:b0:cd:afd7:272c with SMTP id hv6csp1542017pzb; Tue, 28 Feb 2023 04:02:47 -0800 (PST) X-Google-Smtp-Source: AK7set9M/q6dG82HGepuaf2j9OjTEHjg8nJR094drvk6zOniTnGbl6plC/moHsqKE1Zo3A0GkskG X-Received: by 2002:a05:6402:4d:b0:4ac:bcf9:6d6c with SMTP id f13-20020a056402004d00b004acbcf96d6cmr2617469edu.36.1677585767395; Tue, 28 Feb 2023 04:02:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677585767; cv=none; d=google.com; s=arc-20160816; b=Z4R1u7kHjmCho/bzzAdmTBGCukXpCSEBFad8qVYlSdAGKCiUkCG2O2q8SQcVmYtMMB Dh74HP4EIarhYflLlSkO6zWJEEwmbF+YGo+qGyT/UH2WhZS2zg/K3/7ruvTdxrZAywA2 u8bxedNEsO+cS5faBpd8oVfJG6e6jgXZxX7BTeJIFQShfUGuwYrAeKOGi9NqCVupyiZD EpBUtrtZUHi9apSrj38Nq7TzdEUpm1Ah9GcuQetQJVuULdYrZayteBPfbJ7VBGjSEJaa oIRDf7pDXp8B7mRAV5/WSHMihnMRG8mifG31I/yj8zx0s0q3XhDOHO82ZxUMsMPQ1xBv 5pBA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=Sr0IvghA+f80s4g8mEylxUcscB7ZvrxLSzuZwfZzL6A=; b=KHRlPlW0BKKScmz7fpHVWis9v07AGdlz/O187TTDB9dZ9h9EsKCN5zr+H4kiLFZCOP vwj7i2l18ssMtjGGMk2ZuPxrMHOFS3rO4ZnHdsXdc5xs4D3cbErP+jM/oEX7b0mfv+Ev PNA/eFxjgKGn0/eJjOxg0BJ3dfx5Slya4XVcWos+8G7tbMMeAP/7HRvhcLwp7T2Ny2zd sZwJENvIBQenNUkxgTQmGLiiXJCjwkUK40VoQ7O6iSgw3dWc2OzXuGTkimZKSum1igJv KGqiqOK9Zx3mppQ8Z8n7NiSd0wnfbluGbmmi22yDNeO5VpjzX4kB8XHOOxgsULjv9hXD VB6A== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id c13-20020aa7df0d000000b004acbbda703asi11342832edy.41.2023.02.28.04.02.46; Tue, 28 Feb 2023 04:02:47 -0800 (PST) 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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EC2A168ACB0; Tue, 28 Feb 2023 14:01:37 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F3F9068ABE5 for ; Tue, 28 Feb 2023 14:01:27 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id EEE6A2405EC for ; Tue, 28 Feb 2023 13:01:24 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id xUh8pU0Z-Xln for ; Tue, 28 Feb 2023 13:01:24 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 1092A2405F9 for ; Tue, 28 Feb 2023 13:01:21 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 6A7CB3A0567 for ; Tue, 28 Feb 2023 13:01:14 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Feb 2023 13:01:03 +0100 Message-Id: <20230228120104.2347-7-anton@khirnov.net> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230228120104.2347-1-anton@khirnov.net> References: <20230228120104.2347-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 7/8] lavc/libvpxenc: handle queue desync more gracefully X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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" X-TUID: xbAqkRqW40fw If the packets returned by libvpx and our internal frame properties queue get desynchronized for some reason (should not happen, but it is not clear libvpx API guarantees this), we will keep adding to the queue indefinitely and never remove anything. Change the code to drain the queue even if timestamps do not match. --- libavcodec/libvpxenc.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c index 33f35bbaf4..aeeaa0e681 100644 --- a/libavcodec/libvpxenc.c +++ b/libavcodec/libvpxenc.c @@ -401,11 +401,16 @@ static int frame_data_apply(AVCodecContext *avctx, AVFifo *fifo, AVPacket *pkt) { FrameData fd; uint8_t *data; + int ret = 0; + if (av_fifo_peek(fifo, &fd, 1, 0) < 0) return 0; - if (fd.pts != pkt->pts) - return 0; - av_fifo_drain2(fifo, 1); + if (fd.pts != pkt->pts) { + av_log(avctx, AV_LOG_WARNING, + "Mismatching timestamps: libvpx %"PRId64" queued %"PRId64"; " + "this is a bug, please report it\n", pkt->pts, fd.pts); + goto skip; + } #if FF_API_REORDERED_OPAQUE FF_DISABLE_DEPRECATION_WARNINGS @@ -419,20 +424,22 @@ FF_ENABLE_DEPRECATION_WARNINGS pkt->opaque_ref = fd.frame_opaque_ref; fd.frame_opaque_ref = NULL; } - av_buffer_unref(&fd.frame_opaque_ref); if (fd.hdr10_plus) { data = av_packet_new_side_data(pkt, AV_PKT_DATA_DYNAMIC_HDR10_PLUS, fd.hdr10_plus->size); if (!data) { - av_buffer_unref(&fd.hdr10_plus); - return AVERROR(ENOMEM); + ret = AVERROR(ENOMEM); + goto skip; } memcpy(data, fd.hdr10_plus->data, fd.hdr10_plus->size); - av_buffer_unref(&fd.hdr10_plus); } - return 0; +skip: + av_fifo_drain2(fifo, 1); + frame_data_uninit(&fd); + + return ret; } static av_cold int codecctl_int(AVCodecContext *avctx,