From patchwork Sun Nov 20 06:49:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 39347 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:999a:b0:a4:2148:650a with SMTP id ve26csp1406502pzb; Sat, 19 Nov 2022 22:50:56 -0800 (PST) X-Google-Smtp-Source: AA0mqf5hr2GmPr0mF2pmzlvQ+XguYr2kVLiyZwEC5b968K+WrS5aYJF53TXMGaC4b4HVzh9/MuP+ X-Received: by 2002:a17:907:bd5:b0:7ad:9ada:f32e with SMTP id ez21-20020a1709070bd500b007ad9adaf32emr11252977ejc.591.1668927055869; Sat, 19 Nov 2022 22:50:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668927055; cv=none; d=google.com; s=arc-20160816; b=jtAhsKFScbYNghPZIDk5/LkU+nrFtNBL+oSyPjOi44HGG45pAA/09ifK9B4dB2ndxE SwZH3Yk+WQhoHnpghwb3txm+ts9i6qa8O7pXROnXvff7x2CrZSvj4CUve/3eTg2W5IGU mn5fTPGxK+yv/T1KMWs1ULiyvrzq1dIfAuLZyve3YWcB3dJ64bYfPKRKSdiFlngJxLwy HCAtUQpJHhmEDBBQlsszhdZ4ZnichLTOM5rmpb7Tekk6YS8vHLop5nUvyg+PS7flkz8U stYu+MtKGPjkJoINRll1WcNlwKtCHdWPVTBZaL72TGM2cIKuP9eIYHtWzDtVkUACft3R GGZw== 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=zM/ivENmJnH4eUNsAREIFXcXmVnhOFf0QRPZ/wy7vjExvQgBTKOq954zpy/i3dPu+R 7942Uf2t3uEa4Qny5x7eF8zZZ6wsT1nS6U6NdjRCNJeM87uZsRaM6ki1hDrKRXUEN9cY CYhxDeyDRG2iNMPtR4UNc4FKsuW6POMlF2rDmhwyOBkdjXFi5M8rh2ZkmegO2XshAaWW 7ZMKCvf3ILjPJ8Vafl9HB+AtDOyji63ZJF5K1m80Ir3CjQ/K/50M+bg+1RSPI9GDD9rF h61xG9mQuLeyMzQGvZNU1AqLxkfS8Sbf1/Td3nzpDnuuT+xqGqfoom65Rutq4vjzUoes OxGQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=Vo0XuFNm; 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 sa20-20020a1709076d1400b007aa6ce58d9asi7546677ejc.712.2022.11.19.22.50.55; Sat, 19 Nov 2022 22:50:55 -0800 (PST) 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=Vo0XuFNm; 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 F188C68BB81; Sun, 20 Nov 2022 08:50:43 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: s9DqUUn6FUUs 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; }