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