From patchwork Tue Jun 20 14:16:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 42243 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:be15:b0:121:b37c:e101 with SMTP id ge21csp1427625pzb; Tue, 20 Jun 2023 07:17:48 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5symRHgdtr94kYCqTfOx0Ql7oATjxQoDJiAoHNTGXpTaLbs0CBRT35XFRifBLiDn7Xhrhi X-Received: by 2002:a05:6402:782:b0:51a:2d2c:75ee with SMTP id d2-20020a056402078200b0051a2d2c75eemr7723829edy.25.1687270667638; Tue, 20 Jun 2023 07:17:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687270667; cv=none; d=google.com; s=arc-20160816; b=AovOrpJsNbg6+llDq0bNqYTQkk5oMek2/vR1H73lSq3m+iQ9IOnjXtpIBtmbMu7WaY PwWYvijNzlPk2XV4CcWtBK5iPlvYk3pKrAH+U2/lQICbeJaL/8Ikv5dHSHmNHJChZjqR 5yshKyupvXiuix+hjaDS6FlpUz/zkeZB442lOMVwJyyd7JtMzhorLvofIFj76+hvNa/O +2h8orZcJx2jX1DhpMj2Em4MJExuy+e0kWXpVt3RUY09CTuo9AMZo+BNlTkPgyJ/UXla 8xMeJcSkvmCuH0IIOdii9I5tPVpcF+PDniTr5oy9TK9pkD+maW1wHbgS5REf7gqm9fOg zLcA== 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=9iKbqV5UwIF8u5teCVnFc/ZxaxNLJWBGucc9oRDT+XI=; b=ruOQlzt1HfKrYKdIvrN9JAdxjH0g+ZHgcgM5nCl0sSO1139ZEogtnYBYBTNk53Yg2p TlaaO4xO7ERhMyEvpcSI4sSGZPESh9LnfFyQK1j7HTpZPt8rWijtJny7KUuT9ch5K4ql n0cU+lWGvHNAeGM0ChWj8JBVgT21IVhLVRTr4tUkmugT517IwqU1KHtE6XUzxHHTbUIA iamXskMjd+INH9ms/yg1PiTRMNUInMgvgOqTJDnzIWfXVWnbjPTVmviTw1LneOYEvSJ+ 3QaJXXAnw8nd3lEMVwkSA7Kmr+aYybVeaZG64Y0XhXJs/7n2Zn+YPZqjBuNigIqjf7/i mxug== 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 r8-20020aa7da08000000b00514a6ae120csi1232065eds.9.2023.06.20.07.17.47; Tue, 20 Jun 2023 07:17:47 -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; 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 7BC0268C1AE; Tue, 20 Jun 2023 17:16:56 +0300 (EEST) 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 C4BC168C17D for ; Tue, 20 Jun 2023 17:16:48 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 60F1F2404F8 for ; Tue, 20 Jun 2023 16:16:44 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id RWuTPDqXGMBn for ; Tue, 20 Jun 2023 16:16:43 +0200 (CEST) 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 BC7D2240591 for ; Tue, 20 Jun 2023 16:16:42 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 010103A168E for ; Tue, 20 Jun 2023 16:16:37 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Tue, 20 Jun 2023 16:16:06 +0200 Message-Id: <20230620141608.31759-7-anton@khirnov.net> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230620141608.31759-1-anton@khirnov.net> References: <20230620141608.31759-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 7/9] lavc/decode: track whether the caller started draining with a separate flag 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: nl7UAgdNPg0D Decoding pipeline has multiple stages, some of which may have their own delay (e.g. bitstream filters). The code currently uses AVCodecInternal.draining to track all of them, but they do not have to all be in sync. --- libavcodec/decode.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/libavcodec/decode.c b/libavcodec/decode.c index c070148b58..c61ce74fb8 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -53,6 +53,11 @@ struct DecodeContext { /* to prevent infinite loop on errors when draining */ int nb_draining_errors; + + /** + * The caller has submitted a NULL packet on input. + */ + int draining_started; }; static int apply_param_change(AVCodecContext *avctx, const AVPacket *avpkt) @@ -624,7 +629,7 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec)) return AVERROR(EINVAL); - if (avctx->internal->draining) + if (avci->d->draining_started) return AVERROR_EOF; if (avpkt && !avpkt->size && avpkt->data) @@ -635,7 +640,8 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke ret = av_packet_ref(avci->buffer_pkt, avpkt); if (ret < 0) return ret; - } + } else + avci->d->draining_started = 1; ret = av_bsf_send_packet(avci->bsf, avci->buffer_pkt); if (ret < 0) { @@ -1758,6 +1764,7 @@ void ff_decode_flush_buffers(AVCodecContext *avctx) av_bsf_flush(avci->bsf); avci->d->nb_draining_errors = 0; + avci->d->draining_started = 0; } AVCodecInternal *ff_decode_internal_alloc(void)