From patchwork Mon Oct 24 03:16:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 38937 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4a86:b0:9d:28a3:170e with SMTP id fn6csp1997630pzb; Sun, 23 Oct 2022 20:17:38 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5gxvi535TPo4L7UOohx3fOwwtc9efGMEHuO1CMdvuq0c3QABJAjxNn0nBhQFYTaxLoKDe2 X-Received: by 2002:a17:906:5d11:b0:78d:a41c:6a2d with SMTP id g17-20020a1709065d1100b0078da41c6a2dmr25366693ejt.215.1666581458658; Sun, 23 Oct 2022 20:17:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666581458; cv=none; d=google.com; s=arc-20160816; b=Rrs6A3smPB8u78th9fYArYU5DxQvX8XmIo1voP4R5DhWKmqLN45pjyhZxkd7OP7/1u sppRjlTpEMLjHY2oPLTPjxfxOdTSnFADxGLbg198qAHmLsFfJ0N8RNNNH+UlgH/lyQIw fVwQjsAQ7YuYahhnuxLXoLvNWB4xH6wfSI9iYbT3djRyErmqaa6nvAW5SS80xwwDmrl+ Y07viYK1xwuemCIskRLT6N/K5lL6eStO1cTKddFg+xm16owmufT1o0DROy/KqUAsJBeG Tn413EBdK/vHLcSmjUDBVfoNQ2tE8CjOu06Fzvm406Ol23T48O73t+gFyloKU4c8IFAa +pnQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to:date :to:from:message-id:dkim-signature:delivered-to; bh=D9pA4qF84TdVIbHxJaM9jTyL4eBlqxwpDkVuwY2Vibg=; b=mkOT1PIHH9uyFdIBPns9jrzy1A6lQBXAPS60pSAXbfFShGGZuD+h3onXWnVtNIfgN3 OmZ5HnC047d884csvFNa8bbiUXuNHSCPFx2KkzmN5sJa6K7TasRcKONYdt9c/wA2KF00 FRgG0Oy4eV2k3zHS2PLotf6v5KQ5cJIn3hmbulbzqrF+UL0lIbxdQ1ZjRsmSnONTtPZJ jxizJ9INghBlzsr2qPRL0pUueg9hzoCEXQYKPtzo8tzNio10uNeKNnKdIStA76OeLjN/ 0eYnlK39Q2DrGhzjiYj5tF/2mSU5JYmzGtdJ8NE3PJA1vsGaQ4VN+Ha/3/86Sr5SqYqt Tbvw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=rxH+7EVy; 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=foxmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id cw10-20020a170906478a00b007314b427e96si32305641ejc.633.2022.10.23.20.17.38; Sun, 23 Oct 2022 20:17:38 -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=@foxmail.com header.s=s201512 header.b=rxH+7EVy; 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=foxmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0617868BD0F; Mon, 24 Oct 2022 06:17:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out162-62-57-210.mail.qq.com (out162-62-57-210.mail.qq.com [162.62.57.210]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 47E0868BB69 for ; Mon, 24 Oct 2022 06:17:18 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1666581435; bh=U+ZFDDSMx9NZbmIQBcSMvX6hrw2B6jNvxsIWP4P86hs=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=rxH+7EVy27a1S6KWw1IOlDKxuyaffGJ9T3IqG+nAkJXpH2KSUyCdSVQgKwWwCTeQ1 WGBlyZ+vcfMfsrCSOU/CrxzS86pMAPkwpA+mqY8jsO3CmAVqmNaaMWHLSZ4jtSlN4n 6qUoChI7CofltmPa30RQcgXtN4tZ2kHLu2si3h58= Received: from localhost.localdomain ([59.37.125.102]) by newxmesmtplogicsvrsza31.qq.com (NewEsmtp) with SMTP id 44A14270; Mon, 24 Oct 2022 11:17:10 +0800 X-QQ-mid: xmsmtpt1666581434ta25adzwi Message-ID: X-QQ-XMAILINFO: Mrv6PNPZjcp66JUX8FFyYklFuzJnOCED/BzKyPTWaVIKJbwC4hlJKoyo1siZ2v SfwokayrgMCkNK12JOmJHnCb1avz4F7AhCSS9g32zE2Y8oqUtA/HgzByQO98uXf70DfYMN4r+V5P luJzolbu1DAVdaVEr4Stre1T0uRoYvUcQAFjjyStb4A3NhBPzWJ/WUDCOMv1/+k1wsyZvFROoYIZ 7j4Bd1AZrcqzywFJ38AQq6UePT0JENsf27vq+d3eU0ASIIefzYhfCX8e5SVzhCIgt/1zOAejpHvb HfiErFMCj/ZwpSxdp/pESvWBvZKO7PsLySa8Q9zWHg9o/y7TFypZnZHvgE2e3xHchL03tSG3W0YU rhGc+Ud+0fOHLDDaIGtGZuzO6z+8M+TXdh23/dSjAV43d0c9Behib9f3jkXCi6ioFkotOOfv+aXt Uclmh1vDrughH2voXa6kEtMxliy0sSJrgfWWCw4lyWcVUj8padzJTCIQBfNSlXSfQ2DdrDFymPBv BdLIrncbOuKj7YGrd5whz78VdGJUhno3iZlGNL6SS7rxiYJc3D8Jq120r4+zTI5U49SQDfnN4HEx uFpzjqUu59/2Nh9fxg6nPDnViAzbesRqzp9sU9ZBQaHkBzxbY+hl5eAq7Rlh80iNAqy3C721CdG/ c1ng52kRfycnJqmYZoKZJSNGDXQ6Z8tGdMYAZpSH0nsPGg/7EML1F8BbVuv+TeqRJFBj0R9sSXZk BOJfFhqm0yLHdhbmTKApvIDyCtTt8uaeCdbNAniyTg3vWh5YLucVQewllk1U8+/v8O1FyIGnKpFv uYiQe20bwZLdEiYTJJF8FV9TDKr8eLXxq0AKWcnS4V2sJcoe/PK+eyBmiyTJBBVkXw4xIDEmu4M9 ZKyMZF+crjj1jPj+Mg+cMUJ2mosjq/RU/7FsMluY9Kjua6XmS5OeqPaFsj5lm/+cMcEmwON+SDo/ tjb+m6PHSNuejL+vOZHtpYDJxFfng4L4Y8v6HQ9ezadshSypcSlTyxywRna5JN From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Mon, 24 Oct 2022 11:16:48 +0800 X-OQ-MSGID: <20221024031658.1026118-3-quinkblack@foxmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221024031658.1026118-1-quinkblack@foxmail.com> References: <20221024031658.1026118-1-quinkblack@foxmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 02/12] avcodec/mediacodecdec: don't break out if both input and output port return try again 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 Cc: matthieu.bouron@stupeflix.com, Zhao Zhili , aman@tmm1.net Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: wVZG8ADqAlWc From: Zhao Zhili At the beginning of decoding, if we feed mediacodec too fast, the input port will return try again. It takes some time for mediacodec to consume bitstream and output frame. So the output port also return try again. It possible that mediacodec_receive_frame doesn't consume any AVPacket and no AVFrame is output. Then both avcodec_send_packet() and avcodec_receive_frame() return EAGAIN, which shouldn't happen. This bug can be produced with decoding benchmark on Pixel 3. Signed-off-by: Zhao Zhili --- libavcodec/mediacodecdec.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c index 322b448d27..2c66f38541 100644 --- a/libavcodec/mediacodecdec.c +++ b/libavcodec/mediacodecdec.c @@ -444,7 +444,16 @@ static int mediacodec_receive_frame(AVCodecContext *avctx, AVFrame *frame) index = ff_AMediaCodec_dequeueInputBuffer(s->ctx->codec, 0); if (index < 0) { /* no space, block for an output frame to appear */ - return ff_mediacodec_dec_receive(avctx, s->ctx, frame, true); + ret = ff_mediacodec_dec_receive(avctx, s->ctx, frame, true); + /* Try again if both input port and output port return EAGAIN. + * If no data is consumed and no frame in output, it can make + * both avcodec_send_packet() and avcodec_receive_frame() + * return EAGAIN, which violate the design. + */ + if (ff_AMediaCodec_infoTryAgainLater(s->ctx->codec, index) && + ret == AVERROR(EAGAIN)) + continue; + return ret; } s->ctx->current_input_buffer = index; }