From: Zhao Zhili via ffmpeg-devel <ffmpeg-devel@ffmpeg.org> To: ffmpeg-devel@ffmpeg.org Cc: Zhao Zhili <code@ffmpeg.org> Subject: [FFmpeg-devel] [PATCH] avcodec/rkmppdec: fix input queue overflow (PR #20511) Date: Sat, 13 Sep 2025 06:38:59 -0000 Message-ID: <175774554119.25.16526766524499579988@463a07221176> (raw) 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 <zhilizhao@tencent.com> 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 <zhilizhao@tencent.com> 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
reply other threads:[~2025-09-13 6:39 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=175774554119.25.16526766524499579988@463a07221176 \ --to=ffmpeg-devel@ffmpeg.org \ --cc=code@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git