avcodec/mediacodecdec: call MediaCodec.stop on close

Usually the MediaCodec context will be released immediately, or it needs to stay
alive due to existing hardware buffers.

However we can free resources early in the case of
hw_buffer_count == 0 && refcount > 1, which can be reproduced by keeping frames
referenced after flushing and closing. mpv currently behaves like this.

Signed-off-by: sfan5 <sfan5@live.de>
Signed-off-by: Matthieu Bouron <matthieu.bouron@gmail.com>
This commit is contained in:
sfan5 2024-08-07 17:48:06 +02:00 • committed by Matthieu Bouron
parent 817c6a6762
commit c779766b5c

View file

@ -841,6 +841,18 @@ int ff_mediacodec_dec_flush(AVCodecContext *avctx, MediaCodecDecContext *s)
int ff_mediacodec_dec_close(AVCodecContext *avctx, MediaCodecDecContext *s)
{
if (!s)
return 0;
if (s->codec) {
if (atomic_load(&s->hw_buffer_count) == 0) {
ff_AMediaCodec_stop(s->codec);
av_log(avctx, AV_LOG_DEBUG, "MediaCodec %p stopped\n", s->codec);
} else {
av_log(avctx, AV_LOG_DEBUG, "Not stopping MediaCodec (there are buffers pending)\n");
}
}
ff_mediacodec_dec_unref(s);
return 0;