From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 729C343FA7 for ; Mon, 24 Oct 2022 03:17:36 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C5BF968BD06; Mon, 24 Oct 2022 06:17:24 +0300 (EEST) 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: 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; } -- 2.25.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".