The branch, master has been updated
       via  9e3c07f2dfaaf55690a83b173778487ce5c9a484 (commit)
       via  0773343ed769d4b14d58803cf2957223f93e1b4f (commit)
      from  6e63b978d32ea3449a7dbb47e9eb7c8ad00af30d (commit)


- Log -----------------------------------------------------------------
commit 9e3c07f2dfaaf55690a83b173778487ce5c9a484
Author:     Zhao Zhili <quinkbl...@foxmail.com>
AuthorDate: Sat Sep 13 13:31:17 2025 +0800
Commit:     Zhao Zhili <quinkbl...@foxmail.com>
CommitDate: Sun Sep 14 21:35:54 2025 +0800

    avcodec/rkmppdec: fix return EAGAIN during flushing
    
    Signed-off-by: Zhao Zhili <zhiliz...@tencent.com>

diff --git a/libavcodec/rkmppdec.c b/libavcodec/rkmppdec.c
index 62ba51cff8..a6bc565776 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)

commit 0773343ed769d4b14d58803cf2957223f93e1b4f
Author:     Zhao Zhili <quinkbl...@foxmail.com>
AuthorDate: Sat Sep 13 12:26:08 2025 +0800
Commit:     Zhao Zhili <quinkbl...@foxmail.com>
CommitDate: Sun Sep 14 21:35:54 2025 +0800

    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.
    
    Signed-off-by: Zhao Zhili <zhiliz...@tencent.com>

diff --git a/libavcodec/rkmppdec.c b/libavcodec/rkmppdec.c
index a5ed0fc9b7..62ba51cff8 100644
--- a/libavcodec/rkmppdec.c
+++ b/libavcodec/rkmppdec.c
@@ -484,7 +484,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) {
@@ -497,17 +496,25 @@ 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;
-            }
+            AVPacket *const pkt = avctx->internal->in_pkt;
 
-            ret = rkmpp_send_packet(avctx, &pkt);
-            av_packet_unref(&pkt);
+            if (!pkt->size) {
+                ret = ff_decode_get_packet(avctx, pkt);
+                if (ret < 0 && ret != AVERROR_EOF) {
+                    return ret;
+                }
+            }
 
-            if (ret < 0) {
+            ret = rkmpp_send_packet(avctx, pkt);
+            if (ret < 0 && ret != AVERROR(EAGAIN)) {
+                av_packet_unref(pkt);
                 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(pkt);
             }
         }
 

-----------------------------------------------------------------------

Summary of changes:
 libavcodec/rkmppdec.c | 31 +++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)


hooks/post-receive
-- 

_______________________________________________
ffmpeg-cvslog mailing list -- ffmpeg-cvslog@ffmpeg.org
To unsubscribe send an email to ffmpeg-cvslog-le...@ffmpeg.org

Reply via email to