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 6CDDC44637 for ; Sun, 20 Nov 2022 06:50:53 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B9D2968BB74; Sun, 20 Nov 2022 08:50:43 +0200 (EET) Received: from out162-62-58-211.mail.qq.com (out162-62-58-211.mail.qq.com [162.62.58.211]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4CB5D68B7DE for ; Sun, 20 Nov 2022 08:50:37 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1668927034; bh=U+ZFDDSMx9NZbmIQBcSMvX6hrw2B6jNvxsIWP4P86hs=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Vo0XuFNmLXBIb0VYdsKcwpYec3niJfGFhUvN047jUpdCCx/hhy1Kucy9z6ZpG62mr A7+XRFldTT44OWEao6j0ysGO1YFwyoxg13fTZIApmN7WfNiwGwwQvUd/3Cz6HFY6WD lVMccNxzWbg98TCcMp6m7G8iWMwRXeH5MWeTSZpE= Received: from localhost.localdomain ([14.153.77.200]) by newxmesmtplogicsvrszc2-1.qq.com (NewEsmtp) with SMTP id C8F0626E; Sun, 20 Nov 2022 14:50:15 +0800 X-QQ-mid: xmsmtpt1668927033tkw3b0gfc Message-ID: X-QQ-XMAILINFO: Nq1uWKlIb9DM5TBK3iwpz0I3nqzOUPcdlimJI6yjA9BXyEA67SVrsO+gaVHRMe xgo7JwXxR9MnMuNPV85ant9Zyp1YvqubFySOV4kqmE08HGXO6cqhhjJexR/fNFlGq6gXaXGR/dPN V98XCUhRIvjg3dcN9faG/EcltzEb8qoK71bnAeiptBOkE91gT7ngNThobnZIoc3CHS2tY7eegKRm cjtHIKmrc0KpUB1Aqjq+zUOe8c4bDbA2TM2/1slL5chwMfVZhRCl0/8LMMlgxvLgTK0+ZwwEMSdo JjDepqmnqm4do0kUng9d2M61I/2LA2f9bpY5lFbNKPOfD74U1KyTehR7WGPhMRNdLF8B13kknVpH QYdO3Rfcfr1TncX47Ewm2Zw+uk8qA6+lA8Hh6PXv+N9M/eXKKw5cZcf9MJ4XLQWsIHpRm9WOS28i +wQJc40uHQ4K+UoSY5OAebI8oA1RLpLLWo9yA1AI0I1COope5ESemOmF85mDQ9RD07JcaZhAhLSC dxAvsVjvFykMg3DVGh+pTAnhh1qILotoJfgQGh595kGlwcfncGyMAFDUjJ9nP5d/xHPIQl0FzXh4 wvvICXk+5HDWpkhlltlDot6sAyJ6BQusbiqEUyoaTcay01vZ8Ds1KWSp0EV/Q06yxBzm8loYT1/6 RTjk0BTKW3SuspOjJH/qZiYBKZ60L9m3HHABW6y6hw/KnCuPI5BRFWvXYCoKfvE4vMrrgoEalNQh taQ43z+ZoGMjHdOwSzJlYoDywJTQ1cvHDI9hxRSgXzzd8WFCFWyQpgZm3AoewJo4Jd1UFzUEhXDI S36pwudgQbQzfQEgWduSx2/RswrWz3Npz5jtEpsM9NMFVsfRrzfBnVe7T+j0qHGGntLHg25b0Mec s1RDk85mL0GT+rRXMSQibNZJU8LE1N1YvEyAaEOJyv3na+Ig09Y9smhGUB5LzTZ5A4gcA90jvy11 MVD8QRgRRhmCB0qUhlXqFHUqKbXMHYDIm4Zvnb6sA= From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Sun, 20 Nov 2022 14:49:37 +0800 X-OQ-MSGID: <20221120064947.94540-3-quinkblack@foxmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221120064947.94540-1-quinkblack@foxmail.com> References: <20221120064947.94540-1-quinkblack@foxmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 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".