From patchwork Wed Apr 29 21:29:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andriy Gelman X-Patchwork-Id: 19381 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 D88E344AB96 for ; Thu, 30 Apr 2020 00:30:04 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A44A668C1EA; Thu, 30 Apr 2020 00:30:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f194.google.com (mail-qk1-f194.google.com [209.85.222.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 182EA68BE69 for ; Thu, 30 Apr 2020 00:29:58 +0300 (EEST) Received: by mail-qk1-f194.google.com with SMTP id 23so3692901qkf.0 for ; Wed, 29 Apr 2020 14:29:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=bNFEsEeEOlKozwUEy+TCYaRsZ/ATw1rjZe00VjSwSdU=; b=D+M2FgLN6mo2B671jHvPmA8HhhFXK/5qSOpqGFrtZRjP8FxgkJ58xjMCpi5mR2rMhN MfmpZ4y3GnzgngH+fIVKXii4IRknwbaZD+UwkjjilG+QkuDwug23pr3Czfn6Cy8Kxuld KRLZP+iy5sznm8Ayc9w2Aa3ByQxmhjAflMIDXpIg4cfn1/WfxSlMOOyWLQF4t/iQDrxD BggiYnns4vQ7zWUcDBF6r3CxbsTb9K7k5Bh2zl8QxyOQLrWv+ktjhFjSLWiJ07x1CEmF D8jLW5eQhhe9sACbA2CylU7utMUa7oQNm0ebdmkGem+y5vbYjTQ+hjl8XXd6Xkmd333F 5Nkg== 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:mime-version :content-transfer-encoding; bh=bNFEsEeEOlKozwUEy+TCYaRsZ/ATw1rjZe00VjSwSdU=; b=Sl3mL9R0FULELajrUAomqH5imvQQL5CXrVasdqHCUgHOS4Q2wXArVTZEjxUYkyEVdv /hvkXnL7a/Y1Y10XcmD/qPAc2L8h4hG1wUfHF0z8gpsEb+LYr4aYjHZsOwclNOvxc0ir p9tajk7e/ccxeLS5ppP/rIcLb9cbnxqHCom2vw+W2Apgg4YO273XCNU6B4taSCQ9NvKs i/fIJJ1PSuaUtYn7NWVUJkp8pvuUO/JyFIRGr0LupqRQK9ikjZLYQYLDXZXQ058Sj878 MMOd+DpD514myk2vbWzkJ3uLIot0n0RRFuXIMAWZC6XOHe4p+5oyjhhLiZBfV9hts+aV EVyQ== X-Gm-Message-State: AGi0PuYloX2pVYMLig8n4Ri313qkABpF40veDnb7aGAXwTx0WsDsLYzf zr/ojwm/itWULaLGpCwxUpqhjMay X-Google-Smtp-Source: APiQypJXokEtNbPqdRZP34OHe7eHdejO+ZTPinyNgSXIEBwcw+0xieTmVDaTZDjIUJldz7iOFyG54g== X-Received: by 2002:a37:b3c1:: with SMTP id c184mr531884qkf.194.1588195795591; Wed, 29 Apr 2020 14:29:55 -0700 (PDT) Received: from localhost.localdomain (c-71-232-27-28.hsd1.ma.comcast.net. [71.232.27.28]) by smtp.gmail.com with ESMTPSA id d74sm279109qkc.106.2020.04.29.14.29.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2020 14:29:55 -0700 (PDT) From: Andriy Gelman X-Google-Original-From: Andriy Gelman To: ffmpeg-devel@ffmpeg.org Date: Wed, 29 Apr 2020 17:29:41 -0400 Message-Id: <20200429212942.28797-1-andriy.gelman@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avcodec/v4l2_context: Drop empty packet while draining 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: Andriy Gelman Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Andriy Gelman v4l2_m2m devices may send an empty packet/frame while draining to indicate that all capture buffers have been flushed. Currently, the empty packet/frame is not handled correctly: When encoding, the empty packet is forwarded to the muxer, usually creating warnings. When decoding, a reference to the memory is created anyway.. Since in the past this memory contained a decoded frame, it results in an extra frame being decoded. This commit discards the empty packet/frame. References: linux/Documentation/media/uapi/v4l/dev-decoder.rst: "The last buffer may be empty (with :c:type:`v4l2_buffer` bytesused = 0) and in that case it must be ignored by the client, as it does not contain a decoded frame." linux/Documentation/media/uapi/media/v4l/vidioc-encoder-cmd.rst: "...This buffer may be empty, indicated by the driver setting the ``bytesused`` field to 0." Signed-off-by: Andriy Gelman --- libavcodec/v4l2_context.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c index 6c2db5c849..f0ecc18ebd 100644 --- a/libavcodec/v4l2_context.c +++ b/libavcodec/v4l2_context.c @@ -393,6 +393,15 @@ dequeue: return NULL; } + if (ctx_to_m2mctx(ctx)->draining && !V4L2_TYPE_IS_OUTPUT(ctx->type)) { + int bytesused = V4L2_TYPE_IS_MULTIPLANAR(buf.type) ? + buf.m.planes[0].bytesused : buf.bytesused; + if (bytesused == 0) { + ctx->done = 1; + return NULL; + } + } + avbuf = &ctx->buffers[buf.index]; avbuf->status = V4L2BUF_AVAILABLE; avbuf->buf = buf;