From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id DBE6F44B26 for ; Sat, 13 Sep 2025 06:39:17 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'vggJuR04iq4LtENnmD3om1wjO4AeqaSwCjT6RlZo2/Q=', expected b'fccJKZcrwb3kAEw6WhBKOCBb2yVuLBc/EaKF9+cfcSI=')) header.d=ffmpeg.org header.i=@ffmpeg.org header.a=rsa-sha256 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1757745552; h=mime-version : to : date : message-id : reply-to : subject : list-id : list-archive : list-archive : list-help : list-owner : list-post : list-subscribe : list-unsubscribe : from : cc : content-type : content-transfer-encoding : from; bh=vggJuR04iq4LtENnmD3om1wjO4AeqaSwCjT6RlZo2/Q=; b=QkuOIdIYBVh9hb5vC4mGTnTm0zCXB1u2mCoL5OPoRLg7kIxAOjSa6rRQO7CbDmvReydaH 2tOw/MMI3vve1qdEo5bB4oAXzxvq8w8vipAYgqbAYZu2+o3rIzCLClnvL9ZaGsSic513nwu efG18i8dltpA40uOw4WqnSL654mvU+mQ3suY4hqsBo9O5tpUvwUV98DH7jzxAVb9uQ8ARCM 7cdS6ikQGzwB1+0jhoQ+R5SZvwUDvyUnkg7QD8ejB32aLNSyiHs9uYAJXzYriwj3OCeIQQ8 WLW8U3lu2pipCUyFEcW5w9ec928gWlj4/sdDGLXymtZBfZ0iPNtpwuIAfvuA== Received: from [172.19.0.4] (unknown [172.19.0.4]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 86BAE68E7E6; Sat, 13 Sep 2025 09:39:12 +0300 (EEST) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1757745551; b=JmfSMVvotyWg7hafpy3om/sWwlbLFsISlT5FDhN4mUa3JWWahUJVS0JPJ6aDQaKY7axlf fofLprfAZmT3dzJDJqUbv9HUH4TBBMXgGuK4XAsrgj2m7UE6bzGY9gxBqC5BP1SIul6xcPM sNxlEWwKAWDvmolRFM+panP6EEZMpoby4kq9yBkH9Iojq4XdWCQbiYvjw1PZ4l5XC+ZXR9E /VJSFBTDl8E7hOEFrHpsi3pan3+U6NXGV5ygWRwOEWKeDrMMkNCtNUF7hHFfEsz/zo6Ga/2 q4KbzHNi42s2OAo3Peh/W+qL8P/vlLNntfSQHMQ5q3U9fbwXv/xYZcr4Vjeg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1757745551; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=3zr2LCbjF5sfOOrDZ7FSw+s/+YfEM5X6N8aJKAnjxAE=; b=fp2IeCgjliQycOVOTgFFMW/jndXZKD1c3UeEAHQIJXkYo3ORt50Hf163WTOAkL0J2U3dH S8+4tk+/DcgFNtmn4B9sOQLLkCiQ1NYG9Am1PO19YQ9+amWZ+pVOCFYn96fWqLqLOvoglBD lN+0UtLTUI0jpEf1n+ggSrho3odkfVhghDmc4baiRnuHRrYDtDrsGZsO9IrtccIuRkDI7r/ 5rtQ6lUwPUEEmWhUYWXfFVr18yjnnUu5Jj6hQik7O0B1K2f32CW/N3idxa8vXyncxbcnY0P peImLEXxAY6G5uYMMLO08AizjAIWTylZ2WB3lHw8EvfFFh8gkFXs4sgl7z8A== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none; dmarc=none Authentication-Results: ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none (Message is not ARC signed); dmarc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1757745539; h=content-type : mime-version : content-transfer-encoding : from : to : reply-to : subject : date : from; bh=fccJKZcrwb3kAEw6WhBKOCBb2yVuLBc/EaKF9+cfcSI=; b=cN3gqLg6sg749cgpdQdOUjbVtO9Xs3wNbFO1TYu9HnxDkY6ZkoyuU3C/n7qtLe/iHwTu/ 38mD0A1AHEAr7VyLZzhiByd1RFICZ1lbFXtUUSKpteLH6rStbIv5BUNb5bqvwvbPI/XKHJC OLZekkyRFTrMmaRdOpDUiTNFS0NbOmv52LISwP/4C4VJrJM8gpa6PDEXJyKl3qpb7Ks/ETN c1dhtBqPRIJkIhszrpIqzsxHPxNRTYCyEWxNcl7eK/FOMVuKNxsunS4nT65aV7TvYVVoUKM 2vv2qCTHFPzUdNCie9Eiz+jULFi6KDvmw9pkYwwxQezWrjTRjr9uXiI15Edw== Received: from 3f9d35a0eedc (code.ffmpeg.org [188.245.149.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id B3FB968E6B2 for ; Sat, 13 Sep 2025 09:38:59 +0300 (EEST) MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Date: Sat, 13 Sep 2025 06:38:59 -0000 Message-ID: <175774554119.25.16526766524499579988@463a07221176> Message-ID-Hash: FANEQCWKLGCF4ALPOS23IJ7KDOGMQOFJ X-Message-ID-Hash: FANEQCWKLGCF4ALPOS23IJ7KDOGMQOFJ X-MailFrom: code@ffmpeg.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-ffmpeg-devel.ffmpeg.org-0; header-match-ffmpeg-devel.ffmpeg.org-1; header-match-ffmpeg-devel.ffmpeg.org-2; header-match-ffmpeg-devel.ffmpeg.org-3; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH] avcodec/rkmppdec: fix input queue overflow (PR #20511) List-Id: FFmpeg development discussions and patches Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Zhao Zhili via ffmpeg-devel Cc: Zhao Zhili Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: PR #20511 opened by Zhao Zhili (quink) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20511 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20511.patch >>From aa109c9581468287eab30a987992f9bfbcf5f7ef Mon Sep 17 00:00:00 2001 From: Zhao Zhili Date: Sat, 13 Sep 2025 12:26:08 +0800 Subject: [PATCH 1/2] avcodec/rkmppdec: fix input queue overflow The strategy to count free slots isn't reliable. The value of INPUT_MAX_PACKETS is a hardcoded value, and MPP_DEC_GET_STREAM_COUNT doesn't always work as expected. When freeslots is nonzero, the mpp decoder still returns MPP_ERR_BUFFER_FULL. Before this patch, all packets are dropped once went into MPP_ERR_BUFFER_FULL state. Don't drop packet and return error in MPP_ERR_BUFFER_FULL state. Receive frame to allow the decoder's state machine to resume. --- libavcodec/rkmppdec.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/libavcodec/rkmppdec.c b/libavcodec/rkmppdec.c index dad0e4c25f..c4bceb4dc4 100644 --- a/libavcodec/rkmppdec.c +++ b/libavcodec/rkmppdec.c @@ -55,6 +55,7 @@ typedef struct { AVBufferRef *frames_ref; AVBufferRef *device_ref; + AVPacket pkt; } RKMPPDecoder; typedef struct { @@ -148,6 +149,7 @@ static void rkmpp_release_decoder(AVRefStructOpaque unused, void *obj) av_buffer_unref(&decoder->frames_ref); av_buffer_unref(&decoder->device_ref); + av_packet_unref(&decoder->pkt); } static av_cold int rkmpp_init_decoder(AVCodecContext *avctx) @@ -485,7 +487,6 @@ static int rkmpp_receive_frame(AVCodecContext *avctx, AVFrame *frame) RKMPPDecodeContext *rk_context = avctx->priv_data; RKMPPDecoder *decoder = rk_context->decoder; int ret = MPP_NOK; - AVPacket pkt = {0}; RK_S32 usedslots, freeslots; if (!decoder->eos_reached) { @@ -498,17 +499,22 @@ static int rkmpp_receive_frame(AVCodecContext *avctx, AVFrame *frame) freeslots = INPUT_MAX_PACKETS - usedslots; if (freeslots > 0) { - ret = ff_decode_get_packet(avctx, &pkt); - if (ret < 0 && ret != AVERROR_EOF) { - return ret; + if (!decoder->pkt.size) { + ret = ff_decode_get_packet(avctx, &decoder->pkt); + if (ret < 0 && ret != AVERROR_EOF) { + return ret; + } } - ret = rkmpp_send_packet(avctx, &pkt); - av_packet_unref(&pkt); - - if (ret < 0) { + ret = rkmpp_send_packet(avctx, &decoder->pkt); + if (ret < 0 && ret != AVERROR(EAGAIN)) { av_log(avctx, AV_LOG_ERROR, "Failed to send packet to decoder (code = %d)\n", ret); return ret; + } else if (ret == AVERROR(EAGAIN)) { + // Input queue is full, don't queue more packet. + freeslots = 0; + } else { + av_packet_unref(&decoder->pkt); } } -- 2.49.1 >>From 13a3e7f31b9d3bf50f67fbad94029ba9f8dfe430 Mon Sep 17 00:00:00 2001 From: Zhao Zhili Date: Sat, 13 Sep 2025 13:31:17 +0800 Subject: [PATCH 2/2] avcodec/rkmppdec: fix return EAGAIN during flushing --- libavcodec/rkmppdec.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libavcodec/rkmppdec.c b/libavcodec/rkmppdec.c index c4bceb4dc4..8307f03456 100644 --- a/libavcodec/rkmppdec.c +++ b/libavcodec/rkmppdec.c @@ -519,11 +519,15 @@ static int rkmpp_receive_frame(AVCodecContext *avctx, AVFrame *frame) } // make sure we keep decoder full - if (freeslots > 1) + if (freeslots > 1 && !decoder->eos_reached) return AVERROR(EAGAIN); } - return rkmpp_retrieve_frame(avctx, frame); + do { + ret = rkmpp_retrieve_frame(avctx, frame); + } while (decoder->eos_reached && ret == AVERROR(EAGAIN)); + + return ret; } static av_cold void rkmpp_flush(AVCodecContext *avctx) -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org