diff mbox series

[FFmpeg-devel] mediacodecdec_common: enable refcounting of buffers unconditionally

Message ID PAXP251MB0726BD93CCAB0539C6E3B78BEC4A9@PAXP251MB0726.EURP251.PROD.OUTLOOK.COM
State New
Headers show
Series [FFmpeg-devel] mediacodecdec_common: enable refcounting of buffers unconditionally | expand

Checks

Context Check Description
yinshiyou/configure_loongarch64 warning Failed to apply patch
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

sfan5 Sept. 18, 2022, 6:26 p.m. UTC
This allows av_mediacodec_release_buffer to be called safely after
the decoder is closed, this was already the case with delay_flush=1.
Note that this causes holding onto frames to keep the decoding context
alive which is generally considered to be the intended behavior


(resending as my patch got mangled somehow)

Comments

Anton Khirnov Sept. 28, 2022, 8:27 a.m. UTC | #1
Quoting sfan5 (2022-09-18 20:26:48)
> This allows av_mediacodec_release_buffer to be called safely after
> the decoder is closed, this was already the case with delay_flush=1.
> Note that this causes holding onto frames to keep the decoding context
> alive which is generally considered to be the intended behavior
> 
> 
> (resending as my patch got mangled somehow)

The patch looks like it makes sense, but I have no experience with this
code. CCing the maintainer, will push in a few days if nobody objects.
Matthieu Bouron Sept. 28, 2022, 9:35 a.m. UTC | #2
On Wed, Sep 28, 2022 at 10:27:49AM +0200, Anton Khirnov wrote:
> Quoting sfan5 (2022-09-18 20:26:48)
> > This allows av_mediacodec_release_buffer to be called safely after
> > the decoder is closed, this was already the case with delay_flush=1.
> > Note that this causes holding onto frames to keep the decoding context
> > alive which is generally considered to be the intended behavior
> > 
> > 
> > (resending as my patch got mangled somehow)
> 
> The patch looks like it makes sense, but I have no experience with this
> code. CCing the maintainer, will push in a few days if nobody objects.

Sorry for the wait, the patch looks good to me.

Thanks,
Matthieu
diff mbox series

Patch

From c3a5edd940c503cca706b3d92954b8cd5c715e26 Mon Sep 17 00:00:00 2001
From: sfan5 <sfan5@live.de>
Date: Sun, 18 Sep 2022 18:26:43 +0200
Subject: [PATCH] mediacodecdec_common: enable refcounting of buffers
 unconditionally

This allows av_mediacodec_release_buffer to be called safely after
the decoder is closed, this was already the case with delay_flush=1.
Note that this causes holding onto frames to keep the decoding context
alive which is generally considered to be the intended behavior.

Signed-off-by: sfan5 <sfan5@live.de>
---
 libavcodec/mediacodecdec_common.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c
index 9fa769656c..2a605e7f5b 100644
--- a/libavcodec/mediacodecdec_common.c
+++ b/libavcodec/mediacodecdec_common.c
@@ -265,8 +265,7 @@  static void mediacodec_buffer_release(void *opaque, uint8_t *data)
         ff_AMediaCodec_releaseOutputBuffer(ctx->codec, buffer->index, 0);
     }
 
-    if (ctx->delay_flush)
-        ff_mediacodec_dec_unref(ctx);
+    ff_mediacodec_dec_unref(ctx);
     av_freep(&buffer);
 }
 
@@ -321,8 +320,7 @@  static int mediacodec_wrap_hw_buffer(AVCodecContext *avctx,
 
     buffer->ctx = s;
     buffer->serial = atomic_load(&s->serial);
-    if (s->delay_flush)
-        ff_mediacodec_dec_ref(s);
+    ff_mediacodec_dec_ref(s);
 
     buffer->index = index;
     buffer->pts = info->presentationTimeUs;
@@ -872,7 +870,7 @@  int ff_mediacodec_dec_receive(AVCodecContext *avctx, MediaCodecDecContext *s,
 */
 int ff_mediacodec_dec_flush(AVCodecContext *avctx, MediaCodecDecContext *s)
 {
-    if (!s->surface || atomic_load(&s->refcount) == 1) {
+    if (!s->surface || !s->delay_flush || atomic_load(&s->refcount) == 1) {
         int ret;
 
         /* No frames (holding a reference to the codec) are retained by the
-- 
2.37.3